164 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html>
 | |
| <html lang="en">
 | |
| <head>
 | |
|     <meta charset="UTF-8">
 | |
|     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | |
|     <title>Mermaid Diagram with Zoom and Pan</title>
 | |
| 
 | |
|     <!-- Include the Mermaid library via CDN -->
 | |
|     <script src="https://cdn.jsdelivr.net/npm/mermaid@10.9.0/dist/mermaid.min.js"></script>
 | |
|     
 | |
|     <!-- Include the Panzoom.js library -->
 | |
|     <script src="https://cdn.jsdelivr.net/npm/panzoom@9.4.3/dist/panzoom.min.js"></script>
 | |
| 
 | |
|     <style>
 | |
|         /* Container to hold the Mermaid diagram */
 | |
|         #mermaidContainer {
 | |
|             width: 100%;
 | |
|             max-width: 1200px; /* Control the max width */
 | |
|             height: 80vh; /* Control the height based on the viewport */
 | |
|             margin: auto;
 | |
|             border: 1px solid #ddd; /* Optional: border for visibility */
 | |
|             position: relative;
 | |
|             overflow: hidden; /* Ensure overflow is hidden */
 | |
|         }
 | |
| 
 | |
|         /* Position the zoom buttons at the top of the diagram */
 | |
|         #zoomControls {
 | |
|             display: flex;
 | |
|             justify-content: center;
 | |
|             margin-bottom: 10px;
 | |
|         }
 | |
| 
 | |
|         .zoom-btn {
 | |
|             padding: 10px;
 | |
|             margin: 0 5px;
 | |
|             font-size: 16px;
 | |
|             cursor: pointer;
 | |
|             background-color: #007BFF;
 | |
|             color: white;
 | |
|             border: none;
 | |
|             border-radius: 5px;
 | |
|         }
 | |
| 
 | |
|         .zoom-btn:hover {
 | |
|             background-color: #0056b3;
 | |
|         }
 | |
| 
 | |
|         svg {
 | |
|             width: 100%; /* Ensure the SVG fits the container width */
 | |
|             height: 100%; /* Ensure the SVG fits the container height */
 | |
|         }
 | |
| 
 | |
|         /* Styles for the log container */
 | |
|         #logContainer {
 | |
|             margin-top: 20px;
 | |
|             padding: 10px;
 | |
|             border: 1px solid #ccc;
 | |
|             background-color: #f9f9f9;
 | |
|             max-height: 200px;
 | |
|             overflow-y: auto;
 | |
|         }
 | |
|     </style>
 | |
| </head>
 | |
| <body>
 | |
|     <h1>Mermaid Flowchart with Zoom and Pan</h1>
 | |
| 
 | |
|     <!-- Zoom Controls -->
 | |
|     <div id="zoomControls">
 | |
|         <button class="zoom-btn" id="zoomIn">Zoom In</button>
 | |
|         <button class="zoom-btn" id="zoomOut">Zoom Out</button>
 | |
|         <button class="zoom-btn" id="resetZoom">Reset</button>
 | |
|     </div>
 | |
| 
 | |
|     <!-- Mermaid diagram container -->
 | |
|     <div id="mermaidContainer" class="mermaid">
 | |
|         flowchart TD
 | |
|         A[Cloud User] -->|CHF/EUR/...| B(CLOUD MARKET PLACE<br>Discount based on position<br>in TF Liquidity Pool.)
 | |
|         A[Cloud User] -->|CHF/EUR/...| B2((ThreeFold<br>Liquidity Pool))
 | |
|         B2 -->|TFT or INCA| B
 | |
|         B -->|TFT or INCA| C{Proof Of Utilization}
 | |
|         G[FARMING GRANTS<br>40m Tokens / Month] --> I{Proof Of Capacity<br>uptime, location, ...} --> D
 | |
|         C -->|80%| D[ThreeFold Farmers]
 | |
|         C -->|10%| E[ThreeFold Cooperative]
 | |
|         C -->|10%| F[Validators<br>Commercial Partners]
 | |
|     </div>
 | |
| 
 | |
|     <!-- Log container -->
 | |
|     <div id="logContainer"></div>
 | |
