Parcourir la source

Fianle NAchbesserungen

Leonard Schulz il y a 10 mois
Parent
commit
cfe892dcc8

+ 1 - 0
build.gradle

@@ -23,6 +23,7 @@ dependencies {
     implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
     implementation 'com.fasterxml.jackson.core:jackson-databind'
     implementation 'com.networknt:json-schema-validator:1.4.2'
+    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
     testImplementation 'org.springframework.boot:spring-boot-starter-test'
 }
 

+ 0 - 43
src/main/java/com/tsystems/inwo/vgl/config/AuthenticationInterceptor.java

@@ -1,43 +0,0 @@
-package com.tsystems.inwo.vgl.config;
-
-import org.springframework.stereotype.Component;
-import org.springframework.web.servlet.HandlerInterceptor;
-
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.servlet.http.HttpSession;
-
-@Component
-public class AuthenticationInterceptor implements HandlerInterceptor {
-
-    @Override
-    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-        String requestURI = request.getRequestURI();
-        
-        // Allow access to login page, static resources, and health endpoint
-        if (requestURI.startsWith("/login") || 
-            requestURI.startsWith("/static/") ||
-            requestURI.startsWith("/css/") ||
-            requestURI.startsWith("/js/") ||
-            requestURI.startsWith("/images/") ||
-            requestURI.equals("/health") ||
-            requestURI.equals("/actuator/health")) {
-            return true;
-        }
-
-        HttpSession session = request.getSession(false);
-        Boolean authenticated = null;
-        
-        if (session != null) {
-            authenticated = (Boolean) session.getAttribute("authenticated");
-        }
-        
-        if (authenticated != null && authenticated) {
-            return true;
-        }
-        
-        // Redirect to login page if not authenticated
-        response.sendRedirect("/login");
-        return false;
-    }
-}

+ 21 - 0
src/main/java/com/tsystems/inwo/vgl/config/SwaggerConfig.java

@@ -0,0 +1,21 @@
+package com.tsystems.inwo.vgl.config;
+
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.info.Info;
+import io.swagger.v3.oas.annotations.info.Contact;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@OpenAPIDefinition(
+    info = @Info(
+        title = "INWO Vergleichsservice API",
+        version = "1.0.0",
+        description = "API für den Vergleich von Miete-/Wohnungsdaten und Haushaltsmitglieder-/Einkommensdaten",
+        contact = @Contact(
+            name = "Leonard Schulz",
+            email = "leonard.schulz@t-systems.com"
+        )
+    )
+)
+public class SwaggerConfig {
+}

+ 1 - 11
src/main/java/com/tsystems/inwo/vgl/config/WebConfig.java

@@ -1,19 +1,9 @@
 package com.tsystems.inwo.vgl.config;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 @Configuration
 public class WebConfig implements WebMvcConfigurer {
-
-    @Autowired
-    private AuthenticationInterceptor authenticationInterceptor;
-
-    @Override
-    public void addInterceptors(InterceptorRegistry registry) {
-        registry.addInterceptor(authenticationInterceptor)
-                .addPathPatterns("/**");
-    }
+    // Authentication interceptor removed - no login required
 }

+ 0 - 36
src/main/java/com/tsystems/inwo/vgl/web/AuthController.java

@@ -1,36 +0,0 @@
-package com.tsystems.inwo.vgl.web;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import jakarta.servlet.http.HttpSession;
-
-@Controller
-public class AuthController {
-
-    @Value("${app.auth.password}")
-    private String authPassword;
-
-    @GetMapping("/login")
-    public String login(@RequestParam(required = false) String error, Model model) {
-        if (error != null) {
-            model.addAttribute("error", "Falsches Passwort. Bitte versuchen Sie es erneut.");
-        }
-        return "login";
-    }
-
-    @PostMapping("/login")
-    public String authenticate(@RequestParam String password, HttpSession session) {
-        if (authPassword.equals(password)) {
-            session.setAttribute("authenticated", true);
-            return "redirect:";
-        } else {
-            return "redirect:/login?error=true";
-        }
-    }
-
-}

