141 lines
5.2 KiB
HTML
141 lines
5.2 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 Flowchart Pan Zoom Demo</title>
|
||
|
<script src="https://bumbu.github.io/svg-pan-zoom/dist/svg-pan-zoom.min.js"></script>
|
||
|
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
|
||
|
<style>
|
||
|
#svg-container {
|
||
|
width: 100%;
|
||
|
height: 600px;
|
||
|
border: 1px solid black;
|
||
|
overflow: hidden;
|
||
|
}
|
||
|
#mermaid-diagram {
|
||
|
width: 100%;
|
||
|
height: 100%;
|
||
|
}
|
||
|
#mermaid-diagram svg {
|
||
|
width: 100%;
|
||
|
height: 100%;
|
||
|
}
|
||
|
</style>
|
||
|
</head>
|
||
|
<body>
|
||
|
<div id="svg-container">
|
||
|
<div id="mermaid-diagram" class="mermaid">
|
||
|
flowchart TD
|
||
|
A["Cloud User"] -- CHF/EUR/... --> B("CLOUD MARKET PLACE<br>Discount based on position<br>in TF Liquidity Pool.") & 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, ..."}
|
||
|
I --> D["ThreeFold Farmers"]
|
||
|
C -- 80% --> D
|
||
|
C -- 10% --> E["ThreeFold Cooperative"] & F["Validators<br>Commercial Partners"]
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div>
|
||
|
<button id="zoom-in">Zoom In</button>
|
||
|
<button id="zoom-out">Zoom Out</button>
|
||
|
<button id="reset">Reset</button>
|
||
|
<button id="center">Center</button>
|
||
|
<button id="fit">Fit</button>
|
||
|
<button id="toggle-pan">Toggle Pan</button>
|
||
|
<button id="toggle-zoom">Toggle Zoom</button>
|
||
|
</div>
|
||
|
|
||
|
<script>
|
||
|
mermaid.initialize({ startOnLoad: true });
|
||
|
|
||
|
// Wait for Mermaid to render the flowchart
|
||
|
mermaid.init(undefined, "#mermaid-diagram").then(function() {
|
||
|
// Get the SVG element created by Mermaid
|
||
|
var svgElement = document.querySelector("#mermaid-diagram svg");
|
||
|
|
||
|
// Initialize svg-pan-zoom
|
||
|
var panZoomInstance = svgPanZoom(svgElement, {
|
||
|
zoomEnabled: true,
|
||
|
controlIconsEnabled: true,
|
||
|
fit: true,
|
||
|
center: true,
|
||
|
minZoom: 0.1,
|
||
|
maxZoom: 10,
|
||
|
zoomScaleSensitivity: 0.3
|
||
|
});
|
||
|
|
||
|
svgElement.addEventListener('touchstart', function(){}, { passive: true });
|
||
|
svgElement.addEventListener('touchmove', function(){}, { passive: true });
|
||
|
svgElement.addEventListener('touchend', function(){}, { passive: true });
|
||
|
|
||
|
// Event listeners for buttons
|
||
|
document.getElementById('zoom-in').addEventListener('click', function() {
|
||
|
panZoomInstance.zoomIn();
|
||
|
});
|
||
|
|
||
|
document.getElementById('zoom-out').addEventListener('click', function() {
|
||
|
panZoomInstance.zoomOut();
|
||
|
});
|
||
|
|
||
|
document.getElementById('reset').addEventListener('click', function() {
|
||
|
panZoomInstance.resetZoom();
|
||
|
panZoomInstance.resetPan();
|
||
|
});
|
||
|
|
||
|
document.getElementById('center').addEventListener('click', function() {
|
||
|
panZoomInstance.center();
|
||
|
});
|
||
|
|
||
|
document.getElementById('fit').addEventListener('click', function() {
|
||
|
panZoomInstance.fit();
|
||
|
});
|
||
|
|
||
|
document.getElementById('toggle-pan').addEventListener('click', function() {
|
||
|
if (panZoomInstance.isPanEnabled()) {
|
||
|
panZoomInstance.disablePan();
|
||
|
this.textContent = 'Enable Pan';
|
||
|
} else {
|
||
|
panZoomInstance.enablePan();
|
||
|
this.textContent = 'Disable Pan';
|
||
|
}
|
||
|
});
|
||
|
|
||
|
document.getElementById('toggle-zoom').addEventListener('click', function() {
|
||
|
if (panZoomInstance.isZoomEnabled()) {
|
||
|
panZoomInstance.disableZoom();
|
||
|
this.textContent = 'Enable Zoom';
|
||
|
} else {
|
||
|
panZoomInstance.enableZoom();
|
||
|
this.textContent = 'Disable Zoom';
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Example of programmatic panning
|
||
|
setTimeout(function() {
|
||
|
panZoomInstance.panBy({x: 50, y: 50});
|
||
|
}, 1000);
|
||
|
|
||
|
// Example of getting sizes
|
||
|
console.log('SVG Sizes:', panZoomInstance.getSizes());
|
||
|
|
||
|
// Example of zoom at a specific point
|
||
|
setTimeout(function() {
|
||
|
panZoomInstance.zoomAtPoint(2, {x: 300, y: 200});
|
||
|
}, 2000);
|
||
|
|
||
|
// Example of setting a custom beforeZoom function
|
||
|
panZoomInstance.setBeforeZoom(function(oldZoom, newZoom) {
|
||
|
console.log('Zoom is about to change from', oldZoom, 'to', newZoom);
|
||
|
return true; // Allows zooming to continue
|
||
|
});
|
||
|
|
||
|
// Example of setting a custom onZoom function
|
||
|
panZoomInstance.setOnZoom(function(newZoom) {
|
||
|
console.log('Zoom has changed to', newZoom);
|
||
|
});
|
||
|
});
|
||
|
</script>
|
||
|
</body>
|
||
|
</html>
|