| 
 | |
|     <script>
 | |
|         function log(message) {
 | |
|             const logContainer = document.getElementById('logContainer');
 | |
|             logContainer.innerHTML += message + '<br>';
 | |
|             console.log(message);
 | |
|         }
 | |
| 
 | |
|         document.addEventListener('DOMContentLoaded', function () {
 | |
|             // Initialize Mermaid
 | |
|             mermaid.initialize({ startOnLoad: true });
 | |
| 
 | |
|             // Watch for changes in the DOM to detect when the SVG is rendered
 | |
|             const observer = new MutationObserver(function () {
 | |
|                 const svgElement = document.querySelector('#mermaidContainer svg');
 | |
|                 if (svgElement) {
 | |
|                     // Once the SVG is found, disconnect the observer
 | |
|                     observer.disconnect();
 | |
| 
 | |
|                     // Log SVG details
 | |
|                     log('SVG found:');
 | |
|                     log(`- Width: ${svgElement.width.baseVal.value}`);
 | |
|                     log(`- Height: ${svgElement.height.baseVal.value}`);
 | |
|                     log(`- ViewBox: ${svgElement.getAttribute('viewBox')}`);
 | |
| 
 | |
|                     // Set the viewBox on the SVG element to fit the entire diagram
 | |
|                     const svgBox = svgElement.getBBox();
 | |
|                     svgElement.setAttribute('viewBox', `0 0 ${svgBox.width} ${svgBox.height}`);
 | |
|                     log(`- Updated ViewBox: ${svgElement.getAttribute('viewBox')}`);
 | |
| 
 | |
|                     // Log the number of child elements
 | |
|                     log(`- Number of child elements: ${svgElement.children.length}`);
 | |
| 
 | |
|                     // Apply Panzoom to enable zoom and pan functionality
 | |
|                     const panzoomInstance = panzoom(svgElement, {
 | |
|                         maxScale: 10,  // Maximum zoom level
 | |
|                         minScale: 0.5,  // Minimum zoom level
 | |
|                         contain: 'outside',  // Ensure the SVG stays within bounds
 | |
|                         panOnlyWhenZoomed: true,  // Enable panning only when zoomed
 | |
|                         initialX: 300,
 | |
|                         initialY: 500,
 | |
|                         initialZoom: 2
 | |
|                     });
 | |
| 
 | |
|                     log('Panzoom initialized');
 | |
| 
 | |
|                     // Enable zooming with the mouse wheel, marking the event listener as passive
 | |
|                     svgElement.parentElement.addEventListener('wheel', panzoomInstance.zoomWithWheel, { passive: true });
 | |
| 
 | |
|                     // Hook up the zoom buttons
 | |
|                     document.getElementById('zoomIn').addEventListener('click', function() {
 | |
|                         const currentScale = panzoomInstance.getScale();
 | |
|                         panzoomInstance.scaleTo(svgElement.clientWidth / 2, svgElement.clientHeight / 2, currentScale * 1.2);
 | |
|                         log(`Zoomed in. New scale: ${panzoomInstance.getScale()}`);
 | |
|                     });
 | |
| 
 | |
|                     document.getElementById('zoomOut').addEventListener('click', function() {
 | |
|                         const currentScale = panzoomInstance.getScale();
 | |
|                         panzoomInstance.scaleTo(svgElement.clientWidth / 2, svgElement.clientHeight / 2, currentScale * 0.8);
 | |
|                         log(`Zoomed out. New scale: ${panzoomInstance.getScale()}`);
 | |
|                     });
 | |
| 
 | |
|                     document.getElementById('resetZoom').addEventListener('click', function() {
 | |
|                         panzoomInstance.reset(); // Reset zoom and pan to the initial state
 | |
|                         log('Zoom reset');
 | |
|                     });
 | |
|                 }
 | |
|             });
 | |
| 
 | |
|             // Observe changes inside the mermaidContainer
 | |
|             const container = document.querySelector('#mermaidContainer');
 | |
|             observer.observe(container, { childList: true, subtree: true });
 | |
|         });
 | |
|     </script>
 | |
| </body>
 | |
| </html> |