+ 67 - 0
src/main/java/com/tsystems/inwo/vgl/web/HhmEinkommenController.java

@@ -9,12 +9,16 @@ import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.http.ResponseEntity;
 import org.springframework.core.io.ClassPathResource;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import java.util.*;
 import java.io.*;
 import java.nio.charset.StandardCharsets;
 
 @Controller
 @RequestMapping("/hhm-einkommen")
+@Tag(name = "HHM-Einkommen", description = "Haushaltsmitglieder und Einkommen Vergleich")
 public class HhmEinkommenController {
     private final ObjectMapper om;
     private final SchemaValidationService validator;
@@ -67,16 +71,27 @@ public class HhmEinkommenController {
     }
 
     @PostMapping
+    @Operation(summary = "Haushaltsmitglieder und Einkommen vergleichen", description = "Führt einen Vergleich von Haushaltsmitglieder- und Einkommensdaten zwischen zwei JSON-Datensätzen durch")
     public String vergleich(
+            @Parameter(description = "JSON-Daten für Vergleichsbasis (links)", required = true)
             @RequestParam String leftJson,
+            @Parameter(description = "JSON-Daten für aktuellen Stand (rechts)", required = true)
             @RequestParam String rightJson,
+            @Parameter(description = "Schema-Validierung aktivieren")
             @RequestParam(required = false, defaultValue = "true") boolean validate,
+            @Parameter(description = "Name des Validierungsschemas")
             @RequestParam(required = false, defaultValue = "haushalt-einkommen") String schemaName,
+            @Parameter(description = "ID des zu vergleichenden linken Vorgangs")
             @RequestParam(required = false) String leftVorgangId,
+            @Parameter(description = "ID des zu vergleichenden linken Zeitraums")
             @RequestParam(required = false) String leftZeitraumId,
+            @Parameter(description = "ID des zu vergleichenden rechten Zeitraums")
             @RequestParam(required = false) String rightZeitraumId,
+            @Parameter(description = "ID der ausgewählten Person")
             @RequestParam(required = false) String personId,
+            @Parameter(description = "Kunden-ID")
             @RequestParam(required = false) String kunde,
+            @Parameter(description = "Kunden-ID aus Header")
             @RequestHeader(value = "X-Kunde", required = false) String kundeHeader,
             Model model) {
 
@@ -188,12 +203,19 @@ public class HhmEinkommenController {
 
     @PostMapping("/api/person-details")
     @ResponseBody
+    @Operation(summary = "Personendetails abrufen", description = "Ruft detaillierte Informationen zu einer bestimmten Person ab")
     public ResponseEntity<PersonDetailsResponse> getPersonDetails(
+            @Parameter(description = "JSON-Daten für Vergleichsbasis (links)", required = true)
             @RequestParam String leftJson,
+            @Parameter(description = "JSON-Daten für aktuellen Stand (rechts)", required = true)
             @RequestParam String rightJson,
+            @Parameter(description = "ID des linken Vorgangs", required = true)
             @RequestParam String leftVorgangId,
+            @Parameter(description = "ID des linken Zeitraums", required = true)
             @RequestParam String leftZeitraumId,
+            @Parameter(description = "ID des rechten Zeitraums", required = true)
             @RequestParam String rightZeitraumId,
+            @Parameter(description = "ID der Person", required = true)
             @RequestParam String personId) throws Exception {
 
         JsonNode left = om.readTree(leftJson);
@@ -220,11 +242,17 @@ public class HhmEinkommenController {
 
     @PostMapping("/api/vorgang-change")
     @ResponseBody
+    @Operation(summary = "Vorgang wechseln", description = "Wechselt zu einem anderen Vorgang und aktualisiert die Vergleichsdaten")
     public ResponseEntity<VorgangChangeResponse> changeLeftVorgang(
+            @Parameter(description = "JSON-Daten für Vergleichsbasis (links)", required = true)
             @RequestParam String leftJson,
+            @Parameter(description = "JSON-Daten für aktuellen Stand (rechts)", required = true)
             @RequestParam String rightJson,
+            @Parameter(description = "ID des rechten Zeitraums", required = true)
             @RequestParam String rightZeitraumId,
+            @Parameter(description = "ID der ausgewählten Person", required = true)
             @RequestParam String personId,
+            @Parameter(description = "ID des neuen linken Vorgangs", required = true)
             @RequestParam String newLeftVorgangId) throws Exception {
 
         JsonNode left = om.readTree(leftJson);
@@ -272,12 +300,19 @@ public class HhmEinkommenController {
 
     @PostMapping("/api/zeitraum-change")
     @ResponseBody
+    @Operation(summary = "Zeitraum wechseln", description = "Wechselt zu einem anderen Zeitraum und aktualisiert die Vergleichsdaten")
     public ResponseEntity<ZeitraumChangeResponse> changeLeftZeitraum(
+            @Parameter(description = "JSON-Daten für Vergleichsbasis (links)", required = true)
             @RequestParam String leftJson,
+            @Parameter(description = "JSON-Daten für aktuellen Stand (rechts)", required = true)
             @RequestParam String rightJson,
+            @Parameter(description = "ID des linken Vorgangs", required = true)
             @RequestParam String leftVorgangId,
+            @Parameter(description = "ID des rechten Zeitraums", required = true)
             @RequestParam String rightZeitraumId,
+            @Parameter(description = "ID der ausgewählten Person", required = true)
             @RequestParam String personId,
+            @Parameter(description = "ID des neuen linken Zeitraums", required = true)
             @RequestParam String newLeftZeitraumId) throws Exception {
 
         JsonNode left = om.readTree(leftJson);
@@ -382,4 +417,36 @@ public class HhmEinkommenController {
         List<FreibetragZeile> freibetragZeilen,
         List<KitaZeile> kitaZeilen
     ) {}
+
+    // ===== Response Classes =====
+    
+    public record PersonDetailsResponse(
+        String personId,
+        String personLabel,
+        List<EinkommenZeile> einkommenZeilen,
+        List<FreibetragZeile> freibetragZeilen,
+        List<KitaZeile> kitaZeilen
+    ) {}
+    
+    public record VorgangChangeResponse(
+        String newLeftVorgangId,
+        String newLeftZeitraumId,
+        List<Z> leftZeitraeumeOfSelected,
+        List<MitgliedRow> mitgliederRows,
+        String personId,
+        String personLabel,
+        List<EinkommenZeile> einkommenZeilen,
+        List<FreibetragZeile> freibetragZeilen,
+        List<KitaZeile> kitaZeilen
+    ) {}
+    
+    public record ZeitraumChangeResponse(
+        String newLeftZeitraumId,
+        List<MitgliedRow> mitgliederRows,
+        String personId,
+        String personLabel,
+        List<EinkommenZeile> einkommenZeilen,
+        List<FreibetragZeile> freibetragZeilen,
+        List<KitaZeile> kitaZeilen
+    ) {}
 }

+ 25 - 0
src/main/java/com/tsystems/inwo/vgl/web/MieteController.java

@@ -9,12 +9,16 @@ import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.http.ResponseEntity;
 import org.springframework.core.io.ClassPathResource;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import java.util.*;
 import java.io.*;
 import java.nio.charset.StandardCharsets;
 
 @Controller
 @RequestMapping("/miete")
+@Tag(name = "Miete", description = "Miete-/Wohnungsdaten Vergleich")
 public class MieteController {
     private final ObjectMapper om;
     private final SchemaValidationService validator;
@@ -67,15 +71,25 @@ public class MieteController {
     }
 
     @PostMapping
+    @Operation(summary = "Miete-/Wohnungsdaten vergleichen", description = "Führt einen Vergleich von Miete- und Wohnungsdaten zwischen zwei JSON-Datensätzen durch")
     public String vergleich(
+            @Parameter(description = "JSON-Daten für Vergleichsbasis (links)", required = true)
             @RequestParam String leftJson,
+            @Parameter(description = "JSON-Daten für aktuellen Stand (rechts)", required = true)
             @RequestParam String rightJson,
+            @Parameter(description = "Schema-Validierung aktivieren")
             @RequestParam(required = false, defaultValue = "true") boolean validate,
+            @Parameter(description = "Name des Validierungsschemas")
             @RequestParam(required = false, defaultValue = "miete") String schemaName,
+            @Parameter(description = "ID des zu vergleichenden linken Vorgangs")
             @RequestParam(required = false) String leftVorgangId,
+            @Parameter(description = "ID des zu vergleichenden linken Zeitraums")
             @RequestParam(required = false) String leftZeitraumId,
+            @Parameter(description = "ID des zu vergleichenden rechten Zeitraums")
             @RequestParam(required = false) String rightZeitraumId,
+            @Parameter(description = "Kunden-ID")
             @RequestParam(required = false) String kunde,
+            @Parameter(description = "Kunden-ID aus Header")
             @RequestHeader(value = "X-Kunde", required = false) String kundeHeader,
             Model model) {
 
@@ -183,10 +197,15 @@ public class MieteController {
 
     @PostMapping("/api/vorgang-change")
     @ResponseBody
+    @Operation(summary = "Vorgang wechseln", description = "Wechselt zu einem anderen Vorgang und aktualisiert die Vergleichsdaten")
     public ResponseEntity<VorgangChangeResponse> changeLeftVorgang(
+            @Parameter(description = "JSON-Daten für Vergleichsbasis (links)", required = true)
             @RequestParam String leftJson,
+            @Parameter(description = "JSON-Daten für aktuellen Stand (rechts)", required = true)
             @RequestParam String rightJson,
+            @Parameter(description = "ID des rechten Zeitraums", required = true)
             @RequestParam String rightZeitraumId,
+            @Parameter(description = "ID des neuen linken Vorgangs", required = true)
             @RequestParam String newLeftVorgangId) throws Exception {
 
         JsonNode left = om.readTree(leftJson);
@@ -236,11 +255,17 @@ public class MieteController {
 
     @PostMapping("/api/zeitraum-change")
     @ResponseBody
+    @Operation(summary = "Zeitraum wechseln", description = "Wechselt zu einem anderen Zeitraum und aktualisiert die Vergleichsdaten")
     public ResponseEntity<ZeitraumChangeResponse> changeLeftZeitraum(
+            @Parameter(description = "JSON-Daten für Vergleichsbasis (links)", required = true)
             @RequestParam String leftJson,
+            @Parameter(description = "JSON-Daten für aktuellen Stand (rechts)", required = true)
             @RequestParam String rightJson,
+            @Parameter(description = "ID des linken Vorgangs", required = true)
             @RequestParam String leftVorgangId,
+            @Parameter(description = "ID des rechten Zeitraums", required = true)
             @RequestParam String rightZeitraumId,
+            @Parameter(description = "ID des neuen linken Zeitraums", required = true)
             @RequestParam String newLeftZeitraumId) throws Exception {
 
         JsonNode left = om.readTree(leftJson);

+ 1 - 1
src/main/java/com/tsystems/inwo/vgl/web/PrototypeController.java

@@ -10,7 +10,7 @@ public class PrototypeController {
     @GetMapping("/")
     public String prototype(Model model) {
         model.addAttribute("activeKunde", "Berlin");
-        model.addAttribute("pageTitle", "DIWO");
+        model.addAttribute("pageTitle", "DEMO-DIWO");
         return "prototype";
     }
 }

+ 0 - 3
src/main/resources/application.properties

@@ -5,6 +5,3 @@ server.port=8080
 
 server.forward-headers-strategy=framework
 
-# Authentication settings
-app.auth.password=D1W0Vgl2025
-app.auth.session-timeout=7200

+ 5 - 15
src/main/resources/static/css/global.css

@@ -41,18 +41,8 @@
   --gelb-hell: #fff2cc;
   --gruen-hell: #e6f7ff;
   --rot: #cc0044;   
-  --gelb: #b8620e;  
-  --gruen: #0077b6; 
-}
-
-/* Alternative B – maximale Kontrastunterscheidung */
-:root[data-color-scheme="alt-b"] {
-  --rot-hell: #ffe6f0;
-  --gelb-hell: #e6ebff;
-  --gruen-hell: #eaf7d4;
-  --rot: #d00070;   
-  --gelb:#0040ff ;  
-  --gruen: #7a9e00; 
+  --gelb: #a3590f;  
+  --gruen: #0069a1; 
 }
 
 /* Alternative Pastell (ohne Ampel-Assoziation) */
@@ -61,9 +51,9 @@
   --gelb-hell:#f3e8ff; 
   --gruen-hell:  #e8f0ff;
 
-  --rot: #e67891;      
-  --gelb: #9d6ee8;     
-  --gruen: #4f9df7;     
+  --rot: #af314e;      
+  --gelb: #7045b4;     
+  --gruen: #00499c;     
 }
 
 /* =============================================================================

+ 2 - 2
src/main/resources/static/css/header.css

@@ -59,7 +59,7 @@
 .kunde-logo-placeholder {
   width: 30px;
   height: 30px;
-  background: var(--diwo-blau);
+  background: var(--rot);
   border-radius: 4px;
   display: flex;
   align-items: center;
@@ -68,7 +68,7 @@
 }
 
 .kunde-logo-placeholder::after {
-  content: "🐻‍❄️";
+  content: "🏟️";
   font-size: 16px;
   color: var(--weiss);
 }

+ 24 - 12
src/main/resources/static/css/prototype.css

@@ -78,20 +78,32 @@
     text-align: center;
 }
 
-.video-placeholder {
-    width: 100%;
-    max-width: 600px;
-    height: 300px;
-    background: linear-gradient(135deg, #f8f9fa, #e9ecef);
-    border: 2px dashed #007bff;
-    border-radius: 8px;
+.video-hint {
+    margin-top: 1rem;
+    padding: 1rem;
+    background: #e3f2fd;
+    border-left: 4px solid #2196f3;
+    border-radius: 0 6px 6px 0;
+    text-align: left;
+}
+
+.video-hint p {
+    margin: 0.5rem 0;
+    font-size: 0.95rem;
+    color: #1565c0;
     display: flex;
     align-items: center;
-    justify-content: center;
-    margin: 0 auto;
-    color: #007bff;
-    font-size: 1.1rem;
-    font-weight: 500;
+    gap: 0.5rem;
+}
+
+.video-hint p:last-child {
+    margin-bottom: 0;
+}
+
+.video-hint i {
+    width: 16px;
+    text-align: center;
+    color: #1976d2;
 }
 
 .tutorial-content {

BIN
src/main/resources/static/images/tutorial.mp4


+ 0 - 1
src/main/resources/static/js/color-scheme.js

@@ -18,7 +18,6 @@ function updateColorNames(scheme) {
   const colorNames = {
     'standard': { added: 'grün', removed: 'rot', changed: 'gelb' },
     'alt-a': { added: 'türkis', removed: 'magenta', changed: 'orange' },
-    'alt-b': { added: 'grün', removed: 'rot', changed: 'blau' },
     'alt-pastell': { added: 'blau', removed: 'pink', changed: 'lila' }
   };
   

+ 7 - 0
src/main/resources/static/js/prototype.js

@@ -13,6 +13,13 @@ function closeTutorial() {
     modal.classList.remove('show');
     document.body.style.overflow = ''; // Scrollen wieder aktivieren
     
+    // Video pausieren
+    const video = modal.querySelector('video');
+    if (video) {
+        video.pause();
+        video.currentTime = 0; // Optional: Video zurückspulen
+    }
+    
     // Cookie setzen, damit Tutorial nicht erneut angezeigt wird
     document.cookie = 'tutorialSeen=true; path=/; max-age=' + (365 * 24 * 60 * 60); // 1 Jahr
 }

+ 1 - 2
src/main/resources/templates/fragments/legend.html

@@ -30,8 +30,7 @@
         <label id="color-picker-label" for="colorSchemeSelect">Farbwahl:</label>
         <select id="colorSchemeSelect" class="color-scheme-select" onchange="changeColorScheme(this.value)" aria-describedby="color-scheme-hint">
           <option value="standard">Standard (Ampel)</option>
-          <option value="alt-a">Rot-Grün-Schwäche</option>
-          <option value="alt-b">Maximaler Kontrast</option>
+          <option value="alt-a">Alternativ</option>
           <option value="alt-pastell">Pastellfarben</option>
         </select>
       </div>

+ 0 - 99
src/main/resources/templates/login.html

@@ -1,99 +0,0 @@
-<!DOCTYPE html>
-<html lang="de">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Anmeldung - Vergleichsansicht</title>
-    <style>
-        body {
-            font-family: Arial, sans-serif;
-            background-color: #f5f5f5;
-            display: flex;
-            justify-content: center;
-            align-items: center;
-            min-height: 100vh;
-            margin: 0;
-        }
-
-        .login-box {
-            background: white;
-            padding: 2rem;
-            border-radius: 8px;
-            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
-            width: 300px;
-        }
-
-        h1 {
-            text-align: center;
-            color: #333;
-            margin-bottom: 1.5rem;
-        }
-
-        .form-group {
-            margin-bottom: 1rem;
-        }
-
-        label {
-            display: block;
-            margin-bottom: 0.5rem;
-            color: #555;
-        }
-
-        input[type="password"] {
-            width: 100%;
-            padding: 0.75rem;
-            border: 1px solid #ddd;
-            border-radius: 4px;
-            font-size: 1rem;
-            box-sizing: border-box;
-        }
-
-        input[type="password"]:focus {
-            outline: none;
-            border-color: #007bff;
-        }
-
-        .btn {
-            width: 100%;
-            padding: 0.75rem;
-            background-color: #007bff;
-            color: white;
-            border: none;
-            border-radius: 4px;
-            font-size: 1rem;
-            cursor: pointer;
-        }
-
-        .btn:hover {
-            background-color: #0056b3;
-        }
-
-        .error {
-            color: #dc3545;
-            margin-bottom: 1rem;
-            padding: 0.5rem;
-            background-color: #f8d7da;
-            border: 1px solid #f5c6cb;
-            border-radius: 4px;
-        }
-    </style>
-</head>
-<body>
-    <div class="login-box">
-        <h1>Vergleichsansicht</h1>
-        
-        <div th:if="${error}" class="error">
-            <span th:text="${error}">Fehler</span>
-        </div>
-
-        <form method="post" action="/login">
-            <div class="form-group">
-                <label for="password">Passwort:</label>
-                <input type="password" id="password" name="password" required autofocus>
-            </div>
-            
-            <button type="submit" class="btn">Anmelden</button>
-        </form>
-    </div>
-</body>
-</html>

+ 9 - 6
src/main/resources/templates/prototype.html

@@ -19,11 +19,15 @@
             </div>
             <div class="modal-body">
                 <div class="video-container">
-                    <div class="video-placeholder">
-                        <div>
-                            <i class="fas fa-play-circle" style="font-size: 3rem; margin-bottom: 1rem; display: block;"></i>
-                            Erklärvideo wird hier eingebettet
-                        </div>
+                    <video controls width="auto" height="470px" preload="metadata">
+                        <source src="/images/tutorial.mp4" type="video/mp4">
+                        <p>Ihr Browser unterstützt das Video-Element nicht. 
+                           <a href="/images/tutorial.mp4">Laden Sie das Video herunter</a>, um es anzusehen.
+                        </p>
+                    </video>
+                    <div class="video-hint">
+                        <p><i class="fas fa-expand"></i> <strong>Tipp:</strong> Nutzen Sie den Vollbildmodus des Videos für eine bessere Sicht.</p>
+                        <p><i class="fas fa-info-circle"></i> <strong>Hinweis:</strong> Texthinweise weiter unten.</p>
                     </div>
                 </div>
                 
@@ -60,7 +64,6 @@
             </div>
         </div>
     </div>
-
     <!-- Light Header -->
     <header class="light-header">
         <div class="header-row-1">