Add CSS, JS and asset files (without videos)

Dieser Commit ist enthalten in:
Claude Project Manager
2025-08-17 14:16:58 +02:00
Ursprung 3c1c3a3ad1
Commit 0f67521eb3
49 geänderte Dateien mit 9070 neuen und 7 gelöschten Zeilen

Datei anzeigen

@ -1,13 +1,13 @@
# website-main # website-main
*This README was automatically generated by Claude Project Manager* *This README was automatically generated by Claude Project Manager*
## Project Overview ## Project Overview
- **Path**: `A:/GiTea/website-main` - **Path**: `C:/Users/hendr/Desktop/IntelSight/Projektablage/website-main`
- **Files**: 11 files - **Files**: 12 files
- **Size**: 103.7 KB - **Size**: 137.5 KB
- **Last Modified**: 2025-07-12 15:48 - **Last Modified**: 2025-08-14 22:51
## Technology Stack ## Technology Stack
@ -24,6 +24,7 @@ index.html
README.md README.md
robots.txt robots.txt
script.js script.js
Sitemap_IntelSight_UG.docx
styles.css styles.css
Logo/ Logo/
├── intelsight-dark-no-tagline-website-cropped.svg ├── intelsight-dark-no-tagline-website-cropped.svg
@ -52,5 +53,5 @@ This project is managed with Claude Project Manager. To work with this project:
## Development Log ## Development Log
- README generated on 2025-07-03 23:25:48 - README generated on 2025-07-03 23:25:48
- README updated on 2025-07-12 15:48:18 - README updated on 2025-08-14 22:51:36
- README updated on 2025-07-16 22:31:38 - README updated on 2025-08-14 22:51:56

Binäre Datei nicht angezeigt.

BIN
assets/fonts/Inter-Bold.ttf Normale Datei

Binäre Datei nicht angezeigt.

BIN
assets/fonts/Inter-Light.ttf Normale Datei

Binäre Datei nicht angezeigt.

BIN
assets/fonts/Inter-Regular.ttf Normale Datei

Binäre Datei nicht angezeigt.

Binäre Datei nicht angezeigt.

38
assets/handshake.svg Normale Datei
Datei anzeigen

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 512 512" xml:space="preserve">
<g>
<g>
<path d="M454.313,249.708L512,206.991L462.136,38.939l-256.667,8.226l-24.727,38.398L92.839,64.42L0,256.087l42.289,36.399
l-22.328,34.553c-7.052,10.914-9.432,23.92-6.701,36.624c2.73,12.704,10.245,23.583,21.158,30.635
c7.963,5.146,17.042,7.804,26.304,7.804c2.438,0,4.887-0.193,7.333-0.565c3.097,11.013,10.047,20.988,20.388,27.67
c8.142,5.262,17.282,7.774,26.323,7.774c2.442,0,4.873-0.206,7.278-0.567c3.198,11.44,10.36,21.2,20.423,27.703
c8.143,5.262,17.282,7.774,26.323,7.774c15.973,0,31.639-7.845,40.934-22.231l6.634-10.268l38.853,25.758l0.162,0.107
c7.963,5.146,17.042,7.805,26.304,7.805c3.43,0,6.887-0.365,10.32-1.102c12.704-2.731,23.583-10.246,30.635-21.158
c4.963-7.681,7.476-16.249,7.745-24.785c2.489-0.146,4.985-0.478,7.47-1.012c12.704-2.731,23.583-10.246,30.635-21.158
c4.865-7.528,7.504-16.054,7.777-24.787c2.479-0.147,4.963-0.478,7.436-1.01c12.705-2.731,23.584-10.244,30.636-21.158
c4.968-7.688,7.481-16.267,7.745-24.811c14.973-0.869,29.358-8.609,38.102-22.144c7.052-10.914,9.432-23.92,6.703-36.624
C464.938,264.277,460.578,256.165,454.313,249.708z M223.819,79.562l213.947-6.856l36.06,121.529l-47.959,35.513L242.472,110.338
l-52.058,79.011l-0.08,0.123c-4.694,7.26-14.416,9.349-21.676,4.66c-7.26-4.691-9.35-14.415-4.645-21.697L223.819,79.562z
M73.986,361.949c-4.694,7.261-14.418,9.35-21.675,4.66c-3.517-2.273-5.939-5.779-6.819-9.873
c-0.879-4.094-0.113-8.285,2.161-11.802l32.971-51.027c2.997-4.637,8.043-7.164,13.192-7.164c2.913,0,5.86,0.81,8.484,2.505
c3.517,2.273,5.938,5.778,6.818,9.872s0.113,8.286-2.159,11.803L73.986,361.949z M128.011,396.858
c-4.694,7.26-14.417,9.348-21.676,4.659c-7.26-4.691-9.35-14.415-4.658-21.675l32.972-51.027
c2.997-4.637,8.043-7.164,13.192-7.164c2.913,0,5.86,0.81,8.484,2.506c7.26,4.691,9.35,14.415,4.659,21.675L128.011,396.858z
M215.006,380.74l-32.972,51.027c-4.691,7.262-14.415,9.349-21.674,4.659c-3.517-2.273-5.939-5.779-6.818-9.873
c-0.88-4.094-0.114-8.285,2.159-11.803l32.972-51.027c2.273-3.517,5.778-5.938,9.872-6.818c1.107-0.237,2.22-0.355,3.324-0.355
c2.985,0,5.911,0.857,8.477,2.516C217.607,363.757,219.697,373.48,215.006,380.74z M432.488,292.041
c-2.273,3.517-5.778,5.938-9.872,6.818c-4.094,0.881-8.286,0.113-11.802-2.159l-10.939-7.068l-0.001-0.001l-51.028-32.972
l-17.892,27.69l10.94,7.07l40.088,25.904c3.517,2.273,5.938,5.778,6.818,9.872s0.113,8.286-2.159,11.803s-5.779,5.939-9.872,6.819
c-4.095,0.879-8.285,0.113-11.803-2.159l-51.027-32.972l-17.892,27.69l40.087,25.902c7.26,4.691,9.35,14.414,4.659,21.675
c-2.273,3.517-5.779,5.939-9.872,6.819c-4.095,0.879-8.285,0.113-11.802-2.159l-43.558-28.145l-17.892,27.69l32.617,21.076
c7.26,4.693,9.351,14.415,4.659,21.676c-2.273,3.517-5.778,5.939-9.872,6.819c-4.068,0.874-8.232,0.122-11.735-2.117
l-39.081-25.909l8.443-13.068c14.557-22.529,8.072-52.702-14.457-67.258c-10.349-6.687-22.309-8.922-33.629-7.214
c-3.094-11.023-10.046-21.008-20.394-27.695c-10.342-6.682-22.292-8.919-33.605-7.217c-3.199-11.436-10.36-21.192-20.42-27.692
c-18.62-12.034-42.458-9.676-58.391,4.224l-21.076-18.14l70.215-144.958l50.897,12.241l-25.527,39.639
c-14.557,22.529-8.072,52.701,14.457,67.258c22.506,14.544,52.642,8.083,67.217-14.392l33.979-51.572l175.87,114.508
c3.516,2.273,5.938,5.778,6.818,9.872C435.528,284.332,434.761,288.523,432.488,292.041z"/>
</g>
</g>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 3.6 KiB

Datei anzeigen

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--emojione" preserveAspectRatio="xMidYMid meet"><path d="M31.9 2C18.8 2 7.7 10.4 3.6 22h56.6C56.1 10.4 45 2 31.9 2z" fill="#3e4347"></path><path d="M31.9 62c13.1 0 24.2-8.3 28.3-20H3.6c4.1 11.7 15.2 20 28.3 20z" fill="#ffe62e"></path><path d="M3.6 22c-1.1 3.1-1.7 6.5-1.7 10s.6 6.9 1.7 10h56.6c1.1-3.1 1.7-6.5 1.7-10s-.6-6.9-1.7-10H3.6" fill="#ed4c5c"></path></svg>

Nachher

Breite:  |  Höhe:  |  Größe: 668 B

Datei anzeigen

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--emojione" preserveAspectRatio="xMidYMid meet">
<g fill="#2a5f9e">
<path d="M22 60.3V46.5l-10.3 7.6c2.9 2.7 6.4 4.8 10.3 6.2">
</path>
<path d="M42 60.3c3.9-1.4 7.4-3.5 10.3-6.2L42 46.4v13.9">
</path>
<path d="M3.7 42c.3 1 .7 1.9 1.2 2.9L8.8 42H3.7">
</path>
<path d="M55.2 42l3.9 2.9c.4-.9.8-1.9 1.2-2.9h-5.1">
</path>
</g>
<g fill="#ffffff">
<path d="M23.5 38H2.6c.3 1.4.7 2.7 1.1 4h5.1l-3.9 2.9c.8 1.7 1.7 3.2 2.8 4.7L18 42h4v2l-11.7 8.6l1.4 1.4L22 46.5v13.8c1.3.5 2.6.8 4 1.1V38h-2.5">
</path>
<path d="M61.4 38H38v23.4c1.4-.3 2.7-.7 4-1.1V46.5L52.3 54c1.4-1.3 2.6-2.7 3.8-4.2L45.4 42h6.8l6.1 4.5c.3-.5.6-1.1.8-1.6L55.2 42h5.1c.4-1.3.8-2.6 1.1-4">
</path>
</g>
<g fill="#ed4c5c">
<path d="M7.7 49.6c.8 1.1 1.6 2.1 2.5 3.1L22 44.1v-2h-4L7.7 49.6">
</path>
<path d="M45.5 42l10.7 7.8c.4-.5.7-1 1.1-1.5c.1-.1.1-.2.2-.2c.3-.5.7-1.1 1-1.6L52.2 42h-6.7">
</path>
</g>
<g fill="#2a5f9e">

Nachher

Breite:  |  Höhe:  |  Größe: 2.2 KiB

Datei anzeigen

@ -0,0 +1,3 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 5V19M12 19L5 12M12 19L19 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 213 B

Datei anzeigen

@ -0,0 +1,4 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2C6.48 2 2 6.48 2 12S6.48 22 12 22 22 17.52 22 12 17.52 2 12 2Z" stroke="currentColor" stroke-width="2"/>
<path d="M8 12L12 16L16 8" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 297 B

Datei anzeigen

@ -0,0 +1,4 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2C6.48 2 2 6.48 2 12S6.48 22 12 22 22 17.52 22 12 17.52 2 12 2Z" stroke="currentColor" stroke-width="2"/>
<path d="M8 12L12 16L16 8" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 297 B

Datei anzeigen

@ -0,0 +1,3 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19 9L12 16L5 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 197 B

Datei anzeigen

@ -0,0 +1,4 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2"/>
<path d="M12 6V12L16 14" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 248 B

Datei anzeigen

@ -0,0 +1,4 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2"/>
<path d="M12 6V12L16 16" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 248 B

Datei anzeigen

@ -0,0 +1,4 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2L4 8V16L12 22L20 16V8L12 2Z" stroke="currentColor" stroke-width="2"/>
<path d="M12 12L4 8M12 12L20 8M12 12V22" stroke="currentColor" stroke-width="2"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 253 B

Datei anzeigen

@ -0,0 +1,4 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="3" y="3" width="18" height="18" rx="2" stroke="currentColor" stroke-width="2"/>
<path d="M7 7H17M7 12H17M7 17H12" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 274 B

Datei anzeigen

@ -0,0 +1,5 @@
<svg viewBox="0 0 60 36" xmlns="http://www.w3.org/2000/svg">
<rect x="0" y="0" width="60" height="12" fill="#000000"/>
<rect x="0" y="12" width="60" height="12" fill="#DD0000"/>
<rect x="0" y="24" width="60" height="12" fill="#FFCE00"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 255 B

Datei anzeigen

@ -0,0 +1,6 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2"/>
<ellipse cx="12" cy="12" rx="10" ry="4" stroke="currentColor" stroke-width="2"/>
<path d="M2 12H22" stroke="currentColor" stroke-width="2"/>
<path d="M12 2V22" stroke="currentColor" stroke-width="2"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 368 B

Datei anzeigen

@ -0,0 +1,4 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2C8.13 2 5 5.13 5 9C5 14.25 12 22 12 22S19 14.25 19 9C19 5.13 15.87 2 12 2Z" stroke="currentColor" stroke-width="2"/>
<circle cx="12" cy="9" r="2.5" stroke="currentColor" stroke-width="2"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 290 B

Datei anzeigen

@ -0,0 +1,5 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="5" y="11" width="14" height="10" rx="2" stroke="currentColor" stroke-width="2"/>
<path d="M7 11V7C7 4.23858 9.23858 2 12 2C14.7614 2 17 4.23858 17 7V11" stroke="currentColor" stroke-width="2"/>
<circle cx="12" cy="16" r="1" fill="currentColor"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 346 B

Datei anzeigen

@ -0,0 +1,3 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9 11H15M12 8V14M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12Z" stroke="currentColor" stroke-width="2"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 264 B

Datei anzeigen

@ -0,0 +1,3 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3 21H21M4 18H20M5 15H19M6 12H18M8 9H16M10 6H14M12 3V6" stroke="currentColor" stroke-width="2"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 189 B

Datei anzeigen

@ -0,0 +1,4 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2L2 7V12C2 17 6.5 21 12 22C17.5 21 22 17 22 12V7L12 2Z" stroke="currentColor" stroke-width="2"/>
<path d="M9 12L11 14L15 10" stroke="currentColor" stroke-width="2"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 266 B

Datei anzeigen

@ -0,0 +1,4 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2L3 7V11C3 16 7 20 12 21C17 20 21 16 21 11V7L12 2Z" stroke="currentColor" stroke-width="2"/>
<polygon points="10,8 16,12 10,16" fill="currentColor"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 250 B

Datei anzeigen

@ -0,0 +1,3 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2L3.5 7V11.5C3.5 16.5 6.5 21 12 22C17.5 21 20.5 16.5 20.5 11.5V7L12 2Z" stroke="currentColor" stroke-width="2"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 209 B

Datei anzeigen

@ -0,0 +1,5 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="2" y="6" width="20" height="12" rx="2" stroke="currentColor" stroke-width="2"/>
<circle cx="12" cy="12" r="3" stroke="currentColor" stroke-width="2"/>
<path d="M18 8L22 6V18L18 16" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/>
</svg>

Nachher

Breite:  |  Höhe:  |  Größe: 346 B

Dateidiff unterdrückt, weil mindestens eine Zeile zu lang ist

Nachher

Breite:  |  Höhe:  |  Größe: 7.9 KiB

BIN
assets/images/nrw.png Normale Datei

Binäre Datei nicht angezeigt.

Nachher

Breite:  |  Höhe:  |  Größe: 46 KiB

56
assets/videos/README.md Normale Datei
Datei anzeigen

