From 65c44ab371ea9363b8e6cdb7833a3a2a8122b9aa Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Mon, 28 Apr 2025 13:20:41 +0200 Subject: [PATCH] Refactor node relationship handling in app.py and introduce new routes for thoughts association with nodes. --- __pycache__/app.cpython-313.pyc | Bin 65725 -> 65846 bytes __pycache__/models.cpython-313.pyc | Bin 16988 -> 16976 bytes app.py | 35 +--- database/__pycache__/models.cpython-313.pyc | Bin 0 -> 16985 bytes instance/systades.db | 0 static/js/main.js | 25 +-- static/js/modules/mindmap-page.js | 11 +- static/js/modules/mindmap.js | 20 ++ static/neural-network-background.js | 173 ++++++++---------- systades.db | 0 templates/base.html | 59 ++++-- templates/mindmap.html | 2 +- utils/__pycache__/__init__.cpython-313.pyc | Bin 969 -> 957 bytes utils/__pycache__/db_check.cpython-313.pyc | Bin 2946 -> 2934 bytes utils/__pycache__/db_fix.cpython-313.pyc | Bin 3778 -> 3766 bytes utils/__pycache__/db_rebuild.cpython-313.pyc | Bin 3811 -> 3799 bytes utils/__pycache__/db_test.cpython-313.pyc | Bin 5851 -> 5839 bytes utils/__pycache__/server.cpython-313.pyc | Bin 1903 -> 1891 bytes .../__pycache__/user_manager.cpython-313.pyc | Bin 8275 -> 8263 bytes venv/pyvenv.cfg | 8 +- 20 files changed, 181 insertions(+), 152 deletions(-) create mode 100644 database/__pycache__/models.cpython-313.pyc create mode 100644 instance/systades.db create mode 100644 systades.db diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index 68d240dfc4de46bdc45c334189e161f9838bb382..04d49718edef87daa74461b6014305a96de9455d 100644 GIT binary patch delta 10945 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 diff --git a/__pycache__/models.cpython-313.pyc b/__pycache__/models.cpython-313.pyc index 2c27178782a034d4c3cc7f25fbb8ad90bab67c4e..cbe731ebe38cfc03bfcc0f3736bb368fc80967da 100644 GIT binary patch delta 56 zcmcc9!g!&Dk@qt%FBbz4)LQXpyx7Paz%HfjY!wq)oLW>I6B6R@>m22%=j!X~7~_&! Kwz--8rWF9?&Jo1` delta 68 zcmcc6!g!~Jk@qt%FBbz4C=~H!FmL1yU{^DDwu%WYPAw{qNy{us&5dzMEzT~q}j$V*iS$t+3D*<8+k(+U8;K^7wb diff --git a/app.py b/app.py index b477fce..a2546d3 100644 --- a/app.py +++ b/app.py @@ -22,7 +22,7 @@ from dotenv import load_dotenv from models import ( db, User, Thought, Comment, MindMapNode, ThoughtRelation, ThoughtRating, RelationType, Category, UserMindmap, UserMindmapNode, MindmapNote, - node_thought_association, user_thought_bookmark + node_thought_association, user_thought_bookmark, node_relationship ) # Lade .env-Datei @@ -903,45 +903,30 @@ def delete_note(note_id): @app.route('/api/mindmap') def get_mindmap(): """API-Endpunkt zur Bereitstellung der Mindmap-Daten in hierarchischer Form.""" - # Alle root-Nodes (ohne parent) abrufen - root_nodes = MindMapNode.query.filter_by(parent_id=None).all() - - if not root_nodes: - # Wenn keine Nodes existieren, rufen wir initialize_database direkt auf - # anstatt create_sample_mindmap zu verwenden - with app.app_context(): - initialize_database() - root_nodes = MindMapNode.query.filter_by(parent_id=None).all() - - # Ergebnisse in hierarchischer Struktur zurückgeben + # Root-Knoten: Knoten ohne Eltern + root_nodes = MindMapNode.query.\ + outerjoin(node_relationship, MindMapNode.id == node_relationship.c.child_id).\ + filter(node_relationship.c.parent_id == None).all() + result = [] - for node in root_nodes: node_data = build_node_tree(node) result.append(node_data) - return jsonify({"nodes": result}) def build_node_tree(node): """Erzeugt eine hierarchische Darstellung eines Knotens inkl. seiner Kindknoten.""" - # Gedankenzähler abrufen von der many-to-many Beziehung thought_count = len(node.thoughts) - - # Daten für aktuellen Knoten node_data = { "id": node.id, "name": node.name, - "description": f"Knoten mit {thought_count} Gedanken", + "description": node.description or "", "thought_count": thought_count, "children": [] } - - # Rekursiv Kinder hinzufügen - child_nodes = MindMapNode.query.filter_by(parent_id=node.id).all() - for child_node in child_nodes: - child_data = build_node_tree(child_node) + for child in node.children: + child_data = build_node_tree(child) node_data["children"].append(child_data) - return node_data @app.route('/api/nodes//thoughts') @@ -1250,7 +1235,7 @@ def chat_with_assistant(): # Zusammenfassen mehrerer Gedanken oder Analyse anfordern system_message = ( - "Du bist ein hilfreicher Assistent, der Zugriff auf die Wissensdatenbank hat. " + "Du bist ein hilfreicher Assistent, der Zugriff auf die Wissensdatenbank hat. Du antwortest nur auf Fragen bezüglich Systades und der Wissensdatenbank. " "Du kannst Informationen zu Gedanken, Kategorien und Mindmaps liefern. " "Antworte informativ, sachlich und gut strukturiert auf Deutsch." ) diff --git a/database/__pycache__/models.cpython-313.pyc b/database/__pycache__/models.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78b3d6ab2ecf29d7883701916d864dc487279c69 GIT binary patch literal 16985 zcmds8Yit`=b{@V&iWEhWdP|l?+lnn}ZO6~Vk{v(vG$l)NI8x#V9hM?T)L0a$y+hiT zcC%rdVk>P6SVEB6LVj2Vwy?ZKVFg`m{39sbra;|4-7$#P>R^N2qJOGCg<2^Ey1#nP zyhKtnv0OV?U_1v4>fiB3xg2t3{YMsx`jnz6 z+R#V!8i>J*bz`5g*F;QW-PC99H50Q~H}_e3i%3zgl~~1lOP{T`m=t@dpkX(4Toy^} zHPmj3E~=wwYq0pZNoppJpgmA4ljQuPZO~qy(;!#rVrbv7wH;a;x3<#u;|8gfcF-lQ zW*wQ%SCOgCqzt5J&7@SPSJ$ibsv{G}u>I9>=dX@B6E{fFnu$lJ*YcO@wIaV)9ht9Z zCOBfPnN;fZTJ=&hss8R~qBG7KXy3c_eGi%g&0AaP+E&wXv(!#1#a&njyRbfJ0xA2q z(yO%9BJB>KZP1}qc5#hJxf3WGUqD$aQhI@M*9$1?M9SSjx#tCx^&({xP`>d3${ix* zUZC9f0?G!FvKc6SFQD8hQnmo)_g+BRC{peR$^$Q;^u`YQ-dx2;<1+|$`rQlX;*l|C zVhZkxhdGAyv$xm;+}NVw6q8~n7@tw7iZKa>z

k%yBo9BpMnEb7Mj|a7M=S8-dl_ zl}JxSa-Y5omDD=E6Q5E+iWq2$7-<7B(MDpXO~gW*NfB)!R=SATXe%kEZNwfc_SuD! z022?V*kod8YLZ!Xf`GIY3NH24m#OKLP;!%vGK8BXY-B7oT{03*r@Z0xDE{Q0V*V za9sYy6$*{AgiFOiVj>AY+vwqo7Y74FwBYC%92g3m>-2ZvP5ZF_LMI&>zBo7_IC{DU zx&r4e_^)))LNR@@tHa;zhpNp#KwtC+pjH_QaVeN)Bot1i2s@HaF3CDsj*}_HkJy(JCuyD z;xiSj;x9mASAGT2N*#m>-ZV@)gneOG3Q?{IR~`kh=QW^=N|8e09Z4p~VT|K~RcrjA2D++_B0K47C>!Y-;*Hh%>ICyJ?9kPN zz&k{CLAiPnitdL-p(veTzn^9VTOu8ghezVf>Mi^^0|j{#YfqsNtV0qk2t@$hV@U#x z){$^zoG_z;IUbɡ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 literal 0 HcmV?d00001 diff --git a/instance/systades.db b/instance/systades.db new file mode 100644 index 0000000..e69de29 diff --git a/static/js/main.js b/static/js/main.js index a1a8de7..50e9b4a 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -7,15 +7,6 @@ * Verwaltet die globale Anwendungslogik */ -document.addEventListener('DOMContentLoaded', function() { - // Initialisiere die Anwendung - MindMap.init(); - - // Wende Dunkel-/Hellmodus an - const isDarkMode = localStorage.getItem('darkMode') === 'dark'; - document.documentElement.classList.toggle('dark', isDarkMode); -}); - /** * Hauptobjekt der MindMap-Anwendung */ @@ -24,7 +15,7 @@ const MindMap = { initialized: false, darkMode: document.documentElement.classList.contains('dark'), pageInitializers: {}, - currentPage: document.body.dataset.page, + currentPage: null, /** * Initialisiert die MindMap-Anwendung @@ -32,6 +23,9 @@ const MindMap = { init() { if (this.initialized) return; + // Setze currentPage erst jetzt, wenn DOM garantiert geladen ist + this.currentPage = document.body && document.body.dataset ? document.body.dataset.page : null; + console.log('MindMap-Anwendung wird initialisiert...'); // Initialisiere den ChatGPT-Assistenten @@ -229,6 +223,13 @@ const MindMap = { }); } }; +window.MindMap = MindMap; -// Globale Export für andere Module -window.MindMap = MindMap; \ No newline at end of file +document.addEventListener('DOMContentLoaded', function() { + // Initialisiere die Anwendung + MindMap.init(); + + // Wende Dunkel-/Hellmodus an + const isDarkMode = localStorage.getItem('darkMode') === 'dark'; + document.documentElement.classList.toggle('dark', isDarkMode); +}); \ No newline at end of file diff --git a/static/js/modules/mindmap-page.js b/static/js/modules/mindmap-page.js index f00ae14..a543504 100644 --- a/static/js/modules/mindmap-page.js +++ b/static/js/modules/mindmap-page.js @@ -14,9 +14,18 @@ if (window.MindMap) { window.MindMap.pageInitializers.mindmap = initMindmapPage; } +// Initialisiere die Mindmap-Seite nur, wenn alle Abhängigkeiten vorhanden sind +if (window.MindMap && typeof MindMapVisualization !== 'undefined') { + if (document.body && document.body.dataset && document.body.dataset.page === 'mindmap') { + window.MindMap.pageInitializers = window.MindMap.pageInitializers || {}; + window.MindMap.pageInitializers.mindmap = initMindmapPage; + initMindmapPage(); + } +} + document.addEventListener('DOMContentLoaded', function() { // Prüfe, ob wir auf der Mindmap-Seite sind und initialisiere - if (document.body.dataset.page === 'mindmap') { + if (document.body && document.body.dataset && document.body.dataset.page === 'mindmap') { initMindmapPage(); } }); diff --git a/static/js/modules/mindmap.js b/static/js/modules/mindmap.js index 427545c..0dfc9db 100644 --- a/static/js/modules/mindmap.js +++ b/static/js/modules/mindmap.js @@ -818,6 +818,26 @@ class MindMapVisualization { this.updateNodeAppearance(d.id, isBookmarked); }); } + + /** + * Gibt alle direkt verbundenen Knoten eines Knotens zurück + * @param {Object} node - Der Knoten, für den die Verbindungen gesucht werden + * @returns {Array} Array der verbundenen Knotenobjekte + */ + getConnectedNodes(node) { + if (!node || !this.links || !this.nodes) return []; + const nodeId = node.id; + const connectedIds = new Set(); + this.links.forEach(link => { + if (link.source === nodeId || (link.source && link.source.id === nodeId)) { + connectedIds.add(link.target.id ? link.target.id : link.target); + } + if (link.target === nodeId || (link.target && link.target.id === nodeId)) { + connectedIds.add(link.source.id ? link.source.id : link.source); + } + }); + return this.nodes.filter(n => connectedIds.has(n.id)); + } } // Exportiere die Klasse für die Verwendung in anderen Modulen diff --git a/static/neural-network-background.js b/static/neural-network-background.js index b1b0521..3cb5eb3 100644 --- a/static/neural-network-background.js +++ b/static/neural-network-background.js @@ -68,18 +68,18 @@ class NeuralNetworkBackground { // Config - Drastisch verstärkt für strahlende Animationen und neuronale Vernetzung this.config = { - nodeCount: 120, // Viel mehr Knoten für ein dichtes Netzwerk - nodeSize: 1.4, // Größere Knoten für mehr Sichtbarkeit - nodeVariation: 0.6, // Mehr Variation für organisches Aussehen - connectionDistance: 220, // Deutlich längere Verbindungen für mehr Vernetzung - connectionOpacity: 0.4, // Wesentlich stärkere Verbindungen - animationSpeed: 0.08, // Schnellere Bewegung - pulseSpeed: 0.006, // Schnelleres Pulsieren für lebendiges Aussehen - flowSpeed: 0.8, // Schnellere Flussanimationen - flowDensity: 0.005, // Viel mehr Flussanimationen - flowLength: 0.25, // Längere Flussanimationen - maxConnections: 6, // NEW: Neue Eigenschaft für mehr neuronale Verbindungen pro Knoten - clusteringFactor: 0.3 // NEW: Erzeugt Cluster wie in einem neuronalen Netzwerk + nodeCount: 120, // Anzahl der Knoten bleibt hoch für Netzwerkstruktur + nodeSize: 1.1, // Dezenter: kleinere Knoten + nodeVariation: 0.4, // Weniger Variation für ruhigeres Bild + connectionDistance: 220, // Unverändert: gute Vernetzung + connectionOpacity: 0.18, // Deutlich dezentere Verbindungen + animationSpeed: 0.05, // Ruhigere Bewegung + pulseSpeed: 0.004, // Ruhigeres Pulsieren + flowSpeed: 1.2, // Flows schneller für flüssigere Aktivität + flowDensity: 0.012, // Mehr Flows für sichtbare Aktivität + flowLength: 0.32, // Flows länger sichtbar + maxConnections: 5, // Weniger Überlagerung + clusteringFactor: 0.35 // Mehr Cluster für neuronalen Effekt }; // Initialize @@ -335,17 +335,17 @@ class NeuralNetworkBackground { if (!this.connections.some(conn => (conn.from === i && conn.to === j) || (conn.from === j && conn.to === i) )) { - // Create connection + // Neue Verbindung startet mit progress=0 für animierten Aufbau this.connections.push({ from: i, to: j, distance: distance, opacity: connOpacity, strength: connectionStrength, - hasFlow: false, // Each connection can have a flow - lastActivated: 0 // For neural firing animation + hasFlow: false, + lastActivated: 0, + progress: 0 // Animationsfortschritt für Verbindungsaufbau }); - nodeA.connections.push(j); nodeB.connections.push(i); } @@ -406,6 +406,15 @@ class NeuralNetworkBackground { } } + // Animierter Verbindungsaufbau: progress inkrementieren + for (const connection of this.connections) { + if (connection.progress < 1) { + // Langsamer Aufbau: Geschwindigkeit kann angepasst werden + connection.progress += 0.012; // Sehr langsam, für subtilen Effekt + if (connection.progress > 1) connection.progress = 1; + } + } + // Update flows this.updateFlows(); @@ -515,21 +524,8 @@ class NeuralNetworkBackground { positions[i * 2] = node.x; positions[i * 2 + 1] = node.y; - // Enhanced pulse effect with additional boost for active nodes - let pulse = Math.sin(node.pulsePhase) * 0.4 + 1; - - // Make active nodes pulse more intensely (neural firing effect) - if (node.isActive) { - const timeSinceFired = now - node.lastFired; - if (timeSinceFired < 300) { - // Quick expand then contract effect - const normalizedTime = timeSinceFired / 300; - const fireBoost = 1.5 * (1 - normalizedTime); - pulse += fireBoost; - } - } - - // Nodes with more connections are larger (hub neurons) + // Sichtbarkeit der Neuronen erhöhen + let pulse = Math.sin(node.pulsePhase) * 0.22 + 1.08; const connectivityFactor = 1 + (node.connections.length / this.config.maxConnections) * 0.8; sizes[i] = node.size * pulse * connectivityFactor; } @@ -585,10 +581,11 @@ class NeuralNetworkBackground { b = (b + nodePulseColor.b / 255) / 2; } + // Sehr sichtbare Knoten this.gl.uniform4f( this.programInfo.uniformLocations.color, r, g, b, - 0.95 // Higher opacity for maximum visibility + node.isActive ? 0.98 : 0.8 // Sehr sichtbar ); // Draw each node individually for better control @@ -598,50 +595,40 @@ class NeuralNetworkBackground { renderConnectionsWebGL() { const now = Date.now(); - - // For each connection, draw a line for (const connection of this.connections) { const fromNode = this.nodes[connection.from]; const toNode = this.nodes[connection.to]; - - // Line positions + // Animierter Verbindungsaufbau: nur Teil der Linie zeichnen + const progress = connection.progress || 1; + const x1 = fromNode.x; + const y1 = fromNode.y; + const x2 = x1 + (toNode.x - x1) * progress; + const y2 = y1 + (toNode.y - y1) * progress; const positions = new Float32Array([ - fromNode.x, fromNode.y, - toNode.x, toNode.y + x1, y1, + x2, y2 ]); - - // Bind position buffer this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.positionBuffer); this.gl.bufferData(this.gl.ARRAY_BUFFER, positions, this.gl.STATIC_DRAW); this.gl.vertexAttribPointer( this.programInfo.attribLocations.vertexPosition, - 2, // components per vertex - this.gl.FLOAT, // data type - false, // normalize - 0, // stride - 0 // offset + 2, + this.gl.FLOAT, + false, + 0, + 0 ); this.gl.enableVertexAttribArray(this.programInfo.attribLocations.vertexPosition); - - // Disable point size attribute for lines this.gl.disableVertexAttribArray(this.programInfo.attribLocations.pointSize); - - // Set line color with connection opacity const colorObj = this.isDarkMode ? this.darkModeColors : this.lightModeColors; let lineColor = this.hexToRgb(colorObj.connectionColor); - - // Highlight recently activated connections for neural pathway effect - let opacity = connection.opacity * 1.4; // Base increased visibility - + // Sehr dezente Grundopazität + let opacity = connection.opacity * 0.7; if (now - connection.lastActivated < 800) { - // Make recently activated connections brighter lineColor = this.hexToRgb(colorObj.flowColor); - - // Fade out effect const timeFactor = 1 - ((now - connection.lastActivated) / 800); - opacity = Math.max(opacity, timeFactor * 0.9); + opacity = Math.max(opacity, timeFactor * 0.32); } - this.gl.uniform4f( this.programInfo.uniformLocations.color, lineColor.r / 255, @@ -649,11 +636,8 @@ class NeuralNetworkBackground { lineColor.b / 255, opacity ); - - // Draw the line - this.gl.enable(this.gl.BLEND); - this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE); - this.gl.lineWidth(1); + // Sehr dünne Linien + this.gl.lineWidth(0.5); this.gl.drawArrays(this.gl.LINES, 0, 2); } } @@ -730,18 +714,18 @@ class NeuralNetworkBackground { // Flow color - much stronger glow const colorObj = this.isDarkMode ? this.darkModeColors : this.lightModeColors; const flowColor = this.hexToRgb(colorObj.flowColor); + + // Flows mit sanftem, aber sichtbarem Glow und höherer Opazität this.gl.uniform4f( this.programInfo.uniformLocations.color, flowColor.r / 255, flowColor.g / 255, flowColor.b / 255, - 0.9 * fadeOpacity * flow.intensity // Much stronger flow opacity with intensity variation + 0.55 * fadeOpacity * (flow.intensity || 1) // Dezenter, aber sichtbar ); - // Draw the flow line - this.gl.enable(this.gl.BLEND); - this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE); - this.gl.lineWidth(2.5); // Even thicker for dramatic visibility + // Dünnere Flows für subtilen Effekt + this.gl.lineWidth(1.2); this.gl.drawArrays(this.gl.LINES, 0, 2); } } @@ -769,13 +753,19 @@ class NeuralNetworkBackground { for (const connection of this.connections) { const fromNode = this.nodes[connection.from]; const toNode = this.nodes[connection.to]; - + // Animierter Verbindungsaufbau: nur Teil der Linie zeichnen + const progress = connection.progress || 1; + const x1 = fromNode.x; + const y1 = fromNode.y; + const x2 = x1 + (toNode.x - x1) * progress; + const y2 = y1 + (toNode.y - y1) * progress; this.ctx.beginPath(); - this.ctx.moveTo(fromNode.x, fromNode.y); - this.ctx.lineTo(toNode.x, toNode.y); - + this.ctx.moveTo(x1, y1); + this.ctx.lineTo(x2, y2); const rgbColor = this.hexToRgb(connectionColor); - this.ctx.strokeStyle = `rgba(${rgbColor.r}, ${rgbColor.g}, ${rgbColor.b}, ${connection.opacity})`; + // Sehr dezente Opazität + this.ctx.strokeStyle = `rgba(${rgbColor.r}, ${rgbColor.g}, ${rgbColor.b}, ${connection.opacity * 0.7})`; + this.ctx.lineWidth = 0.5; this.ctx.stroke(); } @@ -792,33 +782,22 @@ class NeuralNetworkBackground { : this.lightModeColors.nodePulse; for (const node of this.nodes) { - // Node with subtle glow effect - const pulse = Math.sin(node.pulsePhase) * 0.2 + 1; - const nodeSize = node.size * pulse * (node.connections.length > 3 ? 1.3 : 1); - - // Glow effect + // Sichtbarkeit der Neuronen erhöhen + const pulse = Math.sin(node.pulsePhase) * 0.18 + 1.08; // Leicht erhöhte Amplitude + const nodeSize = node.size * pulse * (node.connections.length > 3 ? 1.22 : 1); const glow = this.ctx.createRadialGradient( node.x, node.y, 0, - node.x, node.y, nodeSize * 2 + node.x, node.y, nodeSize * 2.2 ); - - const rgbNodeColor = this.hexToRgb(nodeColor); - const rgbPulseColor = this.hexToRgb(nodePulse); - - glow.addColorStop(0, `rgba(${rgbPulseColor.r}, ${rgbPulseColor.g}, ${rgbPulseColor.b}, 0.6)`); - glow.addColorStop(0.5, `rgba(${rgbNodeColor.r}, ${rgbNodeColor.g}, ${rgbNodeColor.b}, 0.2)`); - glow.addColorStop(1, `rgba(${rgbNodeColor.r}, ${rgbNodeColor.g}, ${rgbNodeColor.b}, 0)`); - - this.ctx.beginPath(); - this.ctx.arc(node.x, node.y, nodeSize * 2, 0, Math.PI * 2); - this.ctx.fillStyle = glow; - this.ctx.fill(); - - // Main node + glow.addColorStop(0, `rgba(${nodePulse.r}, ${nodePulse.g}, ${nodePulse.b}, 0.52)`); + glow.addColorStop(0.5, `rgba(${nodeColor.r}, ${nodeColor.g}, ${nodeColor.b}, 0.22)`); + glow.addColorStop(1, `rgba(${nodeColor.r}, ${nodeColor.g}, ${nodeColor.b}, 0)`); this.ctx.beginPath(); this.ctx.arc(node.x, node.y, nodeSize, 0, Math.PI * 2); - this.ctx.fillStyle = nodeColor; + this.ctx.fillStyle = glow; + this.ctx.globalAlpha = node.isActive ? 0.95 : 0.7; // Sehr sichtbar this.ctx.fill(); + this.ctx.globalAlpha = 1.0; } } @@ -876,12 +855,12 @@ class NeuralNetworkBackground { 1 ); - // Draw flow + // Dezente Flows mit sanftem Fade-Out this.ctx.beginPath(); this.ctx.moveTo(p1.x, p1.y); this.ctx.lineTo(p2.x, p2.y); - this.ctx.strokeStyle = `rgba(${rgbFlowColor.r}, ${rgbFlowColor.g}, ${rgbFlowColor.b}, ${0.4 * fadeOpacity})`; - this.ctx.lineWidth = 1.5; + this.ctx.strokeStyle = `rgba(${rgbFlowColor.r}, ${rgbFlowColor.g}, ${rgbFlowColor.b}, ${0.28 * fadeOpacity})`; + this.ctx.lineWidth = 1.1; this.ctx.stroke(); } } diff --git a/systades.db b/systades.db new file mode 100644 index 0000000..e69de29 diff --git a/templates/base.html b/templates/base.html index 180005e..14a8411 100644 --- a/templates/base.html +++ b/templates/base.html @@ -14,11 +14,12 @@ - + + + + \ No newline at end of file diff --git a/templates/mindmap.html b/templates/mindmap.html index 1711c7f..83923a7 100644 --- a/templates/mindmap.html +++ b/templates/mindmap.html @@ -391,7 +391,7 @@

-
+
diff --git a/utils/__pycache__/__init__.cpython-313.pyc b/utils/__pycache__/__init__.cpython-313.pyc index 032f9c9530af7c4b68be6745bd7483f29ea7e786..fb28d80c692c4e6320fc2dd80296bb1e90ff719b 100644 GIT binary patch delta 53 zcmX@fzL%Z%GcPX}0}#|&@n@Xc$ZN*^Tel3F%7 Hg*g=fjOGt{ delta 65 zcmdnXev+N{GcPX}0}z-O@ntO9$ZN=~X76kj6Iz^FR2-9*S(KU^kyG@qwGcPX}0}#|&@n>*xZ{(|Ck}`C*iU}=FEh>%)3Gw%Jj&js<^>uZOaY-%P Jyn#uG2LP9E4^RLA delta 67 zcmdlcdq|e=GcPX}0}z-O@n!7g+Q?VKq-N`E6%$&VT2vg9mRXdV8{?8%oL!P%5MyX) V7~`Ljm#PqwS(2Kwc?pvc4*;-S6g(zlQDkiizwWv5IEwd;!H^wEkIJ+djAjZ(p VFvdS4FI6EVvm`ZV^DVBw%mCHE7ajlr diff --git a/utils/__pycache__/db_test.cpython-313.pyc b/utils/__pycache__/db_test.cpython-313.pyc index 098065ff390d79fed48640ef40b2a0bbebd400d3..2be7b9b8a90f586c6eb26e107e870dad4802ebbb 100644 GIT binary patch delta 55 zcmcbudtR6CGcPX}0}#|&@n%)3Gw%Jj&js<^>uZOaY-%P J?8G`#5CEPD4|Mw>$m_=`W$tVh6Iz^FR2&l$;_vGm<*4WC>*^Tel3KR8 Ik@J!m0J~)n)Bpeg delta 66 zcmX@^aM^+PGcPX}0}z-O@nwi?