Exsolvent Field - Rational Function Visualizer (Mobile).HTML
Exsolvent Field - Rational Function Visualizer (Mobile).HTML
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-
scale=1.0, user-scalable=no" />
<title>Exsolvent Field — Rational Function Visualizer (Mobile)</title>
<!-- Plotly CDN for interactive 3D and 2D plots -->
<script src="[Link]
<style>
* {
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: #0b0e14;
color: #e0e4ea;
margin: 0;
padding: 10px;
-webkit-text-size-adjust: 100%;
}
.app-container {
max-width: 100%;
margin: 0 auto;
}
h1 {
text-align: center;
font-weight: 300;
letter-spacing: 1px;
font-size: 1.5rem;
border-bottom: 1px solid #2a3a4a;
padding-bottom: 10px;
color: #b8d0e0;
margin-top: 10px;
}
h1 span {
color: #6a9bbf;
font-weight: 500;
}
.subtitle {
text-align: center;
color: #8899aa;
font-style: italic;
margin-top: -6px;
margin-bottom: 15px;
font-size: 0.85rem;
padding: 0 10px;
}
.controls {
display: flex;
flex-direction: column;
gap: 15px;
background: #141a22;
padding: 15px;
border-radius: 12px;
margin-bottom: 20px;
border: 1px solid #2a3a4a;
}
.control-group {
display: flex;
flex-direction: column;
width: 100%;
}
.control-group label {
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 1px;
color: #7a8fa0;
margin-bottom: 4px;
display: flex;
justify-content: space-between;
}
.control-group .value {
font-size: 0.9rem;
font-weight: 600;
color: #b0d0e8;
}
input[type="range"] {
width: 100%;
background: #1e2a34;
height: 8px;
border-radius: 4px;
-webkit-appearance: none;
appearance: none;
outline: none;
margin: 8px 0;
}
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 24px;
height: 24px;
border-radius: 50%;
background: #6a9bbf;
cursor: pointer;
border: 2px solid #fff;
box-shadow: 0 2px 6px rgba(0,0,0,0.4);
}
input[type="range"]::-moz-range-thumb {
width: 24px;
height: 24px;
border-radius: 50%;
background: #6a9bbf;
cursor: pointer;
border: 2px solid #fff;
box-shadow: 0 2px 6px rgba(0,0,0,0.4);
}
.grid-container {
display: grid;
grid-template-columns: 1fr;
gap: 15px;
}
.plot-card {
background: #141a22;
border-radius: 12px;
padding: 10px;
border: 1px solid #1e2e3e;
box-shadow: 0 4px 20px rgba(0,0,0,0.5);
}
.plot-card h3 {
margin: 0 0 5px 0;
font-weight: 400;
font-size: 0.95rem;
color: #9ab0c8;
letter-spacing: 0.5px;
}
.plot-card .sub {
font-size: 0.7rem;
color: #6a7f90;
margin-bottom: 8px;
line-height: 1.3;
}
.plot-card .plot-container {
width: 100%;
height: 350px;
}
.full-width {
grid-column: 1 / -1;
}
.footer-note {
text-align: center;
font-size: 0.75rem;
color: #4a5f70;
margin-top: 20px;
border-top: 1px solid #1a2a3a;
padding-top: 15px;
line-height: 1.4;
}
.footer-note a {
color: #6a9bbf;
text-decoration: none;
}
</style>
</head>
<body>
<div class="app-container">
<h1><span>Exsolvent</span> Field Visualizer</h1>
<div class="subtitle">Rational Function Field for Multi-Scale Porous Media —
Weighted Polynomial Upscaling</div>
<div class="footer-note">
The Watcher inhabits the gap between the abstract field (top) and the
physical ground (bottom).<br/>
Drag sliders to explore the structural tension. <span
style="color:#4a6a7a;">— Exsolvent Geometry v1.0 (Mobile)</span>
</div>
</div>
<script>
(function() {
"use strict";
[Link] = [Link](2);
[Link] = [Link](2);
[Link] = [Link](2);
[Link] = [Link](2);
[Link] = res;
const n = res;
const data = computeField(n, phiC, alpha, k);
let zAtPoint = 0;
try {
zAtPoint = rationalField(phi, k, phiC, alpha);
} catch(e) { zAtPoint = 0; }
const pointTrace = {
type: 'scatter3d',
mode: 'markers',
x: [phi],
y: [k],
z: [zAtPoint],
marker: { color: 'red', size: 6, symbol: 'diamond' },
name: 'Watcher Position'
};
const layout3d = {
margin: { l: 10, r: 10, b: 20, t: 10 },
scene: {
xaxis: { title: 'φ', color: '#8899aa' },
yaxis: { title: 'k', color: '#8899aa' },
zaxis: { title: 'K', color: '#8899aa' },
bgcolor: '#0b0e14',
camera: { eye: { x: 1.8, y: 1.8, z: 1.4 } }
},
paper_bgcolor: '#141a22',
plot_bgcolor: '#0b0e14',
font: { color: '#c0d0e0', size: 10 }
};
const traceContour = {
type: 'contour',
x: [Link],
y: [Link],
z: pMatrix,
colorscale: 'Viridis',
showscale: false,
contours: { coloring: 'heatmap' },
hovertemplate: 'φ: %{x:.2f}<br>k: %{y:.2f}<br>P:
%{z:.2f}<extra></extra>'
};
const layoutContour = {
margin: { l: 30, r: 10, b: 30, t: 10 },
xaxis: { title: 'Porosity φ', color: '#8899aa', gridcolor:
'#1a2a3a' },
yaxis: { title: 'Permeability k', color: '#8899aa', gridcolor:
'#1a2a3a' },
paper_bgcolor: '#141a22',
plot_bgcolor: '#0b0e14',
font: { color: '#c0d0e0', size: 10 }
};
const traceLattice = {
type: 'heatmap',
z: zLattice,
colorscale: [[0, '#0a0f18'], [1, '#d0e4f0']],
showscale: false,
hovertemplate: 'x: %{x}<br>y: %{y}<br>Pore: %{z}<extra></extra>'
};
const traceCluster = {
type: 'scatter',
mode: 'markers',
x: [Link](p => p.x),
y: [Link](p => p.y),
marker: { color: '#ff4466', size: 2, opacity: 0.8 },
name: 'Active Anchor Path'
};
const layoutLattice = {
margin: { l: 10, r: 10, b: 10, t: 25 },
xaxis: { showgrid: false, showticklabels: false, range: [-1,
size] },
yaxis: { showgrid: false, showticklabels: false, range: [-1, size],
scaleanchor: 'x' },
paper_bgcolor: '#141a22',
plot_bgcolor: '#0b0e14',
font: { color: '#c0d0e0', size: 10 },
annotations: [{
x: 0.5,
y: 1.08,
xref: 'paper',
yref: 'paper',
text: `φ = ${[Link](2)} | p = ${[Link](2)} |
Cluster: ${[Link]}`,
showarrow: false,
font: { size: 10, color: '#8aaabc' }
}]
};
</body>
</html>