@ -0,0 +1,56 @@
# Hero Section Videos
## Benötigte Video-Dateien
Die Hero-Section benötigt 4 rotierende Hintergrund-Videos. Diese sollten folgende Eigenschaften haben:
### Video-Spezifikationen:
- **Format:** MP4 (H.264 codec)
- **Auflösung:** 1920x1080 (Full HD) minimum
- **Länge:** 10-15 Sekunden Loop
- **Dateigröße:** Max. 5MB pro Video (komprimiert)
- **Framerate:** 24-30 fps
- **Audio:** Keine (Videos werden stumm abgespielt)
### Benötigte Videos:
1. **hero-tech-pattern.mp4**
- Abstrakte Tech-Muster oder Code-Visualisierung
- Helle, sanfte Bewegungen
- Farben: Weiß, Hellgrau, Hellblau
2. **hero-data-flow.mp4**
- Datenströme oder Partikel-Animationen
- Fließende Bewegungen
- Minimalistisch und hell
3. **hero-network-viz.mp4**
- Netzwerk-Nodes und Verbindungen
- Geometrische Formen
- Subtile Animationen
4. **hero-code-abstract.mp4**
- Code-Editor oder Terminal-Output
- Verschwommen/abstrakt
- Heller Hintergrund
### Empfohlene Tools zum Erstellen:
- After Effects (für professionelle Animationen)
- DaVinci Resolve (kostenlos)
- Blender (für 3D-Animationen)
- Online: Canva, Renderforest
### Kostenlose Stock-Video Quellen:
- Pexels Videos (https://www.pexels.com/videos/)
- Pixabay (https://pixabay.com/videos/)
- Videvo (https://www.videvo.net/)
- Coverr (https://coverr.co/)
### Komprimierung:
```bash
# FFmpeg Befehl zum Komprimieren:
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -vf scale=1920:1080 -an output.mp4
```
### Fallback:
Falls keine Videos vorhanden sind, funktioniert die Website trotzdem - es wird nur der statische Gradient-Hintergrund mit Particle-Animation angezeigt.

612
css/about-modern.css Normale Datei
Datei anzeigen

@ -0,0 +1,612 @@
/* Modern About Section Redesign */
/* About Section Background */
.about-section {
background: linear-gradient(135deg, #ffffff 0%, #f8fafb 100%);
position: relative;
overflow: hidden;
padding: 100px 0;
}
.about-section::before {
content: '';
position: absolute;
top: -50%;
right: -20%;
width: 60%;
height: 60%;
background: radial-gradient(circle, rgba(15, 114, 181, 0.05) 0%, transparent 70%);
border-radius: 50%;
animation: float-slow 20s ease-in-out infinite;
}
@keyframes float-slow {
0%, 100% { transform: translate(0, 0) scale(1); }
33% { transform: translate(-30px, -30px) scale(1.05); }
66% { transform: translate(30px, -20px) scale(0.95); }
}
/* Modern Tab Navigation */
.about-tabs {
display: flex;
justify-content: center;
gap: 20px;
margin-bottom: 4rem;
position: relative;
padding: 10px;
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
border-radius: 100px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
max-width: 800px;
margin-left: auto;
margin-right: auto;
border: none;
}
.about-tab {
background: transparent;
border: none;
color: #666;
padding: 15px 30px;
cursor: pointer;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
font-size: 1rem;
font-weight: 600;
border-radius: 50px;
position: relative;
overflow: hidden;
z-index: 1;
}
.about-tab::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50px;
background: linear-gradient(135deg, #0f72b5, #00406e);
transform: translate(-50%, -50%);
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
z-index: -1;
}
.about-tab.active::before {
width: 100%;
height: 100%;
}
.about-tab.active {
color: #ffffff;
transform: scale(1.05);
box-shadow: 0 8px 20px rgba(15, 114, 181, 0.3);
}
.about-tab:hover:not(.active) {
color: #0f72b5;
transform: translateY(-2px);
background: rgba(15, 114, 181, 0.05);
}
/* Tab Content Panels */
.about-content {
max-width: 1200px;
margin: 0 auto;
position: relative;
}
.about-panel {
display: none;
animation: fadeInUp 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
.about-panel.active {
display: block;
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Company Tab - Cards Layout */
#who-we-are .panel-text {
display: flex;
gap: 40px;
align-items: stretch;
min-height: 500px;
}
.company-cards-wrapper {
display: flex;
flex-direction: column;
gap: 30px;
width: 50%;
justify-content: space-between;
}
.company-card {
background: white;
border-radius: 20px;
padding: 40px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
position: relative;
overflow: hidden;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
flex: 1;
display: flex;
flex-direction: column;
}
.company-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 4px;
height: 100%;
background: linear-gradient(180deg, #0f72b5, #00406e);
transform: scaleY(0);
transition: transform 0.4s;
}
.company-card:hover::before {
transform: scaleY(1);
}
.company-card:hover {
transform: translateX(10px);
box-shadow: 0 15px 50px rgba(15, 114, 181, 0.15);
}
.company-card h4 {
color: #0f72b5;
font-size: 1.4rem;
margin-bottom: 15px;
display: flex;
align-items: center;
gap: 15px;
}
.company-card-icon {
width: 70px;
height: 70px;
background: linear-gradient(135deg, rgba(15, 114, 181, 0.1), rgba(0, 64, 110, 0.05));
border-radius: 20px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: all 0.4s;
}
.company-card:hover .company-card-icon {
transform: scale(1.1) rotate(5deg);
background: linear-gradient(135deg, #0f72b5, #00406e);
}
.company-card-icon img {
width: 35px;
height: 35px;
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(98%) contrast(92%);
transition: filter 0.4s;
}
.company-card:hover .company-card-icon img {
filter: brightness(0) saturate(100%) invert(100%);
}
/* Mission & Values - Modern Grid */
.mission-grid {
text-align: left;
}
.mission-header {
background: linear-gradient(135deg, #0f72b5, #00406e);
color: white;
padding: 60px;
border-radius: 30px;
margin-bottom: 40px;
position: relative;
overflow: hidden;
}
.mission-header::after {
content: '';
position: absolute;
top: -50%;
right: -10%;
width: 50%;
height: 200%;
background: rgba(255, 255, 255, 0.1);
transform: rotate(45deg);
}
.mission-header h3 {
font-size: 2.5rem;
margin-bottom: 20px;
position: relative;
z-index: 1;
color: #ffffff;
}
.mission-header p {
font-size: 1.2rem;
position: relative;
z-index: 1;
opacity: 0.95;
}
.values-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 30px;
margin: 3rem 0;
}
.value-card {
background: white;
border-radius: 24px;
padding: 35px;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
border: 2px solid transparent;
cursor: pointer;
}
.value-card::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(15, 114, 181, 0.1) 0%, transparent 100%);
opacity: 0;
transition: opacity 0.4s;
}
.value-card:hover::after {
opacity: 1;
}
.value-card:hover {
transform: translateY(-10px) scale(1.02);
box-shadow: 0 20px 60px rgba(15, 114, 181, 0.2);
border-color: #0f72b5;
}
.value-icon {
width: 100px;
height: 100px;
margin-bottom: 20px;
background: linear-gradient(135deg, rgba(15, 114, 181, 0.1), rgba(0, 64, 110, 0.05));
border-radius: 30px;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.4s;
}
.value-icon img {
width: 50px;
height: 50px;
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(98%) contrast(92%);
transition: filter 0.4s;
}
.value-card:hover .value-icon {
transform: scale(1.1) rotate(5deg);
background: linear-gradient(135deg, #0f72b5, #00406e);
}
.value-card:hover .value-icon img {
filter: brightness(0) saturate(100%) invert(100%);
}
/* Competencies - Timeline Style */
.competencies-list {
position: relative;
padding-left: 40px;
}
.competencies-list::before {
content: '';
position: absolute;
left: 10px;
top: 0;
width: 3px;
height: 100%;
background: linear-gradient(180deg, #0f72b5, #00406e);
border-radius: 2px;
}
.competency-item {
display: grid;
grid-template-columns: auto 1fr;
gap: 30px;
align-items: center;
padding: 30px;
margin-bottom: 30px;
background: white;
border-radius: 20px;
position: relative;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);
}
.competency-item::before {
content: '';
position: absolute;
left: -30px;
top: 50%;
transform: translateY(-50%);
width: 20px;
height: 20px;
background: white;
border: 4px solid #0f72b5;
border-radius: 50%;
z-index: 1;
}
.competency-item:hover {
transform: translateX(20px);
box-shadow: 0 10px 40px rgba(15, 114, 181, 0.15);
}
.competency-number {
font-size: 3rem;
font-weight: 700;
background: linear-gradient(135deg, #0f72b5, #00406e);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
opacity: 1;
}
/* Why IntelSight - 2x2 Grid */
.why-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 30px;
grid-auto-rows: minmax(250px, auto);
}
.why-card {
grid-column: span 1;
grid-row: span 1;
}
.why-card {
background: white;
border-radius: 24px;
padding: 35px;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
display: flex;
flex-direction: column;
justify-content: space-between;
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.08);
border: 2px solid transparent;
}
.why-card:hover {
transform: translateY(-5px);
box-shadow: 0 15px 40px rgba(15, 114, 181, 0.15);
border-color: rgba(15, 114, 181, 0.3);
}
.why-icon {
width: 100px;
height: 100px;
margin: 0 auto 25px;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, rgba(15, 114, 181, 0.1), rgba(0, 64, 110, 0.05));
border-radius: 30px;
transition: all 0.4s;
}
.why-icon img {
width: 50px;
height: 50px;
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(98%) contrast(92%);
transition: filter 0.4s;
}
/* German Flag Icon Special Styling */
.german-flag-icon {
background: transparent !important;
padding: 15px;
}
.german-flag-icon img {
width: 70px !important;
height: 42px !important;
border-radius: 4px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
filter: none !important;
}
.why-card:hover .german-flag-icon {
background: transparent !important;
transform: scale(1.15);
}
.why-card:hover .german-flag-icon img {
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
filter: none !important;
}
.why-card:hover .why-icon {
transform: scale(1.1) rotate(5deg);
background: linear-gradient(135deg, #0f72b5, #00406e);
}
.why-card:hover .why-icon img {
filter: brightness(0) saturate(100%) invert(100%);
}
.why-card h4 {
font-size: 1.6rem;
margin-bottom: 20px;
color: #0f72b5;
text-align: center;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.why-card p {
color: #666;
line-height: 1.8;
flex-grow: 1;
text-align: center;
font-size: 1.05rem;
}
/* Location Section with Map */
.location-section {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 45%;
margin-left: auto;
height: 100%;
}
.mini-germany-map {
flex: 1;
width: 100%;
max-width: 350px;
padding: 30px;
background: white;
border-radius: 20px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s;
margin-bottom: 20px;
position: relative;
overflow: hidden;
}
.mini-germany-map::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: radial-gradient(circle at 35% 45%, rgba(15, 114, 181, 0.3) 0%, transparent 40%);
opacity: 0;
transition: opacity 0.4s ease;
pointer-events: none;
z-index: 2;
}
.mini-germany-map:hover::before {
opacity: 1;
}
.mini-germany-map:hover {
transform: scale(1.02);
box-shadow: 0 15px 50px rgba(15, 114, 181, 0.15);
}
.mini-germany-map img {
width: 100%;
height: auto;
max-height: 100%;
object-fit: contain;
transition: all 0.4s ease;
position: relative;
z-index: 1;
}
.mini-germany-map:hover img {
filter: brightness(1.1) contrast(1.1);
}
/* Pulsing glow effect for NRW region */
@keyframes nrwPulse {
0%, 100% {
filter: drop-shadow(0 0 10px rgba(15, 114, 181, 0.5));
}
50% {
filter: drop-shadow(0 0 25px rgba(15, 114, 181, 0.8));
}
}
.mini-germany-map:hover img {
animation: nrwPulse 2s ease-in-out infinite;
}
/* Location Badge Enhancement */
.location-badge {
display: inline-flex;
align-items: center;
gap: 12px;
padding: 12px 24px;
background: linear-gradient(135deg, rgba(15, 114, 181, 0.1), rgba(0, 64, 110, 0.05));
border-radius: 100px;
color: #0f72b5;
font-weight: 600;
border: 2px solid rgba(15, 114, 181, 0.2);
transition: all 0.3s;
}
.location-badge:hover {
background: linear-gradient(135deg, #0f72b5, #00406e);
color: white;
transform: scale(1.05);
box-shadow: 0 10px 30px rgba(15, 114, 181, 0.3);
}
.location-badge svg {
width: 24px;
height: 24px;
transition: all 0.3s;
}
.location-badge:hover svg {
animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;
}
@keyframes ping {
0%, 100% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.2);
opacity: 0.8;
}
}
/* Responsive Design */
@media (max-width: 768px) {
.about-tabs {
flex-direction: column;
border-radius: 20px;
gap: 10px;
}
.why-grid {
grid-template-columns: 1fr;
}
.competencies-list {
padding-left: 20px;
}
}

371
css/animations-enhanced.css Normale Datei
Datei anzeigen

@ -0,0 +1,371 @@
/* Enhanced Modern Animations & Effects */
/* Glassmorphism Base */
.glass {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.glass-dark {
background: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.1);
}
/* Premium Glow Effects */
.glow-blue {
box-shadow:
0 0 20px rgba(15, 114, 181, 0.5),
0 0 40px rgba(15, 114, 181, 0.3),
0 0 60px rgba(15, 114, 181, 0.1);
}
.text-glow {
text-shadow:
0 0 10px rgba(15, 114, 181, 0.8),
0 0 20px rgba(15, 114, 181, 0.6),
0 0 30px rgba(15, 114, 181, 0.4);
}
/* Smooth Fade In Animations */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeInScale {
from {
opacity: 0;
transform: scale(0.9);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes slideInRight {
from {
opacity: 0;
transform: translateX(-50px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
/* Staggered Animation Classes */
.animate-in {
opacity: 0;
animation: fadeInUp 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}
.animate-in-scale {
opacity: 0;
animation: fadeInScale 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}
.stagger-1 { animation-delay: 0.1s; }
.stagger-2 { animation-delay: 0.2s; }
.stagger-3 { animation-delay: 0.3s; }
.stagger-4 { animation-delay: 0.4s; }
.stagger-5 { animation-delay: 0.5s; }
/* Floating Animation */
@keyframes float {
0%, 100% { transform: translateY(0px); }
50% { transform: translateY(-20px); }
}
.floating {
animation: float 6s ease-in-out infinite;
}
/* Pulse Glow Animation */
@keyframes pulseGlow {
0%, 100% {
box-shadow:
0 0 5px rgba(15, 114, 181, 0.5),
0 0 10px rgba(15, 114, 181, 0.3);
}
50% {
box-shadow:
0 0 20px rgba(15, 114, 181, 0.8),
0 0 30px rgba(15, 114, 181, 0.5),
0 0 40px rgba(15, 114, 181, 0.3);
}
}
.pulse-glow {
animation: pulseGlow 2s ease-in-out infinite;
}
/* Gradient Animation */
@keyframes gradientShift {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
.gradient-animated {
background: linear-gradient(
-45deg,
#0f72b5,
#00406e,
#0f72b5,
#1e90ff
);
background-size: 400% 400%;
animation: gradientShift 15s ease infinite;
}
/* Text Reveal Animation */
@keyframes textReveal {
from {
clip-path: polygon(0 0, 0 0, 0 100%, 0% 100%);
}
to {
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
}
}
.text-reveal {
animation: textReveal 1.5s cubic-bezier(0.77, 0, 0.175, 1) forwards;
}
/* Typewriter Effect */
@keyframes typewriter {
from { width: 0; }
to { width: 100%; }
}
@keyframes blink {
50% { border-color: transparent; }
}
.typewriter {
overflow: hidden;
white-space: nowrap;
border-right: 3px solid #0f72b5;
animation:
typewriter 3s steps(40) forwards,
blink 0.75s step-end infinite;
}
/* Morphing Blob Background */
@keyframes morph {
0% { border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%; }
50% { border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%; }
100% { border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%; }
}
.blob {
background: linear-gradient(45deg, #0f72b5, #00406e);
animation: morph 8s ease-in-out infinite;
filter: blur(40px);
opacity: 0.7;
}
/* Card Hover Effects */
.card-hover-lift {
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.card-hover-lift:hover {
transform: translateY(-10px) scale(1.02);
box-shadow:
0 20px 40px rgba(0, 0, 0, 0.15),
0 0 20px rgba(15, 114, 181, 0.3);
}
/* Magnetic Button Effect */
.magnetic-button {
position: relative;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.magnetic-button::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
background: rgba(255, 255, 255, 0.3);
transform: translate(-50%, -50%);
transition: width 0.6s, height 0.6s;
}
.magnetic-button:hover::before {
width: 300px;
height: 300px;
}
/* Parallax Layers */
.parallax-slow { transform: translateZ(-1px) scale(1.5); }
.parallax-medium { transform: translateZ(-2px) scale(2); }
.parallax-fast { transform: translateZ(-3px) scale(2.5); }
/* Reveal on Scroll */
.reveal {
opacity: 0;
transform: translateY(50px);
transition: all 1s cubic-bezier(0.4, 0, 0.2, 1);
}
.reveal.active {
opacity: 1;
transform: translateY(0);
}
/* Glitch Effect */
@keyframes glitch {
0%, 100% {
text-shadow:
0.05em 0 0 rgba(255, 0, 0, 0.75),
-0.05em -0.025em 0 rgba(0, 255, 0, 0.75),
0.025em 0.05em 0 rgba(0, 0, 255, 0.75);
}
14% {
text-shadow:
0.05em 0 0 rgba(255, 0, 0, 0.75),
-0.05em -0.025em 0 rgba(0, 255, 0, 0.75),
0.025em 0.05em 0 rgba(0, 0, 255, 0.75);
}
15% {
text-shadow:
-0.05em -0.025em 0 rgba(255, 0, 0, 0.75),
0.025em 0.025em 0 rgba(0, 255, 0, 0.75),
-0.05em -0.05em 0 rgba(0, 0, 255, 0.75);
}
49% {
text-shadow:
-0.05em -0.025em 0 rgba(255, 0, 0, 0.75),
0.025em 0.025em 0 rgba(0, 255, 0, 0.75),
-0.05em -0.05em 0 rgba(0, 0, 255, 0.75);
}
50% {
text-shadow:
0.025em 0.05em 0 rgba(255, 0, 0, 0.75),
0.05em 0 0 rgba(0, 255, 0, 0.75),
0 -0.05em 0 rgba(0, 0, 255, 0.75);
}
99% {
text-shadow:
0.025em 0.05em 0 rgba(255, 0, 0, 0.75),
0.05em 0 0 rgba(0, 255, 0, 0.75),
0 -0.05em 0 rgba(0, 0, 255, 0.75);
}
}
.glitch {
animation: glitch 1s linear infinite;
}
/* Smooth Scroll Indicator */
@keyframes scrollDown {
0% {
transform: translateY(0);
opacity: 0;
}
40% {
opacity: 1;
}
80% {
transform: translateY(20px);
opacity: 0;
}
100% {
opacity: 0;
}
}
.scroll-indicator-animated {
animation: scrollDown 2s infinite;
}
/* Loading Shimmer */
@keyframes shimmer {
0% {
background-position: -1000px 0;
}
100% {
background-position: 1000px 0;
}
}
.shimmer {
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0) 0%,
rgba(255, 255, 255, 0.3) 50%,
rgba(255, 255, 255, 0) 100%
);
background-size: 1000px 100%;
animation: shimmer 2s infinite;
}
/* Orbit Animation */
@keyframes orbit {
from { transform: rotate(0deg) translateX(100px) rotate(0deg); }
to { transform: rotate(360deg) translateX(100px) rotate(-360deg); }
}
.orbit {
animation: orbit 20s linear infinite;
}
/* Perspective Tilt */
.tilt-card {
transform-style: preserve-3d;
transition: transform 0.5s;
}
.tilt-card:hover {
transform: perspective(1000px) rotateX(10deg) rotateY(-10deg) scale(1.05);
}
/* Neon Glow Text */
.neon-text {
color: #fff;
text-shadow:
0 0 7px #fff,
0 0 10px #fff,
0 0 21px #fff,
0 0 42px #0f72b5,
0 0 82px #0f72b5,
0 0 92px #0f72b5,
0 0 102px #0f72b5,
0 0 151px #0f72b5;
}
/* Water Ripple Effect */
@keyframes ripple {
0% {
transform: scale(0);
opacity: 1;
}
100% {
transform: scale(4);
opacity: 0;
}
}
.ripple::before {
content: '';
position: absolute;
border: 1px solid #0f72b5;
border-radius: 50%;
animation: ripple 1s ease-out;
}

2715
css/animations.css Normale Datei

Datei-Diff unterdrückt, da er zu groß ist Diff laden

41
css/fonts.css Normale Datei
Datei anzeigen

@ -0,0 +1,41 @@
/* Local Font Definitions - DSGVO-compliant */
@font-face {
font-family: 'Bebas Neue';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('../assets/fonts/BebasNeue-Regular.ttf') format('truetype');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 300;
font-display: swap;
src: url('../assets/fonts/Inter-Light.ttf') format('truetype');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('../assets/fonts/Inter-Regular.ttf') format('truetype');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('../assets/fonts/Inter-SemiBold.ttf') format('truetype');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('../assets/fonts/Inter-Bold.ttf') format('truetype');
}

1496
css/main.css Normale Datei

Datei-Diff unterdrückt, da er zu groß ist Diff laden

496
css/products-modern.css Normale Datei
Datei anzeigen

@ -0,0 +1,496 @@
/* Modern Products Section Design */
.products-section {
background: #001f3f;
position: relative;
padding: 120px 0;
overflow: hidden;
}
/* Animated Background */
.products-section::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background:
radial-gradient(circle at 20% 50%, rgba(15, 114, 181, 0.1) 0%, transparent 50%),
radial-gradient(circle at 80% 50%, rgba(0, 64, 110, 0.1) 0%, transparent 50%),
radial-gradient(circle at 50% 100%, rgba(15, 114, 181, 0.05) 0%, transparent 50%);
animation: backgroundShift 20s ease-in-out infinite;
}
@keyframes backgroundShift {
0%, 100% { transform: translate(0, 0) scale(1); }
33% { transform: translate(-20px, -20px) scale(1.1); }
66% { transform: translate(20px, -10px) scale(0.95); }
}
/* Section Title */
.products-section .section-title {
color: #ffffff;
font-size: 3.5rem;
text-transform: uppercase;
letter-spacing: 3px;
margin-bottom: 20px;
position: relative;
display: inline-block;
animation: titleGlow 3s ease-in-out infinite;
}
@keyframes titleGlow {
0%, 100% { text-shadow: 0 0 20px rgba(15, 114, 181, 0.5); }
50% { text-shadow: 0 0 40px rgba(15, 114, 181, 0.8), 0 0 60px rgba(15, 114, 181, 0.4); }
}
.products-section .section-subtitle {
color: rgba(255, 255, 255, 0.7);
font-size: 1.3rem;
margin-bottom: 80px;
}
/* Products Container */
.products-container {
max-width: 1400px;
margin: 0 auto;
padding: 0 20px;
position: relative;
z-index: 2;
}
/* Products Grid */
.products-grid {
display: flex;
flex-direction: column;
align-items: center;
gap: 30px;
margin-bottom: 60px;
}
/* Product Card */
.product-card {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.95), rgba(245, 245, 245, 0.95));
border: 1px solid rgba(15, 114, 181, 0.3);
border-radius: 20px;
padding: 0;
position: relative;
overflow: visible;
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
cursor: pointer;
width: 90%;
max-width: 900px;
display: flex;
flex-direction: column;
backdrop-filter: blur(10px);
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
}
.product-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg, transparent 0%, rgba(15, 114, 181, 0.05) 100%);
opacity: 0;
transition: opacity 0.5s;
border-radius: 20px;
}
.product-card:hover::before {
opacity: 1;
}
.product-card:hover {
transform: translateY(-10px) scale(1.02);
background: linear-gradient(135deg, rgba(255, 255, 255, 1), rgba(250, 250, 250, 1));
border-color: rgba(15, 114, 181, 0.5);
box-shadow:
0 30px 60px rgba(0, 0, 0, 0.4),
0 0 80px rgba(15, 114, 181, 0.15),
inset 0 0 20px rgba(15, 114, 181, 0.03);
}
/* Product Header */
.product-header {
padding: 40px 40px 30px;
background: linear-gradient(135deg, rgba(15, 114, 181, 0.15) 0%, transparent 50%);
border-bottom: 1px solid rgba(15, 114, 181, 0.25);
display: grid;
grid-template-columns: 80px 1fr;
align-items: center;
gap: 25px;
}
.product-icon-wrapper {
width: 80px;
height: 80px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.product-icon-bg {
position: absolute;
width: 100%;
height: 100%;
background: linear-gradient(135deg, #0f72b5, #00406e);
border-radius: 20px;
opacity: 0.1;
transition: all 0.5s;
}
.product-card:hover .product-icon-bg {
opacity: 0.2;
transform: rotate(10deg) scale(1.1);
}
.product-icon {
position: relative;
z-index: 1;
width: 50px;
height: 50px;
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(98%) contrast(92%);
transition: all 0.5s;
}
.product-card:hover .product-icon {
transform: scale(1.1);
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(108%) contrast(92%);
}
.product-title-wrapper {
display: flex;
flex-direction: column;
gap: 5px;
align-items: center;
text-align: center;
padding-right: 105px;
}
.product-title {
color: #1a1a1a;
font-size: 1.8rem;
font-weight: 700;
margin: 0;
transition: all 0.3s;
}
.product-card:hover .product-title {
color: #0f72b5;
}
.product-tagline {
color: rgba(0, 0, 0, 0.6);
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 2px;
font-weight: 500;
margin: 0;
}
/* Product Body */
.product-body {
padding: 30px 40px;
flex-grow: 1;
display: flex;
flex-direction: column;
}
.product-description {
color: rgba(0, 0, 0, 0.7);
line-height: 1.8;
margin-bottom: 30px;
flex-grow: 1;
}
/* Product Features */
.product-features {
list-style: none;
padding: 0;
margin: 0 0 30px 0;
}
.product-features li {
color: rgba(255, 255, 255, 0.7);
padding: 8px 0;
padding-left: 30px;
position: relative;
transition: all 0.3s;
}
.product-features li::before {
content: '▸';
position: absolute;
left: 0;
color: #0f72b5;
font-size: 1.2rem;
transition: all 0.3s;
}
.product-card:hover .product-features li {
color: rgba(255, 255, 255, 0.9);
transform: translateX(5px);
}
.product-card:hover .product-features li::before {
color: #1e90ff;
transform: translateX(3px);
}
/* Product Footer */
.product-footer {
padding: 30px 40px;
background: rgba(15, 114, 181, 0.08);
border-top: 1px solid rgba(15, 114, 181, 0.2);
display: flex;
justify-content: space-between;
align-items: center;
}
.product-status {
display: flex;
align-items: center;
gap: 10px;
}
.status-dot {
width: 8px;
height: 8px;
background: #00ff00;
border-radius: 50%;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.5; transform: scale(1.2); }
}
.status-text {
color: rgba(255, 255, 255, 0.6);
font-size: 0.9rem;
}
/* Learn More Button */
.product-learn-more {
background: transparent;
border: 2px solid #0f72b5;
color: #0f72b5;
padding: 10px 25px;
border-radius: 50px;
cursor: pointer;
transition: all 0.3s;
font-size: 0.95rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
position: relative;
overflow: hidden;
}
.product-learn-more::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 0;
height: 0;
background: linear-gradient(135deg, #0f72b5, #00406e);
transform: translate(-50%, -50%);
transition: all 0.5s;
border-radius: 50px;
}
.product-learn-more:hover::before {
width: 100%;
height: 100%;
}
.product-learn-more:hover {
color: #ffffff;
border-color: transparent;
transform: translateY(-2px);
box-shadow: 0 10px 30px rgba(15, 114, 181, 0.3);
}
.product-learn-more span {
position: relative;
z-index: 1;
}
/* Tools Grid Styling - Inside Product Body */
.product-body .tools-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 15px;
margin-top: 20px;
max-height: 0;
overflow: hidden;
opacity: 0;
transition: max-height 0.6s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.4s ease-in-out;
visibility: hidden;
}
.product-body .tools-grid.expanded {
max-height: 2000px;
opacity: 1;
visibility: visible;
}
/* Responsive grid adjustment */
@media (max-width: 768px) {
.product-body .tools-grid {
grid-template-columns: 1fr;
}
}
@media (min-width: 769px) and (max-width: 1024px) {
.product-body .tools-grid {
grid-template-columns: repeat(2, 1fr);
}
}
.tools-grid .tool-card {
background: rgba(0, 0, 0, 0.03);
border-radius: 12px;
padding: 20px;
transition: all 0.3s;
border: 1px solid rgba(0, 0, 0, 0.1);
}
.tools-grid .tool-card:hover {
transform: translateY(-3px);
background: rgba(0, 0, 0, 0.05);
border-color: rgba(15, 114, 181, 0.3);
box-shadow: 0 5px 15px rgba(15, 114, 181, 0.15);
}
.tools-grid .tool-icon {
width: 60px;
height: 60px;
margin-bottom: 15px;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, rgba(15, 114, 181, 0.15), rgba(0, 64, 110, 0.1));
border-radius: 15px;
}
.tools-grid .tool-icon img {
width: 35px;
height: 35px;
filter: brightness(0) saturate(100%) invert(52%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(108%) contrast(92%);
}
.tools-grid h4 {
color: #1a1a1a;
font-size: 1.2rem;
margin-bottom: 15px;
font-weight: 600;
}
.tools-grid .tool-features ul {
list-style: none;
padding: 0;
}
.tools-grid .tool-features li {
color: rgba(0, 0, 0, 0.7);
padding: 5px 0;
font-size: 0.9rem;
position: relative;
padding-left: 20px;
line-height: 1.5;
}
.tools-grid .tool-features li::before {
content: '▸';
position: absolute;
left: 0;
color: #1e90ff;
font-weight: bold;
}
/* Responsive Design */
@media (max-width: 968px) {
.products-grid {
grid-template-columns: 1fr;
}
.product-card.featured {
grid-column: span 1;
}
.products-section .section-title {
font-size: 2.5rem;
}
}
/* Floating Tech Particles */
.tech-particles {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
overflow: hidden;
pointer-events: none;
}
.particle {
position: absolute;
background: rgba(15, 114, 181, 0.3);
border-radius: 50%;
pointer-events: none;
}
.particle:nth-child(1) {
width: 3px;
height: 3px;
top: 10%;
left: 20%;
animation: float1 15s infinite;
}
.particle:nth-child(2) {
width: 2px;
height: 2px;
top: 70%;
left: 80%;
animation: float2 20s infinite;
}
.particle:nth-child(3) {
width: 4px;
height: 4px;
top: 40%;
left: 60%;
animation: float3 18s infinite;
}
@keyframes float1 {
0%, 100% { transform: translate(0, 0); opacity: 0; }
10% { opacity: 1; }
90% { opacity: 1; }
100% { transform: translate(100px, -100px); opacity: 0; }
}
@keyframes float2 {
0%, 100% { transform: translate(0, 0); opacity: 0; }
10% { opacity: 1; }
90% { opacity: 1; }
100% { transform: translate(-100px, -150px); opacity: 0; }
}
@keyframes float3 {
0%, 100% { transform: translate(0, 0); opacity: 0; }
10% { opacity: 1; }
90% { opacity: 1; }
100% { transform: translate(50px, -120px); opacity: 0; }
}

437
css/section-transitions.css Normale Datei
Datei anzeigen

@ -0,0 +1,437 @@
/* Modern Section Transitions & Dividers */
/* Simple fade transition between sections */
.section-fade {
position: relative;
opacity: 0;
transform: translateY(30px);
transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
}
.section-fade.visible {
opacity: 1;
transform: translateY(0);
}
/* Subtle gradient overlay at section edges */
.section-gradient-top {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100px;
background: linear-gradient(to bottom, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%);
pointer-events: none;
z-index: 1;
}
.section-gradient-bottom {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 100px;
background: linear-gradient(to top, rgba(244,244,244,1) 0%, rgba(244,244,244,0) 100%);
pointer-events: none;
z-index: 1;
}
/* Animated Gradient Divider */
.gradient-divider {
position: relative;
height: 200px;
margin: -100px 0;
background: linear-gradient(
135deg,
transparent 0%,
rgba(15, 114, 181, 0.03) 25%,
rgba(15, 114, 181, 0.08) 50%,
rgba(15, 114, 181, 0.03) 75%,
transparent 100%
);
z-index: 5;
overflow: hidden;
}
.gradient-divider::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 200%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
rgba(15, 114, 181, 0.2),
transparent
);
animation: shimmerDivider 8s infinite;
}
@keyframes shimmerDivider {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
/* Diagonal Section Transitions */
.diagonal-section {
position: relative;
padding: 120px 0 80px;
margin-top: -50px;
clip-path: polygon(0 50px, 100% 0, 100% 100%, 0 100%);
}
.diagonal-section-reverse {
position: relative;
padding: 120px 0 80px;
margin-top: -50px;
clip-path: polygon(0 0, 100% 50px, 100% 100%, 0 100%);
}
/* Blob Divider */
.blob-divider {
position: absolute;
bottom: -150px;
left: 0;
width: 100%;
height: 300px;
z-index: 5;
pointer-events: none;
}
.blob-shape {
position: absolute;
width: 100%;
height: 100%;
background: linear-gradient(135deg, #0f72b5, #00406e);
opacity: 0.1;
border-radius: 40% 60% 60% 40% / 60% 30% 70% 40%;
animation: morphBlob 20s ease-in-out infinite;
}
@keyframes morphBlob {
0%, 100% {
border-radius: 40% 60% 60% 40% / 60% 30% 70% 40%;
transform: translate(0, 0) scale(1);
}
33% {
border-radius: 60% 40% 30% 70% / 60% 70% 30% 40%;
transform: translate(-30px, -20px) scale(1.1);
}
66% {
border-radius: 30% 70% 70% 30% / 30% 60% 40% 70%;
transform: translate(30px, 20px) scale(0.9);
}
}
/* Particle Bridge */
.particle-bridge {
position: absolute;
width: 100%;
height: 200px;
bottom: -100px;
left: 0;
z-index: 8;
overflow: hidden;
}
.particle {
position: absolute;
width: 4px;
height: 4px;
background: #0f72b5;
border-radius: 50%;
opacity: 0.6;
}
@keyframes floatParticle {
0% {
transform: translateY(100px) translateX(0);
opacity: 0;
}
10% {
opacity: 0.6;
}
90% {
opacity: 0.6;
}
100% {
transform: translateY(-100px) translateX(100px);
opacity: 0;
}
}
/* Curved Section */
.curved-section {
position: relative;
padding-top: 100px;
margin-top: -80px;
}
.curved-section::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 80px;
background: inherit;
border-radius: 0 0 50% 50% / 0 0 100% 100%;
transform: scaleX(1.5);
}
/* Glass Transition */
.glass-transition {
position: relative;
margin: 50px 0;
padding: 40px 0;
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.1) 0%,
rgba(255, 255, 255, 0.05) 100%
);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border-top: 1px solid rgba(15, 114, 181, 0.1);
border-bottom: 1px solid rgba(15, 114, 181, 0.1);
}
/* Zigzag Border */
.zigzag-top {
position: relative;
padding-top: 40px;
}
.zigzag-top::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 30px;
background: linear-gradient(
135deg,
transparent 33.33%,
#0f72b5 33.33%,
#0f72b5 66.66%,
transparent 66.66%
);
background-size: 30px 60px;
opacity: 0.1;
}
/* Flowing Lines */
.flow-lines {
position: absolute;
width: 100%;
height: 200px;
bottom: -100px;
left: 0;
overflow: hidden;
z-index: 5;
}
.flow-line {
position: absolute;
height: 2px;
background: linear-gradient(90deg, transparent, #0f72b5, transparent);
animation: flowLine 6s infinite;
}
.flow-line:nth-child(1) {
top: 20%;
animation-delay: 0s;
width: 60%;
}
.flow-line:nth-child(2) {
top: 40%;
animation-delay: 1s;
width: 80%;
}
.flow-line:nth-child(3) {
top: 60%;
animation-delay: 2s;
width: 70%;
}
.flow-line:nth-child(4) {
top: 80%;
animation-delay: 3s;
width: 90%;
}
@keyframes flowLine {
0% {
transform: translateX(-100%);
opacity: 0;
}
50% {
opacity: 1;
}
100% {
transform: translateX(200%);
opacity: 0;
}
}
/* Reveal Sections with Mask */
.section-reveal {
position: relative;
overflow: hidden;
}
.section-reveal::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
rgba(255, 255, 255, 0.4),
transparent
);
animation: revealMask 2s ease-out forwards;
}
@keyframes revealMask {
to {
left: 100%;
}
}
/* Geometric Pattern Divider */
.geometric-divider {
position: relative;
height: 100px;
margin: 40px 0;
background-image:
repeating-linear-gradient(
45deg,
transparent,
transparent 10px,
rgba(15, 114, 181, 0.05) 10px,
rgba(15, 114, 181, 0.05) 20px
),
repeating-linear-gradient(
-45deg,
transparent,
transparent 10px,
rgba(15, 114, 181, 0.05) 10px,
rgba(15, 114, 181, 0.05) 20px
);
}
/* Animated Border */
.animated-border {
position: relative;
padding: 80px 0;
}
.animated-border::before,
.animated-border::after {
content: '';
position: absolute;
left: 0;
width: 100%;
height: 2px;
background: linear-gradient(
90deg,
transparent,
#0f72b5 20%,
#0f72b5 80%,
transparent
);
}
.animated-border::before {
top: 0;
animation: borderSlide 4s infinite;
}
.animated-border::after {
bottom: 0;
animation: borderSlide 4s infinite reverse;
}
@keyframes borderSlide {
0%, 100% {
transform: translateX(-100%);
}
50% {
transform: translateX(100%);
}
}
/* Section Fade Transitions */
.fade-section {
opacity: 0;
transform: translateY(50px);
transition: all 1s cubic-bezier(0.4, 0, 0.2, 1);
}
.fade-section.visible {
opacity: 1;
transform: translateY(0);
}
/* Parallax Background Sections */
.parallax-section {
position: relative;
min-height: 500px;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.parallax-bg {
position: absolute;
top: -20%;
left: 0;
width: 100%;
height: 120%;
background-image: linear-gradient(135deg, rgba(15, 114, 181, 0.05) 0%, transparent 100%);
background-attachment: fixed;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
will-change: transform;
}
/* Split Color Section */
.split-section {
position: relative;
overflow: hidden;
}
.split-section::before {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: linear-gradient(
45deg,
transparent 48%,
rgba(15, 114, 181, 0.05) 49%,
rgba(15, 114, 181, 0.05) 51%,
transparent 52%
);
animation: rotateSplit 20s linear infinite;
}
@keyframes rotateSplit {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}

Binäre Datei nicht angezeigt.

Binäre Datei nicht angezeigt.

Binäre Datei nicht angezeigt.

303
js/animations-enhanced.js Normale Datei
Datei anzeigen

@ -0,0 +1,303 @@
/**
* Enhanced Animations and Interactions
* Premium effects for modern web experience
*/
const EnhancedAnimations = {
init() {
this.initScrollAnimations();
this.initParallaxEffects();
this.initMagneticButtons();
this.initTextAnimations();
this.initCardTilt();
this.initSmoothScroll();
this.initCursorEffects();
this.initNumberCounters();
this.initRevealOnScroll();
this.initNavbarEffects();
},
// Smooth scroll with easing
initSmoothScroll() {
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
const offset = 100;
const targetPosition = target.offsetTop - offset;
window.scrollTo({
top: targetPosition,
behavior: 'smooth'
});
}
});
});
},
// Parallax scrolling effects
initParallaxEffects() {
const parallaxElements = document.querySelectorAll('.parallax');
let ticking = false;
function updateParallax() {
const scrolled = window.pageYOffset;
parallaxElements.forEach(element => {
const speed = element.dataset.speed || 0.5;
const yPos = -(scrolled * speed);
element.style.transform = `translateY(${yPos}px)`;
});
ticking = false;
}
function requestTick() {
if (!ticking) {
window.requestAnimationFrame(updateParallax);
ticking = true;
}
}
window.addEventListener('scroll', requestTick);
},
// Magnetic button effects
initMagneticButtons() {
const magneticButtons = document.querySelectorAll('.primary-button, .secondary-button, .cta-button');
magneticButtons.forEach(button => {
button.addEventListener('mousemove', (e) => {
const rect = button.getBoundingClientRect();
const x = e.clientX - rect.left - rect.width / 2;
const y = e.clientY - rect.top - rect.height / 2;
button.style.transform = `translate(${x * 0.2}px, ${y * 0.2}px) scale(1.05)`;
});
button.addEventListener('mouseleave', () => {
button.style.transform = '';
});
});
},
// Advanced text animations
initTextAnimations() {
// Typewriter effect for hero title - DISABLED to prevent duplication
// The title already has CSS animations applied
/* Commented out to fix duplication issue
const heroTitle = document.querySelector('.main-title');
if (heroTitle && !heroTitle.dataset.animated) {
heroTitle.dataset.animated = 'true';
const text = heroTitle.textContent;
heroTitle.textContent = '';
heroTitle.style.opacity = '1';
let index = 0;
const typeWriter = () => {
if (index < text.length) {
heroTitle.textContent += text.charAt(index);
index++;
setTimeout(typeWriter, 50);
}
};
// Start typewriter after a short delay
setTimeout(typeWriter, 500);
}
*/
// Word-by-word reveal for hero text
const heroText = document.querySelector('.hero-text');
if (heroText) {
const words = heroText.textContent.split(' ');
heroText.innerHTML = words.map(word =>
`<span class="word-reveal" style="opacity: 0; display: inline-block; transform: translateY(20px); transition: all 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);">${word}</span>`
).join(' ');
const wordSpans = heroText.querySelectorAll('.word-reveal');
wordSpans.forEach((word, index) => {
setTimeout(() => {
word.style.opacity = '1';
word.style.transform = 'translateY(0)';
}, 1000 + index * 100);
});
}
},
// 3D card tilt effect
initCardTilt() {
const cards = document.querySelectorAll('.tool-card, .value-card, .why-card');
cards.forEach(card => {
card.addEventListener('mousemove', (e) => {
const rect = card.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
const centerX = rect.width / 2;
const centerY = rect.height / 2;
const rotateX = (y - centerY) / 10;
const rotateY = (centerX - x) / 10;
card.style.transform = `perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(1.02)`;
});
card.addEventListener('mouseleave', () => {
card.style.transform = '';
});
});
},
// Custom cursor effects - DISABLED
initCursorEffects() {
// Cursor removed as requested
return;
},
// Animated number counters
initNumberCounters() {
const counters = document.querySelectorAll('.indicator-value');
const animationDuration = 2000;
let hasAnimated = false;
const animateCounters = () => {
if (hasAnimated) return;
counters.forEach(counter => {
const target = parseFloat(counter.dataset.target);
const start = 0;
const increment = target / (animationDuration / 16);
let current = start;
const updateCounter = () => {
current += increment;
if (current < target) {
counter.textContent = Math.floor(current);
requestAnimationFrame(updateCounter);
} else {
counter.textContent = target % 1 === 0 ? target : target.toFixed(1);
}
};
updateCounter();
});
hasAnimated = true;
};
// Trigger on scroll into view
const observerOptions = {
threshold: 0.5
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
animateCounters();
}
});
}, observerOptions);
const indicatorsSection = document.querySelector('.trust-indicators');
if (indicatorsSection) {
observer.observe(indicatorsSection);
}
},
// Reveal elements on scroll
initRevealOnScroll() {
const revealElements = document.querySelectorAll('.about-panel, .tool-card, .value-card, .why-card, .competency-item');
revealElements.forEach((element, index) => {
element.style.opacity = '0';
element.style.transform = 'translateY(50px)';
element.style.transition = 'all 0.8s cubic-bezier(0.4, 0, 0.2, 1)';
});
const revealOnScroll = () => {
const windowHeight = window.innerHeight;
revealElements.forEach((element, index) => {
const elementTop = element.getBoundingClientRect().top;
const elementVisible = 100;
if (elementTop < windowHeight - elementVisible) {
setTimeout(() => {
element.style.opacity = '1';
element.style.transform = 'translateY(0)';
}, index * 50);
}
});
};
window.addEventListener('scroll', revealOnScroll);
revealOnScroll(); // Check on initial load
},
// Scroll-based animations
initScrollAnimations() {
let lastScrollY = window.scrollY;
let ticking = false;
function updateScrollAnimations() {
const scrollY = window.scrollY;
const scrollDirection = scrollY > lastScrollY ? 'down' : 'up';
// Hero parallax
const hero = document.querySelector('.hero-content');
if (hero) {
hero.style.transform = `translateY(${scrollY * 0.5}px)`;
hero.style.opacity = 1 - (scrollY / 800);
}
// Video parallax
const heroVideos = document.querySelector('.hero-video-container');
if (heroVideos) {
heroVideos.style.transform = `translateY(${scrollY * 0.3}px) scale(${1 + scrollY * 0.0003})`;
}
lastScrollY = scrollY;
ticking = false;
}
function requestTick() {
if (!ticking) {
window.requestAnimationFrame(updateScrollAnimations);
ticking = true;
}
}
window.addEventListener('scroll', requestTick);
},
// Enhanced navbar effects
initNavbarEffects() {
const navbar = document.querySelector('.navbar');
let lastScrollY = window.scrollY;
window.addEventListener('scroll', () => {
const scrollY = window.scrollY;
if (scrollY > 50) {
navbar.classList.add('scrolled');
} else {
navbar.classList.remove('scrolled');
}
// Keep navbar always visible
navbar.style.transform = 'translateY(0)';
lastScrollY = scrollY;
});
}
};
// Initialize when DOM is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => EnhancedAnimations.init());
} else {
EnhancedAnimations.init();
}

