Commits vergleichen
160 Commits
fd9e02de35
...
develop
| Autor | SHA1 | Datum | |
|---|---|---|---|
|
|
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:*)",
|
||||||
"Bash(sudo apt-get install:*)",
|
"Bash(sudo apt-get install:*)",
|
||||||
"Bash(git add:*)",
|
"Bash(git add:*)",
|
||||||
"Bash(rm:*)"
|
"Bash(rm:*)",
|
||||||
|
"Bash(hostname)"
|
||||||
],
|
],
|
||||||
"deny": []
|
"deny": []
|
||||||
}
|
}
|
||||||
|
|||||||
3
.gitignore
vendored
Normale Datei
@@ -0,0 +1,3 @@
|
|||||||
|
# Lagebild-Daten (werden per Cron-Sync vom Monitor regeneriert)
|
||||||
|
lagebild/data/
|
||||||
|
lagen/*/data/
|
||||||
239
CLAUDE.md
Normale Datei
@@ -0,0 +1,239 @@
|
|||||||
|
# CLAUDE.md - AegisSight Website
|
||||||
|
|
||||||
|
RELATED_DOCS:
|
||||||
|
COOKIE_CONSENT_IMPLEMENTATION.md: "Cookie-Banner Implementierung, GDPR, Testing"
|
||||||
|
DATENSCHUTZ_ANALYTICS.md: "Textbausteine fuer Datenschutzerklaerung"
|
||||||
|
PROFESSIONAL_TOOLBOX_CONTENT.md: "Backup-HTML fuer entfernte Produktkarte"
|
||||||
|
VIDEO_UPLOAD_INSTRUCTIONS.md: "Anleitung fuer manuelle Video-Uploads (Git-Limit)"
|
||||||
|
|
||||||
|
PROJECT: Website
|
||||||
|
STATUS: PRODUCTION
|
||||||
|
URL: https://aegis-sight.de
|
||||||
|
CONTAINER: aegis-website-nginx
|
||||||
|
|
||||||
|
COMPANY:
|
||||||
|
name: AegisSight UG (haftungsbeschraenkt)
|
||||||
|
domain: aegis-sight.de
|
||||||
|
email: info@aegis-sight.de
|
||||||
|
|
||||||
|
TECHNOLOGY:
|
||||||
|
type: Static Website
|
||||||
|
build_process: NONE
|
||||||
|
deployment: Docker/nginx
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
- HTML5
|
||||||
|
- CSS3 (modular)
|
||||||
|
- JavaScript ES6+
|
||||||
|
- SVG
|
||||||
|
|
||||||
|
features:
|
||||||
|
- multi_language: [DE, EN]
|
||||||
|
- responsive: mobile-first
|
||||||
|
- video_backgrounds: true
|
||||||
|
- cookie_consent: GDPR-compliant
|
||||||
|
- security_headers: enabled
|
||||||
|
|
||||||
|
STRUCTURE:
|
||||||
|
root_files:
|
||||||
|
- index.html: Hauptseite
|
||||||
|
- impressum.html: Impressum DE
|
||||||
|
- impressum-en.html: Impressum EN
|
||||||
|
- datenschutz.html: Datenschutz DE
|
||||||
|
- datenschutz-en.html: Datenschutz EN
|
||||||
|
- accountforger-video.html: Produkt-Demo
|
||||||
|
- robots.txt: SEO-Konfiguration
|
||||||
|
- cookie-consent.js: GDPR Cookie-System
|
||||||
|
- cookie-consent.css: Cookie-Banner Styles
|
||||||
|
|
||||||
|
directories:
|
||||||
|
assets:
|
||||||
|
fonts: [Inter, Bebas Neue]
|
||||||
|
images:
|
||||||
|
icons: UI-Icons (SVG)
|
||||||
|
flags: Laenderflaggen
|
||||||
|
logos: "Logo+Schrift_Rechts.svg"
|
||||||
|
videos: "~300MB - Hero-Videos, AFv6.mp4"
|
||||||
|
|
||||||
|
css:
|
||||||
|
- main.css: Kern-Styles
|
||||||
|
- animations-enhanced.css: Animationen
|
||||||
|
- mobile.css: Mobile Responsive
|
||||||
|
- fonts.css: Typografie
|
||||||
|
|
||||||
|
js:
|
||||||
|
- main.js: Einstiegspunkt
|
||||||
|
- translations.js: Mehrsprachigkeit
|
||||||
|
- components.js: UI-Komponenten
|
||||||
|
- animations.js: Animationssystem
|
||||||
|
|
||||||
|
docs: Rechtliche PDFs
|
||||||
|
|
||||||
|
lagen:
|
||||||
|
iran-konflikt:
|
||||||
|
- index.html: Lagebild-Seite (Leaflet, Tabs, Timeline)
|
||||||
|
- lagebild.js: Datenladung, Rendering, Interaktionen
|
||||||
|
- lagebild.css: Dark-Theme Styling
|
||||||
|
- data/: current.json + Snapshots (sync alle 5min)
|
||||||
|
|
||||||
|
vorschau:
|
||||||
|
- index.html: Produktseite AegisSight Monitor (Passwort-Gate)
|
||||||
|
css:
|
||||||
|
- style.css: Light-Mode Design (Navy/Gold Akzente)
|
||||||
|
js:
|
||||||
|
- app.js: Hero-Videos, 3D-Karussell, Leaflet-Karte, Live-Daten, Kontaktformular
|
||||||
|
|
||||||
|
PAGES:
|
||||||
|
homepage:
|
||||||
|
sections: [Hero mit Video, Ueber uns, Loesungen, Kontakt]
|
||||||
|
legal:
|
||||||
|
- Impressum (DE/EN)
|
||||||
|
- Datenschutz (DE/EN)
|
||||||
|
product:
|
||||||
|
- AccountForger Video-Demo
|
||||||
|
lagen:
|
||||||
|
url_struktur: /lagen/{thema}/
|
||||||
|
redirect: /lagebild/ -> 301 -> /lagen/iran-konflikt/
|
||||||
|
aktiv:
|
||||||
|
- iran-konflikt: Live-Lagebild Irankonflikt (ehemals /lagebild/)
|
||||||
|
geplant:
|
||||||
|
- (2 weitere Lagen in Vorbereitung)
|
||||||
|
vorschau:
|
||||||
|
url: /vorschau/
|
||||||
|
zweck: Produktseite AegisSight Monitor (ersetzt spaeter die Hauptseite)
|
||||||
|
auth: JavaScript SHA-256 Passwort-Gate (kein Benutzername)
|
||||||
|
design: Light-Mode, Navy/Gold Akzente, SVG-Wellen/Diagonale Divider
|
||||||
|
sections: [Hero mit Video (clip-path Chevron), Problem (dark), Workflow 3-Schritte, Live-Stats, 3D-Karussell mit Lagebild-Text, Leaflet-Karte (gekoppelt an Karussell), Faktenprüfung-Statement, Features (5 Cards zentriert), CTA, Unser Versprechen]
|
||||||
|
daten: Fetcht /lagen/iran-konflikt/data/summary.json (~116 KB)
|
||||||
|
karussell: 3D-Perspektive, 3 Cards (Iran live + 2 Platzhalter), Karte wechselt mit
|
||||||
|
karte: Leaflet mit Pulse-Markern, Dark Popups/Legende, gekoppelt an aktive Lage
|
||||||
|
kontaktformular: Popup-Modal (Name, Organisation, E-Mail, Nachricht) -> /api/contact -> SMTP
|
||||||
|
icons: monitor.svg + languages.svg (Lucide) hinzugefuegt
|
||||||
|
|
||||||
|
DEVELOPMENT:
|
||||||
|
translations: js/translations.js
|
||||||
|
large_files: "assets/videos/ (~300MB)"
|
||||||
|
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 an info@aegis-sight.de)
|
||||||
|
rate_limit: 3 Anfragen pro IP / 10 Min
|
||||||
|
|
||||||
|
DEPLOYMENT:
|
||||||
|
container: aegis-website-nginx
|
||||||
|
server: nginx (static files)
|
||||||
|
ssl: enabled
|
||||||
|
security_headers: enabled
|
||||||
|
rate_limiting: configured
|
||||||
|
|
||||||
|
CHANGE_LOG:
|
||||||
|
2026-01-08:
|
||||||
|
- "Rebrand: IntelSight -> AegisSight"
|
||||||
|
- "Neues Logo: Logo+Schrift_Rechts.svg"
|
||||||
|
- "Email: info@aegis-sight.de"
|
||||||
|
- "Footer: Dynamisches Jahr, AGB entfernt"
|
||||||
|
|
||||||
|
Last-Updated: 2026-04-06
|
||||||
|
|
||||||
|
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\">"
|
||||||
|
- "Fuer 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: |
|
||||||
|
cd /opt/v2-Docker/aegis-website-staging/html
|
||||||
|
git checkout develop
|
||||||
|
# Aenderung machen
|
||||||
|
git add . && git commit -m ...
|
||||||
|
git push origin develop
|
||||||
|
2_staging_aktualisieren_manuell: |
|
||||||
|
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website-staging/html && git pull'
|
||||||
|
# Kein Container-Reload noetig (statische Files)
|
||||||
|
3_in_browser_pruefen: https://staging.aegis-sight.de
|
||||||
|
4_promote_zu_live: |
|
||||||
|
# Auf Gitea: Pull Request develop -> main, dann mergen
|
||||||
|
# Danach auf Live-Server pullen:
|
||||||
|
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && git pull'
|
||||||
|
|
||||||
|
# ───────────────────────────────────────────────────────────────────
|
||||||
|
# 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 noetig.
|
||||||
|
|
||||||
|
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 ueber Gitea-Webhook)"
|
||||||
|
"POST /__deploy/live": "live (HMAC ueber 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) Live-Stand 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.
|
||||||
|
|
||||||
|
WORKFLOW_KOMPLETT:
|
||||||
|
1_entwickeln: |
|
||||||
|
git checkout develop
|
||||||
|
# Aenderung
|
||||||
|
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>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>AccountForger</title>
|
<title>AccountForger - AegisSight</title>
|
||||||
<link rel="stylesheet" href="styles-intelsight.css">
|
|
||||||
<link rel="stylesheet" href="css/fonts.css">
|
<link rel="stylesheet" href="css/fonts.css">
|
||||||
<style>
|
<style>
|
||||||
:root {
|
:root {
|
||||||
@@ -12,7 +11,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background: linear-gradient(135deg, #0a0a0a 0%, #1a1a1a 100%);
|
background: linear-gradient(135deg, #0A1832 0%, #060F20 100%);
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
min-height: calc(var(--vh, 1vh) * 100);
|
min-height: calc(var(--vh, 1vh) * 100);
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
@@ -37,8 +36,8 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 0.5rem;
|
gap: 0.5rem;
|
||||||
padding: 0.75rem 1.5rem;
|
padding: 0.75rem 1.5rem;
|
||||||
background: rgba(255, 255, 255, 0.1);
|
background: rgba(200, 168, 81, 0.15);
|
||||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
border: 1px solid rgba(200, 168, 81, 0.3);
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@@ -50,7 +49,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.back-button:hover {
|
.back-button:hover {
|
||||||
background: rgba(255, 255, 255, 0.15);
|
background: rgba(200, 168, 81, 0.25);
|
||||||
transform: translateX(-5px);
|
transform: translateX(-5px);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,7 +241,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.play-button, .fullscreen-button, .volume-button {
|
.play-button, .fullscreen-button, .volume-button {
|
||||||
background: rgba(255, 255, 255, 0.2);
|
background: rgba(200, 168, 81, 0.25);
|
||||||
border: none;
|
border: none;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
@@ -255,7 +254,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.play-button:hover, .fullscreen-button:hover, .volume-button:hover {
|
.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);
|
transform: scale(1.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,7 +287,7 @@
|
|||||||
|
|
||||||
.volume-fill {
|
.volume-fill {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: #00d4ff;
|
background: #C8A851;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
@@ -304,7 +303,7 @@
|
|||||||
|
|
||||||
.progress-fill {
|
.progress-fill {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: #00d4ff;
|
background: #C8A851;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
width: 0%;
|
width: 0%;
|
||||||
transition: width 0.1s linear;
|
transition: width 0.1s linear;
|
||||||
@@ -323,7 +322,7 @@
|
|||||||
margin-top: 2rem;
|
margin-top: 2rem;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
background: rgba(255, 255, 255, 0.05);
|
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;
|
border-radius: 8px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: rgba(255, 255, 255, 0.7);
|
color: rgba(255, 255, 255, 0.7);
|
||||||
@@ -338,7 +337,7 @@
|
|||||||
height: 20px;
|
height: 20px;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
margin-right: 0.5rem;
|
margin-right: 0.5rem;
|
||||||
fill: #00d4ff;
|
fill: #C8A851;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes fadeInUp {
|
@keyframes fadeInUp {
|
||||||
@@ -519,6 +518,8 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||||
|
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="video-container">
|
<div class="video-container">
|
||||||
@@ -530,8 +531,9 @@
|
|||||||
</a>
|
</a>
|
||||||
|
|
||||||
<div class="video-header">
|
<div class="video-header">
|
||||||
|
<img src="assets/images/logos/AegisSightLogo_NavyGold.svg" alt="AegisSight" style="height: 48px; margin-bottom: 1rem;">
|
||||||
<h1>AccountForger</h1>
|
<h1>AccountForger</h1>
|
||||||
<p>Exklusiver Zugang für autorisierte Behörden</p>
|
<p>Video-Demo</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="video-wrapper">
|
<div class="video-wrapper">
|
||||||
@@ -570,20 +572,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</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>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Check authentication
|
// Zugangsschutz wird serverseitig von Nginx (auth_request) geprueft.
|
||||||
if (!sessionStorage.getItem('accountForgerAuth')) {
|
// Wenn diese Seite laedt, wurde der Zugang bereits verifiziert.
|
||||||
window.location.href = 'index.html';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Video player functionality
|
// Video player functionality
|
||||||
const video = document.getElementById('protectedVideo');
|
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 |
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:
|
### Video-Spezifikationen:
|
||||||
- **Format:** MP4 (H.264 codec)
|
- **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
496
cookie-consent.css
Normale Datei
@@ -0,0 +1,496 @@
|
|||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
background: var(--consent-text-dark);
|
||||||
|
color: white;
|
||||||
|
padding: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
})();
|
||||||
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
/* About Section Background */
|
/* About Section Background */
|
||||||
.about-section {
|
.about-section {
|
||||||
background: linear-gradient(135deg, #ffffff 0%, #f8fafb 100%);
|
background: linear-gradient(135deg, var(--color-white) 0%, var(--color-gray-50) 100%);
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 100px 0;
|
padding: var(--space-4xl) 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.about-section::before {
|
.about-section::before {
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
right: -20%;
|
right: -20%;
|
||||||
width: 60%;
|
width: 60%;
|
||||||
height: 60%;
|
height: 60%;
|
||||||
background: radial-gradient(circle, rgba(15, 114, 181, 0.05) 0%, transparent 70%);
|
background: radial-gradient(circle, rgba(10, 24, 50, 0.04) 0%, transparent 70%);
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
animation: float-slow 20s ease-in-out infinite;
|
animation: float-slow 20s ease-in-out infinite;
|
||||||
}
|
}
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
.about-tab {
|
.about-tab {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border: none;
|
border: none;
|
||||||
color: #666;
|
color: var(--color-gray-600);
|
||||||
padding: 15px 30px;
|
padding: 15px 30px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
width: 0;
|
width: 0;
|
||||||
height: 0;
|
height: 0;
|
||||||
border-radius: 50px;
|
border-radius: 50px;
|
||||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
background: var(--color-navy);
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
|
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
z-index: -1;
|
z-index: -1;
|
||||||
@@ -79,15 +79,15 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.about-tab.active {
|
.about-tab.active {
|
||||||
color: #ffffff;
|
color: var(--color-white);
|
||||||
transform: scale(1.05);
|
transform: scale(1.05);
|
||||||
box-shadow: 0 8px 20px rgba(15, 114, 181, 0.3);
|
box-shadow: 0 8px 20px rgba(10, 24, 50, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.about-tab:hover:not(.active) {
|
.about-tab:hover:not(.active) {
|
||||||
color: #0f72b5;
|
color: var(--color-gold-dark);
|
||||||
transform: translateY(-2px);
|
transform: translateY(-2px);
|
||||||
background: rgba(15, 114, 181, 0.05);
|
background: rgba(200, 168, 81, 0.08);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tab Content Panels */
|
/* Tab Content Panels */
|
||||||
@@ -153,7 +153,7 @@
|
|||||||
left: 0;
|
left: 0;
|
||||||
width: 4px;
|
width: 4px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: linear-gradient(180deg, #0f72b5, #00406e);
|
background: #0A1832;
|
||||||
transform: scaleY(0);
|
transform: scaleY(0);
|
||||||
transition: transform 0.4s;
|
transition: transform 0.4s;
|
||||||
}
|
}
|
||||||
@@ -163,12 +163,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.company-card:hover {
|
.company-card:hover {
|
||||||
transform: translateX(10px);
|
transform: translateX(6px);
|
||||||
box-shadow: 0 15px 50px rgba(15, 114, 181, 0.15);
|
box-shadow: 0 12px 32px rgba(10, 24, 50, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.company-card h4 {
|
.company-card h4 {
|
||||||
color: #0f72b5;
|
color: var(--color-navy);
|
||||||
font-size: 1.4rem;
|
font-size: 1.4rem;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -190,7 +190,7 @@
|
|||||||
|
|
||||||
.company-card:hover .company-card-icon {
|
.company-card:hover .company-card-icon {
|
||||||
transform: scale(1.1) rotate(5deg);
|
transform: scale(1.1) rotate(5deg);
|
||||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
background: #0A1832;
|
||||||
}
|
}
|
||||||
|
|
||||||
.company-card-icon img {
|
.company-card-icon img {
|
||||||
@@ -210,7 +210,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.mission-header {
|
.mission-header {
|
||||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
background: #0A1832;
|
||||||
color: white;
|
color: white;
|
||||||
padding: 60px;
|
padding: 60px;
|
||||||
border-radius: 30px;
|
border-radius: 30px;
|
||||||
@@ -277,9 +277,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.value-card:hover {
|
.value-card:hover {
|
||||||
transform: translateY(-10px) scale(1.02);
|
transform: translateY(-4px);
|
||||||
box-shadow: 0 20px 60px rgba(15, 114, 181, 0.2);
|
box-shadow: 0 12px 32px rgba(10, 24, 50, 0.12);
|
||||||
border-color: #0f72b5;
|
border-color: var(--color-navy);
|
||||||
}
|
}
|
||||||
|
|
||||||
.value-icon {
|
.value-icon {
|
||||||
@@ -303,7 +303,7 @@
|
|||||||
|
|
||||||
.value-card:hover .value-icon {
|
.value-card:hover .value-icon {
|
||||||
transform: scale(1.1) rotate(5deg);
|
transform: scale(1.1) rotate(5deg);
|
||||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
background: #0A1832;
|
||||||
}
|
}
|
||||||
|
|
||||||
.value-card:hover .value-icon img {
|
.value-card:hover .value-icon img {
|
||||||
@@ -323,7 +323,7 @@
|
|||||||
top: 0;
|
top: 0;
|
||||||
width: 3px;
|
width: 3px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: linear-gradient(180deg, #0f72b5, #00406e);
|
background: #0A1832;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,21 +356,21 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.competency-item:hover {
|
.competency-item:hover {
|
||||||
transform: translateX(20px);
|
transform: translateX(10px);
|
||||||
box-shadow: 0 10px 40px rgba(15, 114, 181, 0.15);
|
box-shadow: 0 8px 24px rgba(10, 24, 50, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.competency-number {
|
.competency-number {
|
||||||
font-size: 3rem;
|
font-size: 3rem;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
background: linear-gradient(135deg, #C8A851, #B39645);
|
||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
background-clip: text;
|
background-clip: text;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Why IntelSight - 2x2 Grid */
|
/* Why AegisSight - 2x2 Grid */
|
||||||
.why-grid {
|
.why-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(2, 1fr);
|
grid-template-columns: repeat(2, 1fr);
|
||||||
@@ -398,9 +398,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.why-card:hover {
|
.why-card:hover {
|
||||||
transform: translateY(-5px);
|
transform: translateY(-4px);
|
||||||
box-shadow: 0 15px 40px rgba(15, 114, 181, 0.15);
|
box-shadow: 0 12px 24px rgba(10, 24, 50, 0.1);
|
||||||
border-color: rgba(15, 114, 181, 0.3);
|
border-color: rgba(10, 24, 50, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.why-icon {
|
.why-icon {
|
||||||
@@ -448,7 +448,7 @@
|
|||||||
|
|
||||||
.why-card:hover .why-icon {
|
.why-card:hover .why-icon {
|
||||||
transform: scale(1.1) rotate(5deg);
|
transform: scale(1.1) rotate(5deg);
|
||||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
background: #0A1832;
|
||||||
}
|
}
|
||||||
|
|
||||||
.why-card:hover .why-icon img {
|
.why-card:hover .why-icon img {
|
||||||
@@ -458,7 +458,7 @@
|
|||||||
.why-card h4 {
|
.why-card h4 {
|
||||||
font-size: 1.6rem;
|
font-size: 1.6rem;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
color: #0f72b5;
|
color: var(--color-navy);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
@@ -466,7 +466,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.why-card p {
|
.why-card p {
|
||||||
color: #666;
|
color: var(--color-gray-600);
|
||||||
line-height: 1.8;
|
line-height: 1.8;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -508,7 +508,7 @@
|
|||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
background: radial-gradient(circle at 35% 45%, rgba(15, 114, 181, 0.3) 0%, transparent 40%);
|
background: radial-gradient(circle at 35% 45%, rgba(10, 24, 50, 0.3) 0%, transparent 40%);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: opacity 0.4s ease;
|
transition: opacity 0.4s ease;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
@@ -521,7 +521,7 @@
|
|||||||
|
|
||||||
.mini-germany-map:hover {
|
.mini-germany-map:hover {
|
||||||
transform: scale(1.02);
|
transform: scale(1.02);
|
||||||
box-shadow: 0 15px 50px rgba(15, 114, 181, 0.15);
|
box-shadow: 0 15px 50px rgba(10, 24, 50, 0.15);
|
||||||
}
|
}
|
||||||
|
|
||||||
.mini-germany-map img {
|
.mini-germany-map img {
|
||||||
@@ -541,10 +541,10 @@
|
|||||||
/* Pulsing glow effect for NRW region */
|
/* Pulsing glow effect for NRW region */
|
||||||
@keyframes nrwPulse {
|
@keyframes nrwPulse {
|
||||||
0%, 100% {
|
0%, 100% {
|
||||||
filter: drop-shadow(0 0 10px rgba(15, 114, 181, 0.5));
|
filter: drop-shadow(0 0 10px rgba(10, 24, 50, 0.5));
|
||||||
}
|
}
|
||||||
50% {
|
50% {
|
||||||
filter: drop-shadow(0 0 25px rgba(15, 114, 181, 0.8));
|
filter: drop-shadow(0 0 25px rgba(10, 24, 50, 0.8));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -567,7 +567,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.location-badge:hover {
|
.location-badge:hover {
|
||||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
background: #0A1832;
|
||||||
color: white;
|
color: white;
|
||||||
transform: scale(1.05);
|
transform: scale(1.05);
|
||||||
box-shadow: 0 10px 30px rgba(15, 114, 181, 0.3);
|
box-shadow: 0 10px 30px rgba(15, 114, 181, 0.3);
|
||||||
|
|||||||
@@ -15,21 +15,6 @@
|
|||||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
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 */
|
/* Smooth Fade In Animations */
|
||||||
@keyframes fadeInUp {
|
@keyframes fadeInUp {
|
||||||
from {
|
from {
|
||||||
@@ -91,23 +76,22 @@
|
|||||||
animation: float 6s ease-in-out infinite;
|
animation: float 6s ease-in-out infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pulse Glow Animation */
|
/* Pulse Glow Animation - Dezent */
|
||||||
@keyframes pulseGlow {
|
@keyframes pulseGlow {
|
||||||
0%, 100% {
|
0%, 100% {
|
||||||
box-shadow:
|
box-shadow:
|
||||||
0 0 5px rgba(15, 114, 181, 0.5),
|
0 0 5px rgba(10, 24, 50, 0.2),
|
||||||
0 0 10px rgba(15, 114, 181, 0.3);
|
0 0 10px rgba(10, 24, 50, 0.1);
|
||||||
}
|
}
|
||||||
50% {
|
50% {
|
||||||
box-shadow:
|
box-shadow:
|
||||||
0 0 20px rgba(15, 114, 181, 0.8),
|
0 0 10px rgba(10, 24, 50, 0.3),
|
||||||
0 0 30px rgba(15, 114, 181, 0.5),
|
0 0 20px rgba(10, 24, 50, 0.15);
|
||||||
0 0 40px rgba(15, 114, 181, 0.3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.pulse-glow {
|
.pulse-glow {
|
||||||
animation: pulseGlow 2s ease-in-out infinite;
|
animation: pulseGlow 3s ease-in-out infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Gradient Animation */
|
/* Gradient Animation */
|
||||||
@@ -120,10 +104,10 @@
|
|||||||
.gradient-animated {
|
.gradient-animated {
|
||||||
background: linear-gradient(
|
background: linear-gradient(
|
||||||
-45deg,
|
-45deg,
|
||||||
#0f72b5,
|
var(--color-navy),
|
||||||
#00406e,
|
var(--color-navy-light),
|
||||||
#0f72b5,
|
var(--color-navy),
|
||||||
#1e90ff
|
var(--color-blue)
|
||||||
);
|
);
|
||||||
background-size: 400% 400%;
|
background-size: 400% 400%;
|
||||||
animation: gradientShift 15s ease infinite;
|
animation: gradientShift 15s ease infinite;
|
||||||
@@ -143,49 +127,14 @@
|
|||||||
animation: textReveal 1.5s cubic-bezier(0.77, 0, 0.175, 1) forwards;
|
animation: textReveal 1.5s cubic-bezier(0.77, 0, 0.175, 1) forwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Typewriter Effect */
|
/* Card Hover Effects - Subtil */
|
||||||
@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 {
|
.card-hover-lift {
|
||||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-hover-lift:hover {
|
.card-hover-lift:hover {
|
||||||
transform: translateY(-10px) scale(1.02);
|
transform: translateY(-4px);
|
||||||
box-shadow:
|
box-shadow: 0 12px 24px rgba(10, 24, 50, 0.12);
|
||||||
0 20px 40px rgba(0, 0, 0, 0.15),
|
|
||||||
0 0 20px rgba(15, 114, 181, 0.3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Magnetic Button Effect */
|
/* Magnetic Button Effect */
|
||||||
@@ -229,50 +178,6 @@
|
|||||||
transform: translateY(0);
|
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 */
|
/* Smooth Scroll Indicator */
|
||||||
@keyframes scrollDown {
|
@keyframes scrollDown {
|
||||||
0% {
|
0% {
|
||||||
@@ -295,7 +200,7 @@
|
|||||||
animation: scrollDown 2s infinite;
|
animation: scrollDown 2s infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Loading Shimmer */
|
/* Loading Shimmer - Für Gold-Akzente */
|
||||||
@keyframes shimmer {
|
@keyframes shimmer {
|
||||||
0% {
|
0% {
|
||||||
background-position: -1000px 0;
|
background-position: -1000px 0;
|
||||||
@@ -308,64 +213,10 @@
|
|||||||
.shimmer {
|
.shimmer {
|
||||||
background: linear-gradient(
|
background: linear-gradient(
|
||||||
90deg,
|
90deg,
|
||||||
rgba(255, 255, 255, 0) 0%,
|
rgba(200, 168, 81, 0) 0%,
|
||||||
rgba(255, 255, 255, 0.3) 50%,
|
rgba(200, 168, 81, 0.2) 50%,
|
||||||
rgba(255, 255, 255, 0) 100%
|
rgba(200, 168, 81, 0) 100%
|
||||||
);
|
);
|
||||||
background-size: 1000px 100%;
|
background-size: 1000px 100%;
|
||||||
animation: shimmer 2s infinite;
|
animation: shimmer 3s 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;
|
|
||||||
}
|
|
||||||
2444
css/animations.css
@@ -1,4 +1,10 @@
|
|||||||
/* Local Font Definitions - DSGVO-compliant */
|
/* 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-face {
|
||||||
font-family: 'Bebas Neue';
|
font-family: 'Bebas Neue';
|
||||||
@@ -38,4 +44,4 @@
|
|||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
src: url('../assets/fonts/Inter-Bold.ttf') format('truetype');
|
src: url('../assets/fonts/Inter-Bold.ttf') format('truetype');
|
||||||
}
|
}
|
||||||
|
|||||||
270
css/main.css
@@ -1,14 +1,64 @@
|
|||||||
/* Global Styles - Rheinmetall Design */
|
/* Global Styles - AegisSight Corporate Design */
|
||||||
:root {
|
:root {
|
||||||
--primary-blue: #0f72b5;
|
/* Primärfarben (Logo) */
|
||||||
--dark-blue: #00406e;
|
--color-navy: #0A1832;
|
||||||
--light-gray: #f4f4f4;
|
--color-gold: #C8A851;
|
||||||
--white: #FFFFFF;
|
--color-gold-light: #D4B96A;
|
||||||
--text-dark: #333333;
|
--color-gold-dark: #B39645;
|
||||||
--text-gray: #666666;
|
|
||||||
--border-gray: #e0e0e0;
|
/* 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: 0 2px 8px rgba(0,0,0,0.1);
|
||||||
--shadow-hover: 0 8px 24px rgba(0,0,0,0.15);
|
--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 {
|
body {
|
||||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||||
background-color: var(--white);
|
background-color: var(--color-navy);
|
||||||
color: var(--text-dark);
|
color: var(--color-gray-800);
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
}
|
}
|
||||||
@@ -55,7 +105,11 @@ h6 { font-size: 1.1rem; }
|
|||||||
font-size: 2.5rem;
|
font-size: 2.5rem;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
color: var(--primary-blue);
|
color: var(--color-navy);
|
||||||
|
}
|
||||||
|
|
||||||
|
#about .section-title {
|
||||||
|
color: var(--color-navy);
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-subtitle {
|
.section-subtitle {
|
||||||
@@ -90,7 +144,7 @@ h6 { font-size: 1.1rem; }
|
|||||||
backdrop-filter: blur(10px);
|
backdrop-filter: blur(10px);
|
||||||
-webkit-backdrop-filter: blur(10px);
|
-webkit-backdrop-filter: blur(10px);
|
||||||
box-shadow: 0 1px 0 rgba(0,0,0,0.1);
|
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);
|
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,6 +165,9 @@ h6 { font-size: 1.1rem; }
|
|||||||
.logo-img {
|
.logo-img {
|
||||||
height: 50px;
|
height: 50px;
|
||||||
width: auto;
|
width: auto;
|
||||||
|
max-width: 100%;
|
||||||
|
display: block;
|
||||||
|
object-fit: contain;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-menu {
|
.nav-menu {
|
||||||
@@ -122,7 +179,7 @@ h6 { font-size: 1.1rem; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.nav-menu a {
|
.nav-menu a {
|
||||||
color: #001f3f;
|
color: var(--color-navy);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-size: 1.1rem;
|
font-size: 1.1rem;
|
||||||
@@ -134,7 +191,7 @@ h6 { font-size: 1.1rem; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.nav-menu a:hover {
|
.nav-menu a:hover {
|
||||||
color: var(--primary-blue);
|
color: var(--color-navy);
|
||||||
transform: translateY(-2px);
|
transform: translateY(-2px);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,7 +202,7 @@ h6 { font-size: 1.1rem; }
|
|||||||
left: 0;
|
left: 0;
|
||||||
width: 0;
|
width: 0;
|
||||||
height: 2px;
|
height: 2px;
|
||||||
background: var(--primary-blue);
|
background: var(--color-navy);
|
||||||
transition: width 0.3s ease;
|
transition: width 0.3s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,10 +218,10 @@ h6 { font-size: 1.1rem; }
|
|||||||
|
|
||||||
.lang-toggle {
|
.lang-toggle {
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border: 1px solid var(--border-gray);
|
border: 1px solid var(--color-gray-200);
|
||||||
color: #001f3f;
|
color: var(--color-navy);
|
||||||
padding: 0.5rem 1rem;
|
padding: 0.5rem 1rem;
|
||||||
border-radius: 4px;
|
border-radius: var(--radius-md);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
@@ -184,7 +241,7 @@ h6 { font-size: 1.1rem; }
|
|||||||
.secondary-button {
|
.secondary-button {
|
||||||
padding: 0.75rem 1.5rem;
|
padding: 0.75rem 1.5rem;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 4px;
|
border-radius: var(--radius-md);
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
@@ -254,7 +311,7 @@ h6 { font-size: 1.1rem; }
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
position: relative;
|
position: relative;
|
||||||
padding-top: 100px;
|
padding-top: 100px;
|
||||||
background: #000000;
|
background: var(--color-navy);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -266,7 +323,7 @@ h6 { font-size: 1.1rem; }
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
background: #000000;
|
background: var(--color-navy);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hero Videos */
|
/* Hero Videos */
|
||||||
@@ -344,12 +401,14 @@ h6 { font-size: 1.1rem; }
|
|||||||
|
|
||||||
.main-title {
|
.main-title {
|
||||||
display: block;
|
display: block;
|
||||||
|
font-family: 'Bebas Neue', sans-serif;
|
||||||
font-size: clamp(3rem, 8vw, 7rem);
|
font-size: clamp(3rem, 8vw, 7rem);
|
||||||
color: var(--white);
|
color: var(--color-white);
|
||||||
font-weight: 700;
|
font-weight: 400;
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
line-height: 1.1;
|
line-height: 1.1;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
letter-spacing: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-text {
|
.hero-text {
|
||||||
@@ -387,42 +446,10 @@ h6 { font-size: 1.1rem; }
|
|||||||
color: var(--primary-blue);
|
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 */
|
||||||
.about-section {
|
.about-section {
|
||||||
padding: 80px 0;
|
padding: var(--space-4xl) 0;
|
||||||
background: var(--white);
|
background: var(--color-white);
|
||||||
}
|
}
|
||||||
|
|
||||||
.about-tabs {
|
.about-tabs {
|
||||||
@@ -503,12 +530,23 @@ h6 { font-size: 1.1rem; }
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
color: var(--text-dark);
|
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;
|
width: 20px;
|
||||||
height: 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 {
|
.shield-animation {
|
||||||
@@ -540,9 +578,9 @@ h6 { font-size: 1.1rem; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.value-card {
|
.value-card {
|
||||||
background: var(--light-gray);
|
background: var(--color-gray-100);
|
||||||
border-radius: 12px;
|
border-radius: var(--radius-lg);
|
||||||
padding: 2rem;
|
padding: var(--space-lg);
|
||||||
transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
|
transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -571,9 +609,9 @@ h6 { font-size: 1.1rem; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.value-card:hover {
|
.value-card:hover {
|
||||||
transform: translateY(-8px) scale(1.02);
|
transform: translateY(-4px);
|
||||||
box-shadow: 0 15px 40px rgba(15, 114, 181, 0.2);
|
box-shadow: 0 12px 24px rgba(10, 24, 50, 0.12);
|
||||||
background: linear-gradient(135deg, var(--light-gray) 0%, rgba(15, 114, 181, 0.05) 100%);
|
background: linear-gradient(135deg, var(--color-gray-100) 0%, rgba(10, 24, 50, 0.03) 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.value-icon {
|
.value-icon {
|
||||||
@@ -634,7 +672,7 @@ h6 { font-size: 1.1rem; }
|
|||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Why IntelSight */
|
/* Why AegisSight */
|
||||||
.why-grid {
|
.why-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(2, 1fr);
|
grid-template-columns: repeat(2, 1fr);
|
||||||
@@ -642,10 +680,10 @@ h6 { font-size: 1.1rem; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.why-card {
|
.why-card {
|
||||||
background: var(--white);
|
background: var(--color-white);
|
||||||
border: 1px solid var(--border-gray);
|
border: 1px solid var(--color-gray-200);
|
||||||
border-radius: 12px;
|
border-radius: var(--radius-lg);
|
||||||
padding: 2rem;
|
padding: var(--space-lg);
|
||||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
box-shadow: 0 2px 10px rgba(0,0,0,0.05);
|
box-shadow: 0 2px 10px rgba(0,0,0,0.05);
|
||||||
position: relative;
|
position: relative;
|
||||||
@@ -668,10 +706,10 @@ h6 { font-size: 1.1rem; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.why-card:hover {
|
.why-card:hover {
|
||||||
transform: translateY(-8px) scale(1.02);
|
transform: translateY(-4px);
|
||||||
box-shadow: 0 15px 35px rgba(15, 114, 181, 0.15);
|
box-shadow: 0 12px 24px rgba(10, 24, 50, 0.12);
|
||||||
border-color: var(--primary-blue);
|
border-color: var(--color-navy);
|
||||||
background: linear-gradient(135deg, var(--white) 0%, rgba(15, 114, 181, 0.02) 100%);
|
background: linear-gradient(135deg, var(--color-white) 0%, rgba(10, 24, 50, 0.02) 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.why-card:hover .why-icon {
|
.why-card:hover .why-icon {
|
||||||
@@ -702,8 +740,8 @@ h6 { font-size: 1.1rem; }
|
|||||||
|
|
||||||
/* Products Section */
|
/* Products Section */
|
||||||
.products-section {
|
.products-section {
|
||||||
padding: 80px 0;
|
padding: var(--space-4xl) 0;
|
||||||
background: var(--light-gray);
|
background: var(--color-gray-100);
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-showcase {
|
.product-showcase {
|
||||||
@@ -780,10 +818,10 @@ h6 { font-size: 1.1rem; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tool-card {
|
.tool-card {
|
||||||
background: var(--light-gray);
|
background: var(--color-gray-100);
|
||||||
border-radius: 12px;
|
border-radius: var(--radius-lg);
|
||||||
padding: 2rem;
|
padding: var(--space-lg);
|
||||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -807,10 +845,10 @@ h6 { font-size: 1.1rem; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tool-card:hover {
|
.tool-card:hover {
|
||||||
transform: translateY(-10px) rotateX(5deg) scale(1.02);
|
transform: translateY(-4px);
|
||||||
box-shadow: 0 20px 40px rgba(15, 114, 181, 0.25);
|
box-shadow: 0 12px 24px rgba(10, 24, 50, 0.15);
|
||||||
border-color: rgba(15, 114, 181, 0.3);
|
border-color: rgba(10, 24, 50, 0.2);
|
||||||
background: linear-gradient(135deg, var(--white) 0%, var(--light-gray) 100%);
|
background: linear-gradient(135deg, var(--color-white) 0%, var(--color-gray-100) 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.tool-card:hover .tool-icon {
|
.tool-card:hover .tool-icon {
|
||||||
@@ -907,8 +945,8 @@ h6 { font-size: 1.1rem; }
|
|||||||
|
|
||||||
/* Contact Section */
|
/* Contact Section */
|
||||||
.contact-section {
|
.contact-section {
|
||||||
padding: 80px 0;
|
padding: var(--space-4xl) 0;
|
||||||
background: var(--white);
|
background: var(--color-white);
|
||||||
}
|
}
|
||||||
|
|
||||||
.contact-grid {
|
.contact-grid {
|
||||||
@@ -941,11 +979,11 @@ h6 { font-size: 1.1rem; }
|
|||||||
|
|
||||||
.form-group input,
|
.form-group input,
|
||||||
.form-group textarea {
|
.form-group textarea {
|
||||||
background: var(--white);
|
background: var(--color-white);
|
||||||
border: 1px solid var(--border-gray);
|
border: 1px solid var(--color-gray-200);
|
||||||
color: var(--text-dark);
|
color: var(--color-gray-800);
|
||||||
padding: 0.75rem;
|
padding: 0.75rem;
|
||||||
border-radius: 4px;
|
border-radius: var(--radius-md);
|
||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
}
|
}
|
||||||
@@ -1126,8 +1164,8 @@ h6 { font-size: 1.1rem; }
|
|||||||
|
|
||||||
/* Legal Section */
|
/* Legal Section */
|
||||||
.legal-section {
|
.legal-section {
|
||||||
padding: 80px 0;
|
padding: var(--space-4xl) 0;
|
||||||
background: var(--light-gray);
|
background: var(--color-gray-100);
|
||||||
}
|
}
|
||||||
|
|
||||||
.legal-grid {
|
.legal-grid {
|
||||||
@@ -1137,9 +1175,9 @@ h6 { font-size: 1.1rem; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.legal-card {
|
.legal-card {
|
||||||
background: var(--white);
|
background: var(--color-white);
|
||||||
border-radius: 8px;
|
border-radius: var(--radius-lg);
|
||||||
padding: 2rem;
|
padding: var(--space-lg);
|
||||||
box-shadow: var(--shadow);
|
box-shadow: var(--shadow);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1164,8 +1202,8 @@ h6 { font-size: 1.1rem; }
|
|||||||
|
|
||||||
/* Footer */
|
/* Footer */
|
||||||
.footer {
|
.footer {
|
||||||
background: #0a0f1c;
|
background: var(--color-navy-dark);
|
||||||
color: var(--white);
|
color: var(--color-white);
|
||||||
padding: 3rem 0 1rem;
|
padding: 3rem 0 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1197,7 +1235,7 @@ h6 { font-size: 1.1rem; }
|
|||||||
}
|
}
|
||||||
|
|
||||||
.footer-section a:hover {
|
.footer-section a:hover {
|
||||||
color: var(--white);
|
color: var(--color-gold);
|
||||||
}
|
}
|
||||||
|
|
||||||
.copyright {
|
.copyright {
|
||||||
@@ -1217,11 +1255,6 @@ h6 { font-size: 1.1rem; }
|
|||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.trust-indicators {
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-tabs {
|
.about-tabs {
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
@@ -1452,12 +1485,12 @@ h6 { font-size: 1.1rem; }
|
|||||||
.scroll-arrow {
|
.scroll-arrow {
|
||||||
width: 32px;
|
width: 32px;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
color: #ffffff;
|
color: #0A1832;
|
||||||
animation: bounceArrow 2s infinite;
|
animation: bounceArrow 2s infinite;
|
||||||
background: rgba(15, 114, 181, 0.2);
|
background: rgba(10, 24, 50, 0.15);
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
padding: 4px;
|
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 {
|
.scroll-arrow svg {
|
||||||
@@ -1493,4 +1526,25 @@ h6 { font-size: 1.1rem; }
|
|||||||
.mb-1 { margin-bottom: 0.5rem; }
|
.mb-1 { margin-bottom: 0.5rem; }
|
||||||
.mb-2 { margin-bottom: 1rem; }
|
.mb-2 { margin-bottom: 1rem; }
|
||||||
.mb-3 { margin-bottom: 1.5rem; }
|
.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,9 +1,9 @@
|
|||||||
/* Modern Products Section Design */
|
/* Modern Products Section Design */
|
||||||
|
|
||||||
.products-section {
|
.products-section {
|
||||||
background: #001f3f;
|
background: var(--color-navy);
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 120px 0;
|
padding: var(--space-4xl) 0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -15,10 +15,10 @@
|
|||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
background:
|
background:
|
||||||
radial-gradient(circle at 20% 50%, rgba(15, 114, 181, 0.1) 0%, transparent 50%),
|
radial-gradient(circle at 20% 50%, rgba(19, 40, 68, 0.3) 0%, transparent 50%),
|
||||||
radial-gradient(circle at 80% 50%, rgba(0, 64, 110, 0.1) 0%, transparent 50%),
|
radial-gradient(circle at 80% 50%, rgba(19, 40, 68, 0.2) 0%, transparent 50%),
|
||||||
radial-gradient(circle at 50% 100%, rgba(15, 114, 181, 0.05) 0%, transparent 50%);
|
radial-gradient(circle at 50% 100%, rgba(200, 168, 81, 0.05) 0%, transparent 50%);
|
||||||
animation: backgroundShift 20s ease-in-out infinite;
|
animation: backgroundShift 20s ease-in-out infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,8 +41,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@keyframes titleGlow {
|
@keyframes titleGlow {
|
||||||
0%, 100% { text-shadow: 0 0 20px rgba(15, 114, 181, 0.5); }
|
0%, 100% { text-shadow: 0 0 15px rgba(200, 168, 81, 0.3); }
|
||||||
50% { text-shadow: 0 0 40px rgba(15, 114, 181, 0.8), 0 0 60px rgba(15, 114, 181, 0.4); }
|
50% { text-shadow: 0 0 25px rgba(200, 168, 81, 0.5), 0 0 40px rgba(200, 168, 81, 0.2); }
|
||||||
}
|
}
|
||||||
|
|
||||||
.products-section .section-subtitle {
|
.products-section .section-subtitle {
|
||||||
@@ -72,8 +72,8 @@
|
|||||||
/* Product Card */
|
/* Product Card */
|
||||||
.product-card {
|
.product-card {
|
||||||
background: linear-gradient(135deg, rgba(255, 255, 255, 0.95), rgba(245, 245, 245, 0.95));
|
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: 1px solid rgba(200, 168, 81, 0.3);
|
||||||
border-radius: 20px;
|
border-radius: var(--radius-lg);
|
||||||
padding: 0;
|
padding: 0;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
@@ -105,20 +105,19 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.product-card:hover {
|
.product-card:hover {
|
||||||
transform: translateY(-10px) scale(1.02);
|
transform: translateY(-6px);
|
||||||
background: linear-gradient(135deg, rgba(255, 255, 255, 1), rgba(250, 250, 250, 1));
|
background: linear-gradient(135deg, rgba(255, 255, 255, 1), rgba(250, 250, 250, 1));
|
||||||
border-color: rgba(15, 114, 181, 0.5);
|
border-color: var(--color-gold);
|
||||||
box-shadow:
|
box-shadow:
|
||||||
0 30px 60px rgba(0, 0, 0, 0.4),
|
0 20px 40px rgba(0, 0, 0, 0.3),
|
||||||
0 0 80px rgba(15, 114, 181, 0.15),
|
0 0 40px rgba(200, 168, 81, 0.1);
|
||||||
inset 0 0 20px rgba(15, 114, 181, 0.03);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Product Header */
|
/* Product Header */
|
||||||
.product-header {
|
.product-header {
|
||||||
padding: 40px 40px 30px;
|
padding: 40px 40px 30px;
|
||||||
background: linear-gradient(135deg, rgba(15, 114, 181, 0.15) 0%, transparent 50%);
|
background: linear-gradient(135deg, rgba(10, 24, 50, 0.1) 0%, transparent 50%);
|
||||||
border-bottom: 1px solid rgba(15, 114, 181, 0.25);
|
border-bottom: 1px solid rgba(200, 168, 81, 0.2);
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 80px 1fr;
|
grid-template-columns: 80px 1fr;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -139,15 +138,16 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
background: linear-gradient(135deg, var(--color-navy), var(--color-gold));
|
||||||
border-radius: 20px;
|
border-radius: var(--radius-lg);
|
||||||
opacity: 0.1;
|
opacity: 0.1;
|
||||||
transition: all 0.5s;
|
transition: all 0.5s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-card:hover .product-icon-bg {
|
.product-card:hover .product-icon-bg {
|
||||||
opacity: 0.2;
|
opacity: 0.25;
|
||||||
transform: rotate(10deg) scale(1.1);
|
transform: rotate(5deg) scale(1.05);
|
||||||
|
background: linear-gradient(135deg, var(--color-navy), var(--color-gold-dark));
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-icon {
|
.product-icon {
|
||||||
@@ -155,13 +155,13 @@
|
|||||||
z-index: 1;
|
z-index: 1;
|
||||||
width: 50px;
|
width: 50px;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(98%) contrast(92%);
|
filter: brightness(0) saturate(100%) invert(8%) sepia(13%) saturate(4290%) hue-rotate(189deg) brightness(95%) contrast(97%);
|
||||||
transition: all 0.5s;
|
transition: all 0.5s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-card:hover .product-icon {
|
.product-card:hover .product-icon {
|
||||||
transform: scale(1.1);
|
transform: scale(1.1);
|
||||||
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(108%) contrast(92%);
|
filter: brightness(0) saturate(100%) invert(100%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(100%) contrast(100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-title-wrapper {
|
.product-title-wrapper {
|
||||||
@@ -174,15 +174,21 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.product-title {
|
.product-title {
|
||||||
color: #1a1a1a;
|
color: #0A1832;
|
||||||
font-size: 1.8rem;
|
font-size: 1.8rem;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
transition: all 0.3s;
|
transition: all 0.3s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Specific styling for product titles */
|
||||||
|
.product-title[data-translate="productAccountForgerTitle"],
|
||||||
|
.product-title[data-translate="productOsintMonitorTitle"] {
|
||||||
|
color: #0A1832;
|
||||||
|
}
|
||||||
|
|
||||||
.product-card:hover .product-title {
|
.product-card:hover .product-title {
|
||||||
color: #0f72b5;
|
color: var(--color-navy);
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-tagline {
|
.product-tagline {
|
||||||
@@ -228,7 +234,7 @@
|
|||||||
content: '▸';
|
content: '▸';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
color: #0f72b5;
|
color: var(--color-gold);
|
||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
transition: all 0.3s;
|
transition: all 0.3s;
|
||||||
}
|
}
|
||||||
@@ -239,15 +245,15 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.product-card:hover .product-features li::before {
|
.product-card:hover .product-features li::before {
|
||||||
color: #1e90ff;
|
color: var(--color-gold-light);
|
||||||
transform: translateX(3px);
|
transform: translateX(3px);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Product Footer */
|
/* Product Footer */
|
||||||
.product-footer {
|
.product-footer {
|
||||||
padding: 30px 40px;
|
padding: 30px 40px;
|
||||||
background: rgba(15, 114, 181, 0.08);
|
background: rgba(10, 24, 50, 0.05);
|
||||||
border-top: 1px solid rgba(15, 114, 181, 0.2);
|
border-top: 1px solid rgba(200, 168, 81, 0.2);
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -279,9 +285,9 @@
|
|||||||
|
|
||||||
/* Learn More Button */
|
/* Learn More Button */
|
||||||
.product-learn-more {
|
.product-learn-more {
|
||||||
background: transparent;
|
background: var(--color-gold);
|
||||||
border: 2px solid #0f72b5;
|
border: 2px solid var(--color-gold);
|
||||||
color: #0f72b5;
|
color: var(--color-navy);
|
||||||
padding: 10px 25px;
|
padding: 10px 25px;
|
||||||
border-radius: 50px;
|
border-radius: 50px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@@ -301,7 +307,7 @@
|
|||||||
left: 50%;
|
left: 50%;
|
||||||
width: 0;
|
width: 0;
|
||||||
height: 0;
|
height: 0;
|
||||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
background: var(--color-navy);
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
transition: all 0.5s;
|
transition: all 0.5s;
|
||||||
border-radius: 50px;
|
border-radius: 50px;
|
||||||
@@ -313,10 +319,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.product-learn-more:hover {
|
.product-learn-more:hover {
|
||||||
color: #ffffff;
|
color: var(--color-gold);
|
||||||
border-color: transparent;
|
border-color: var(--color-gold);
|
||||||
transform: translateY(-2px);
|
transform: translateY(-2px);
|
||||||
box-shadow: 0 10px 30px rgba(15, 114, 181, 0.3);
|
box-shadow: 0 10px 30px rgba(200, 168, 81, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-learn-more span {
|
.product-learn-more span {
|
||||||
@@ -367,8 +373,8 @@
|
|||||||
.tools-grid .tool-card:hover {
|
.tools-grid .tool-card:hover {
|
||||||
transform: translateY(-3px);
|
transform: translateY(-3px);
|
||||||
background: rgba(0, 0, 0, 0.05);
|
background: rgba(0, 0, 0, 0.05);
|
||||||
border-color: rgba(15, 114, 181, 0.3);
|
border-color: rgba(200, 168, 81, 0.3);
|
||||||
box-shadow: 0 5px 15px rgba(15, 114, 181, 0.15);
|
box-shadow: 0 5px 15px rgba(10, 24, 50, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.tools-grid .tool-icon {
|
.tools-grid .tool-icon {
|
||||||
@@ -389,7 +395,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tools-grid h4 {
|
.tools-grid h4 {
|
||||||
color: #1a1a1a;
|
color: var(--color-navy);
|
||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
@@ -413,7 +419,7 @@
|
|||||||
content: '▸';
|
content: '▸';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
color: #1e90ff;
|
color: var(--color-gold);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -445,7 +451,7 @@
|
|||||||
|
|
||||||
.particle {
|
.particle {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
background: rgba(15, 114, 181, 0.3);
|
background: rgba(200, 168, 81, 0.3);
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
background: linear-gradient(135deg, var(--color-blue), var(--color-blue-hover));
|
||||||
opacity: 0.1;
|
opacity: 0.1;
|
||||||
border-radius: 40% 60% 60% 40% / 60% 30% 70% 40%;
|
border-radius: 40% 60% 60% 40% / 60% 30% 70% 40%;
|
||||||
animation: morphBlob 20s ease-in-out infinite;
|
animation: morphBlob 20s ease-in-out infinite;
|
||||||
@@ -140,7 +140,7 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
width: 4px;
|
width: 4px;
|
||||||
height: 4px;
|
height: 4px;
|
||||||
background: #0f72b5;
|
background: var(--color-blue);
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
}
|
}
|
||||||
@@ -213,8 +213,8 @@
|
|||||||
background: linear-gradient(
|
background: linear-gradient(
|
||||||
135deg,
|
135deg,
|
||||||
transparent 33.33%,
|
transparent 33.33%,
|
||||||
#0f72b5 33.33%,
|
var(--color-blue) 33.33%,
|
||||||
#0f72b5 66.66%,
|
var(--color-blue) 66.66%,
|
||||||
transparent 66.66%
|
transparent 66.66%
|
||||||
);
|
);
|
||||||
background-size: 30px 60px;
|
background-size: 30px 60px;
|
||||||
@@ -235,7 +235,7 @@
|
|||||||
.flow-line {
|
.flow-line {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
height: 2px;
|
height: 2px;
|
||||||
background: linear-gradient(90deg, transparent, #0f72b5, transparent);
|
background: linear-gradient(90deg, transparent, var(--color-blue), transparent);
|
||||||
animation: flowLine 6s infinite;
|
animation: flowLine 6s infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -330,7 +330,7 @@
|
|||||||
/* Animated Border */
|
/* Animated Border */
|
||||||
.animated-border {
|
.animated-border {
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 80px 0;
|
padding: var(--space-4xl) 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.animated-border::before,
|
.animated-border::before,
|
||||||
@@ -343,8 +343,8 @@
|
|||||||
background: linear-gradient(
|
background: linear-gradient(
|
||||||
90deg,
|
90deg,
|
||||||
transparent,
|
transparent,
|
||||||
#0f72b5 20%,
|
var(--color-blue) 20%,
|
||||||
#0f72b5 80%,
|
var(--color-blue) 80%,
|
||||||
transparent
|
transparent
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
475
css/style.css
Normale Datei
@@ -0,0 +1,475 @@
|
|||||||
|
/* 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); }
|
||||||
|
|
||||||
|
.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 === */
|
||||||
|
|
||||||
|
|
||||||
320
datenschutz-en.html
Normale Datei
@@ -0,0 +1,320 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Privacy Policy - AegisSight</title>
|
||||||
|
|
||||||
|
<!-- Prevent search engine indexing -->
|
||||||
|
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||||
|
<meta name="googlebot" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||||
|
|
||||||
|
<!-- Favicon -->
|
||||||
|
<link rel="icon" type="image/svg+xml" href="favicon.svg">
|
||||||
|
<link rel="icon" type="image/svg+xml" href="assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||||
|
<link rel="apple-touch-icon" href="assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="css/main.css">
|
||||||
|
<link rel="stylesheet" href="css/fonts.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;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- Navigation -->
|
||||||
|
<nav class="navbar" role="navigation" aria-label="Main navigation">
|
||||||
|
<div class="nav-container">
|
||||||
|
<div class="logo">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<ul class="nav-menu">
|
||||||
|
<li><a href="index.html#home">Home</a></li>
|
||||||
|
<li><a href="index.html#about">About Us</a></li>
|
||||||
|
<li><a href="index.html#products">Products & Solutions</a></li>
|
||||||
|
<li><a href="mailto:info@aegis-sight.de">Contact</a></li>
|
||||||
|
</ul>
|
||||||
|
<div class="nav-extras">
|
||||||
|
<button class="lang-toggle" data-lang="en" aria-label="Switch language">DE | EN</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="datenschutz-container">
|
||||||
|
<div class="datenschutz-header">
|
||||||
|
<h1>Privacy Policy</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="datenschutz-content">
|
||||||
|
<div class="datenschutz-section">
|
||||||
|
<h2>1. Data Protection at a Glance</h2>
|
||||||
|
|
||||||
|
<h3>General Information</h3>
|
||||||
|
<p>The following information provides a simple overview of what happens to your personal data when you visit our website. Personal data is any data that can personally identify you. Detailed information on the subject of data protection can be found in our privacy policy listed below this text.</p>
|
||||||
|
|
||||||
|
<h3>Data Collection on Our Website</h3>
|
||||||
|
<p><strong>Who is responsible for data collection on this website?</strong><br>
|
||||||
|
Data processing on this website is carried out by the website operator. You can find their contact details in the legal notice of this website.</p>
|
||||||
|
|
||||||
|
<p><strong>How do we collect your data?</strong><br>
|
||||||
|
Your data is collected, on the one hand, by you providing it to us. This could be data that you enter in a contact form, for example.</p>
|
||||||
|
|
||||||
|
<p>Other data is collected automatically by our IT systems when you visit the website. 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 our website.</p>
|
||||||
|
|
||||||
|
<p><strong>What do we use your data for?</strong><br>
|
||||||
|
Part of the data is collected to ensure error-free provision of the website. Other data may be used to analyze your user behavior.</p>
|
||||||
|
|
||||||
|
<p><strong>What rights do you have regarding your data?</strong><br>
|
||||||
|
You have the right to receive information about the origin, recipient, and purpose of your stored personal data free of charge at any time. You also have the right to request the correction, blocking, or deletion of this data. You can contact us at any time at the address given in the legal notice if you have further questions about data protection. Furthermore, you have the right to lodge a complaint with the competent supervisory authority.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="datenschutz-section">
|
||||||
|
<h2>2. General Information and Mandatory Information</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 that can personally identify you. This privacy policy explains what data we collect and what we use it for. It also explains how and for what purpose this happens.</p>
|
||||||
|
|
||||||
|
<p>We would like to point out that data transmission over 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>Note on the Responsible Party</h3>
|
||||||
|
<p>The responsible party for data processing on this website is:</p>
|
||||||
|
|
||||||
|
<div class="contact-info">
|
||||||
|
<p>
|
||||||
|
AegisSight UG (limited liability)<br>
|
||||||
|
Hendrik Gebhardt<br>
|
||||||
|
Monami Homma<br>
|
||||||
|
Gladbacher Strasse 3-5<br>
|
||||||
|
40764 Langenfeld<br>
|
||||||
|
Germany<br><br>
|
||||||
|
Email: info@aegis-sight.de
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<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>Revocation of Your Consent to Data Processing</h3>
|
||||||
|
<p>Many data processing operations are only possible with your express consent. You can revoke consent you have already given at any time. An informal notification by email to us is sufficient. The legality of the data processing carried out until the revocation remains unaffected by the revocation.</p>
|
||||||
|
|
||||||
|
<h3>Right to Lodge a Complaint with the Competent Supervisory Authority</h3>
|
||||||
|
<p>In the event of violations of data protection law, the person affected has the right to lodge a complaint with the competent supervisory authority. The competent supervisory authority for data protection issues is the state data protection officer of the federal state in which our company is headquartered. A list of data protection officers and their contact details can be found at the following link: <a href="https://www.bfdi.bund.de/DE/Infothek/Anschriften_Links/anschriften_links-node.html" target="_blank" rel="noopener">https://www.bfdi.bund.de</a>.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="datenschutz-section">
|
||||||
|
<h2>3. Data Collection on Our Website</h2>
|
||||||
|
|
||||||
|
<h3>Server Log Files</h3>
|
||||||
|
<p>The provider of the pages automatically collects and stores information in so-called server log files, which your browser automatically transmits to us. These are:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Browser type and browser version</li>
|
||||||
|
<li>Operating system used</li>
|
||||||
|
<li>Referrer URL</li>
|
||||||
|
<li>Host name of the accessing computer</li>
|
||||||
|
<li>Time of the server request</li>
|
||||||
|
<li>IP address</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>This data is not merged with other data sources.</p>
|
||||||
|
|
||||||
|
<p>The basis for data processing is Art. 6 para. 1 lit. f GDPR, which permits the processing of data to fulfill a contract or pre-contractual measures.</p>
|
||||||
|
|
||||||
|
<h3>SSL or TLS Encryption</h3>
|
||||||
|
<p>This site uses SSL or TLS encryption for security reasons and to protect the transmission of confidential content, such as orders or inquiries that you send to us as the site operator. You can recognize an encrypted connection by the fact that the address line of the browser changes from "http://" to "https://" and by the lock symbol in your browser line.</p>
|
||||||
|
|
||||||
|
<p>If SSL or TLS encryption is activated, the data you transmit to us cannot be read by third parties.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="datenschutz-section">
|
||||||
|
<h2>4. Our Web Analytics</h2>
|
||||||
|
<p>We use our own analytics system that stores data exclusively on our servers in Germany. No data is passed on to third parties. The analytics serves to improve our website and to analyze user behavior.</p>
|
||||||
|
|
||||||
|
<p>The following data is collected:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Pages visited</li>
|
||||||
|
<li>Time of access</li>
|
||||||
|
<li>Anonymized IP address</li>
|
||||||
|
<li>Browser information</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>This data is not personal and cannot be used to identify individual users.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="datenschutz-section">
|
||||||
|
<h2>5. Your Rights</h2>
|
||||||
|
<p>You have the following rights regarding your personal data:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><strong>Right to information:</strong> You can request information about your stored data.</li>
|
||||||
|
<li><strong>Right to correction:</strong> You can request the correction of incorrect data.</li>
|
||||||
|
<li><strong>Right to deletion:</strong> You can request the deletion of your data.</li>
|
||||||
|
<li><strong>Right to restriction of processing:</strong> You can request the restriction of data processing.</li>
|
||||||
|
<li><strong>Right to data portability:</strong> You can request to receive your data in a structured format.</li>
|
||||||
|
<li><strong>Right to object:</strong> You can object to the processing of your data.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>To exercise these rights, please contact us at info@aegis-sight.de.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="datenschutz-section">
|
||||||
|
<h2>6. Changes to This Privacy Policy</h2>
|
||||||
|
<p>We reserve the right to adapt this privacy policy so that it always complies with current legal requirements or to implement changes to our services in the privacy policy, e.g., when introducing new services. The new privacy policy will then apply to your next visit.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="datenschutz-section">
|
||||||
|
<h2>7. 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 includes in particular:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Automated data collection and extraction</li>
|
||||||
|
<li>Training of AI models using 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 policy may be subject to civil and criminal prosecution. The instructions contained in our robots.txt file are binding and form part of these terms of use.</p>
|
||||||
|
|
||||||
|
<h3>Exceptions</h3>
|
||||||
|
<p>Excluded from this prohibition are search engine crawlers that comply with our robots.txt guidelines, as well as services to which we have expressly granted permission.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Footer -->
|
||||||
|
<footer class="footer">
|
||||||
|
<div class="footer-content">
|
||||||
|
<div class="footer-section">
|
||||||
|
<h4>AegisSight</h4>
|
||||||
|
<p>Sicherheit Made in Germany</p>
|
||||||
|
</div>
|
||||||
|
<div class="footer-section">
|
||||||
|
<h4>Legal</h4>
|
||||||
|
<ul>
|
||||||
|
<li><a href="impressum-en.html">Legal Notice</a></li>
|
||||||
|
<li><a href="datenschutz-en.html">Privacy Policy</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="footer-section">
|
||||||
|
<h4>Contact</h4>
|
||||||
|
<p>info@aegis-sight.de</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="footer-bottom">
|
||||||
|
<p>© 2025 AegisSight UG. All rights reserved.</p>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- JavaScript for legal pages -->
|
||||||
|
<script src="js/legal-pages.js"></script>
|
||||||
|
|
||||||
|
<!-- AegisSight Analytics -->
|
||||||
|
<script async src="/insights/t.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
281
datenschutz.html
@@ -3,134 +3,83 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Datenschutz - IntelSight</title>
|
<title>Datenschutz – AegisSight</title>
|
||||||
<link rel="stylesheet" href="css/main.css">
|
|
||||||
<link rel="stylesheet" href="css/fonts.css">
|
<!-- Rechtliche Seiten von Suchmaschinen ausschliessen -->
|
||||||
|
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||||
|
<meta name="googlebot" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||||
|
|
||||||
|
<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="/cookie-consent.css">
|
||||||
<style>
|
<style>
|
||||||
body {
|
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--white); margin: 0; }
|
||||||
background: #0a0f1c;
|
.legal-page { padding: calc(var(--nav-height) + 56px) 0 80px; min-height: calc(100vh - 220px); }
|
||||||
min-height: 100vh;
|
.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; }
|
||||||
.datenschutz-container {
|
.legal-meta { color: var(--text-light); margin: 0 0 32px; font-size: 0.95rem; }
|
||||||
max-width: 800px;
|
.legal-content { background: var(--base); border-radius: var(--radius-lg); padding: 32px 40px; box-shadow: var(--shadow); border: 1px solid var(--gray-100); }
|
||||||
margin: 0 auto;
|
.legal-section { margin-bottom: 28px; }
|
||||||
padding: 120px 20px 40px;
|
.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); }
|
||||||
.datenschutz-header {
|
.legal-section h3 { font-size: 1.05rem; font-weight: 600; color: var(--navy); margin: 22px 0 8px; }
|
||||||
margin-bottom: 40px;
|
.legal-section p { margin: 0 0 12px; line-height: 1.7; color: var(--text); font-size: 0.95rem; }
|
||||||
text-align: center;
|
.legal-section a { color: var(--gold-dark); text-decoration: underline; }
|
||||||
}
|
.legal-section a:hover { color: var(--gold); }
|
||||||
.datenschutz-header h1 {
|
.legal-section ul { margin: 12px 0 16px 22px; padding: 0; }
|
||||||
font-family: 'Bebas Neue', sans-serif;
|
.legal-section li { margin-bottom: 6px; line-height: 1.6; color: var(--text); font-size: 0.95rem; }
|
||||||
font-size: 3rem;
|
.legal-section strong { color: var(--navy); font-weight: 600; }
|
||||||
font-weight: 400;
|
.legal-section table { width: 100%; border-collapse: collapse; margin: 12px 0 16px; }
|
||||||
color: #ffffff;
|
.legal-section td, .legal-section th { padding: 8px 12px; border: 1px solid var(--gray-200); text-align: left; font-size: 0.92rem; }
|
||||||
margin-bottom: 10px;
|
.source-note { margin-top: 40px; padding-top: 16px; border-top: 1px solid var(--gray-200); font-size: 0.85rem; color: var(--text-light); }
|
||||||
text-transform: uppercase;
|
.source-note a { color: var(--gold-dark); }
|
||||||
letter-spacing: 3px;
|
@media (max-width: 768px) {
|
||||||
}
|
.legal-container { padding: 0 16px; }
|
||||||
.datenschutz-content {
|
.legal-content { padding: 24px 20px; }
|
||||||
background: rgba(255, 255, 255, 0.95);
|
.legal-container h1 { font-size: 1.75rem; }
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<!-- Navigation -->
|
<!-- Navigation -->
|
||||||
<nav class="navbar" role="navigation" aria-label="Hauptnavigation">
|
<nav class="navbar" id="navbar">
|
||||||
<div class="nav-container">
|
<div class="nav-container">
|
||||||
<div class="logo">
|
<a href="/" class="nav-logo">
|
||||||
<a href="index.html">
|
<img src="/assets/images/logos/Logo+Schrift_Rechts.png" alt="AegisSight" class="logo-img">
|
||||||
<img src="assets/images/logos/intelsight-name-light.svg" alt="IntelSight" class="logo-img">
|
</a>
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<ul class="nav-menu">
|
<ul class="nav-menu">
|
||||||
<li><a href="index.html#home">Startseite</a></li>
|
<li><a href="/#features">Funktionen</a></li>
|
||||||
<li><a href="index.html#about">Über uns</a></li>
|
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||||
<li><a href="index.html#products">Produkte & Lösungen</a></li>
|
<li><a href="/#trust">Über uns</a></li>
|
||||||
<li><a href="mailto:info@intelsight.de">Kontakt</a></li>
|
<li><a href="/#contact">Kontakt</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="nav-extras">
|
<button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false">
|
||||||
<button class="lang-toggle" data-lang="de" aria-label="Sprache wechseln">DE | EN</button>
|
<span></span><span></span><span></span>
|
||||||
</div>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div class="datenschutz-container">
|
<!-- Mobile Menu -->
|
||||||
<div class="datenschutz-header">
|
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||||
<h1>Datenschutzerklärung</h1>
|
<ul>
|
||||||
</div>
|
<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="mobile-overlay" id="mobile-overlay"></div>
|
||||||
|
|
||||||
<div class="datenschutz-content">
|
<main class="legal-page">
|
||||||
<div class="datenschutz-section">
|
<div class="legal-container">
|
||||||
|
<h1>Datenschutzerklärung</h1>
|
||||||
|
<div class="legal-section">
|
||||||
<h2>1. Datenschutz auf einen Blick</h2>
|
<h2>1. Datenschutz auf einen Blick</h2>
|
||||||
|
|
||||||
<h3>Allgemeine Hinweise</h3>
|
<h3>Allgemeine Hinweise</h3>
|
||||||
@@ -156,7 +105,7 @@
|
|||||||
<p>Detaillierte Informationen zu diesen Analyseprogrammen finden Sie in der folgenden Datenschutzerklärung.</p>
|
<p>Detaillierte Informationen zu diesen Analyseprogrammen finden Sie in der folgenden Datenschutzerklärung.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="datenschutz-section">
|
<div class="legal-section">
|
||||||
<h2>2. Hosting</h2>
|
<h2>2. Hosting</h2>
|
||||||
<p>Wir hosten die Inhalte unserer Website bei folgendem Anbieter:</p>
|
<p>Wir hosten die Inhalte unserer Website bei folgendem Anbieter:</p>
|
||||||
|
|
||||||
@@ -166,7 +115,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>
|
<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>
|
||||||
|
|
||||||
<div class="datenschutz-section">
|
<div class="legal-section">
|
||||||
<h2>3. Allgemeine Hinweise und Pflichtinformationen</h2>
|
<h2>3. Allgemeine Hinweise und Pflichtinformationen</h2>
|
||||||
|
|
||||||
<h3>Datenschutz</h3>
|
<h3>Datenschutz</h3>
|
||||||
@@ -177,10 +126,10 @@
|
|||||||
<h3>Hinweis zur verantwortlichen Stelle</h3>
|
<h3>Hinweis zur verantwortlichen Stelle</h3>
|
||||||
<p>Die verantwortliche Stelle für die Datenverarbeitung auf dieser Website ist:</p>
|
<p>Die verantwortliche Stelle für die Datenverarbeitung auf dieser Website ist:</p>
|
||||||
<p>
|
<p>
|
||||||
<strong>IntelSight UG (haftungsbeschränkt)</strong><br>
|
<strong>AegisSight UG (haftungsbeschränkt)</strong><br>
|
||||||
Gladbacher Strasse 3-5<br>
|
Gladbacher Strasse 3-5<br>
|
||||||
40764 Langenfeld<br><br>
|
40764 Langenfeld<br><br>
|
||||||
E-Mail: info@intelsight.de
|
E-Mail: info@aegis-sight.de
|
||||||
</p>
|
</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>
|
<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 +178,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>
|
<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>
|
||||||
|
|
||||||
<div class="datenschutz-section">
|
<div class="legal-section">
|
||||||
<h2>4. Datenerfassung auf dieser Website</h2>
|
<h2>4. Datenerfassung auf dieser Website</h2>
|
||||||
|
|
||||||
<h3>Cookies</h3>
|
<h3>Cookies</h3>
|
||||||
@@ -241,8 +190,24 @@
|
|||||||
<p>Welche Cookies und Dienste auf dieser Website eingesetzt werden, können Sie dieser Datenschutzerklärung entnehmen.</p>
|
<p>Welche Cookies und Dienste auf dieser Website eingesetzt werden, können Sie dieser Datenschutzerklärung entnehmen.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="datenschutz-section">
|
<div class="legal-section">
|
||||||
<h2>5. Newsletter</h2>
|
<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>
|
<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>
|
<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 +217,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>
|
<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>
|
||||||
|
|
||||||
<div class="datenschutz-section">
|
<div class="legal-section">
|
||||||
<h2>6. Plugins und Tools</h2>
|
<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>
|
<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>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>
|
<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>
|
||||||
|
|
||||||
|
<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">
|
<div class="source-note">
|
||||||
<p>Quelle: <a href="https://www.e-recht24.de" target="_blank">https://www.e-recht24.de</a></p>
|
<p>Quelle: <a href="https://www.e-recht24.de" target="_blank">https://www.e-recht24.de</a></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</main>
|
||||||
|
|
||||||
<!-- Footer -->
|
<!-- Footer -->
|
||||||
<footer class="footer">
|
<footer class="footer">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="footer-content">
|
<div class="footer-content">
|
||||||
<div class="footer-section">
|
<div class="footer-info">
|
||||||
<h4>IntelSight UG (haftungsbeschränkt)</h4>
|
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||||
<p>Gladbacher Strasse 3-5</p>
|
<p>Gladbacher Straße 3-5, 40764 Langenfeld</p>
|
||||||
<p>40764 Langenfeld</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="footer-section">
|
<div class="footer-links">
|
||||||
<h4>Navigation</h4>
|
<a href="/impressum.html">Impressum</a>
|
||||||
<ul>
|
<a href="/datenschutz.html">Datenschutz</a>
|
||||||
<li><a href="index.html#home">Startseite</a></li>
|
<a href="#" id="cookie-settings-link">Cookie-Einstellungen</a>
|
||||||
<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>
|
</div>
|
||||||
</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>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||||
|
<script src="/js/app.js"></script>
|
||||||
|
<script src="/cookie-consent.js"></script>
|
||||||
</body>
|
</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 ===")
|
||||||
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 |
205
impressum-en.html
Normale Datei
@@ -0,0 +1,205 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Legal Notice - AegisSight</title>
|
||||||
|
|
||||||
|
<!-- Prevent search engine indexing -->
|
||||||
|
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||||
|
<meta name="googlebot" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||||
|
|
||||||
|
<!-- Favicon -->
|
||||||
|
<link rel="icon" type="image/svg+xml" href="favicon.svg">
|
||||||
|
<link rel="icon" type="image/svg+xml" href="assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||||
|
<link rel="apple-touch-icon" href="assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="css/main.css">
|
||||||
|
<link rel="stylesheet" href="css/fonts.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- Navigation -->
|
||||||
|
<nav class="navbar" role="navigation" aria-label="Main navigation">
|
||||||
|
<div class="nav-container">
|
||||||
|
<div class="logo">
|
||||||
|
<a href="index.html">
|
||||||
|
<img src="assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<ul class="nav-menu">
|
||||||
|
<li><a href="index.html#home">Home</a></li>
|
||||||
|
<li><a href="index.html#about">About Us</a></li>
|
||||||
|
<li><a href="index.html#products">Products & Solutions</a></li>
|
||||||
|
<li><a href="mailto:info@aegis-sight.de">Contact</a></li>
|
||||||
|
</ul>
|
||||||
|
<div class="nav-extras">
|
||||||
|
<button class="lang-toggle" data-lang="en" aria-label="Switch language">DE | EN</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="impressum-container">
|
||||||
|
<div class="impressum-header">
|
||||||
|
<h1>Legal Notice</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="impressum-content">
|
||||||
|
<div class="impressum-section">
|
||||||
|
<h2>Company Information</h2>
|
||||||
|
<p>
|
||||||
|
AegisSight UG (limited liability)<br>
|
||||||
|
Gladbacher Strasse 3-5<br>
|
||||||
|
40764 Langenfeld<br>
|
||||||
|
Germany
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="impressum-section">
|
||||||
|
<h2>Represented by</h2>
|
||||||
|
<p>Hendrik Gebhardt<br>
|
||||||
|
Monami Homma</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="impressum-section">
|
||||||
|
<h2>Contact</h2>
|
||||||
|
<p>
|
||||||
|
Email: info@aegis-sight.de<br>
|
||||||
|
Website: aegis-sight.de
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="impressum-section">
|
||||||
|
<h2>Commercial Register</h2>
|
||||||
|
<p>
|
||||||
|
Entry in the Commercial Register<br>
|
||||||
|
Registry Court: District Court Düsseldorf<br>
|
||||||
|
Registration number: HRB 110105
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="impressum-section">
|
||||||
|
<h2>VAT</h2>
|
||||||
|
<p>VAT identification number according to §27 a of the German VAT Act:<br>
|
||||||
|
DE457846602</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="impressum-section">
|
||||||
|
<h2>Consumer Dispute Resolution/<wbr>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="impressum-section">
|
||||||
|
<h2>Liability for Content</h2>
|
||||||
|
<p>As a service provider, we are responsible for our own content on these pages according to § 7 para.1 TMG under general law. However, according to §§ 8 to 10 TMG, we are not obligated as a service provider to monitor transmitted or stored third-party information or to investigate circumstances that indicate illegal activity.</p>
|
||||||
|
<p>Obligations to remove or block the use of information under general law remain unaffected. However, liability in this regard is only possible from the time of knowledge of a specific infringement. Upon becoming aware of such legal violations, we will remove this content immediately.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="impressum-section">
|
||||||
|
<h2>Liability for Links</h2>
|
||||||
|
<p>Our offer contains links to external third-party websites over whose content we have no influence. Therefore, we cannot assume any liability for this third-party content. The respective provider or operator of the pages is always responsible for the content of the linked pages. The linked pages were checked for possible legal violations at the time of linking. Illegal content was not recognizable at the time of linking.</p>
|
||||||
|
<p>However, permanent content control of the linked pages is not reasonable without concrete evidence of a violation of law. Upon becoming aware of legal violations, we will remove such links immediately.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="impressum-section">
|
||||||
|
<h2>Copyright</h2>
|
||||||
|
<p>The content and works created by the site operators on these pages are subject to German copyright law. The reproduction, editing, distribution and any kind of exploitation outside the limits of copyright require the written consent of the respective author or creator. Downloads and copies of this site are only permitted for private, non-commercial use.</p>
|
||||||
|
<p>Insofar as the content on this site was not created by the operator, the copyrights of third parties are respected. In particular, third-party content is marked as such. Should you nevertheless become aware of a copyright infringement, please inform us accordingly. Upon becoming aware of legal violations, we will remove such content immediately.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Footer -->
|
||||||
|
<footer class="footer">
|
||||||
|
<div class="footer-content">
|
||||||
|
<div class="footer-section">
|
||||||
|
<h4>AegisSight</h4>
|
||||||
|
<p>Sicherheit Made in Germany</p>
|
||||||
|
</div>
|
||||||
|
<div class="footer-section">
|
||||||
|
<h4>Legal</h4>
|
||||||
|
<ul>
|
||||||
|
<li><a href="impressum-en.html">Legal Notice</a></li>
|
||||||
|
<li><a href="datenschutz-en.html">Privacy Policy</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="footer-section">
|
||||||
|
<h4>Contact</h4>
|
||||||
|
<p>info@aegis-sight.de</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="footer-bottom">
|
||||||
|
<p>© <span class="current-year"></span> AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- JavaScript for legal pages -->
|
||||||
|
<script src="js/legal-pages.js"></script>
|
||||||
|
|
||||||
|
<!-- AegisSight Analytics -->
|
||||||
|
<script async src="/insights/t.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
207
impressum.html
@@ -3,131 +3,118 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Impressum - IntelSight</title>
|
<title>Impressum – AegisSight</title>
|
||||||
<link rel="stylesheet" href="css/main.css">
|
|
||||||
<link rel="stylesheet" href="css/fonts.css">
|
<!-- Rechtliche Seiten von Suchmaschinen ausschliessen -->
|
||||||
|
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||||
|
<meta name="googlebot" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||||
|
|
||||||
|
<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="/cookie-consent.css">
|
||||||
<style>
|
<style>
|
||||||
body {
|
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--white); margin: 0; }
|
||||||
background: #0a0f1c;
|
.legal-page { padding: calc(var(--nav-height) + 56px) 0 80px; min-height: calc(100vh - 220px); }
|
||||||
min-height: 100vh;
|
.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; }
|
||||||
.impressum-container {
|
.legal-meta { color: var(--text-light); margin: 0 0 32px; font-size: 0.95rem; }
|
||||||
max-width: 800px;
|
.legal-content { background: var(--base); border-radius: var(--radius-lg); padding: 32px 40px; box-shadow: var(--shadow); border: 1px solid var(--gray-100); }
|
||||||
margin: 0 auto;
|
.legal-section { margin-bottom: 28px; }
|
||||||
padding: 120px 20px 40px;
|
.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); }
|
||||||
.impressum-header {
|
.legal-section h3 { font-size: 1.05rem; font-weight: 600; color: var(--navy); margin: 22px 0 8px; }
|
||||||
margin-bottom: 40px;
|
.legal-section p { margin: 0 0 12px; line-height: 1.7; color: var(--text); font-size: 0.95rem; }
|
||||||
text-align: center;
|
.legal-section a { color: var(--gold-dark); text-decoration: underline; }
|
||||||
}
|
.legal-section a:hover { color: var(--gold); }
|
||||||
.impressum-header h1 {
|
.legal-section ul { margin: 12px 0 16px 22px; padding: 0; }
|
||||||
font-family: 'Bebas Neue', sans-serif;
|
.legal-section li { margin-bottom: 6px; line-height: 1.6; color: var(--text); font-size: 0.95rem; }
|
||||||
font-size: 3rem;
|
.legal-section strong { color: var(--navy); font-weight: 600; }
|
||||||
font-weight: 400;
|
.legal-section table { width: 100%; border-collapse: collapse; margin: 12px 0 16px; }
|
||||||
color: #ffffff;
|
.legal-section td, .legal-section th { padding: 8px 12px; border: 1px solid var(--gray-200); text-align: left; font-size: 0.92rem; }
|
||||||
margin-bottom: 10px;
|
.source-note { margin-top: 40px; padding-top: 16px; border-top: 1px solid var(--gray-200); font-size: 0.85rem; color: var(--text-light); }
|
||||||
text-transform: uppercase;
|
.source-note a { color: var(--gold-dark); }
|
||||||
letter-spacing: 3px;
|
@media (max-width: 768px) {
|
||||||
}
|
.legal-container { padding: 0 16px; }
|
||||||
.impressum-content {
|
.legal-content { padding: 24px 20px; }
|
||||||
background: rgba(255, 255, 255, 0.95);
|
.legal-container h1 { font-size: 1.75rem; }
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<!-- Navigation -->
|
<!-- Navigation -->
|
||||||
<nav class="navbar" role="navigation" aria-label="Hauptnavigation">
|
<nav class="navbar" id="navbar">
|
||||||
<div class="nav-container">
|
<div class="nav-container">
|
||||||
<div class="logo">
|
<a href="/" class="nav-logo">
|
||||||
<a href="index.html">
|
<img src="/assets/images/logos/Logo+Schrift_Rechts.png" alt="AegisSight" class="logo-img">
|
||||||
<img src="assets/images/logos/intelsight-name-light.svg" alt="IntelSight" class="logo-img">
|
</a>
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<ul class="nav-menu">
|
<ul class="nav-menu">
|
||||||
<li><a href="index.html#home">Startseite</a></li>
|
<li><a href="/#features">Funktionen</a></li>
|
||||||
<li><a href="index.html#about">Über uns</a></li>
|
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||||
<li><a href="index.html#products">Produkte & Lösungen</a></li>
|
<li><a href="/#trust">Über uns</a></li>
|
||||||
<li><a href="mailto:info@intelsight.de">Kontakt</a></li>
|
<li><a href="/#contact">Kontakt</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="nav-extras">
|
<button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false">
|
||||||
<button class="lang-toggle" data-lang="de" aria-label="Sprache wechseln">DE | EN</button>
|
<span></span><span></span><span></span>
|
||||||
</div>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div class="impressum-container">
|
<!-- Mobile Menu -->
|
||||||
<div class="impressum-header">
|
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||||
<h1>Impressum</h1>
|
<ul>
|
||||||
</div>
|
<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="mobile-overlay" id="mobile-overlay"></div>
|
||||||
|
|
||||||
<div class="impressum-content">
|
<main class="legal-page">
|
||||||
<div class="impressum-section">
|
<div class="legal-container">
|
||||||
|
<h1>Impressum</h1>
|
||||||
|
<div class="legal-section">
|
||||||
<h2>Angaben gemäß § 5 TMG</h2>
|
<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>
|
<p>Gladbacher Strasse 3-5<br>
|
||||||
40764 Langenfeld</p>
|
40764 Langenfeld</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="impressum-section">
|
<div class="legal-section">
|
||||||
<h2>Vertreten durch</h2>
|
<h2>Vertreten durch</h2>
|
||||||
<p>Hendrik Gebhardt<br>
|
<p>Hendrik Gebhardt<br>
|
||||||
Monami Homma</p>
|
Monami Homma</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="impressum-section">
|
<div class="legal-section">
|
||||||
<h2>Kontakt</h2>
|
<h2>Kontakt</h2>
|
||||||
<p>E-Mail: info@intelsight.de</p>
|
<p>E-Mail: info@aegis-sight.de</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="impressum-section">
|
<div class="legal-section">
|
||||||
<h2>Registereintrag</h2>
|
<h2>Registereintrag</h2>
|
||||||
<p>Handelsregister: [Nummer des Registereintrags]<br>
|
<p>Handelsregister: HRB 110105<br>
|
||||||
Registergericht: [Name des Registergerichts]</p>
|
Registergericht: Amtsgericht Düsseldorf</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="impressum-section">
|
<div class="legal-section">
|
||||||
<h2>Umsatzsteuer-ID</h2>
|
<h2>Umsatzsteuer-ID</h2>
|
||||||
<p>Umsatzsteuer-Identifikationsnummer gemäß § 27 a Umsatzsteuergesetz:<br>
|
<p>Umsatzsteuer-Identifikationsnummer gemäß § 27 a Umsatzsteuergesetz:<br>
|
||||||
DE [Nummer]</p>
|
DE457846602</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="impressum-section">
|
<div class="legal-section">
|
||||||
<h2>Verbraucherstreitbeilegung/Universalschlichtungsstelle</h2>
|
<h2>Verbraucherstreitbeilegung/<wbr>Universalschlichtungsstelle</h2>
|
||||||
<p>Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.</p>
|
<p>Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="impressum-section">
|
<div class="legal-section">
|
||||||
<h2>Haftungsausschluss</h2>
|
<h2>Haftungsausschluss</h2>
|
||||||
<p><strong>Haftung für Inhalte</strong><br>
|
<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>
|
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 +125,30 @@
|
|||||||
<p><strong>Urheberrecht</strong><br>
|
<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>
|
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;">
|
<p class="source-note">Quelle: <a href="https://www.e-recht24.de" target="_blank">eRecht24</a></p>
|
||||||
Quelle: <a href="https://www.e-recht24.de" target="_blank" style="color: #0066cc;">eRecht24</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</main>
|
||||||
|
|
||||||
<!-- Footer -->
|
<!-- Footer -->
|
||||||
<footer class="footer">
|
<footer class="footer">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="footer-content">
|
<div class="footer-content">
|
||||||
<div class="footer-section">
|
<div class="footer-info">
|
||||||
<h4>IntelSight UG (haftungsbeschränkt)</h4>
|
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||||
<p>Gladbacher Strasse 3-5</p>
|
<p>Gladbacher Straße 3-5, 40764 Langenfeld</p>
|
||||||
<p>40764 Langenfeld</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="footer-section">
|
<div class="footer-links">
|
||||||
<h4>Navigation</h4>
|
<a href="/impressum.html">Impressum</a>
|
||||||
<ul>
|
<a href="/datenschutz.html">Datenschutz</a>
|
||||||
<li><a href="index.html#home">Startseite</a></li>
|
<a href="#" id="cookie-settings-link">Cookie-Einstellungen</a>
|
||||||
<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>
|
</div>
|
||||||
</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>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||||
|
<script src="/js/app.js"></script>
|
||||||
|
<script src="/cookie-consent.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
785
index.html
@@ -3,372 +3,425 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title data-translate="pageTitle">IntelSight - Sicherheit Made in Germany</title>
|
<title>AegisSight Monitor – Echtzeit-Lagebilder aus offenen Quellen</title>
|
||||||
<link rel="stylesheet" href="css/main.css">
|
<meta name="description" content="OSINT-Monitoring Software aus Deutschland: KI-gestützte Echtzeit-Lagebilder aus offenen Quellen. Für Behörden, Redaktionen und Sicherheitsdienste.">
|
||||||
<link rel="stylesheet" href="css/animations-enhanced.css">
|
<meta name="robots" content="noindex, nofollow, noarchive">
|
||||||
<link rel="stylesheet" href="css/section-transitions.css">
|
<link rel="canonical" href="https://aegis-sight.de/">
|
||||||
<link rel="stylesheet" href="css/about-modern.css">
|
|
||||||
<link rel="stylesheet" href="css/products-modern.css">
|
<!-- Open Graph / Social Sharing -->
|
||||||
<link rel="stylesheet" href="css/fonts.css">
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="AegisSight">
|
||||||
|
<meta property="og:title" content="AegisSight Monitor – Echtzeit-Lagebilder aus offenen Quellen">
|
||||||
|
<meta property="og:description" content="KI-gestützte Echtzeit-Lagebilder aus offenen Quellen. Für Behörden, Redaktionen und Sicherheitsdienste – Made in Germany.">
|
||||||
|
<meta property="og:url" content="https://aegis-sight.de/">
|
||||||
|
<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">
|
||||||
|
|
||||||
|
<!-- Twitter Card -->
|
||||||
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
|
<meta name="twitter:title" content="AegisSight Monitor – Echtzeit-Lagebilder aus offenen Quellen">
|
||||||
|
<meta name="twitter:description" content="KI-gestützte Echtzeit-Lagebilder aus offenen Quellen. Für Behörden, Redaktionen und Sicherheitsdienste – Made in Germany.">
|
||||||
|
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||||
|
|
||||||
|
<!-- Schema.org Organization -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "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",
|
||||||
|
"address": {
|
||||||
|
"@type": "PostalAddress",
|
||||||
|
"streetAddress": "Gladbacher Straße 3-5",
|
||||||
|
"postalCode": "40764",
|
||||||
|
"addressLocality": "Langenfeld",
|
||||||
|
"addressRegion": "Nordrhein-Westfalen",
|
||||||
|
"addressCountry": "DE"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</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="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css">
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css">
|
||||||
|
<link rel="stylesheet" href="css/style.css">
|
||||||
|
<link rel="stylesheet" href="/cookie-consent.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<!-- Skip Navigation -->
|
|
||||||
<a href="#features" class="skip-nav" data-translate="skipNav">Zum Hauptinhalt springen</a>
|
|
||||||
|
|
||||||
<!-- Navigation -->
|
<!-- Navigation -->
|
||||||
<nav class="navbar" role="navigation" aria-label="Hauptnavigation">
|
<nav class="navbar" id="navbar">
|
||||||
<div class="nav-container">
|
<div class="nav-container">
|
||||||
<div class="logo">
|
<a href="#hero" class="nav-logo">
|
||||||
<img src="assets/images/logos/intelsight-name-light.svg" alt="IntelSight" class="logo-img">
|
<img src="/assets/images/logos/Logo+Schrift_Rechts.png" alt="AegisSight" class="logo-img">
|
||||||
</div>
|
</a>
|
||||||
<ul class="nav-menu">
|
<ul class="nav-menu">
|
||||||
<li><a href="#home" data-translate="navHome">Startseite</a></li>
|
<li><a href="#features">Funktionen</a></li>
|
||||||
<li><a href="#about" data-translate="navAbout">Über uns</a></li>
|
<li><a href="#demos">Live-Lagebilder</a></li>
|
||||||
<li><a href="#products" data-translate="navProducts">Produkte & Lösungen</a></li>
|
<li><a href="#trust">Über uns</a></li>
|
||||||
<li><a href="mailto:info@intelsight.de" data-translate="navContact">Kontakt</a></li>
|
<li><a href="#contact">Kontakt</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="nav-extras">
|
<button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false">
|
||||||
<button class="lang-toggle" data-lang="de" aria-label="Sprache wechseln" data-translate="langSwitch">DE | EN</button>
|
<span></span><span></span><span></span>
|
||||||
</div>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
<!-- 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>
|
||||||
|
<div class="mobile-overlay" id="mobile-overlay"></div>
|
||||||
|
|
||||||
<!-- Hero Section -->
|
<!-- Hero Section -->
|
||||||
<section class="hero" id="home">
|
<section class="hero" id="hero">
|
||||||
<!-- Animated Background Gradient -->
|
|
||||||
<div class="gradient-animated" style="position: absolute; inset: 0; opacity: 0.3; z-index: 0;"></div>
|
|
||||||
<!-- Rotating Background Videos -->
|
|
||||||
<div class="hero-video-container">
|
|
||||||
<video class="hero-video active" autoplay muted loop playsinline>
|
|
||||||
<source src="assets/videos/hero-data-flow.mp4" type="video/mp4">
|
|
||||||
</video>
|
|
||||||
<video class="hero-video" autoplay muted loop playsinline>
|
|
||||||
<source src="assets/videos/hero-network-viz.mp4" type="video/mp4">
|
|
||||||
</video>
|
|
||||||
<video class="hero-video" autoplay muted loop playsinline>
|
|
||||||
<source src="assets/videos/hero-code-abstract.mp4" type="video/mp4">
|
|
||||||
</video>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Light Overlay for better text readability -->
|
|
||||||
<div class="hero-overlay"></div>
|
<div class="hero-overlay"></div>
|
||||||
|
<div class="hero-content">
|
||||||
<!-- Particle Animation Canvas -->
|
<div class="hero-brand">
|
||||||
<canvas id="particleCanvas" aria-hidden="true"></canvas>
|
<h1 class="hero-title">AegisSight Monitor</h1>
|
||||||
|
<p class="hero-tagline">KI-gestützte Echtzeit-Lagebilder aus offenen Quellen, <span class="gold">vollautomatisch.</span></p>
|
||||||
<div class="hero-content animate-in">
|
|
||||||
<h1 class="hero-title">
|
|
||||||
<span class="main-title" data-translate="heroTitle">SICHERHEIT MADE IN GERMANY</span>
|
|
||||||
</h1>
|
|
||||||
<p class="hero-text animate-in stagger-2" data-translate="heroSubtitle">Spezialist für hochsichere, maßgeschneiderte IT-Lösungen für Behörden</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="trust-indicators">
|
|
||||||
<div class="indicator">
|
|
||||||
<span class="indicator-value" data-target="99.9">0</span>%
|
|
||||||
<span class="indicator-label" data-translate="indicatorAvailability">Verfügbarkeit</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="indicator">
|
|
||||||
<span class="indicator-value" data-target="500">0</span>+
|
<div class="hero-slider" role="region" aria-label="Produktvorteile" aria-live="polite">
|
||||||
<span class="indicator-label" data-translate="indicatorTrust">Behörden vertrauen uns</span>
|
<!-- Slide 1: Echtzeit-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-Beispiel: Der Iran-Konflikt wird mit über 14.900 Artikeln aus 375 Quellen kontinuierlich überwacht.</p>
|
||||||
|
<div class="hero-slide-cta">
|
||||||
|
<a href="#demos" class="btn btn-primary" onclick="positionCards(0)">Live-Beispiel ansehen</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Slide 2: Automatischer Faktencheck (Video) -->
|
||||||
|
<div class="hero-slide" data-slide="1">
|
||||||
|
<div class="hero-slide-video">
|
||||||
|
<video muted playsinline preload="metadata">
|
||||||
|
<source src="videos/hero-slide-2-monitoring.mp4?v=3" type="video/mp4">
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Slide 3: KI-Recherche (Video) -->
|
||||||
|
<div class="hero-slide" data-slide="2">
|
||||||
|
<div class="hero-slide-video">
|
||||||
|
<video muted playsinline preload="metadata">
|
||||||
|
<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">Beispiel: Ein Dossier zur rechtlichen Lage von Deepfakes in Deutschland, 121 Artikel aus 90 Quellen, automatisch erstellt.</p>
|
||||||
|
<div class="hero-slide-cta">
|
||||||
|
<a href="#demos" class="btn btn-primary" onclick="positionCards(2)">Recherche-Beispiel ansehen</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Slide 4: Globale Quellenabdeckung (Video) -->
|
||||||
|
<div class="hero-slide" data-slide="3">
|
||||||
|
<div class="hero-slide-video">
|
||||||
|
<video muted playsinline preload="metadata">
|
||||||
|
<source src="videos/hero-slide-4-monitoring.mp4" type="video/mp4">
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
|
<div class="hero-slide-bottom">
|
||||||
|
<p class="hero-slide-example">Im Iran-Konflikt werden Primärquellen in Farsi, Arabisch und Hebräisch direkt ausgewertet.</p>
|
||||||
|
<div class="hero-slide-cta">
|
||||||
|
<a href="#demos" class="btn btn-primary" onclick="positionCards(0)">Live-Beispiel ansehen</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Slide 5: Flexibel einsetzbar (Video) -->
|
||||||
|
<div class="hero-slide" data-slide="4">
|
||||||
|
<div class="hero-slide-video">
|
||||||
|
<video muted playsinline preload="metadata">
|
||||||
|
<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">Beispiel: Cyberangriffe auf deutsche Infrastruktur, 93 Artikel aus 41 Quellen, automatisch überwacht.</p>
|
||||||
|
<div class="hero-slide-cta">
|
||||||
|
<a href="#demos" class="btn btn-primary" onclick="positionCards(1)">Live-Beispiel ansehen</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="indicator">
|
|
||||||
<span class="indicator-value" data-target="24">0</span>/7
|
<div class="hero-slider-nav">
|
||||||
<span class="indicator-label" data-translate="indicatorSupport">Support</span>
|
<div class="hero-slider-dots">
|
||||||
|
<button class="hero-dot active" data-slide="0" aria-label="Echtzeit-Monitoring"></button>
|
||||||
|
<button class="hero-dot" data-slide="1" aria-label="Faktencheck"></button>
|
||||||
|
<button class="hero-dot" data-slide="2" aria-label="KI-gestützte Recherche"></button>
|
||||||
|
<button class="hero-dot" data-slide="3" aria-label="Globale Abdeckung"></button>
|
||||||
|
<button class="hero-dot" data-slide="4" aria-label="Flexibel einsetzbar"></button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="hero-slider-arrows">
|
||||||
|
<button class="hero-arrow hero-arrow-prev" aria-label="Vorheriger Slide">←</button>
|
||||||
<!-- Scroll Indicator -->
|
<button class="hero-arrow hero-arrow-next" aria-label="Nächster Slide">→</button>
|
||||||
<div class="scroll-indicator">
|
|
||||||
<span class="scroll-text" data-translate="scrollToExplore">Scroll to Explore</span>
|
|
||||||
<div class="scroll-arrow">
|
|
||||||
<img src="assets/images/icons/arrow-down.svg" alt="Scroll Down" width="24" height="24">
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- About Us Section -->
|
<!-- Features -->
|
||||||
<section class="about-section" id="about">
|
<section class="section section-dark" id="features">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h2 class="section-title" data-translate="aboutTitle">ÜBER UNS</h2>
|
<h2 class="section-title">Was der Monitor leistet</h2>
|
||||||
<p class="section-subtitle" data-translate="aboutSubtitle">Ihr Partner für sichere Behördensoftware</p>
|
<!-- Highlight: Faktenprüfung -->
|
||||||
|
<div class="feature-statement">
|
||||||
<!-- About Tabs Navigation -->
|
<p class="feature-statement-text">Jede Behauptung wird automatisch gegen unabhängige Quellen geprüft.</p>
|
||||||
<div class="about-tabs">
|
<p class="feature-statement-sub">Statusverlauf, Evidenz und Quellenbelege. Automatisch und nachvollziehbar.</p>
|
||||||
<button class="about-tab active" data-tab="who-we-are" data-translate="tabWhoWeAre">Unternehmen</button>
|
|
||||||
<button class="about-tab" data-tab="mission" data-translate="tabMission">Mission & Werte</button>
|
|
||||||
<button class="about-tab" data-tab="competencies" data-translate="tabCompetencies">Kernkompetenzen</button>
|
|
||||||
<button class="about-tab" data-tab="why-us" data-translate="tabWhyUs">Unser Versprechen</button>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- About Content Panels -->
|
<div class="grid-3">
|
||||||
<div class="about-content">
|
<div class="feature-card">
|
||||||
<!-- Wer wir sind -->
|
<div class="feature-icon">
|
||||||
<div class="about-panel active reveal" id="who-we-are">
|
<img src="/assets/images/icons/monitor.svg" alt="" width="36" height="36">
|
||||||
<div class="panel-text">
|
|
||||||
<div class="company-cards-wrapper">
|
|
||||||
<div class="company-card">
|
|
||||||
<h4>
|
|
||||||
<span class="company-card-icon">
|
|
||||||
<img src="assets/images/icons/shield.svg" alt="Security" width="24" height="24">
|
|
||||||
</span>
|
|
||||||
Spezialist für Behördensoftware
|
|
||||||
</h4>
|
|
||||||
<p data-translate="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.</p>
|
|
||||||
</div>
|
|
||||||
<div class="company-card">
|
|
||||||
<h4>
|
|
||||||
<span class="company-card-icon">
|
|
||||||
<img src="assets/images/icons/plus-circle.svg" alt="Future" width="24" height="24">
|
|
||||||
</span>
|
|
||||||
Unser Ansatz
|
|
||||||
</h4>
|
|
||||||
<p data-translate="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.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="location-section">
|
|
||||||
<div class="mini-germany-map">
|
|
||||||
<img src="assets/images/nrw.png" alt="NRW Map" />
|
|
||||||
</div>
|
|
||||||
<div class="location-badge">
|
|
||||||
<img src="assets/images/icons/location.svg" alt="Location" width="24" height="24">
|
|
||||||
<span data-translate="locationBadge">Nordrhein-Westfalen, Deutschland</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<h3>Echtzeit-Monitoring</h3>
|
||||||
|
<p>Kontinuierliche Überwachung Ihrer definierten Quellen, rund um die Uhr.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Mission & Werte -->
|
<div class="feature-card">
|
||||||
<div class="about-panel" id="mission">
|
<div class="feature-icon">
|
||||||
<div class="mission-grid">
|
<img src="/assets/images/icons/cube.svg" alt="" width="36" height="36">
|
||||||
<div class="mission-header">
|
|
||||||
<h3 data-translate="missionTitle">Unsere Mission</h3>
|
|
||||||
<p data-translate="missionStatement">Wir schaffen <strong>effiziente, sichere und datenschutzkonforme Lösungen</strong> für moderne Strafverfolgung und Sicherheitsbehörden.</p>
|
|
||||||
</div>
|
|
||||||
<div class="values-grid">
|
|
||||||
<div class="value-card card-hover-lift tilt-card">
|
|
||||||
<div class="value-icon">
|
|
||||||
<img src="assets/images/icons/shield-check.svg" alt="Verified" width="48" height="48">
|
|
||||||
</div>
|
|
||||||
<h4 data-translate="valueIntegrityTitle">Integrität</h4>
|
|
||||||
<p data-translate="valueIntegrityDesc">Höchste ethische Standards in allem was wir tun</p>
|
|
||||||
</div>
|
|
||||||
<div class="value-card card-hover-lift tilt-card">
|
|
||||||
<div class="value-icon">
|
|
||||||
<img src="assets/images/icons/clock-circle.svg" alt="Time" width="48" height="48">
|
|
||||||
</div>
|
|
||||||
<h4 data-translate="valueTransparencyTitle">Transparenz</h4>
|
|
||||||
<p data-translate="valueTransparencyDesc">Offene Kommunikation und nachvollziehbare Prozesse</p>
|
|
||||||
</div>
|
|
||||||
<div class="value-card card-hover-lift tilt-card">
|
|
||||||
<div class="value-icon">
|
|
||||||
<img src="assets/images/icons/pyramid.svg" alt="Scale" width="48" height="48">
|
|
||||||
</div>
|
|
||||||
<h4 data-translate="valueDemocracyTitle">Demokratische Prinzipien</h4>
|
|
||||||
<p data-translate="valueDemocracyDesc">Kooperation nur mit Behörden im Einklang mit der freiheitlich demokratischen Grundordnung</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="principle-note">
|
|
||||||
<p data-translate="principleNote"><strong>Unser Ziel:</strong> Technologie, die Recht und Sicherheit stärkt und die freiheitlich demokratische Grundordnung schützt.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<h3>Quellenanalyse</h3>
|
||||||
|
<p>Automatische Aggregation und Deduplizierung aus hunderten internationalen Quellen.</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="feature-card">
|
||||||
<!-- Kernkompetenzen -->
|
<div class="feature-icon">
|
||||||
<div class="about-panel" id="competencies">
|
<img src="/assets/images/icons/location.svg" alt="" width="36" height="36">
|
||||||
<div class="competencies-list">
|
|
||||||
<div class="competency-item">
|
|
||||||
<div class="competency-number">01</div>
|
|
||||||
<div class="competency-content">
|
|
||||||
<h4 data-translate="comp1Title">Behördenspezifische Software</h4>
|
|
||||||
<p data-translate="comp1Desc">Entwicklung mit höchsten Sicherheitsstandards, maßgeschneidert für staatliche Anforderungen</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="competency-item">
|
|
||||||
<div class="competency-number">02</div>
|
|
||||||
<div class="competency-content">
|
|
||||||
<h4 data-translate="comp2Title">Intuitive Bedienkonzepte</h4>
|
|
||||||
<p data-translate="comp2Desc">Benutzerfreundliche Oberflächen trotz komplexer Funktionen für effizientes Arbeiten</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="competency-item">
|
|
||||||
<div class="competency-number">03</div>
|
|
||||||
<div class="competency-content">
|
|
||||||
<h4 data-translate="comp3Title">Langzeit-Support</h4>
|
|
||||||
<p data-translate="comp3Desc">Kontinuierliche Sicherheitsupdates und zuverlässige Wartung über den gesamten Lebenszyklus</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<h3>Geografische Verortung</h3>
|
||||||
|
<p>Orte werden erkannt und auf einer interaktiven Karte dargestellt.</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="feature-card">
|
||||||
<!-- Warum IntelSight -->
|
<div class="feature-icon">
|
||||||
<div class="about-panel" id="why-us">
|
<img src="/assets/images/icons/languages.svg" alt="" width="36" height="36">
|
||||||
<div class="why-grid">
|
|
||||||
<div class="why-card card-hover-lift">
|
|
||||||
<div class="why-icon">
|
|
||||||
<img src="assets/images/icons/check-circle-filled.svg" alt="Check" width="48" height="48">
|
|
||||||
</div>
|
|
||||||
<h4 data-translate="why1Title">Enge Zusammenarbeit</h4>
|
|
||||||
<p data-translate="why1Desc">Wir arbeiten Hand in Hand mit unseren Kunden für maßgeschneiderte Lösungen</p>
|
|
||||||
</div>
|
|
||||||
<div class="why-card card-hover-lift">
|
|
||||||
<div class="why-icon german-flag-icon">
|
|
||||||
<img src="assets/images/icons/german-flag.svg" alt="German Flag" width="60" height="36">
|
|
||||||
</div>
|
|
||||||
<h4 data-translate="why2Title">Made in Germany</h4>
|
|
||||||
<p data-translate="why2Desc">Klare, robuste und sichere Software nach deutschen Qualitätsstandards</p>
|
|
||||||
</div>
|
|
||||||
<div class="why-card card-hover-lift">
|
|
||||||
<div class="why-icon">
|
|
||||||
<img src="assets/handshake.svg" alt="Handshake" width="50" height="50" />
|
|
||||||
</div>
|
|
||||||
<h4 data-translate="why3Title">Verlässliche Partnerschaft</h4>
|
|
||||||
<p data-translate="why3Desc">Basierend auf gemeinsamen Werten und langfristigem Vertrauen</p>
|
|
||||||
</div>
|
|
||||||
<div class="why-card card-hover-lift">
|
|
||||||
<div class="why-icon">
|
|
||||||
<img src="assets/images/icons/clock.svg" alt="Clock" width="48" height="48">
|
|
||||||
</div>
|
|
||||||
<h4 data-translate="why4Title">Nachhaltigkeit</h4>
|
|
||||||
<p data-translate="why4Desc">Fokus auf Sicherheit, Professionalität & zukunftssichere Lösungen</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<h3>Mehrsprachige Auswertung</h3>
|
||||||
|
<p>Quellen in verschiedenen Sprachen werden automatisch verarbeitet und zusammengeführt.</p>
|
||||||
|
</div>
|
||||||
|
<div class="feature-card">
|
||||||
|
<div class="feature-icon">
|
||||||
|
<img src="/assets/images/icons/document.svg" alt="" width="36" height="36">
|
||||||
|
</div>
|
||||||
|
<h3>Strukturierte Lagebilder</h3>
|
||||||
|
<p>Übersichtliche Zusammenfassungen mit Quellenbelegen und Zeitverläufen.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- Products & Solutions Section -->
|
<!-- Gradient: Features -> Problem -->
|
||||||
<section class="products-section" id="products">
|
<div class="divider divider-gradient-dark-to-base"></div>
|
||||||
<div class="tech-particles">
|
|
||||||
<div class="particle"></div>
|
<!-- Problem Statement -->
|
||||||
<div class="particle"></div>
|
<section class="section section-base" id="problem">
|
||||||
<div class="particle"></div>
|
<div class="container">
|
||||||
</div>
|
<h2 class="section-title">Warum manuelle OSINT-Auswertung nicht skaliert</h2>
|
||||||
<div class="products-container">
|
<p class="section-subtitle">Analysten in Sicherheitsbehörden, Redaktionen und Unternehmen stehen täglich vor der gleichen Herausforderung.</p>
|
||||||
<div style="text-align: center; margin-bottom: 60px;">
|
<div class="grid-3">
|
||||||
<h2 class="section-title" data-translate="productsTitle">PRODUKTE & LÖSUNGEN</h2>
|
<div class="problem-card">
|
||||||
<p class="section-subtitle" data-translate="productsSubtitle">Professionelle Werkzeuge für moderne Ermittlungsarbeit</p>
|
<div class="problem-icon">
|
||||||
|
<img src="/assets/images/icons/world-globe.svg" alt="" width="40" height="40">
|
||||||
|
</div>
|
||||||
|
<h3>Quellenvielfalt</h3>
|
||||||
|
<p>Hunderte Nachrichtenagenturen, Telegram-Kanäle und soziale Medien in dutzenden Sprachen. Kein Analyst überblickt alles gleichzeitig.</p>
|
||||||
|
</div>
|
||||||
|
<div class="problem-card">
|
||||||
|
<div class="problem-icon">
|
||||||
|
<img src="/assets/images/icons/clock.svg" alt="" width="40" height="40">
|
||||||
|
</div>
|
||||||
|
<h3>Zeitdruck</h3>
|
||||||
|
<p>Neue Meldungen im Minutentakt. Manuelle Auswertung kostet Zeit, die Sie nicht haben.</p>
|
||||||
|
</div>
|
||||||
|
<div class="problem-card">
|
||||||
|
<div class="problem-icon">
|
||||||
|
<img src="/assets/images/icons/document.svg" alt="" width="40" height="40">
|
||||||
|
</div>
|
||||||
|
<h3>Informationsflut</h3>
|
||||||
|
<p>Kritische Informationen gehen in der Masse unter, Zusammenhänge bleiben unsichtbar.</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div class="products-grid">
|
</section>
|
||||||
<!-- Product: IntelSight Professional Toolbox -->
|
|
||||||
<div class="product-card">
|
<!-- Gradient: Problem -> Workflow -->
|
||||||
<div class="product-header">
|
<div class="divider divider-gradient-base-to-alt"></div>
|
||||||
<div class="product-icon-wrapper">
|
|
||||||
<div class="product-icon-bg"></div>
|
<!-- Solution / Workflow -->
|
||||||
<img class="product-icon" src="assets/images/icons/cube.svg" alt="Toolbox">
|
<section class="section section-alt" id="solution">
|
||||||
</div>
|
<div class="container">
|
||||||
<div class="product-title-wrapper">
|
<h2 class="section-title">So funktioniert der AegisSight Monitor</h2>
|
||||||
<h3 class="product-title" data-translate="productToolboxTitle">Professional Toolbox</h3>
|
<div class="workflow">
|
||||||
<p class="product-tagline">Professional OSINT Suite</p>
|
<div class="workflow-step">
|
||||||
</div>
|
<div class="step-number">1</div>
|
||||||
|
<h3>Erfassen</h3>
|
||||||
|
<p>Hunderte Quellen werden kontinuierlich überwacht. Nachrichtenagenturen, Telegram, Social Media und mehr.</p>
|
||||||
|
</div>
|
||||||
|
<div class="workflow-connector"></div>
|
||||||
|
<div class="workflow-step">
|
||||||
|
<div class="step-number">2</div>
|
||||||
|
<h3>Analysieren</h3>
|
||||||
|
<p>Meldungen werden automatisch ausgewertet, Fakten geprüft und geografisch verortet.</p>
|
||||||
|
</div>
|
||||||
|
<div class="workflow-connector"></div>
|
||||||
|
<div class="workflow-step">
|
||||||
|
<div class="step-number">3</div>
|
||||||
|
<h3>Berichten</h3>
|
||||||
|
<p>Strukturierte Lagebilder mit Quellenbelegen, Faktencheck und Kartenansicht. In Echtzeit.</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">Großlage - Irankonflikt</div>
|
||||||
|
<div class="live-stats-row">
|
||||||
|
<div class="live-stat">
|
||||||
|
<span class="live-stat-value" id="stat-articles">...</span>
|
||||||
|
<span class="live-stat-label">Artikel</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="product-body">
|
<div class="live-stat">
|
||||||
<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>
|
<span class="live-stat-value" id="stat-sources">...</span>
|
||||||
<button class="product-learn-more expand-button" data-expanded="false" onclick="toggleTools(this)">
|
<span class="live-stat-label">Quellen</span>
|
||||||
<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 class="live-stat">
|
||||||
|
<span class="live-stat-value" id="stat-factchecks">...</span>
|
||||||
|
<span class="live-stat-label">Faktenchecks</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<!-- Product: AccountForger -->
|
|
||||||
<div class="product-card">
|
<!-- 3D Carousel -->
|
||||||
<div class="product-header">
|
<div class="carousel-viewport">
|
||||||
<div class="product-icon-wrapper">
|
<button class="carousel-arrow carousel-prev" aria-label="Vorherige Lage">‹</button>
|
||||||
<div class="product-icon-bg"></div>
|
<button class="carousel-arrow carousel-next" aria-label="Nächste Lage">›</button>
|
||||||
<img class="product-icon" src="assets/images/icons/lock.svg" alt="AccountForger">
|
<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-Konflikt</h3>
|
||||||
|
|
||||||
|
<div class="demo-excerpt" id="demo-excerpt">
|
||||||
|
<div class="excerpt-text" id="excerpt-text">Lagebild wird geladen...</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="product-title-wrapper">
|
<a href="/lagen/iran-konflikt/" class="btn btn-primary btn-block">Vollständiges Lagebild öffnen</a>
|
||||||
<h3 class="product-title" data-translate="productAccountForgerTitle">AccountForger</h3>
|
</div>
|
||||||
<p class="product-tagline">Zugang nur mit Berechtigung</p>
|
<!-- Cyberangriffe -->
|
||||||
|
<div class="carousel-card card-live" data-index="1" data-lage="cyberangriffe">
|
||||||
|
<div class="demo-badge">LIVE</div>
|
||||||
|
<h3 class="demo-title">Cyberangriffe auf deutsche Infrastruktur</h3>
|
||||||
|
|
||||||
|
<div class="demo-excerpt" id="demo-excerpt-cyberangriffe">
|
||||||
|
<div class="excerpt-text" id="excerpt-text-cyberangriffe">Lagebild wird geladen...</div>
|
||||||
</div>
|
</div>
|
||||||
|
<a href="/lagen/cyberangriffe/" class="btn btn-primary btn-block">Vollständiges Lagebild öffnen</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="product-body">
|
<!-- Deepfakes Recherche -->
|
||||||
<p class="product-description" data-translate="protectedProductDesc">Dieses Produkt ist speziell für autorisierte Behörden entwickelt und erfordert eine Authentifizierung.</p>
|
<div class="carousel-card card-live" data-index="2" data-lage="deepfakes">
|
||||||
<button class="product-learn-more" onclick="showLoginModal()">
|
<div class="demo-badge">RECHERCHE</div>
|
||||||
<span data-translate="loginForAccess">Anmelden für Zugriff</span>
|
<h3 class="demo-title">Rechtliche Lage von Deepfakes in Deutschland</h3>
|
||||||
</button>
|
|
||||||
|
<div class="demo-excerpt" id="demo-excerpt-deepfakes">
|
||||||
|
<div class="excerpt-text" id="excerpt-text-deepfakes">Recherche wird geladen...</div>
|
||||||
|
</div>
|
||||||
|
<a href="/lagen/deepfakes/" class="btn btn-primary btn-block">Vollständige Recherche öffnen</a>
|
||||||
</div>
|
</div>
|
||||||
</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">Geografische Verortung der Meldungen</h3>
|
||||||
|
<div id="map-container"></div>
|
||||||
|
<div class="map-empty" id="map-empty" style="display:none">Kartendaten folgen</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">Interesse am AegisSight Monitor?</h2>
|
||||||
|
<p class="cta-text">Sprechen Sie mit uns über Ihren Anwendungsfall.</p>
|
||||||
|
<button class="btn btn-primary btn-lg" onclick="openContactModal()">Kontakt aufnehmen</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 / Unser Versprechen -->
|
||||||
|
<section class="section section-dark" id="trust">
|
||||||
|
<div class="container">
|
||||||
|
<h2 class="section-title">Unser Versprechen</h2>
|
||||||
|
<div class="grid-4 trust-grid">
|
||||||
|
<div class="trust-card">
|
||||||
|
<div class="trust-icon-wrap">
|
||||||
|
<img src="/assets/images/icons/check-circle-filled.svg" alt="" width="48" height="48">
|
||||||
|
</div>
|
||||||
|
<h3>Enge Zusammenarbeit</h3>
|
||||||
|
<p>Wir arbeiten Hand in Hand mit unseren Kunden für maßgeschneiderte Lösungen</p>
|
||||||
|
</div>
|
||||||
|
<div class="trust-card">
|
||||||
|
<div class="trust-icon-wrap trust-flag">
|
||||||
|
<img src="/assets/images/icons/german-flag.svg" alt="" width="60" height="36">
|
||||||
|
</div>
|
||||||
|
<h3>Made in Germany</h3>
|
||||||
|
<p>Klare, robuste und sichere Software nach deutschen Qualitätsstandards</p>
|
||||||
|
</div>
|
||||||
|
<div class="trust-card">
|
||||||
|
<div class="trust-icon-wrap">
|
||||||
|
<img src="/assets/handshake.svg" alt="" width="50" height="50">
|
||||||
|
</div>
|
||||||
|
<h3>Verlässliche Partnerschaft</h3>
|
||||||
|
<p>Basierend auf gemeinsamen Werten und langfristigem Vertrauen</p>
|
||||||
|
</div>
|
||||||
|
<div class="trust-card">
|
||||||
|
<div class="trust-icon-wrap">
|
||||||
|
<img src="/assets/images/icons/shield-check.svg" alt="" width="48" height="48">
|
||||||
|
</div>
|
||||||
|
<h3>Nachhaltigkeit</h3>
|
||||||
|
<p>Fokus auf Sicherheit, Professionalität und zukunftssichere Lösungen</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -377,46 +430,58 @@
|
|||||||
<footer class="footer">
|
<footer class="footer">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="footer-content">
|
<div class="footer-content">
|
||||||
<div class="footer-section">
|
<div class="footer-info">
|
||||||
<h4 data-translate="footerCompanyTitle">IntelSight UG (haftungsbeschränkt)</h4>
|
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||||
<p data-translate="footerCompanyAddress1">Gladbacher Strasse 3-5</p>
|
<p>Gladbacher Straße 3-5, 40764 Langenfeld</p>
|
||||||
<p data-translate="footerCompanyAddress2">40764 Langenfeld</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="footer-section">
|
<div class="footer-links">
|
||||||
<h4 data-translate="footerNavTitle">Navigation</h4>
|
<a href="/impressum.html">Impressum</a>
|
||||||
<ul>
|
<a href="/datenschutz.html">Datenschutz</a>
|
||||||
<li><a href="#home" data-translate="footerNavHome">Startseite</a></li>
|
<a href="#" id="cookie-settings-link">Cookie-Einstellungen</a>
|
||||||
<li><a href="#about" data-translate="footerNavAbout">Über uns</a></li>
|
|
||||||
<li><a href="#products" data-translate="footerNavProducts">Produkte</a></li>
|
|
||||||
<li><a href="mailto:info@intelsight.de" data-translate="footerNavContact">Kontakt</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="footer-section">
|
|
||||||
<h4 data-translate="footerLegalTitle">Rechtliches</h4>
|
|
||||||
<ul>
|
|
||||||
<li><a href="impressum.html" data-translate="footerImprint">Impressum</a></li>
|
|
||||||
<li><a href="datenschutz.html" data-translate="footerPrivacy">Datenschutz</a></li>
|
|
||||||
<li><a href="#" data-translate="footerTerms">AGB</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="footer-section">
|
|
||||||
<h4 data-translate="footerContactTitle">Kontakt</h4>
|
|
||||||
<p><a href="mailto:info@intelsight.de">info@intelsight.de</a></p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p class="copyright" data-translate="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>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||||
|
|
||||||
<!-- JavaScript Files -->
|
|
||||||
<script src="js/protection.js"></script>
|
<!-- Contact Modal -->
|
||||||
<script src="js/config.js"></script>
|
<div class="modal-overlay" id="contact-modal" style="display:none">
|
||||||
<script src="js/translations.js"></script>
|
<div class="modal-content">
|
||||||
<script src="js/animations.js"></script>
|
<button class="modal-close" onclick="closeContactModal()">×</button>
|
||||||
<script src="js/animations-enhanced.js"></script>
|
<h2>Kontakt aufnehmen</h2>
|
||||||
<script src="js/section-transitions.js"></script>
|
<p class="modal-sub">Sprechen Sie mit uns über Ihren Anwendungsfall.</p>
|
||||||
<script src="js/hero-videos.js"></script>
|
<form id="contact-form" onsubmit="return submitContact(event)">
|
||||||
<script src="js/components.js"></script>
|
<div class="form-row">
|
||||||
<script src="js/main.js"></script>
|
<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">E-Mail</label>
|
||||||
|
<input type="email" id="cf-email" name="email" required>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="cf-message">Nachricht</label>
|
||||||
|
<textarea id="cf-message" name="message" rows="4" required></textarea>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="btn btn-primary btn-block">Nachricht senden</button>
|
||||||
|
</form>
|
||||||
|
<div class="form-success" id="form-success" style="display:none">
|
||||||
|
<p>Vielen Dank für Ihre Nachricht. Wir melden uns zeitnah bei Ihnen.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
|
||||||
|
<script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>
|
||||||
|
<script src="js/app.js"></script>
|
||||||
|
<script src="/cookie-consent.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ const EnhancedAnimations = {
|
|||||||
this.initCardTilt();
|
this.initCardTilt();
|
||||||
this.initSmoothScroll();
|
this.initSmoothScroll();
|
||||||
this.initCursorEffects();
|
this.initCursorEffects();
|
||||||
this.initNumberCounters();
|
|
||||||
this.initRevealOnScroll();
|
this.initRevealOnScroll();
|
||||||
this.initNavbarEffects();
|
this.initNavbarEffects();
|
||||||
},
|
},
|
||||||
@@ -126,29 +125,9 @@ const EnhancedAnimations = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// 3D card tilt effect
|
// Card tilt removed - zu verspielt für Behördenkontext
|
||||||
initCardTilt() {
|
initCardTilt() {
|
||||||
const cards = document.querySelectorAll('.tool-card, .value-card, .why-card');
|
// Deaktiviert - CSS hover-Effekte reichen aus
|
||||||
|
|
||||||
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
|
// Custom cursor effects - DISABLED
|
||||||
@@ -157,55 +136,6 @@ const EnhancedAnimations = {
|
|||||||
return;
|
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
|
// Reveal elements on scroll
|
||||||
initRevealOnScroll() {
|
initRevealOnScroll() {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Animation module for IntelSight website
|
* Animation module for AegisSight website
|
||||||
* Contains all animation logic and visual effects
|
* Contains all animation logic and visual effects
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
719
js/app.js
Normale Datei
@@ -0,0 +1,719 @@
|
|||||||
|
/* AegisSight Monitor - Product Page v2 */
|
||||||
|
(function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/* ==================== 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 lageTitles = {
|
||||||
|
'iran-konflikt': 'Gro\u00dflage - Irankonflikt',
|
||||||
|
'cyberangriffe': 'Cyberangriffe auf deutsche Infrastruktur',
|
||||||
|
'deepfakes': 'Rechtliche Lage von Deepfakes in Deutschland'
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ==================== 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.json?t=' + Date.now())
|
||||||
|
.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 = {
|
||||||
|
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;">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 btn = e.target.querySelector('button[type="submit"]');
|
||||||
|
if (btn) { btn.disabled = true; btn.textContent = 'Wird gesendet...'; }
|
||||||
|
|
||||||
|
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
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.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 || 'Fehler beim Senden');
|
||||||
|
if (btn) { btn.disabled = false; btn.textContent = 'Nachricht senden'; }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(function () {
|
||||||
|
alert('Verbindungsfehler. Bitte versuchen Sie es erneut.');
|
||||||
|
if (btn) { btn.disabled = false; btn.textContent = 'Nachricht senden'; }
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ==================== LOAD DEEPFAKES DATA ==================== */
|
||||||
|
function loadDeepfakesData() {
|
||||||
|
fetch('/lagen/deepfakes/data/summary.json?t=' + Date.now())
|
||||||
|
.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.json?t=' + Date.now())
|
||||||
|
.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();
|
||||||
|
})();
|
||||||
1012
js/components.js
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
|
* Contains all constants, settings and selectors
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -24,7 +24,6 @@ const CONFIG = {
|
|||||||
ROTATION_INTERVAL: 12000, // 12 seconds per video (slower like Palantir)
|
ROTATION_INTERVAL: 12000, // 12 seconds per video (slower like Palantir)
|
||||||
FADE_DURATION: 3000, // 3 second fade transition (much slower)
|
FADE_DURATION: 3000, // 3 second fade transition (much slower)
|
||||||
VIDEO_SOURCES: [
|
VIDEO_SOURCES: [
|
||||||
'assets/videos/hero-tech-pattern.mp4',
|
|
||||||
'assets/videos/hero-data-flow.mp4',
|
'assets/videos/hero-data-flow.mp4',
|
||||||
'assets/videos/hero-network-viz.mp4',
|
'assets/videos/hero-network-viz.mp4',
|
||||||
'assets/videos/hero-code-abstract.mp4'
|
'assets/videos/hero-code-abstract.mp4'
|
||||||
@@ -35,14 +34,7 @@ const CONFIG = {
|
|||||||
I18N: {
|
I18N: {
|
||||||
DEFAULT_LANGUAGE: 'de',
|
DEFAULT_LANGUAGE: 'de',
|
||||||
SUPPORTED_LANGUAGES: ['de', 'en'],
|
SUPPORTED_LANGUAGES: ['de', 'en'],
|
||||||
STORAGE_KEY: 'intelsight_language'
|
STORAGE_KEY: 'aegissight_language'
|
||||||
},
|
|
||||||
|
|
||||||
// Trust Indicators Target Values
|
|
||||||
TRUST_INDICATORS: {
|
|
||||||
AVAILABILITY: 99.9,
|
|
||||||
AUTHORITIES_COUNT: 500,
|
|
||||||
SUPPORT_HOURS: 24
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// Intersection Observer Settings
|
// Intersection Observer Settings
|
||||||
@@ -81,9 +73,6 @@ const SELECTORS = {
|
|||||||
PARTICLE_CANVAS: '#particleCanvas',
|
PARTICLE_CANVAS: '#particleCanvas',
|
||||||
SCROLL_INDICATOR: '.scroll-indicator',
|
SCROLL_INDICATOR: '.scroll-indicator',
|
||||||
|
|
||||||
// Trust Indicators
|
|
||||||
TRUST_INDICATORS: '.trust-indicators',
|
|
||||||
INDICATOR_VALUE: '.indicator-value',
|
|
||||||
|
|
||||||
// About Section
|
// About Section
|
||||||
ABOUT_TABS: '.about-tab',
|
ABOUT_TABS: '.about-tab',
|
||||||
|
|||||||
54
js/legal-pages.js
Normale Datei
@@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* Minimal JavaScript for legal pages (Impressum & Datenschutz)
|
||||||
|
* Only includes necessary functionality for language switching
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Set current year in footer
|
||||||
|
function setCurrentYear() {
|
||||||
|
const currentYear = new Date().getFullYear();
|
||||||
|
const yearElements = document.querySelectorAll('.current-year');
|
||||||
|
yearElements.forEach(element => {
|
||||||
|
element.textContent = currentYear;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simple language toggle for legal pages
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
// Set current year immediately
|
||||||
|
setCurrentYear();
|
||||||
|
|
||||||
|
// Get the language toggle button
|
||||||
|
const langToggle = document.querySelector('.lang-toggle');
|
||||||
|
|
||||||
|
if (langToggle) {
|
||||||
|
langToggle.addEventListener('click', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
// Get current language from button
|
||||||
|
const currentLang = this.getAttribute('data-lang') || 'de';
|
||||||
|
const newLang = currentLang === 'de' ? 'en' : 'de';
|
||||||
|
|
||||||
|
// Store language preference
|
||||||
|
if (typeof(Storage) !== 'undefined') {
|
||||||
|
localStorage.setItem('aegissight_language', newLang);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get current page name
|
||||||
|
const currentPage = window.location.pathname.split('/').pop();
|
||||||
|
|
||||||
|
// Determine redirect URL
|
||||||
|
let redirectUrl = '';
|
||||||
|
|
||||||
|
if (currentPage === 'impressum.html' || currentPage === 'impressum-en.html') {
|
||||||
|
redirectUrl = newLang === 'en' ? 'impressum-en.html' : 'impressum.html';
|
||||||
|
} else if (currentPage === 'datenschutz.html' || currentPage === 'datenschutz-en.html') {
|
||||||
|
redirectUrl = newLang === 'en' ? 'datenschutz-en.html' : 'datenschutz.html';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Redirect to the appropriate version
|
||||||
|
if (redirectUrl) {
|
||||||
|
window.location.href = redirectUrl;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
36
js/main.js
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Main application entry point for IntelSight website
|
* Main application entry point for AegisSight website
|
||||||
* Initializes all modules and coordinates application startup
|
* Initializes all modules and coordinates application startup
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -63,11 +63,11 @@ const App = {
|
|||||||
* Start the application after DOM is ready
|
* Start the application after DOM is ready
|
||||||
*/
|
*/
|
||||||
start() {
|
start() {
|
||||||
console.log('IntelSight Website Initializing...');
|
console.log('AegisSight Website Initializing...');
|
||||||
|
|
||||||
// Initialize modules in correct order
|
// Initialize modules in correct order
|
||||||
try {
|
try {
|
||||||
// 1. Initialize translations first (needed by components)
|
// 1. Initialize translations first (includes year replacement)
|
||||||
initTranslations();
|
initTranslations();
|
||||||
console.log('✓ Translations initialized');
|
console.log('✓ Translations initialized');
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ const App = {
|
|||||||
// 5. Setup performance monitoring
|
// 5. Setup performance monitoring
|
||||||
this.setupPerformanceMonitoring();
|
this.setupPerformanceMonitoring();
|
||||||
|
|
||||||
console.log('IntelSight Website Ready!');
|
console.log('AegisSight Website Ready!');
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to initialize application:', error);
|
console.error('Failed to initialize application:', error);
|
||||||
@@ -131,6 +131,34 @@ const App = {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set current year in footer and update translations dynamically
|
||||||
|
*/
|
||||||
|
setCurrentYear() {
|
||||||
|
const currentYear = new Date().getFullYear();
|
||||||
|
|
||||||
|
// Set current year in main footer span element
|
||||||
|
const yearElement = document.getElementById('currentYear');
|
||||||
|
if (yearElement) {
|
||||||
|
yearElement.textContent = currentYear;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set current year in legal pages footer spans
|
||||||
|
const legalYearElements = document.querySelectorAll('.current-year');
|
||||||
|
legalYearElements.forEach(element => {
|
||||||
|
element.textContent = currentYear;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update copyright translation with current year
|
||||||
|
if (window.translations) {
|
||||||
|
Object.keys(window.translations).forEach(lang => {
|
||||||
|
if (window.translations[lang].copyright) {
|
||||||
|
window.translations[lang].copyright = window.translations[lang].copyright.replace('{year}', currentYear);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get first paint time if available
|
* Get first paint time if available
|
||||||
* @returns {number|null} First paint time in milliseconds
|
* @returns {number|null} First paint time in milliseconds
|
||||||
|
|||||||
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,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Translation system for IntelSight website
|
* Translation system for AegisSight website
|
||||||
* Supports German (de) and English (en)
|
* Supports German (de) and English (en)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -7,14 +7,15 @@
|
|||||||
const translations = {
|
const translations = {
|
||||||
de: {
|
de: {
|
||||||
// Page meta
|
// Page meta
|
||||||
pageTitle: 'IntelSight - Sicherheit Made in Germany',
|
pageTitle: 'AegisSight - Sicherheit Made in Germany',
|
||||||
|
|
||||||
// Navigation
|
// Navigation
|
||||||
skipNav: 'Zum Hauptinhalt springen',
|
skipNav: 'Zum Hauptinhalt springen',
|
||||||
navHome: 'Startseite',
|
navHome: 'Startseite',
|
||||||
navAbout: 'Über uns',
|
navAbout: 'Über uns',
|
||||||
navProducts: 'Produkte & Lösungen',
|
navProducts: 'Lösungen',
|
||||||
navContact: 'Kontakt',
|
navContact: 'Kontakt',
|
||||||
|
navLagebild: 'Lagebild',
|
||||||
langSwitch: 'DE | EN',
|
langSwitch: 'DE | EN',
|
||||||
|
|
||||||
// Hero Section
|
// Hero Section
|
||||||
@@ -22,9 +23,6 @@ const translations = {
|
|||||||
heroSubtitle: 'Spezialist für hochsichere, maßgeschneiderte IT-Lösungen für Behörden',
|
heroSubtitle: 'Spezialist für hochsichere, maßgeschneiderte IT-Lösungen für Behörden',
|
||||||
|
|
||||||
// Trust Indicators
|
// Trust Indicators
|
||||||
indicatorAvailability: 'Verfügbarkeit',
|
|
||||||
indicatorTrust: 'Behörden vertrauen uns',
|
|
||||||
indicatorSupport: 'Support',
|
|
||||||
|
|
||||||
// Scroll Indicator
|
// Scroll Indicator
|
||||||
scrollToExplore: 'Nach unten scrollen',
|
scrollToExplore: 'Nach unten scrollen',
|
||||||
@@ -41,7 +39,9 @@ const translations = {
|
|||||||
|
|
||||||
// Who We Are
|
// Who We Are
|
||||||
whoWeAreTitle: 'Unternehmen',
|
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.',
|
companyCardTitle1: 'Spezialist für Behördensoftware',
|
||||||
|
companyCardTitle2: 'Unser Ansatz',
|
||||||
|
whoWeArePara1: 'AegisSight 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.',
|
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',
|
locationBadge: 'Nordrhein-Westfalen, Deutschland',
|
||||||
nrwLabel: 'Nordrhein-Westfalen',
|
nrwLabel: 'Nordrhein-Westfalen',
|
||||||
@@ -68,7 +68,7 @@ const translations = {
|
|||||||
comp3Desc: 'Kontinuierliche Sicherheitsupdates und zuverlässige Wartung über den gesamten Lebenszyklus',
|
comp3Desc: 'Kontinuierliche Sicherheitsupdates und zuverlässige Wartung über den gesamten Lebenszyklus',
|
||||||
|
|
||||||
// Why Us
|
// Why Us
|
||||||
whyUsTitle: 'Warum IntelSight UG?',
|
whyUsTitle: 'Warum AegisSight UG?',
|
||||||
why1Title: 'Enge Zusammenarbeit',
|
why1Title: 'Enge Zusammenarbeit',
|
||||||
why1Desc: 'Wir arbeiten Hand in Hand mit unseren Kunden für maßgeschneiderte Lösungen',
|
why1Desc: 'Wir arbeiten Hand in Hand mit unseren Kunden für maßgeschneiderte Lösungen',
|
||||||
why2Title: 'Made in Germany',
|
why2Title: 'Made in Germany',
|
||||||
@@ -79,7 +79,7 @@ const translations = {
|
|||||||
why4Desc: 'Fokus auf Sicherheit, Professionalität & zukunftssichere Lösungen',
|
why4Desc: 'Fokus auf Sicherheit, Professionalität & zukunftssichere Lösungen',
|
||||||
|
|
||||||
// Products Section
|
// Products Section
|
||||||
productsTitle: 'PRODUKTE & LÖSUNGEN',
|
productsTitle: 'LÖSUNGEN',
|
||||||
productsSubtitle: 'Professionelle Werkzeuge für moderne Ermittlungsarbeit',
|
productsSubtitle: 'Professionelle Werkzeuge für moderne Ermittlungsarbeit',
|
||||||
|
|
||||||
// Professional Toolbox
|
// Professional Toolbox
|
||||||
@@ -119,24 +119,46 @@ const translations = {
|
|||||||
accessRestricted: 'Zugang nur mit Berechtigung',
|
accessRestricted: 'Zugang nur mit Berechtigung',
|
||||||
protectedProductDesc: 'Dieses Produkt ist speziell für autorisierte Behörden entwickelt und erfordert eine Authentifizierung.',
|
protectedProductDesc: 'Dieses Produkt ist speziell für autorisierte Behörden entwickelt und erfordert eine Authentifizierung.',
|
||||||
loginForAccess: 'Anmelden für Zugriff',
|
loginForAccess: 'Anmelden für Zugriff',
|
||||||
|
// OSINT Monitor
|
||||||
|
productOsintMonitorTitle: 'AegisSight Monitor',
|
||||||
|
productOsintMonitorTagline: 'Open Source Intelligence - automatisiert',
|
||||||
|
productOsintMonitorDesc: 'AegisSight Monitor aggregiert, analysiert und verifiziert Informationen aus öffentlich zugänglichen Quellen in Echtzeit. Erleben Sie die Plattform live am Beispiel des Iran-Livetickers.',
|
||||||
|
osintMonitorButton: 'Iran-Liveticker öffnen',
|
||||||
|
|
||||||
|
|
||||||
|
// Lagebild Page
|
||||||
|
lagebildPageTitle: 'Lagebild - AegisSight',
|
||||||
|
lagebildTitle: 'LAGEBILD',
|
||||||
|
lagebildLive: 'LIVE-LAGEBILD',
|
||||||
|
lagebildSubtitle: 'Automatisierte Situationsberichte vom AegisSight Monitor',
|
||||||
|
lagebildSelectSnapshot: 'Lagebild vom:',
|
||||||
|
lagebildCurrent: 'Aktuell',
|
||||||
|
lagebildPoweredBy: 'Erstellt durch',
|
||||||
|
lagebildAnalysis: 'Lageanalyse',
|
||||||
|
lagebildSources: 'Quellen',
|
||||||
|
lagebildFactChecks: 'Faktenchecks',
|
||||||
|
lagebildFactChecksDesc: 'Automatisierte Verifizierung durch KI-gestützte Quellenanalyse',
|
||||||
|
lagebildArticles: 'Quellenberichte',
|
||||||
|
lagebildArticlesDesc: 'Automatisch aggregierte Meldungen aus internationalen Quellen',
|
||||||
|
lagebildCtaTitle: 'Interesse an AegisSight Monitor?',
|
||||||
|
lagebildCtaText: 'Erhalten Sie Echtzeit-Lagebilder für Ihre Organisation mit KI-gestützter Analyse und Faktencheck.',
|
||||||
|
lagebildCtaButton: 'Kontakt aufnehmen',
|
||||||
// Footer
|
// Footer
|
||||||
footerCompanyTitle: 'IntelSight UG (haftungsbeschränkt)',
|
footerCompanyTitle: 'AegisSight UG (haftungsbeschränkt)',
|
||||||
footerCompanyAddress1: 'Gladbacher Strasse 3-5',
|
footerCompanyAddress1: 'Gladbacher Strasse 3-5',
|
||||||
footerCompanyAddress2: '40764 Langenfeld',
|
footerCompanyAddress2: '40764 Langenfeld',
|
||||||
footerNavTitle: 'Navigation',
|
footerNavTitle: 'Navigation',
|
||||||
footerNavHome: 'Startseite',
|
footerNavHome: 'Startseite',
|
||||||
footerNavAbout: 'Über uns',
|
footerNavAbout: 'Über uns',
|
||||||
footerNavProducts: 'Produkte',
|
footerNavProducts: 'Lösungen',
|
||||||
footerNavContact: 'Kontakt',
|
|
||||||
|
|
||||||
footerLegalTitle: 'Rechtliches',
|
footerLegalTitle: 'Rechtliches',
|
||||||
footerImprint: 'Impressum',
|
footerImprint: 'Impressum',
|
||||||
footerPrivacy: 'Datenschutz',
|
footerPrivacy: 'Datenschutz',
|
||||||
footerTerms: 'AGB',
|
footerCookies: 'Cookie-Einstellungen',
|
||||||
|
|
||||||
footerContactTitle: 'Kontakt',
|
footerContactTitle: 'Kontakt',
|
||||||
copyright: '© 2025 IntelSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.',
|
copyright: '© {year} AegisSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.',
|
||||||
|
|
||||||
// Modal texts
|
// Modal texts
|
||||||
authRequired: 'Authentifizierung erforderlich',
|
authRequired: 'Authentifizierung erforderlich',
|
||||||
@@ -154,24 +176,22 @@ const translations = {
|
|||||||
|
|
||||||
en: {
|
en: {
|
||||||
// Page meta
|
// Page meta
|
||||||
pageTitle: 'IntelSight - Security Made in Germany',
|
pageTitle: 'AegisSight - Sicherheit Made in Germany',
|
||||||
|
|
||||||
// Navigation
|
// Navigation
|
||||||
skipNav: 'Skip to main content',
|
skipNav: 'Skip to main content',
|
||||||
navHome: 'Home',
|
navHome: 'Home',
|
||||||
navAbout: 'About Us',
|
navAbout: 'About Us',
|
||||||
navProducts: 'Products & Solutions',
|
navProducts: 'Solutions',
|
||||||
navContact: 'Contact',
|
navContact: 'Contact',
|
||||||
|
navLagebild: 'Situation Report',
|
||||||
langSwitch: 'EN | DE',
|
langSwitch: 'EN | DE',
|
||||||
|
|
||||||
// Hero Section
|
// Hero Section
|
||||||
heroTitle: 'SECURITY MADE IN GERMANY',
|
heroTitle: 'SICHERHEIT MADE IN GERMANY',
|
||||||
heroSubtitle: 'Specialist for highly secure, customized IT solutions for government agencies',
|
heroSubtitle: 'Specialist for highly secure, customized IT solutions for government agencies',
|
||||||
|
|
||||||
// Trust Indicators
|
// Trust Indicators
|
||||||
indicatorAvailability: 'Availability',
|
|
||||||
indicatorTrust: 'Government agencies trust us',
|
|
||||||
indicatorSupport: 'Support',
|
|
||||||
|
|
||||||
// Scroll Indicator
|
// Scroll Indicator
|
||||||
scrollToExplore: 'Scroll to Explore',
|
scrollToExplore: 'Scroll to Explore',
|
||||||
@@ -188,7 +208,9 @@ const translations = {
|
|||||||
|
|
||||||
// Who We Are
|
// Who We Are
|
||||||
whoWeAreTitle: 'Company',
|
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.',
|
companyCardTitle1: 'Government Software Specialist',
|
||||||
|
companyCardTitle2: 'Our Approach',
|
||||||
|
whoWeArePara1: 'AegisSight 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.',
|
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',
|
locationBadge: 'North Rhine-Westphalia, Germany',
|
||||||
nrwLabel: 'North Rhine-Westphalia',
|
nrwLabel: 'North Rhine-Westphalia',
|
||||||
@@ -215,7 +237,7 @@ const translations = {
|
|||||||
comp3Desc: 'Continuous security updates and reliable maintenance throughout the entire lifecycle',
|
comp3Desc: 'Continuous security updates and reliable maintenance throughout the entire lifecycle',
|
||||||
|
|
||||||
// Why Us
|
// Why Us
|
||||||
whyUsTitle: 'Why IntelSight UG?',
|
whyUsTitle: 'Why AegisSight UG?',
|
||||||
why1Title: 'Close Collaboration',
|
why1Title: 'Close Collaboration',
|
||||||
why1Desc: 'We work hand in hand with our customers for customized solutions',
|
why1Desc: 'We work hand in hand with our customers for customized solutions',
|
||||||
why2Title: 'Made in Germany',
|
why2Title: 'Made in Germany',
|
||||||
@@ -226,7 +248,7 @@ const translations = {
|
|||||||
why4Desc: 'Focus on security, professionalism & future-proof solutions',
|
why4Desc: 'Focus on security, professionalism & future-proof solutions',
|
||||||
|
|
||||||
// Products Section
|
// Products Section
|
||||||
productsTitle: 'Products & Solutions',
|
productsTitle: 'Solutions',
|
||||||
productsSubtitle: 'Professional Tools for Modern Investigation Work',
|
productsSubtitle: 'Professional Tools for Modern Investigation Work',
|
||||||
|
|
||||||
// Professional Toolbox
|
// Professional Toolbox
|
||||||
@@ -266,24 +288,46 @@ const translations = {
|
|||||||
accessRestricted: 'Access by authorization only',
|
accessRestricted: 'Access by authorization only',
|
||||||
protectedProductDesc: 'This product is specifically developed for authorized agencies and requires authentication.',
|
protectedProductDesc: 'This product is specifically developed for authorized agencies and requires authentication.',
|
||||||
loginForAccess: 'Login for Access',
|
loginForAccess: 'Login for Access',
|
||||||
|
// OSINT Monitor
|
||||||
|
productOsintMonitorTitle: 'AegisSight Monitor',
|
||||||
|
productOsintMonitorTagline: 'Open Source Intelligence - Automated',
|
||||||
|
productOsintMonitorDesc: 'AegisSight Monitor aggregates, analyzes and verifies information from publicly available sources in real time. Experience the platform live with the Iran Live Ticker.',
|
||||||
|
osintMonitorButton: 'Open Iran Live Ticker',
|
||||||
|
|
||||||
|
|
||||||
|
// Lagebild Page
|
||||||
|
lagebildPageTitle: 'Situation Report - AegisSight',
|
||||||
|
lagebildTitle: 'SITUATION REPORT',
|
||||||
|
lagebildLive: 'LIVE REPORT',
|
||||||
|
lagebildSubtitle: 'Automated situation reports from AegisSight Monitor',
|
||||||
|
lagebildSelectSnapshot: 'Report from:',
|
||||||
|
lagebildCurrent: 'Current',
|
||||||
|
lagebildPoweredBy: 'Powered by',
|
||||||
|
lagebildAnalysis: 'Situation Analysis',
|
||||||
|
lagebildSources: 'Sources',
|
||||||
|
lagebildFactChecks: 'Fact Checks',
|
||||||
|
lagebildFactChecksDesc: 'Automated verification through AI-powered source analysis',
|
||||||
|
lagebildArticles: 'Source Reports',
|
||||||
|
lagebildArticlesDesc: 'Automatically aggregated reports from international sources',
|
||||||
|
lagebildCtaTitle: 'Interested in AegisSight Monitor?',
|
||||||
|
lagebildCtaText: 'Get real-time situation reports for your organization with AI-powered analysis and fact checking.',
|
||||||
|
lagebildCtaButton: 'Get in touch',
|
||||||
// Footer
|
// Footer
|
||||||
footerCompanyTitle: 'IntelSight UG (haftungsbeschränkt)',
|
footerCompanyTitle: 'AegisSight UG (haftungsbeschränkt)',
|
||||||
footerCompanyAddress1: 'Gladbacher Strasse 3-5',
|
footerCompanyAddress1: 'Gladbacher Strasse 3-5',
|
||||||
footerCompanyAddress2: '40764 Langenfeld',
|
footerCompanyAddress2: '40764 Langenfeld',
|
||||||
footerNavTitle: 'Navigation',
|
footerNavTitle: 'Navigation',
|
||||||
footerNavHome: 'Home',
|
footerNavHome: 'Home',
|
||||||
footerNavAbout: 'About Us',
|
footerNavAbout: 'About Us',
|
||||||
footerNavProducts: 'Products',
|
footerNavProducts: 'Solutions',
|
||||||
footerNavContact: 'Contact',
|
|
||||||
|
|
||||||
footerLegalTitle: 'Legal',
|
footerLegalTitle: 'Legal',
|
||||||
footerImprint: 'Imprint',
|
footerImprint: 'Imprint',
|
||||||
footerPrivacy: 'Privacy Policy',
|
footerPrivacy: 'Privacy Policy',
|
||||||
footerTerms: 'Terms & Conditions',
|
footerCookies: 'Cookie Settings',
|
||||||
|
|
||||||
footerContactTitle: 'Contact',
|
footerContactTitle: 'Contact',
|
||||||
copyright: '© 2025 IntelSight UG (haftungsbeschränkt). All rights reserved.',
|
copyright: '© {year} AegisSight UG (haftungsbeschränkt). All rights reserved.',
|
||||||
|
|
||||||
// Modal texts
|
// Modal texts
|
||||||
authRequired: 'Authentication Required',
|
authRequired: 'Authentication Required',
|
||||||
@@ -330,6 +374,11 @@ function switchLanguage(language) {
|
|||||||
currentLanguage = language;
|
currentLanguage = language;
|
||||||
localStorage.setItem(CONFIG.I18N.STORAGE_KEY, language);
|
localStorage.setItem(CONFIG.I18N.STORAGE_KEY, language);
|
||||||
applyTranslations(language);
|
applyTranslations(language);
|
||||||
|
|
||||||
|
// Update cookie consent language
|
||||||
|
if (typeof CookieConsent !== 'undefined' && CookieConsent.setLanguage) {
|
||||||
|
CookieConsent.setLanguage(language);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -355,11 +404,19 @@ function applyTranslations(language) {
|
|||||||
const key = element.getAttribute(DATA_ATTRS.TRANSLATE);
|
const key = element.getAttribute(DATA_ATTRS.TRANSLATE);
|
||||||
|
|
||||||
if (t[key]) {
|
if (t[key]) {
|
||||||
|
let content = t[key];
|
||||||
|
|
||||||
|
// Replace {year} placeholder with current year
|
||||||
|
if (content.includes('{year}')) {
|
||||||
|
const currentYear = new Date().getFullYear();
|
||||||
|
content = content.replace('{year}', currentYear);
|
||||||
|
}
|
||||||
|
|
||||||
// Check if content contains HTML tags
|
// Check if content contains HTML tags
|
||||||
if (t[key].includes('<strong>') || t[key].includes('<em>')) {
|
if (content.includes('<strong>') || content.includes('<em>')) {
|
||||||
element.innerHTML = t[key];
|
element.innerHTML = content;
|
||||||
} else {
|
} else {
|
||||||
element.textContent = t[key];
|
element.textContent = content;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -373,6 +430,9 @@ function applyTranslations(language) {
|
|||||||
|
|
||||||
// Update expand button text if it exists
|
// Update expand button text if it exists
|
||||||
updateExpandButtonText(language);
|
updateExpandButtonText(language);
|
||||||
|
|
||||||
|
// Update footer legal links based on language
|
||||||
|
updateFooterLinks(language);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -407,4 +467,32 @@ function getTranslation(key) {
|
|||||||
*/
|
*/
|
||||||
function getCurrentLanguage() {
|
function getCurrentLanguage() {
|
||||||
return currentLanguage;
|
return currentLanguage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update footer legal links based on language
|
||||||
|
* @param {string} language - Current language code
|
||||||
|
*/
|
||||||
|
function updateFooterLinks(language) {
|
||||||
|
// Get footer links
|
||||||
|
const impressumLink = document.querySelector('a[href="impressum.html"], a[href="impressum-en.html"]');
|
||||||
|
const datenschutzLink = document.querySelector('a[href="datenschutz.html"], a[href="datenschutz-en.html"]');
|
||||||
|
|
||||||
|
if (language === 'en') {
|
||||||
|
// Switch to English versions
|
||||||
|
if (impressumLink) {
|
||||||
|
impressumLink.href = 'impressum-en.html';
|
||||||
|
}
|
||||||
|
if (datenschutzLink) {
|
||||||
|
datenschutzLink.href = 'datenschutz-en.html';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Switch to German versions
|
||||||
|
if (impressumLink) {
|
||||||
|
impressumLink.href = 'impressum.html';
|
||||||
|
}
|
||||||
|
if (datenschutzLink) {
|
||||||
|
datenschutzLink.href = 'datenschutz.html';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
141
lagen/cyberangriffe/index.html
Normale Datei
@@ -0,0 +1,141 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Lagebild: Cyberangriffe auf deutsche Infrastruktur - AegisSight</title>
|
||||||
|
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||||
|
<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="/lagen/iran-konflikt/lagebild.css">
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css">
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css">
|
||||||
|
<link rel="stylesheet" href="/cookie-consent.css">
|
||||||
|
</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.png" alt="AegisSight" class="logo-img"></a>
|
||||||
|
</div>
|
||||||
|
<ul class="nav-menu">
|
||||||
|
<li><a href="/" data-translate="navHome">Startseite</a></li>
|
||||||
|
<li><a href="/#about" data-translate="navAbout">Über uns</a></li>
|
||||||
|
<li><a href="/#products" data-translate="navProducts">Lösungen</a></li>
|
||||||
|
<li><a href="mailto:info@aegis-sight.de" data-translate="navContact">Kontakt</a></li>
|
||||||
|
</ul>
|
||||||
|
<div class="nav-extras">
|
||||||
|
<button class="lang-toggle" data-lang="de" aria-label="Sprache wechseln" data-translate="langSwitch">DE | EN</button>
|
||||||
|
<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="/" data-translate="navHome">Startseite</a></li>
|
||||||
|
<li><a href="/#about" data-translate="navAbout">Über uns</a></li>
|
||||||
|
<li><a href="/#products" data-translate="navProducts">Lösungen</a></li>
|
||||||
|
<li><a href="mailto:info@aegis-sight.de" data-translate="navContact">Kontakt</a></li>
|
||||||
|
</ul>
|
||||||
|
</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"></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 data-translate="footerCompanyTitle">AegisSight UG (haftungsbeschränkt)</h4><p data-translate="footerCompanyAddress1">Gladbacher Strasse 3-5</p><p data-translate="footerCompanyAddress2">40764 Langenfeld</p></div>
|
||||||
|
<div class="footer-section"><h4 data-translate="footerNavTitle">Navigation</h4><ul><li><a href="/" data-translate="footerNavHome">Startseite</a></li><li><a href="/#features">Funktionen</a></li><li><a href="/#demos">Live-Lagebilder</a></li><li><a href="/#trust" data-translate="footerNavAbout">Über uns</a></li><li><a href="/#contact">Kontakt</a></li></ul></div>
|
||||||
|
<div class="footer-section"><h4 data-translate="footerLegalTitle">Rechtliches</h4><ul><li><a href="/impressum.html" data-translate="footerImprint">Impressum</a></li><li><a href="/datenschutz.html" data-translate="footerPrivacy">Datenschutz</a></li><li><a href="#" id="cookie-settings-link">Cookie-Einstellungen</a></li></ul></div>
|
||||||
|
<div class="footer-section"><h4 data-translate="footerContactTitle">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/translations.js"></script>
|
||||||
|
<script src="/js/mobile-nav.js"></script>
|
||||||
|
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
|
||||||
|
<script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>
|
||||||
|
<script src="/lagen/iran-konflikt/lagebild.js"></script>
|
||||||
|
<script src="/cookie-consent.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
212
lagen/deepfakes/index.html
Normale Datei
@@ -0,0 +1,212 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Recherche: Rechtliche Lage von Deepfakes in Deutschland - AegisSight</title>
|
||||||
|
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||||
|
<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="/lagen/iran-konflikt/lagebild.css">
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css">
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css">
|
||||||
|
<link rel="stylesheet" href="/cookie-consent.css">
|
||||||
|
</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.png" alt="AegisSight" class="logo-img"></a>
|
||||||
|
</div>
|
||||||
|
<ul class="nav-menu">
|
||||||
|
<li><a href="/" data-translate="navHome">Startseite</a></li>
|
||||||
|
<li><a href="/#about" data-translate="navAbout">Über uns</a></li>
|
||||||
|
<li><a href="/#products" data-translate="navProducts">Lösungen</a></li>
|
||||||
|
<li><a href="mailto:info@aegis-sight.de" data-translate="navContact">Kontakt</a></li>
|
||||||
|
</ul>
|
||||||
|
<div class="nav-extras">
|
||||||
|
<button class="lang-toggle" data-lang="de" aria-label="Sprache wechseln" data-translate="langSwitch">DE | EN</button>
|
||||||
|
<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="/" data-translate="navHome">Startseite</a></li>
|
||||||
|
<li><a href="/#about" data-translate="navAbout">Über uns</a></li>
|
||||||
|
<li><a href="/#products" data-translate="navProducts">Lösungen</a></li>
|
||||||
|
<li><a href="mailto:info@aegis-sight.de" data-translate="navContact">Kontakt</a></li>
|
||||||
|
</ul>
|
||||||
|
</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"></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 data-translate="footerCompanyTitle">AegisSight UG (haftungsbeschränkt)</h4>
|
||||||
|
<p data-translate="footerCompanyAddress1">Gladbacher Strasse 3-5</p>
|
||||||
|
<p data-translate="footerCompanyAddress2">40764 Langenfeld</p>
|
||||||
|
</div>
|
||||||
|
<div class="footer-section">
|
||||||
|
<h4 data-translate="footerNavTitle">Navigation</h4>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/" data-translate="footerNavHome">Startseite</a></li>
|
||||||
|
<li><a href="/#features" data-translate="footerNavFeatures">Funktionen</a></li>
|
||||||
|
<li><a href="/#demos" data-translate="footerNavDemos">Live-Lagebilder</a></li>
|
||||||
|
<li><a href="/#trust" data-translate="footerNavAbout">Über uns</a></li>
|
||||||
|
<li><a href="/#contact" data-translate="footerNavContact">Kontakt</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="footer-section">
|
||||||
|
<h4 data-translate="footerLegalTitle">Rechtliches</h4>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/impressum.html" data-translate="footerImprint">Impressum</a></li>
|
||||||
|
<li><a href="/datenschutz.html" data-translate="footerPrivacy">Datenschutz</a></li>
|
||||||
|
<li><a href="#" id="cookie-settings-link">Cookie-Einstellungen</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="footer-section">
|
||||||
|
<h4 data-translate="footerContactTitle">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/translations.js"></script>
|
||||||
|
<script src="/js/mobile-nav.js"></script>
|
||||||
|
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
|
||||||
|
<script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>
|
||||||
|
<script src="/lagen/iran-konflikt/lagebild.js"></script>
|
||||||
|
<script src="/cookie-consent.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
218
lagen/iran-konflikt/index.html
Normale Datei
@@ -0,0 +1,218 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Lagebild Irankonflikt - AegisSight</title>
|
||||||
|
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||||
|
<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="lagebild.css">
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css">
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css">
|
||||||
|
<link rel="stylesheet" href="/cookie-consent.css">
|
||||||
|
</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.png" alt="AegisSight" class="logo-img"></a>
|
||||||
|
</div>
|
||||||
|
<ul class="nav-menu">
|
||||||
|
<li><a href="/" data-translate="navHome">Startseite</a></li>
|
||||||
|
<li><a href="/#about" data-translate="navAbout">Über uns</a></li>
|
||||||
|
<li><a href="/#products" data-translate="navProducts">Lösungen</a></li>
|
||||||
|
<li><a href="mailto:info@aegis-sight.de" data-translate="navContact">Kontakt</a></li>
|
||||||
|
</ul>
|
||||||
|
<div class="nav-extras">
|
||||||
|
<button class="lang-toggle" data-lang="de" aria-label="Sprache wechseln" data-translate="langSwitch">DE | EN</button>
|
||||||
|
<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="/" data-translate="navHome">Startseite</a></li>
|
||||||
|
<li><a href="/#about" data-translate="navAbout">Über uns</a></li>
|
||||||
|
<li><a href="/#products" data-translate="navProducts">Lösungen</a></li>
|
||||||
|
<li><a href="mailto:info@aegis-sight.de" data-translate="navContact">Kontakt</a></li>
|
||||||
|
</ul>
|
||||||
|
</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"></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 data-translate="footerCompanyTitle">AegisSight UG (haftungsbeschränkt)</h4>
|
||||||
|
<p data-translate="footerCompanyAddress1">Gladbacher Strasse 3-5</p>
|
||||||
|
<p data-translate="footerCompanyAddress2">40764 Langenfeld</p>
|
||||||
|
</div>
|
||||||
|
<div class="footer-section">
|
||||||
|
<h4 data-translate="footerNavTitle">Navigation</h4>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/" data-translate="footerNavHome">Startseite</a></li>
|
||||||
|
<li><a href="/#features" data-translate="footerNavFeatures">Funktionen</a></li>
|
||||||
|
<li><a href="/#demos" data-translate="footerNavDemos">Live-Lagebilder</a></li>
|
||||||
|
<li><a href="/#trust" data-translate="footerNavAbout">Über uns</a></li>
|
||||||
|
<li><a href="/#contact" data-translate="footerNavContact">Kontakt</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="footer-section">
|
||||||
|
<h4 data-translate="footerLegalTitle">Rechtliches</h4>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/impressum.html" data-translate="footerImprint">Impressum</a></li>
|
||||||
|
<li><a href="/datenschutz.html" data-translate="footerPrivacy">Datenschutz</a></li>
|
||||||
|
<li><a href="#" id="cookie-settings-link">Cookie-Einstellungen</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="footer-section">
|
||||||
|
<h4 data-translate="footerContactTitle">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/translations.js"></script>
|
||||||
|
<script src="/js/mobile-nav.js"></script>
|
||||||
|
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
|
||||||
|
<script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>
|
||||||
|
<script src="lagebild.js"></script>
|
||||||
|
<script src="/cookie-consent.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
1633
lagen/iran-konflikt/lagebild.css
Normale Datei
1465
lagen/iran-konflikt/lagebild.js
Normale Datei
99
robots-launch.txt
Normale Datei
@@ -0,0 +1,99 @@
|
|||||||
|
# robots.txt for AegisSight UG — wird am Tag X als robots.txt aktiv geschaltet
|
||||||
|
# Allgemein: Crawling erlaubt, außer API-Endpunkte und interne Pfade
|
||||||
|
|
||||||
|
User-agent: *
|
||||||
|
Allow: /
|
||||||
|
Disallow: /api/
|
||||||
|
Disallow: /_archiv/
|
||||||
|
Disallow: /vorschau/
|
||||||
|
|
||||||
|
# Sitemap
|
||||||
|
Sitemap: https://aegis-sight.de/sitemap.xml
|
||||||
|
|
||||||
|
# AI-Crawler explizit blocken — keine Trainingsdaten-Verwendung
|
||||||
|
User-agent: GPTBot
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: ChatGPT-User
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: CCBot
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: anthropic-ai
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: Claude-Web
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: ClaudeBot
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: Bytespider
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: PerplexityBot
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: Google-Extended
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: Applebot-Extended
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: Meta-ExternalAgent
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: cohere-ai
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: OAI-SearchBot
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
# Archiv-Bots blocken
|
||||||
|
User-agent: ia_archiver
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: Wayback Machine
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: archive.org_bot
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
# SEO-/Spam-Crawler blocken
|
||||||
|
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 blocken
|
||||||
|
User-agent: HTTrack
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: SiteSnagger
|
||||||
|
Disallow: /
|
||||||
|
|
||||||
|
User-agent: WebCopier
|
||||||
|
Disallow: /
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# robots.txt for IntelSight UG
|
# robots.txt for AegisSight UG
|
||||||
# Block ALL web crawlers and bots from the entire site
|
# Block ALL web crawlers and bots from the entire site
|
||||||
|
|
||||||
# Block all bots
|
# Block all bots
|
||||||
|
|||||||
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();
|
|
||||||
});
|
|
||||||
33
sitemap-launch.xml
Normale Datei
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
|
<url>
|
||||||
|
<loc>https://aegis-sight.de/</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>1.0</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://aegis-sight.de/lagen/iran-konflikt/</loc>
|
||||||
|
<changefreq>daily</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://aegis-sight.de/lagen/cyberangriffe/</loc>
|
||||||
|
<changefreq>daily</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://aegis-sight.de/lagen/deepfakes/</loc>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://aegis-sight.de/impressum.html</loc>
|
||||||
|
<changefreq>yearly</changefreq>
|
||||||
|
<priority>0.3</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://aegis-sight.de/datenschutz.html</loc>
|
||||||
|
<changefreq>yearly</changefreq>
|
||||||
|
<priority>0.3</priority>
|
||||||
|
</url>
|
||||||
|
</urlset>
|
||||||