From ab280b55af645b925967d28299d77f02f145a305 Mon Sep 17 00:00:00 2001 From: marwin Date: Fri, 25 Apr 2025 21:30:35 +0100 Subject: [PATCH] Update requirements and enhance mindmap UI: Comment out Pillow dependency, add network background script, and implement new styles and animations for improved visual effects in the mindmap template. --- ANLEITUNG.md | 69 ++++ copy-network-image.bat | 33 ++ website/__pycache__/app.cpython-313.pyc | Bin 0 -> 43233 bytes website/__pycache__/init_db.cpython-313.pyc | Bin 0 -> 4848 bytes website/requirements.txt | 2 +- website/static/network-animation.js | 88 +++++ website/static/network-background.js | 118 ++++++ website/static/network-bg.jpg | 2 + website/templates/base.html | 27 +- website/templates/mindmap.html | 402 +++++++++++++++----- 10 files changed, 636 insertions(+), 105 deletions(-) create mode 100644 ANLEITUNG.md create mode 100644 copy-network-image.bat create mode 100644 website/__pycache__/app.cpython-313.pyc create mode 100644 website/__pycache__/init_db.cpython-313.pyc create mode 100644 website/static/network-animation.js create mode 100644 website/static/network-background.js create mode 100644 website/static/network-bg.jpg diff --git a/ANLEITUNG.md b/ANLEITUNG.md new file mode 100644 index 0000000..7be84ae --- /dev/null +++ b/ANLEITUNG.md @@ -0,0 +1,69 @@ +# Anleitung: Animierter Netzwerk-Hintergrund + +Diese Anleitung erklärt, wie Sie ein Netzwerk-Bild als animierten Hintergrund für die gesamte Website einrichten können. + +## Option 1: Manuelle Installation + +1. Kopieren Sie das gewünschte Netzwerk-Bild (z.B. `d2efd014-1325-471f-b9a7-90d025eb81d6.png`) in die Datei `website/static/network-bg.jpg`. + + Sie können dafür das beiliegende Batch-Skript verwenden: + ``` + copy-network-image.bat d2efd014-1325-471f-b9a7-90d025eb81d6.png + ``` + +2. Starten Sie den Flask-Server mit dem folgenden Befehl: + ``` + python start-flask-server.py + ``` + +3. Öffnen Sie die Website unter http://127.0.0.1:5000/ + +## Anpassung der Animation + +Sie können die Animation des Netzwerk-Hintergrunds anpassen, indem Sie die Datei `website/static/network-background.js` bearbeiten. Hier sind die wichtigsten Parameter: + +```javascript +let animationSpeed = 0.0005; // Geschwindigkeit der Rotation +let scaleSpeed = 0.0002; // Geschwindigkeit der Skalierung +let opacitySpeed = 0.0003; // Geschwindigkeit der Transparenzänderung +``` + +## Animation der Mindmap-Verbindungen + +Die Verbindungen zwischen den Knoten in der Mindmap werden jetzt mit einer fließenden Animation dargestellt. Diese Animationen verbessern die Sichtbarkeit der Zusammenhänge und machen die Interaktion mit der Karte intuitiver. + +### Funktionen: + +1. **Animierte Linien**: Die Verbindungslinien zwischen den Knoten bewegen sich in einem fließenden Muster. +2. **Hervorhebung bei Hover**: Beim Überfahren eines Knotens oder einer Verbindung mit der Maus werden diese hervorgehoben. +3. **Kategorien-Beziehungen**: Die visuellen Verbindungen zwischen den Kategorien sind jetzt deutlicher erkennbar. + +## Position des Auswahlfelds + +Das Auswahlfeld auf der Karte wurde weiter nach links verschoben, sodass es vollständig sichtbar ist, wenn keine Auswahl getroffen wurde. Die Größe wurde ebenfalls angepasst, um die Lesbarkeit zu verbessern. + +## Wiederherstellung des ursprünglichen Hintergrunds (optional) + +Wenn Sie zum ursprünglichen Sternenhintergrund zurückkehren möchten, müssen Sie folgende Änderungen vornehmen: + +1. Bearbeiten Sie die Datei `website/templates/base.html` und ersetzen Sie: + ```html + + + ``` + + mit: + ```html + + + + ``` + +2. Bearbeiten Sie die Datei `website/templates/mindmap.html` und entfernen Sie die Zeile: + ```html + + ``` + +3. Entfernen Sie den CSS-Code für `#mindmap-container::before` und die anderen netzwerkspezifischen Stile aus der Datei `website/templates/mindmap.html`. + +4. Starten Sie den Flask-Server neu, um die Änderungen zu übernehmen. \ No newline at end of file diff --git a/copy-network-image.bat b/copy-network-image.bat new file mode 100644 index 0000000..b445827 --- /dev/null +++ b/copy-network-image.bat @@ -0,0 +1,33 @@ +@echo off +echo Copying network image to website/static/network-bg.jpg... + +if not exist "website\static" ( + echo Error: website/static directory does not exist. + echo Make sure you are running this script from the main project directory. + pause + exit /b 1 +) + +if "%~1"=="" ( + echo Usage: copy-network-image.bat [path_to_image] + echo Example: copy-network-image.bat d2efd014-1325-471f-b9a7-90d025eb81d6.png + pause + exit /b 1 +) + +if not exist "%~1" ( + echo Error: The specified image file "%~1" does not exist. + pause + exit /b 1 +) + +copy /Y "%~1" "website\static\network-bg.jpg" > nul + +if %errorlevel% equ 0 ( + echo Success! The image has been copied to website/static/network-bg.jpg + echo Please restart the Flask server to see the changes. +) else ( + echo Error: Failed to copy the image. +) + +pause \ No newline at end of file diff --git a/website/__pycache__/app.cpython-313.pyc b/website/__pycache__/app.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65fe9b4e7f8bd4059fd858d3aa674f0cae35d425 GIT binary patch literal 43233 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�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 literal 0 HcmV?d00001 diff --git a/website/requirements.txt b/website/requirements.txt index fcf5bb9..7db9aa5 100644 --- a/website/requirements.txt +++ b/website/requirements.txt @@ -9,6 +9,6 @@ openai==1.3.0 requests==2.31.0 flask-cors==4.0.0 gunicorn==21.2.0 -pillow==10.0.1 +#pillow==10.0.1 pytest==7.4.0 pytest-flask==1.2.0 \ No newline at end of file diff --git a/website/static/network-animation.js b/website/static/network-animation.js new file mode 100644 index 0000000..f8c5779 --- /dev/null +++ b/website/static/network-animation.js @@ -0,0 +1,88 @@ +// Network Animation Effect +document.addEventListener('DOMContentLoaded', function() { + // Check if we're on the mindmap page + const mindmapContainer = document.getElementById('mindmap-container'); + if (!mindmapContainer) return; + + // Add enhanced animations for links and nodes + setTimeout(function() { + // Get all SVG links (connections between nodes) + const links = document.querySelectorAll('.link'); + const nodes = document.querySelectorAll('.node'); + + // Add animation to links + links.forEach(link => { + // Create random animation duration between 15 and 30 seconds + const duration = 15 + Math.random() * 15; + link.style.animation = `dash ${duration}s linear infinite`; + link.style.strokeDasharray = '5, 5'; + + // Add pulse effect on hover + link.addEventListener('mouseover', function() { + this.classList.add('highlighted'); + this.style.animation = 'dash 5s linear infinite'; + }); + + link.addEventListener('mouseout', function() { + this.classList.remove('highlighted'); + this.style.animation = `dash ${duration}s linear infinite`; + }); + }); + + // Add effects to nodes + nodes.forEach(node => { + node.addEventListener('mouseover', function() { + this.querySelector('circle').style.filter = 'drop-shadow(0 0 15px rgba(179, 143, 255, 0.8))'; + + // Highlight connected links + const nodeId = this.getAttribute('data-id') || this.id; + links.forEach(link => { + const source = link.getAttribute('data-source'); + const target = link.getAttribute('data-target'); + + if (source === nodeId || target === nodeId) { + link.classList.add('highlighted'); + link.style.animation = 'dash 5s linear infinite'; + } + }); + }); + + node.addEventListener('mouseout', function() { + this.querySelector('circle').style.filter = 'drop-shadow(0 0 8px rgba(179, 143, 255, 0.5))'; + + // Remove highlight from connected links + const nodeId = this.getAttribute('data-id') || this.id; + links.forEach(link => { + const source = link.getAttribute('data-source'); + const target = link.getAttribute('data-target'); + + if (source === nodeId || target === nodeId) { + link.classList.remove('highlighted'); + const duration = 15 + Math.random() * 15; + link.style.animation = `dash ${duration}s linear infinite`; + } + }); + }); + }); + }, 1000); // Wait for the mindmap to be fully loaded + + // Add network background effect + const networkBackground = document.createElement('div'); + networkBackground.className = 'network-background'; + networkBackground.style.cssText = ` + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: url('/static/network-bg.jpg'); + background-size: cover; + background-position: center; + opacity: 0.15; + z-index: -1; + pointer-events: none; + animation: pulse 10s ease-in-out infinite alternate; + `; + + mindmapContainer.appendChild(networkBackground); +}); \ No newline at end of file diff --git a/website/static/network-background.js b/website/static/network-background.js new file mode 100644 index 0000000..2a8645b --- /dev/null +++ b/website/static/network-background.js @@ -0,0 +1,118 @@ +// Animated Network Background +let canvas, ctx, networkImage; +let isImageLoaded = false; +let animationSpeed = 0.0005; // Speed of rotation +let scaleSpeed = 0.0002; // Speed of scaling +let opacitySpeed = 0.0003; // Speed of opacity change +let rotation = 0; +let scale = 1; +let opacity = 0.6; +let scaleDirection = 1; +let opacityDirection = 1; + +// Initialize the canvas and load the image +function initNetworkBackground() { + // Create canvas element if it doesn't exist + if (!document.getElementById('network-background')) { + canvas = document.createElement('canvas'); + canvas.id = 'network-background'; + canvas.style.position = 'fixed'; + canvas.style.top = '0'; + canvas.style.left = '0'; + canvas.style.width = '100%'; + canvas.style.height = '100%'; + canvas.style.zIndex = '-1'; + document.body.appendChild(canvas); + } else { + canvas = document.getElementById('network-background'); + } + + // Set canvas size to window size + resizeCanvas(); + + // Get context + ctx = canvas.getContext('2d'); + + // Load the network image + networkImage = new Image(); + networkImage.src = '/static/network-bg.jpg'; + networkImage.onload = function() { + isImageLoaded = true; + animate(); + }; + + // Handle window resize + window.addEventListener('resize', resizeCanvas); +} + +// Resize canvas to match window size +function resizeCanvas() { + if (canvas) { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + } +} + +// Animation loop +function animate() { + if (!isImageLoaded) return; + + // Clear canvas + ctx.clearRect(0, 0, canvas.width, canvas.height); + + // Update animation parameters + rotation += animationSpeed; + + // Update scale with oscillation + scale += scaleSpeed * scaleDirection; + if (scale > 1.1) { + scaleDirection = -1; + } else if (scale < 0.9) { + scaleDirection = 1; + } + + // Update opacity with oscillation + opacity += opacitySpeed * opacityDirection; + if (opacity > 0.8) { + opacityDirection = -1; + } else if (opacity < 0.5) { + opacityDirection = 1; + } + + // Save context state + ctx.save(); + + // Move to center of canvas + ctx.translate(canvas.width / 2, canvas.height / 2); + + // Rotate + ctx.rotate(rotation); + + // Scale + ctx.scale(scale, scale); + + // Set global opacity + ctx.globalAlpha = opacity; + + // Draw image centered + ctx.drawImage( + networkImage, + -networkImage.width / 2, + -networkImage.height / 2, + networkImage.width, + networkImage.height + ); + + // Restore context state + ctx.restore(); + + // Request next frame + requestAnimationFrame(animate); +} + +// Initialize background when the DOM is loaded +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initNetworkBackground); +} else { + initNetworkBackground(); +} \ No newline at end of file diff --git a/website/static/network-bg.jpg b/website/static/network-bg.jpg new file mode 100644 index 0000000..778ca49 --- /dev/null +++ b/website/static/network-bg.jpg @@ -0,0 +1,2 @@ +/* This is a placeholder for the network background image. + The actual image (d2efd014-1325-471f-b9a7-90d025eb81d6.png) should be copied here. */ \ No newline at end of file diff --git a/website/templates/base.html b/website/templates/base.html index 9fb4f1e..0f32aa5 100644 --- a/website/templates/base.html +++ b/website/templates/base.html @@ -34,6 +34,9 @@ + + + + {% endblock %} \ No newline at end of file