403
js/animations.js Normale Datei
Datei anzeigen

@ -0,0 +1,403 @@
/**
* Animation module for IntelSight website
* Contains all animation logic and visual effects
*/
// Particle Animation System
const ParticleAnimation = {
canvas: null,
ctx: null,
particles: [],
/**
* Initialize particle animation
*/
init() {
this.canvas = document.querySelector(SELECTORS.PARTICLE_CANVAS);
if (!this.canvas) return;
this.ctx = this.canvas.getContext('2d');
this.resizeCanvas();
this.createParticles();
this.animate();
// Handle window resize
window.addEventListener('resize', () => this.resizeCanvas());
},
/**
* Resize canvas to window size
*/
resizeCanvas() {
this.canvas.width = window.innerWidth;
this.canvas.height = window.innerHeight;
},
/**
* Create particle objects
*/
createParticles() {
this.particles = [];
for (let i = 0; i < CONFIG.ANIMATION.PARTICLE_COUNT; i++) {
this.particles.push(new Particle(this.canvas));
}
},
/**
* Main animation loop
*/
animate() {
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
// Update and draw particles
this.particles.forEach(particle => {
particle.update(this.canvas);
particle.draw(this.ctx);
});
// Draw connections between particles
this.drawConnections();
requestAnimationFrame(() => this.animate());
},
/**
* Draw connections between nearby particles
*/
drawConnections() {
for (let a = 0; a < this.particles.length; a++) {
for (let b = a + 1; b < this.particles.length; b++) {
const distance = Math.sqrt(
Math.pow(this.particles[a].x - this.particles[b].x, 2) +
Math.pow(this.particles[a].y - this.particles[b].y, 2)
);
if (distance < CONFIG.ANIMATION.CONNECTION_DISTANCE) {
const opacity = 0.15 * (1 - distance / CONFIG.ANIMATION.CONNECTION_DISTANCE);
// Use darker blue for better visibility on light background
this.ctx.strokeStyle = `rgba(15, 114, 181, ${opacity})`;
this.ctx.lineWidth = 1;
this.ctx.beginPath();
this.ctx.moveTo(this.particles[a].x, this.particles[a].y);
this.ctx.lineTo(this.particles[b].x, this.particles[b].y);
this.ctx.stroke();
}
}
}
}
};
/**
* Particle class for animation
*/
class Particle {
constructor(canvas) {
this.x = Math.random() * canvas.width;
this.y = Math.random() * canvas.height;
this.size = Math.random() * (CONFIG.ANIMATION.PARTICLE_SIZE_MAX - CONFIG.ANIMATION.PARTICLE_SIZE_MIN) + CONFIG.ANIMATION.PARTICLE_SIZE_MIN;
this.speedX = (Math.random() - 0.5) * CONFIG.ANIMATION.PARTICLE_SPEED;
this.speedY = (Math.random() - 0.5) * CONFIG.ANIMATION.PARTICLE_SPEED;
this.opacity = Math.random() * 0.5 + 0.2;
}
update(canvas) {
this.x += this.speedX;
this.y += this.speedY;
// Wrap around screen edges
if (this.x > canvas.width) this.x = 0;
else if (this.x < 0) this.x = canvas.width;
if (this.y > canvas.height) this.y = 0;
else if (this.y < 0) this.y = canvas.height;
}
draw(ctx) {
// Use darker blue for better visibility on light background
ctx.fillStyle = `rgba(15, 114, 181, ${this.opacity * 0.7})`;
ctx.beginPath();
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
ctx.fill();
}
}
// Counter Animation
const CounterAnimation = {
/**
* Animate all counter elements
*/
animateAll() {
const counters = document.querySelectorAll(SELECTORS.INDICATOR_VALUE);
counters.forEach(counter => this.animateCounter(counter));
},
/**
* Animate a single counter
* @param {HTMLElement} counter - Counter element to animate
*/
animateCounter(counter) {
const target = parseFloat(counter.getAttribute(DATA_ATTRS.TARGET));
const increment = target / CONFIG.ANIMATION.COUNTER_SPEED;
let current = 0;
const updateCounter = () => {
current += increment;
if (current < target) {
counter.innerText = Math.ceil(current);
setTimeout(updateCounter, CONFIG.TIMING.COUNTER_UPDATE_INTERVAL);
} else {
// Set final value with proper formatting
if (target === CONFIG.TRUST_INDICATORS.AVAILABILITY) {
counter.innerText = target + '%';
} else if (target === CONFIG.TRUST_INDICATORS.AUTHORITIES_COUNT) {
counter.innerText = target + '+';
} else if (target === CONFIG.TRUST_INDICATORS.SUPPORT_HOURS) {
counter.innerText = target + '/7';
}
}
};
updateCounter();
}
};
// Scroll Animations
const ScrollAnimations = {
scrollIndicator: null,
/**
* Initialize scroll-based animations
*/
init() {
this.scrollIndicator = document.querySelector(SELECTORS.SCROLL_INDICATOR);
this.setupScrollIndicator();
this.setupIntersectionObserver();
},
/**
* Setup scroll indicator behavior
*/
setupScrollIndicator() {
if (!this.scrollIndicator) return;
// Click to scroll to about section
this.scrollIndicator.addEventListener('click', () => {
const aboutSection = document.querySelector('#about');
if (aboutSection) {
aboutSection.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
});
// Hide/show based on scroll position
let scrollTimeout;
window.addEventListener('scroll', () => {
const hero = document.querySelector(SELECTORS.HERO);
if (window.scrollY > CONFIG.ANIMATION.SCROLL_THRESHOLD) {
if (hero) hero.classList.add(CLASSES.SCROLLED);
if (this.scrollIndicator) this.scrollIndicator.style.opacity = '0';
} else {
if (hero) hero.classList.remove(CLASSES.SCROLLED);
if (this.scrollIndicator) this.scrollIndicator.style.opacity = '1';
}
clearTimeout(scrollTimeout);
scrollTimeout = setTimeout(() => {
if (window.scrollY > CONFIG.ANIMATION.SCROLL_THRESHOLD && this.scrollIndicator) {
this.scrollIndicator.style.display = 'none';
} else if (this.scrollIndicator) {
this.scrollIndicator.style.display = 'flex';
}
}, CONFIG.TIMING.SCROLL_HIDE_DELAY);
});
},
/**
* Setup intersection observer for scroll-triggered animations
*/
setupIntersectionObserver() {
const observerOptions = {
threshold: CONFIG.OBSERVER.THRESHOLD,
rootMargin: CONFIG.OBSERVER.ROOT_MARGIN
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
// Trust indicators animation
if (entry.target.classList.contains('trust-indicators')) {
CounterAnimation.animateAll();
observer.unobserve(entry.target);
}
// Timeline animation
if (entry.target.classList.contains('timeline')) {
const items = entry.target.querySelectorAll('.timeline-item');
items.forEach((item, index) => {
setTimeout(() => {
item.classList.add(CLASSES.VISIBLE);
}, index * 300);
});
observer.unobserve(entry.target);
}
// Feature nodes animation
if (entry.target.classList.contains('feature-nodes')) {
const nodes = entry.target.querySelectorAll('.node');
nodes.forEach((node, index) => {
setTimeout(() => {
node.style.opacity = '1';
node.style.transform = 'translateY(0)';
}, index * 150);
});
observer.unobserve(entry.target);
}
}
});
}, observerOptions);
// Observe elements
const trustIndicators = document.querySelector(SELECTORS.TRUST_INDICATORS);
if (trustIndicators) {
trustIndicators.style.opacity = '0';
observer.observe(trustIndicators);
}
const timeline = document.querySelector('.timeline');
if (timeline) observer.observe(timeline);
const featureNodes = document.querySelector('.feature-nodes');
if (featureNodes) {
document.querySelectorAll('.node').forEach(node => {
node.style.opacity = '0';
node.style.transform = 'translateY(30px)';
node.style.transition = 'all 0.6s ease';
});
observer.observe(featureNodes);
}
}
};
// Glitch Effect
const GlitchEffect = {
/**
* Apply glitch effect to element on hover
* @param {HTMLElement} element - Element to apply effect to
*/
apply(element) {
if (!element) return;
let glitchInterval;
element.addEventListener('mouseenter', () => {
let count = 0;
glitchInterval = setInterval(() => {
element.style.textShadow = `
${Math.random() * 5}px ${Math.random() * 5}px 0 rgba(0, 212, 255, 0.5),
${Math.random() * -5}px ${Math.random() * 5}px 0 rgba(255, 0, 128, 0.5)
`;
count++;
if (count > CONFIG.ANIMATION.GLITCH_ITERATIONS) {
clearInterval(glitchInterval);
element.style.textShadow = 'none';
}
}, CONFIG.ANIMATION.GLITCH_INTERVAL);
});
}
};
// Interactive Elements
const InteractiveElements = {
/**
* Initialize all interactive element animations
*/
init() {
this.setupNodeHoverEffects();
this.setupWidgetHoverEffects();
this.setupInteractiveIcon();
},
/**
* Setup hover effects for node elements
*/
setupNodeHoverEffects() {
document.querySelectorAll('.node').forEach(node => {
node.addEventListener('mouseenter', function() {
const icon = this.querySelector('.node-icon');
if (icon) icon.style.transform = 'scale(1.2) rotate(5deg)';
});
node.addEventListener('mouseleave', function() {
const icon = this.querySelector('.node-icon');
if (icon) icon.style.transform = 'scale(1) rotate(0deg)';
});
});
},
/**
* Setup hover effects for widget elements
*/
setupWidgetHoverEffects() {
document.querySelectorAll('.widget').forEach(widget => {
widget.addEventListener('mouseenter', function() {
this.style.boxShadow = '0 5px 20px rgba(0, 212, 255, 0.3)';
});
widget.addEventListener('mouseleave', function() {
this.style.boxShadow = 'none';
});
});
},
/**
* Setup 3D interactive icon effect
*/
setupInteractiveIcon() {
const icon = document.querySelector(SELECTORS.INTERACTIVE_ICON);
if (!icon) return;
document.addEventListener('mousemove', (e) => {
const rect = icon.getBoundingClientRect();
const centerX = rect.left + rect.width / 2;
const centerY = rect.top + rect.height / 2;
const mouseX = (e.clientX - centerX) / 20;
const mouseY = (e.clientY - centerY) / 20;
icon.style.transform = `perspective(1000px) rotateY(${mouseX}deg) rotateX(${-mouseY}deg)`;
});
}
};
// Initialize all animations
const Animations = {
/**
* Initialize all animation systems
*/
init() {
// Core animations
ParticleAnimation.init();
ScrollAnimations.init();
InteractiveElements.init();
// Apply glitch effect to main title
const mainTitle = document.querySelector('.main-title');
if (mainTitle) {
GlitchEffect.apply(mainTitle);
}
// Page load animations
window.addEventListener('load', () => {
document.body.classList.add(CLASSES.LOADED);
// Fade in hero content
setTimeout(() => {
const heroContent = document.querySelector(SELECTORS.HERO_CONTENT);
if (heroContent) {
heroContent.style.opacity = '1';
heroContent.style.transform = 'translateY(0)';
}
}, 100);
});
}
};

499
js/components.js Normale Datei
Datei anzeigen

@ -0,0 +1,499 @@
/**
* UI Components module for IntelSight website
* Contains all interactive UI component logic
*/
// Language Toggle Component
const LanguageToggle = {
element: null,
/**
* Initialize language toggle
*/
init() {
this.element = document.querySelector(SELECTORS.LANG_TOGGLE);
if (!this.element) return;
this.element.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
this.toggle();
});
},
/**
* Toggle between languages
*/
toggle() {
const newLanguage = getCurrentLanguage() === 'de' ? 'en' : 'de';
switchLanguage(newLanguage);
// Update expand button text after language change
ProductShowcase.updateExpandButtonText();
}
};
// Navigation Component
const Navigation = {
navbar: null,
/**
* Initialize navigation component
*/
init() {
this.navbar = document.querySelector(SELECTORS.NAVBAR);
this.setupSmoothScrolling();
this.setupMobileMenu();
},
/**
* Setup smooth scrolling for anchor links
*/
setupSmoothScrolling() {
document.querySelectorAll(SELECTORS.SMOOTH_LINKS).forEach(anchor => {
anchor.addEventListener('click', function(e) {
e.preventDefault();
const targetId = this.getAttribute('href');
const target = document.querySelector(targetId);
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
},
/**
* Setup mobile menu functionality
*/
setupMobileMenu() {
// Mobile menu logic would go here if needed
// Currently not implemented as per YAGNI principle
}
};
// About Section Tabs
const AboutTabs = {
tabs: null,
panels: null,
/**
* Initialize about section tabs
*/
init() {
this.tabs = document.querySelectorAll(SELECTORS.ABOUT_TABS);
this.panels = document.querySelectorAll(SELECTORS.ABOUT_PANELS);
if (!this.tabs.length) return;
this.tabs.forEach(tab => {
tab.addEventListener('click', () => this.switchTab(tab));
});
},
/**
* Switch to selected tab
* @param {HTMLElement} selectedTab - Tab element that was clicked
*/
switchTab(selectedTab) {
const targetPanelId = selectedTab.getAttribute(DATA_ATTRS.TAB);
// Remove active class from all tabs and panels
this.tabs.forEach(tab => tab.classList.remove(CLASSES.ACTIVE));
this.panels.forEach(panel => panel.classList.remove(CLASSES.ACTIVE));
// Add active class to selected tab and corresponding panel
selectedTab.classList.add(CLASSES.ACTIVE);
const targetPanel = document.getElementById(targetPanelId);
if (targetPanel) {
targetPanel.classList.add(CLASSES.ACTIVE);
}
}
};
// Product Showcase Component
const ProductShowcase = {
expandButton: null,
toolsGrid: null,
/**
* Initialize product showcase
*/
init() {
this.expandButton = document.querySelector(SELECTORS.EXPAND_BUTTON);
this.toolsGrid = document.querySelector(SELECTORS.TOOLS_GRID);
if (!this.expandButton || !this.toolsGrid) return;
this.expandButton.addEventListener('click', () => this.toggleExpand());
},
/**
* Toggle expand/collapse state
*/
toggleExpand() {
const isExpanded = this.expandButton.getAttribute(DATA_ATTRS.EXPANDED) === 'true';
if (isExpanded) {
this.collapse();
} else {
this.expand();
}
},
/**
* Expand the tools grid
*/
expand() {
this.toolsGrid.classList.remove(CLASSES.COLLAPSED);
this.expandButton.setAttribute(DATA_ATTRS.EXPANDED, 'true');
this.updateExpandButtonText();
},
/**
* Collapse the tools grid
*/
collapse() {
this.toolsGrid.classList.add(CLASSES.COLLAPSED);
this.expandButton.setAttribute(DATA_ATTRS.EXPANDED, 'false');
this.updateExpandButtonText();
},
/**
* Update expand button text based on state
*/
updateExpandButtonText() {
const expandText = this.expandButton?.querySelector('.expand-text');
if (!expandText) return;
const isExpanded = this.expandButton.getAttribute(DATA_ATTRS.EXPANDED) === 'true';
expandText.textContent = getTranslation(isExpanded ? 'hideDetails' : 'expandDetails');
}
};
// Login Modal Component
const LoginModal = {
modalElement: null,
modalStyles: null,
/**
* Show login modal
*/
show() {
this.createModal();
this.attachEventListeners();
},
/**
* Create modal HTML and styles
*/
createModal() {
// Create modal element
this.modalElement = document.createElement('div');
this.modalElement.className = 'login-modal';
this.modalElement.innerHTML = this.getModalHTML();
document.body.appendChild(this.modalElement);
// Add modal styles if not already added
if (!this.modalStyles) {
this.addModalStyles();
}
},
/**
* Get modal HTML content
* @returns {string} Modal HTML
*/
getModalHTML() {
const t = getTranslation;
return `
<div class="modal-content">
<button class="modal-close">×</button>
<div class="modal-header">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="lock-icon">
<rect x="5" y="11" width="14" height="10" rx="2" stroke="currentColor" stroke-width="2"/>
<path d="M7 11V7C7 4.23858 9.23858 2 12 2C14.7614 2 17 4.23858 17 7V11" stroke="currentColor" stroke-width="2"/>
<circle cx="12" cy="16" r="1" fill="currentColor"/>
</svg>
<h3>${t('authRequired')}</h3>
</div>
<p>${t('authDescription')}</p>
<form id="loginForm">
<div class="form-group">
<label for="auth-password">${t('accessCode')}</label>
<input type="password" id="auth-password" placeholder="${t('accessCodePlaceholder')}" required autofocus>
</div>
<button type="submit" class="primary-button">${t('grantAccess')}</button>
</form>
<p class="auth-note">${t('noAccess')} <a href="mailto:info@intelsight.de">${t('contactUs')}</a></p>
</div>
`;
},
/**
* Add modal styles to document
*/
addModalStyles() {
this.modalStyles = document.createElement('style');
this.modalStyles.textContent = `
.login-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(10px);
display: flex;
align-items: center;
justify-content: center;
z-index: 10000;
animation: fadeIn 0.3s ease;
}
.modal-content {
background: #ffffff;
border-radius: 12px;
padding: 2.5rem;
max-width: 400px;
width: 90%;
position: relative;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
}
.modal-header {
text-align: center;
margin-bottom: 1.5rem;
}
.modal-header .lock-icon {
width: 48px;
height: 48px;
color: #0066cc;
margin-bottom: 1rem;
}
.modal-close {
position: absolute;
top: 1rem;
right: 1rem;
background: none;
border: none;
color: #666;
font-size: 2rem;
cursor: pointer;
transition: all 0.3s ease;
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
}
.modal-close:hover {
background: #f0f0f0;
color: #333;
}
.modal-content h3 {
color: #1a1a1a;
margin-bottom: 0.5rem;
font-size: 1.5rem;
font-weight: 600;
}
.modal-content p {
color: #666;
margin-bottom: 2rem;
text-align: center;
}
.modal-content .form-group {
margin-bottom: 1.5rem;
}
.modal-content label {
display: block;
color: #333;
margin-bottom: 0.5rem;
font-weight: 500;
}
.modal-content input {
width: 100%;
padding: 0.875rem;
background: #f8f8f8;
border: 2px solid #e0e0e0;
border-radius: 8px;
color: #333;
font-size: 1rem;
transition: all 0.3s ease;
}
.modal-content input:focus {
outline: none;
border-color: #0066cc;
background: #fff;
}
.modal-content input::placeholder {
color: #999;
}
.modal-content .primary-button {
width: 100%;
padding: 0.875rem;
background: #0066cc;
color: white;
border: none;
border-radius: 8px;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
}
.modal-content .primary-button:hover {
background: #0052a3;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 102, 204, 0.3);
}
.auth-note {
text-align: center;
margin-top: 1.5rem;
font-size: 0.9rem;
color: #666;
}
.auth-note a {
color: #0066cc;
text-decoration: none;
}
.auth-note a:hover {
text-decoration: underline;
}
`;
document.head.appendChild(this.modalStyles);
},
/**
* Attach event listeners to modal
*/
attachEventListeners() {
// Close button
const closeBtn = this.modalElement.querySelector('.modal-close');
closeBtn.addEventListener('click', () => this.close());
// Form submission
const form = this.modalElement.querySelector('#loginForm');
form.addEventListener('submit', (e) => this.handleSubmit(e));
// Click outside to close
this.modalElement.addEventListener('click', (e) => {
if (e.target === this.modalElement) {
this.close();
}
});
},
/**
* Handle form submission
* @param {Event} e - Submit event
*/
handleSubmit(e) {
e.preventDefault();
const password = document.getElementById('auth-password').value;
// Check password (temporarily hardcoded as requested)
if (password === '123456') {
sessionStorage.setItem(CONFIG.AUTH.SESSION_KEY, 'true');
this.close();
window.location.href = CONFIG.AUTH.REDIRECT_PAGE;
} else {
alert(getTranslation('wrongCode'));
document.getElementById('auth-password').value = '';
document.getElementById('auth-password').focus();
}
},
/**
* Close and remove modal
*/
close() {
if (this.modalElement) {
this.modalElement.remove();
this.modalElement = null;
}
}
};
// Contact Form Component
const ContactForm = {
form: null,
/**
* Initialize contact form
*/
init() {
this.form = document.querySelector(SELECTORS.CONTACT_FORM);
if (!this.form) return;
this.form.addEventListener('submit', (e) => this.handleSubmit(e));
},
/**
* Handle form submission
* @param {Event} e - Submit event
*/
handleSubmit(e) {
e.preventDefault();
// Get form data
const formData = new FormData(this.form);
const data = Object.fromEntries(formData.entries());
// In production, this would send data to server
console.log('Form submission:', data);
// Show success message
alert(getTranslation('contactFormSuccess'));
this.form.reset();
}
};
// Demo Request Handler
const DemoRequest = {
/**
* Initialize demo request buttons
*/
init() {
document.querySelectorAll('.primary-button, .secondary-button, .cta-button').forEach(button => {
if (button.textContent.toLowerCase().includes('demo')) {
button.addEventListener('click', (e) => this.handleDemoRequest(e));
}
});
},
/**
* Handle demo request
* @param {Event} e - Click event
*/
handleDemoRequest(e) {
e.preventDefault();
alert(getTranslation('demoRequestAlert'));
}
};
// Initialize all components
const Components = {
/**
* Initialize all UI components
*/
init() {
LanguageToggle.init();
Navigation.init();
AboutTabs.init();
ProductShowcase.init();
ContactForm.init();
DemoRequest.init();
}
};
// Make showLoginModal globally available for onclick attribute
window.showLoginModal = function() {
LoginModal.show();
};
// Make closeLoginModal globally available for onclick attribute
window.closeLoginModal = function() {
LoginModal.close();
};

156
js/config.js Normale Datei
Datei anzeigen

@ -0,0 +1,156 @@
/**
* Central configuration file for IntelSight website
* Contains all constants, settings and selectors
*/
// Application Configuration
const CONFIG = {
// Animation Settings
ANIMATION: {
PARTICLE_COUNT: 100,
PARTICLE_SPEED: 3,
PARTICLE_SIZE_MIN: 1,
PARTICLE_SIZE_MAX: 3,
CONNECTION_DISTANCE: 100,
COUNTER_SPEED: 200,
SCROLL_THRESHOLD: 50,
FADE_DURATION: 500,
GLITCH_ITERATIONS: 5,
GLITCH_INTERVAL: 50
},
// Hero Video Settings
HERO_VIDEOS: {
ROTATION_INTERVAL: 12000, // 12 seconds per video (slower like Palantir)
FADE_DURATION: 3000, // 3 second fade transition (much slower)
VIDEO_SOURCES: [
'assets/videos/hero-tech-pattern.mp4',
'assets/videos/hero-data-flow.mp4',
'assets/videos/hero-network-viz.mp4',
'assets/videos/hero-code-abstract.mp4'
]
},
// Language Settings
I18N: {
DEFAULT_LANGUAGE: 'de',
SUPPORTED_LANGUAGES: ['de', 'en'],
STORAGE_KEY: 'intelsight_language'
},
// Trust Indicators Target Values
TRUST_INDICATORS: {
AVAILABILITY: 99.9,
AUTHORITIES_COUNT: 500,
SUPPORT_HOURS: 24
},
// Intersection Observer Settings
OBSERVER: {
THRESHOLD: 0.3,
ROOT_MARGIN: '0px'
},
// Authentication Settings
AUTH: {
SESSION_KEY: 'accountForgerAuth',
REDIRECT_PAGE: 'accountforger-video.html'
},
// Timeouts and Intervals
TIMING: {
SCROLL_HIDE_DELAY: 500,
COUNTER_UPDATE_INTERVAL: 10,
MAP_POINT_SPAWN_INTERVAL: 5000,
RESPONSE_TIMER_UPDATE: 2000,
LIVE_COUNTER_UPDATE: 3000
}
};
// DOM Selectors
const SELECTORS = {
// Navigation
NAVBAR: '.navbar',
NAV_MENU: '.nav-menu',
LANG_TOGGLE: '.lang-toggle',
// Hero Section
HERO: '.hero',
HERO_CONTENT: '.hero-content',
HERO_VIDEO: '.hero-video',
PARTICLE_CANVAS: '#particleCanvas',
SCROLL_INDICATOR: '.scroll-indicator',
// Trust Indicators
TRUST_INDICATORS: '.trust-indicators',
INDICATOR_VALUE: '.indicator-value',
// About Section
ABOUT_TABS: '.about-tab',
ABOUT_PANELS: '.about-panel',
// Products Section
EXPAND_BUTTON: '.expand-button',
TOOLS_GRID: '.tools-grid',
TOOL_CARDS: '.tool-card',
// Modals
LOGIN_MODAL: '.login-modal',
MODAL_CLOSE: '.modal-close',
// Forms
CONTACT_FORM: '#contactForm',
LOGIN_FORM: '#loginForm',
// Animation Elements
INTERACTIVE_ICON: '#interactiveIcon',
NEURAL_CANVAS: '#neuralCanvas',
DATA_PARTICLES: '#dataParticles',
LIVE_COUNTER: '#liveCounter',
RESPONSE_TIMER: '#responseTimer',
MAP_POINTS: '#mapPoints',
// Generic
TRANSLATABLE: '[data-translate]',
SMOOTH_LINKS: 'a[href^="#"]',
SKIP_NAV: '.skip-nav'
};
// CSS Classes
const CLASSES = {
ACTIVE: 'active',
SCROLLED: 'scrolled',
COLLAPSED: 'collapsed',
VISIBLE: 'visible',
LOADED: 'loaded',
EXPANDED: 'expanded',
HIDDEN: 'hidden',
// Animation Classes
FADE_IN: 'fade-in',
FADE_OUT: 'fade-out',
SLIDE_UP: 'slide-up',
SLIDE_DOWN: 'slide-down',
// Component Classes
PARTICLE: 'particle',
DATA_PARTICLE: 'data-particle',
MAP_POINT: 'map-point',
NODE: 'node',
WIDGET: 'widget',
TAB: 'tab',
PANEL: 'panel'
};
// Data Attributes
const DATA_ATTRS = {
TRANSLATE: 'data-translate',
TAB: 'data-tab',
EXPANDED: 'data-expanded',
LANG: 'data-lang',
TARGET: 'data-target',
TOOL: 'data-tool'
};
// Export for use in other modules (if using module system)
// For now, these are global constants available to all scripts

209
js/hero-videos.js Normale Datei
Datei anzeigen

@ -0,0 +1,209 @@
/**
* Hero Video Rotation System
* Manages rotating background videos in hero section
*/
const HeroVideoRotation = {
videos: [],
currentIndex: 0,
rotationInterval: null,
isTransitioning: false,
/**
* Initialize the video rotation system
*/
init() {
// Get all video elements
this.videos = document.querySelectorAll('.hero-video');
if (!this.videos.length) return;
// Setup event listeners
this.setupEventListeners();
// Start rotation
this.startRotation();
// Ensure first video is playing
this.playVideo(0);
},
/**
* Setup event listeners for videos
*/
setupEventListeners() {
// Indicators removed - no click handlers needed
// Pause rotation on hover (optional)
const heroSection = document.querySelector('.hero');
if (heroSection) {
heroSection.addEventListener('mouseenter', () => {
// Optional: pause rotation on hover
// this.stopRotation();
});
heroSection.addEventListener('mouseleave', () => {
// Optional: resume rotation
// this.startRotation();
});
}
// Handle video load errors gracefully
this.videos.forEach((video, index) => {
video.addEventListener('error', () => {
console.warn(`Video ${index} failed to load, skipping...`);
// If current video fails, move to next
if (index === this.currentIndex) {
this.nextVideo();
}
});
// Ensure videos are ready to play
video.addEventListener('loadeddata', () => {
console.log(`Video ${index} loaded successfully`);
});
});
},
/**
* Start automatic rotation
*/
startRotation() {
// Clear any existing interval
this.stopRotation();
// Set new interval
this.rotationInterval = setInterval(() => {
this.nextVideo();
}, CONFIG.HERO_VIDEOS.ROTATION_INTERVAL);
},
/**
* Stop automatic rotation
*/
stopRotation() {
if (this.rotationInterval) {
clearInterval(this.rotationInterval);
this.rotationInterval = null;
}
},
/**
* Switch to next video
*/
nextVideo() {
const nextIndex = (this.currentIndex + 1) % this.videos.length;
this.switchToVideo(nextIndex);
},
/**
* Switch to previous video
*/
previousVideo() {
const prevIndex = (this.currentIndex - 1 + this.videos.length) % this.videos.length;
this.switchToVideo(prevIndex);
},
/**
* Switch to specific video by index
* @param {number} index - Video index to switch to
*/
switchToVideo(index) {
if (this.isTransitioning || index === this.currentIndex) return;
this.isTransitioning = true;
const currentVideo = this.videos[this.currentIndex];
const nextVideo = this.videos[index];
// Indicators removed - no update needed
// Prepare next video
this.prepareVideo(nextVideo);
// Fade out current video
currentVideo.classList.add('fading-out');
// After half the fade duration, start fading in the next video
setTimeout(() => {
nextVideo.classList.add('active');
nextVideo.classList.remove('fading-out');
// Play next video
this.playVideo(index);
}, CONFIG.HERO_VIDEOS.FADE_DURATION / 2);
// Complete transition
setTimeout(() => {
currentVideo.classList.remove('active', 'fading-out');
this.currentIndex = index;
this.isTransitioning = false;
}, CONFIG.HERO_VIDEOS.FADE_DURATION);
},
/**
* Prepare video for playback
* @param {HTMLVideoElement} video - Video element to prepare
*/
prepareVideo(video) {
// Reset video to beginning
video.currentTime = 0;
// Ensure video is ready to play
const playPromise = video.play();
if (playPromise !== undefined) {
playPromise.catch(error => {
console.warn('Video autoplay was prevented:', error);
});
}
},
/**
* Play specific video
* @param {number} index - Index of video to play
*/
playVideo(index) {
const video = this.videos[index];
if (video) {
const playPromise = video.play();
if (playPromise !== undefined) {
playPromise.catch(error => {
console.warn(`Could not play video ${index}:`, error);
});
}
}
},
/**
* Pause all videos
*/
pauseAllVideos() {
this.videos.forEach(video => {
video.pause();
});
},
/**
* Handle page visibility change (pause when tab is not visible)
*/
handleVisibilityChange() {
if (document.hidden) {
this.stopRotation();
this.pauseAllVideos();
} else {
this.playVideo(this.currentIndex);
this.startRotation();
}
}
};
// Initialize when DOM is ready
document.addEventListener('DOMContentLoaded', () => {
HeroVideoRotation.init();
});
// Handle page visibility API
document.addEventListener('visibilitychange', () => {
HeroVideoRotation.handleVisibilityChange();
});

277
js/main.js Normale Datei
Datei anzeigen

@ -0,0 +1,277 @@
/**
* Main application entry point for IntelSight website
* Initializes all modules and coordinates application startup
*/
/**
* Toggle tools grid visibility
*/
function toggleTools(button) {
// Find the tools grid within the same product card
const productCard = button.closest('.product-card');
const toolsGrid = productCard.querySelector('.tools-grid');
if (toolsGrid) {
const isExpanded = toolsGrid.classList.contains('expanded');
const currentLang = getCurrentLanguage ? getCurrentLanguage() : 'de';
if (isExpanded) {
toolsGrid.classList.remove('expanded');
toolsGrid.classList.add('collapsed');
button.setAttribute('data-expanded', 'false');
button.querySelector('span').textContent = currentLang === 'de' ? 'Details anzeigen' : 'Show Details';
} else {
// Force browser reflow before adding expanded class
toolsGrid.style.display = 'grid';
void toolsGrid.offsetHeight; // Trigger reflow
toolsGrid.classList.remove('collapsed');
toolsGrid.classList.add('expanded');
button.setAttribute('data-expanded', 'true');
button.querySelector('span').textContent = currentLang === 'de' ? 'Details verbergen' : 'Hide Details';
// Ensure all tool cards are visible
setTimeout(() => {
const toolCards = toolsGrid.querySelectorAll('.tool-card');
toolCards.forEach((card, index) => {
card.style.opacity = '1';
card.style.transform = 'translateY(0)';
});
}, 100);
}
}
}
/**
* Application initialization
*/
const App = {
/**
* Initialize the entire application
*/
init() {
// Check DOM ready state
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => this.start());
} else {
// DOM is already ready
this.start();
}
},
/**
* Start the application after DOM is ready
*/
start() {
console.log('IntelSight Website Initializing...');
// Initialize modules in correct order
try {
// 1. Initialize translations first (needed by components)
initTranslations();
console.log('✓ Translations initialized');
// 2. Initialize UI components
Components.init();
console.log('✓ Components initialized');
// 3. Initialize animations
Animations.init();
console.log('✓ Animations initialized');
// 4. Setup error handling
this.setupErrorHandling();
// 5. Setup performance monitoring
this.setupPerformanceMonitoring();
console.log('IntelSight Website Ready!');
} catch (error) {
console.error('Failed to initialize application:', error);
this.handleInitError(error);
}
},
/**
* Setup global error handling
*/
setupErrorHandling() {
window.addEventListener('error', (event) => {
console.error('Global error:', event.error);
// In production, this would send errors to monitoring service
});
window.addEventListener('unhandledrejection', (event) => {
console.error('Unhandled promise rejection:', event.reason);
// In production, this would send errors to monitoring service
});
},
/**
* Setup performance monitoring
*/
setupPerformanceMonitoring() {
// Monitor page load performance
window.addEventListener('load', () => {
if (window.performance && window.performance.timing) {
const timing = window.performance.timing;
const loadTime = timing.loadEventEnd - timing.navigationStart;
console.log(`Page load time: ${loadTime}ms`);
// Log other performance metrics
const metrics = {
domContentLoaded: timing.domContentLoadedEventEnd - timing.navigationStart,
domComplete: timing.domComplete - timing.navigationStart,
firstPaint: this.getFirstPaintTime()
};
console.log('Performance metrics:', metrics);
}
});
},
/**
* Get first paint time if available
* @returns {number|null} First paint time in milliseconds
*/
getFirstPaintTime() {
if (window.performance && window.performance.getEntriesByType) {
const paintEntries = window.performance.getEntriesByType('paint');
const firstPaint = paintEntries.find(entry => entry.name === 'first-paint');
return firstPaint ? Math.round(firstPaint.startTime) : null;
}
return null;
},
/**
* Handle initialization errors
* @param {Error} error - The error that occurred
*/
handleInitError(error) {
// Create a fallback error message for users
const errorContainer = document.createElement('div');
errorContainer.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
background: #ff4444;
color: white;
padding: 15px 20px;
border-radius: 5px;
z-index: 10000;
max-width: 300px;
box-shadow: 0 2px 10px rgba(0,0,0,0.2);
`;
errorContainer.textContent = 'Ein Fehler ist aufgetreten. Bitte laden Sie die Seite neu.';
document.body.appendChild(errorContainer);
// Auto-remove after 5 seconds
setTimeout(() => {
errorContainer.remove();
}, 5000);
}
};
/**
* Utility functions
*/
const Utils = {
/**
* Debounce function to limit function calls
* @param {Function} func - Function to debounce
* @param {number} wait - Wait time in milliseconds
* @returns {Function} Debounced function
*/
debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
},
/**
* Throttle function to limit function calls
* @param {Function} func - Function to throttle
* @param {number} limit - Time limit in milliseconds
* @returns {Function} Throttled function
*/
throttle(func, limit) {
let inThrottle;
return function(...args) {
if (!inThrottle) {
func.apply(this, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
};
},
/**
* Check if element is in viewport
* @param {HTMLElement} element - Element to check
* @returns {boolean} True if element is in viewport
*/
isInViewport(element) {
const rect = element.getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);
},
/**
* Load script dynamically
* @param {string} src - Script source URL
* @returns {Promise} Promise that resolves when script is loaded
*/
loadScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = src;
script.onload = resolve;
script.onerror = reject;
document.head.appendChild(script);
});
},
/**
* Get cookie value by name
* @param {string} name - Cookie name
* @returns {string|null} Cookie value or null
*/
getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) {
return parts.pop().split(';').shift();
}
return null;
},
/**
* Set cookie
* @param {string} name - Cookie name
* @param {string} value - Cookie value
* @param {number} days - Days until expiration
*/
setCookie(name, value, days) {
const date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
const expires = `expires=${date.toUTCString()}`;
document.cookie = `${name}=${value};${expires};path=/`;
}
};
// Make Utils globally available if needed
window.Utils = Utils;
// Start the application
App.init();

188
js/protection.js Normale Datei
Datei anzeigen

@ -0,0 +1,188 @@
/**
* 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 = '';
}
})();

130
js/section-transitions.js Normale Datei
Datei anzeigen

@ -0,0 +1,130 @@
/**
* Section Transitions & Effects
* Modern animations for section dividers
*/
const SectionTransitions = {
init() {
this.initParticleBridge();
this.initScrollReveal();
this.initWaveAnimation();
this.initParallaxDividers();
},
// Animated particles between sections
initParticleBridge() {
const bridge = document.getElementById('particleBridge');
if (!bridge) return;
// Create floating particles
for (let i = 0; i < 30; i++) {
const particle = document.createElement('div');
particle.className = 'particle';
particle.style.left = Math.random() * 100 + '%';
particle.style.animationDelay = Math.random() * 5 + 's';
particle.style.animationDuration = (5 + Math.random() * 5) + 's';
particle.style.animation = `floatParticle ${5 + Math.random() * 5}s linear infinite`;
bridge.appendChild(particle);
}
},
// Reveal sections on scroll
initScrollReveal() {
const sections = document.querySelectorAll('.fade-section');
const revealSection = (entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
// Add shimmer effect on reveal
const shimmer = document.createElement('div');
shimmer.style.cssText = `
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(15, 114, 181, 0.2), transparent);
animation: shimmerPass 1s ease-out forwards;
pointer-events: none;
z-index: 100;
`;
entry.target.style.position = 'relative';
entry.target.appendChild(shimmer);
setTimeout(() => shimmer.remove(), 1000);
}
});
};
const observer = new IntersectionObserver(revealSection, {
threshold: 0.1,
rootMargin: '0px 0px -100px 0px'
});
sections.forEach(section => observer.observe(section));
},
// Animate wave dividers
initWaveAnimation() {
const waves = document.querySelectorAll('.wave-divider path');
waves.forEach(wave => {
let time = 0;
const animateWave = () => {
time += 0.02;
const points = [];
for (let i = 0; i <= 10; i++) {
const x = (i / 10) * 1200;
const y = Math.sin((i / 10) * Math.PI * 2 + time) * 10 + 56;
points.push(`${x},${y}`);
}
// Create smooth wave path
const d = `M0,56 Q${points[2]} T${points[4]} T${points[6]} T${points[8]} T1200,56 L1200,0 L0,0 Z`;
wave.setAttribute('d', d);
requestAnimationFrame(animateWave);
};
// Start wave animation
// animateWave(); // Commented out for performance, uncomment for wave motion
});
},
// Parallax effect for dividers
initParallaxDividers() {
const dividers = document.querySelectorAll('.blob-divider, .gradient-divider, .flow-lines');
window.addEventListener('scroll', () => {
const scrolled = window.pageYOffset;
dividers.forEach(divider => {
const speed = divider.dataset.speed || 0.5;
const yPos = -(scrolled * speed);
divider.style.transform = `translateY(${yPos}px)`;
});
});
}
};
// Add shimmer animation
const style = document.createElement('style');
style.textContent = `
@keyframes shimmerPass {
to {
left: 100%;
opacity: 0;
}
}
`;
document.head.appendChild(style);
// Initialize when DOM is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => SectionTransitions.init());
} else {
SectionTransitions.init();
}

410
js/translations.js Normale Datei
Datei anzeigen

@ -0,0 +1,410 @@
/**
* Translation system for IntelSight website
* Supports German (de) and English (en)
*/
// Translation strings
const translations = {
de: {
// Page meta
pageTitle: 'IntelSight - Sicherheit Made in Germany',
// Navigation
skipNav: 'Zum Hauptinhalt springen',
navHome: 'Startseite',
navAbout: 'Über uns',
navProducts: 'Produkte & Lösungen',
navContact: 'Kontakt',
langSwitch: 'DE | EN',
// Hero Section
heroTitle: 'SICHERHEIT MADE IN GERMANY',
heroSubtitle: 'Spezialist für hochsichere, maßgeschneiderte IT-Lösungen für Behörden',
// Trust Indicators
indicatorAvailability: 'Verfügbarkeit',
indicatorTrust: 'Behörden vertrauen uns',
indicatorSupport: 'Support',
// Scroll Indicator
scrollToExplore: 'Nach unten scrollen',
// About Section
aboutTitle: 'ÜBER UNS',
aboutSubtitle: 'Ihr Partner für sichere Behördensoftware',
// About Tabs
tabWhoWeAre: 'Unternehmen',
tabMission: 'Mission & Werte',
tabCompetencies: 'Kernkompetenzen',
tabWhyUs: 'Unser Versprechen',
// Who We Are
whoWeAreTitle: 'Unternehmen',
whoWeArePara1: 'IntelSight UG ist Ihr <strong>Spezialist für hochsichere, maßgeschneiderte IT-Lösungen</strong> aus Nordrhein-Westfalen. Wir entwickeln innovative Software speziell für staatliche Sicherheits- und Ermittlungsbehörden.',
whoWeArePara2: 'Unser Ansatz vereint modernste Technologie mit einem tiefen Verständnis für die besonderen Anforderungen von Behörden. Dabei steht die Balance zwischen Sicherheit, Effizienz und rechtskonformer Umsetzung im Mittelpunkt unserer Arbeit.',
locationBadge: 'Nordrhein-Westfalen, Deutschland',
nrwLabel: 'Nordrhein-Westfalen',
headquartersLabel: 'Unser Standort: Langenfeld',
// Mission & Values
missionTitle: 'Unsere Mission',
missionStatement: 'Wir schaffen <strong>effiziente, sichere und datenschutzkonforme Lösungen</strong> für moderne Strafverfolgung und Sicherheitsbehörden.',
valueIntegrityTitle: 'Integrität',
valueIntegrityDesc: 'Höchste ethische Standards in allem was wir tun',
valueTransparencyTitle: 'Transparenz',
valueTransparencyDesc: 'Offene Kommunikation und nachvollziehbare Prozesse',
valueDemocracyTitle: 'Demokratische Prinzipien',
valueDemocracyDesc: 'Kooperation nur mit Behörden im Einklang mit der freiheitlich demokratischen Grundordnung',
principleNote: '<strong>Unser Ziel:</strong> Technologie, die Recht und Sicherheit stärkt und die freiheitlich demokratische Grundordnung schützt.',
// Competencies
competenciesTitle: 'Unsere Kernkompetenzen',
comp1Title: 'Behördenspezifische Software',
comp1Desc: 'Entwicklung mit höchsten Sicherheitsstandards, maßgeschneidert für staatliche Anforderungen',
comp2Title: 'Intuitive Bedienkonzepte',
comp2Desc: 'Benutzerfreundliche Oberflächen trotz komplexer Funktionen für effizientes Arbeiten',
comp3Title: 'Langzeit-Support',
comp3Desc: 'Kontinuierliche Sicherheitsupdates und zuverlässige Wartung über den gesamten Lebenszyklus',
// Why Us
whyUsTitle: 'Warum IntelSight UG?',
why1Title: 'Enge Zusammenarbeit',
why1Desc: 'Wir arbeiten Hand in Hand mit unseren Kunden für maßgeschneiderte Lösungen',
why2Title: 'Made in Germany',
why2Desc: 'Klare, robuste und sichere Software nach deutschen Qualitätsstandards',
why3Title: 'Verlässliche Partnerschaft',
why3Desc: 'Basierend auf gemeinsamen Werten und langfristigem Vertrauen',
why4Title: 'Nachhaltigkeit',
why4Desc: 'Fokus auf Sicherheit, Professionalität & zukunftssichere Lösungen',
// Products Section
productsTitle: 'PRODUKTE & LÖSUNGEN',
productsSubtitle: 'Professionelle Werkzeuge für moderne Ermittlungsarbeit',
// Professional Toolbox
productToolboxTitle: 'Professional Toolbox',
productToolboxDesc: 'Eine leistungsstarke Desktop-Anwendung mit fünf essentiellen Tools für behördliche OSINT-Ermittler und Analysten. Modernes Design, intuitive Bedienung, professionelle Funktionen.',
expandDetails: 'Details anzeigen',
hideDetails: 'Details verbergen',
// Tools
tool1Title: 'Metadata Analyzer',
tool1Feature1: 'Extrahiert versteckte Informationen (EXIF, GPS, Erstellungsdaten)',
tool1Feature2: 'Forensische Analyse von Dokumenten & Bildern',
tool1Feature3: 'Export als JSON',
tool2Title: 'Screen Recorder',
tool2Feature1: 'Bildschirmaufnahme mit Audio (System & Mikrofon)',
tool2Feature2: 'Bereichsauswahl oder Vollbild',
tool2Feature3: 'Wählbare Qualitätsstufen',
tool3Title: 'Video Crawler',
tool3Feature1: 'Download von Videos aus 1000+ Plattformen',
tool3Feature2: 'Automatischer Untertitel-Download',
tool3Feature3: 'Qualitätsauswahl',
tool4Title: 'Website Crawler',
tool4Feature1: 'Archiviert Webseiten offline',
tool4Feature2: 'Einstellbare Crawling-Tiefe',
tool4Feature3: 'Erhält Originalstruktur inkl. CSS, JS & Medien',
tool5Title: 'Multimedia Converter',
tool5Feature1: 'Konvertierung von Bildern, Videos, Audio',
tool5Feature2: 'Batch-Verarbeitung',
tool5Feature3: 'Drag & Drop Unterstützung',
// AccountForger
productAccountForgerTitle: 'AccountForger',
accessRestricted: 'Zugang nur mit Berechtigung',
protectedProductDesc: 'Dieses Produkt ist speziell für autorisierte Behörden entwickelt und erfordert eine Authentifizierung.',
loginForAccess: 'Anmelden für Zugriff',
// Footer
footerCompanyTitle: 'IntelSight UG (haftungsbeschränkt)',
footerCompanyAddress1: 'Gladbacher Strasse 3-5',
footerCompanyAddress2: '40764 Langenfeld',
footerNavTitle: 'Navigation',
footerNavHome: 'Startseite',
footerNavAbout: 'Über uns',
footerNavProducts: 'Produkte',
footerNavContact: 'Kontakt',
footerLegalTitle: 'Rechtliches',
footerImprint: 'Impressum',
footerPrivacy: 'Datenschutz',
footerTerms: 'AGB',
footerContactTitle: 'Kontakt',
copyright: '© 2025 IntelSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.',
// Modal texts
authRequired: 'Authentifizierung erforderlich',
authDescription: 'Dieser Bereich ist nur für autorisierte Behörden zugänglich.',
accessCode: 'Zugangscode',
accessCodePlaceholder: 'Bitte Zugangscode eingeben',
grantAccess: 'Zugang gewähren',
noAccess: 'Noch keinen Zugang?',
contactUs: 'Kontaktieren Sie uns',
accessGranted: 'Zugang gewährt! AccountForger wird geladen...',
wrongCode: 'Falscher Zugangscode. Bitte versuchen Sie es erneut.',
demoRequestAlert: 'Demo-Anfrage-Funktion würde hier implementiert werden',
contactFormSuccess: 'Vielen Dank für Ihre Nachricht! Wir werden uns schnellstmöglich bei Ihnen melden.'
},
en: {
// Page meta
pageTitle: 'IntelSight - Security Made in Germany',
// Navigation
skipNav: 'Skip to main content',
navHome: 'Home',
navAbout: 'About Us',
navProducts: 'Products & Solutions',
navContact: 'Contact',
langSwitch: 'EN | DE',
// Hero Section
heroTitle: 'SECURITY MADE IN GERMANY',
heroSubtitle: 'Specialist for highly secure, customized IT solutions for government agencies',
// Trust Indicators
indicatorAvailability: 'Availability',
indicatorTrust: 'Government agencies trust us',
indicatorSupport: 'Support',
// Scroll Indicator
scrollToExplore: 'Scroll to Explore',
// About Section
aboutTitle: 'About Us',
aboutSubtitle: 'Your Partner for Secure Government Software',
// About Tabs
tabWhoWeAre: 'Company',
tabMission: 'Mission & Values',
tabCompetencies: 'Core Competencies',
tabWhyUs: 'Our Promise',
// Who We Are
whoWeAreTitle: 'Company',
whoWeArePara1: 'IntelSight UG is your <strong>specialist for highly secure, customized IT solutions</strong> from North Rhine-Westphalia. We develop innovative software specifically for government security and law enforcement agencies.',
whoWeArePara2: 'Our approach combines cutting-edge technology with a deep understanding of the special requirements of government agencies. The balance between security, efficiency and legally compliant implementation is at the center of our work.',
locationBadge: 'North Rhine-Westphalia, Germany',
nrwLabel: 'North Rhine-Westphalia',
headquartersLabel: 'Our Location: Langenfeld',
// Mission & Values
missionTitle: 'Our Mission',
missionStatement: 'We create <strong>efficient, secure and data protection compliant solutions</strong> for modern law enforcement and security agencies.',
valueIntegrityTitle: 'Integrity',
valueIntegrityDesc: 'Highest ethical standards in everything we do',
valueTransparencyTitle: 'Transparency',
valueTransparencyDesc: 'Open communication and comprehensible processes',
valueDemocracyTitle: 'Democratic Principles',
valueDemocracyDesc: 'Cooperation only with agencies in accordance with the liberal democratic basic order',
principleNote: '<strong>Our Goal:</strong> Technology that strengthens law and security and protects the liberal democratic basic order.',
// Competencies
competenciesTitle: 'Our Core Competencies',
comp1Title: 'Agency-Specific Software',
comp1Desc: 'Development with highest security standards, tailored for government requirements',
comp2Title: 'Intuitive Operating Concepts',
comp2Desc: 'User-friendly interfaces despite complex functions for efficient work',
comp3Title: 'Long-term Support',
comp3Desc: 'Continuous security updates and reliable maintenance throughout the entire lifecycle',
// Why Us
whyUsTitle: 'Why IntelSight UG?',
why1Title: 'Close Collaboration',
why1Desc: 'We work hand in hand with our customers for customized solutions',
why2Title: 'Made in Germany',
why2Desc: 'Clear, robust and secure software according to German quality standards',
why3Title: 'Reliable Partnership',
why3Desc: 'Based on shared values and long-term trust',
why4Title: 'Sustainability',
why4Desc: 'Focus on security, professionalism & future-proof solutions',
// Products Section
productsTitle: 'Products & Solutions',
productsSubtitle: 'Professional Tools for Modern Investigation Work',
// Professional Toolbox
productToolboxTitle: 'Professional Toolbox',
productToolboxDesc: 'A powerful desktop application with five essential tools for government OSINT investigators and analysts. Modern design, intuitive operation, professional functions.',
expandDetails: 'Show Details',
hideDetails: 'Hide Details',
// Tools
tool1Title: 'Metadata Analyzer',
tool1Feature1: 'Extracts hidden information (EXIF, GPS, creation dates)',
tool1Feature2: 'Forensic analysis of documents & images',
tool1Feature3: 'Export as JSON',
tool2Title: 'Screen Recorder',
tool2Feature1: 'Screen recording with audio (system & microphone)',
tool2Feature2: 'Area selection or full screen',
tool2Feature3: 'Selectable quality levels',
tool3Title: 'Video Crawler',
tool3Feature1: 'Download videos from 1000+ platforms',
tool3Feature2: 'Automatic subtitle download',
tool3Feature3: 'Quality selection',
tool4Title: 'Website Crawler',
tool4Feature1: 'Archives websites offline',
tool4Feature2: 'Adjustable crawling depth',
tool4Feature3: 'Preserves original structure incl. CSS, JS & media',
tool5Title: 'Multimedia Converter',
tool5Feature1: 'Conversion of images, videos, audio',
tool5Feature2: 'Batch processing',
tool5Feature3: 'Drag & Drop support',
// AccountForger
productAccountForgerTitle: 'AccountForger',
accessRestricted: 'Access by authorization only',
protectedProductDesc: 'This product is specifically developed for authorized agencies and requires authentication.',
loginForAccess: 'Login for Access',
// Footer
footerCompanyTitle: 'IntelSight UG (haftungsbeschränkt)',
footerCompanyAddress1: 'Gladbacher Strasse 3-5',
footerCompanyAddress2: '40764 Langenfeld',
footerNavTitle: 'Navigation',
footerNavHome: 'Home',
footerNavAbout: 'About Us',
footerNavProducts: 'Products',
footerNavContact: 'Contact',
footerLegalTitle: 'Legal',
footerImprint: 'Imprint',
footerPrivacy: 'Privacy Policy',
footerTerms: 'Terms & Conditions',
footerContactTitle: 'Contact',
copyright: '© 2025 IntelSight UG (haftungsbeschränkt). All rights reserved.',
// Modal texts
authRequired: 'Authentication Required',
authDescription: 'This area is only accessible to authorized agencies.',
accessCode: 'Access Code',
accessCodePlaceholder: 'Please enter access code',
grantAccess: 'Grant Access',
noAccess: 'No access yet?',
contactUs: 'Contact Us',
accessGranted: 'Access granted! AccountForger is loading...',
wrongCode: 'Wrong access code. Please try again.',
demoRequestAlert: 'Demo request function would be implemented here',
contactFormSuccess: 'Thank you for your message! We will get back to you as soon as possible.'
}
};
// Current language state
let currentLanguage = CONFIG.I18N.DEFAULT_LANGUAGE;
/**
* Initialize the translation system
*/
function initTranslations() {
// Try to get saved language from localStorage
const savedLanguage = localStorage.getItem(CONFIG.I18N.STORAGE_KEY);
if (savedLanguage && CONFIG.I18N.SUPPORTED_LANGUAGES.includes(savedLanguage)) {
currentLanguage = savedLanguage;
}
// Apply initial translations
applyTranslations(currentLanguage);
}
/**
* Switch to a different language
* @param {string} language - Language code ('de' or 'en')
*/
function switchLanguage(language) {
if (!CONFIG.I18N.SUPPORTED_LANGUAGES.includes(language)) {
console.error(`Language '${language}' is not supported`);
return;
}
currentLanguage = language;
localStorage.setItem(CONFIG.I18N.STORAGE_KEY, language);
applyTranslations(language);
}
/**
* Apply translations to all elements with data-translate attribute
* @param {string} language - Language code to apply
*/
function applyTranslations(language) {
const t = translations[language];
if (!t) {
console.error(`Translations for language '${language}' not found`);
return;
}
// Update page title
document.title = t.pageTitle;
// Update HTML lang attribute
document.documentElement.lang = language;
// Update all translatable elements
document.querySelectorAll(SELECTORS.TRANSLATABLE).forEach(element => {
const key = element.getAttribute(DATA_ATTRS.TRANSLATE);
if (t[key]) {
// Check if content contains HTML tags
if (t[key].includes('<strong>') || t[key].includes('<em>')) {
element.innerHTML = t[key];
} else {
element.textContent = t[key];
}
}
});
// Update language toggle button
const langToggle = document.querySelector(SELECTORS.LANG_TOGGLE);
if (langToggle) {
langToggle.textContent = t.langSwitch;
langToggle.setAttribute(DATA_ATTRS.LANG, language);
}
// Update expand button text if it exists
updateExpandButtonText(language);
}
/**
* Update expand button text based on current state
* @param {string} language - Current language
*/
function updateExpandButtonText(language) {
const expandButton = document.querySelector(SELECTORS.EXPAND_BUTTON);
if (expandButton) {
const expandText = expandButton.querySelector('.expand-text');
const isExpanded = expandButton.getAttribute(DATA_ATTRS.EXPANDED) === 'true';
const t = translations[language];
if (expandText && t) {
expandText.textContent = isExpanded ? t.hideDetails : t.expandDetails;
}
}
}
/**
* Get a specific translation string
* @param {string} key - Translation key
* @returns {string} Translated text
*/
function getTranslation(key) {
return translations[currentLanguage][key] || key;
}
/**
* Get current language
* @returns {string} Current language code
*/
function getCurrentLanguage() {
return currentLanguage;
}