Spaces:
Running on Zero
Running on Zero
Update index.html
Browse files- index.html +43 -41
index.html
CHANGED
|
@@ -14,15 +14,15 @@
|
|
| 14 |
<div class="nav-container">
|
| 15 |
<div class="nav-brand">
|
| 16 |
<span class="brand-title">⚡ CV Curve Fitting Pro</span>
|
| 17 |
-
<span class="brand-subtitle">JAX Diffusion & DOS Optimizer (
|
| 18 |
</div>
|
| 19 |
<div class="nav-links">
|
| 20 |
-
<div class="engine-badge-btn" id="engine-status-badge" title="Click to view backend connection guide">
|
| 21 |
<span class="status-dot probing" id="engine-dot"></span>
|
| 22 |
<span class="engine-text" id="engine-label">Probing JAX Engine...</span>
|
| 23 |
</div>
|
| 24 |
<a href="#solver" id="nav-solver-btn" class="active">Solver</a>
|
| 25 |
-
<a href="#documentation" id="nav-doc-btn">Documentation</a>
|
| 26 |
</div>
|
| 27 |
</div>
|
| 28 |
</nav>
|
|
@@ -37,18 +37,18 @@
|
|
| 37 |
<h2>Optimization Configuration</h2>
|
| 38 |
</header>
|
| 39 |
<div class="panel-body">
|
| 40 |
-
<form id="cv-form">
|
| 41 |
<!-- File Upload & Drag-and-Drop Area -->
|
| 42 |
-
<div class="form-group file-upload-wrapper" id="drop-zone">
|
| 43 |
-
<label>Upload Cyclic Voltammetry File (.csv)</label>
|
| 44 |
-
<div class="file-upload-custom">
|
| 45 |
-
<
|
| 46 |
<span class="drag-hint">or drag and drop file here</span>
|
| 47 |
</div>
|
| 48 |
-
<div class="file-name-row">
|
| 49 |
<span id="file-name-display">No file chosen</span>
|
| 50 |
</div>
|
| 51 |
-
<input type="file" id="csv-file" name="file" accept=".csv,.txt" class="hidden-file-input">
|
| 52 |
</div>
|
| 53 |
|
| 54 |
<!-- Data Mapping & Column Selector -->
|
|
@@ -57,29 +57,29 @@
|
|
| 57 |
<div class="cycle-preset-container" id="cycle-preset-container">
|
| 58 |
<div class="preset-row">
|
| 59 |
<span class="preset-cycle-tag">Cycle 1:</span>
|
| 60 |
-
<button type="button" class="preset-pill-btn" data-pot="0" data-cur="1" data-skip="5">Raw (0, 1)</button>
|
| 61 |
-
<button type="button" class="preset-pill-btn" data-pot="2" data-cur="3" data-skip="1">Adjusted (2, 3)</button>
|
| 62 |
</div>
|
| 63 |
<div class="preset-row">
|
| 64 |
<span class="preset-cycle-tag">Cycle 2:</span>
|
| 65 |
-
<button type="button" class="preset-pill-btn" data-pot="4" data-cur="5" data-skip="5">Raw (4, 5)</button>
|
| 66 |
-
<button type="button" class="preset-pill-btn" data-pot="6" data-cur="7" data-skip="1">Adjusted (6, 7)</button>
|
| 67 |
</div>
|
| 68 |
<div class="preset-row">
|
| 69 |
<span class="preset-cycle-tag">Cycle 3:</span>
|
| 70 |
-
<button type="button" class="preset-pill-btn active" data-pot="8" data-cur="9" data-skip="5">Raw (8, 9)</button>
|
| 71 |
-
<button type="button" class="preset-pill-btn" data-pot="10" data-cur="11" data-skip="1">Adjusted (10, 11)</button>
|
| 72 |
</div>
|
| 73 |
<div class="preset-row">
|
| 74 |
<span class="preset-cycle-tag">Cycle 4:</span>
|
| 75 |
-
<button type="button" class="preset-pill-btn" data-pot="12" data-cur="13" data-skip="5">Raw (12, 13)</button>
|
| 76 |
-
<button type="button" class="preset-pill-btn" data-pot="14" data-cur="15" data-skip="1">Adjusted (14, 15)</button>
|
| 77 |
</div>
|
| 78 |
</div>
|
| 79 |
<div class="input-grid">
|
| 80 |
<div class="form-group">
|
| 81 |
<label for="pot_col">Potential (V) Column</label>
|
| 82 |
-
<select id="pot_col" name="pot_col" class="engine-dropdown" required>
|
| 83 |
<option value="8">Col 8: Cycle 3 Potential (V) [Raw]</option>
|
| 84 |
<option value="10">Col 10: Cycle 3 Potential (V) [Adjusted]</option>
|
| 85 |
<option value="0">Col 0: Cycle 1 Potential (V) [Raw]</option>
|
|
@@ -92,7 +92,7 @@
|
|
| 92 |
</div>
|
| 93 |
<div class="form-group">
|
| 94 |
<label for="cur_col">Current (A) Column</label>
|
| 95 |
-
<select id="cur_col" name="cur_col" class="engine-dropdown" required>
|
| 96 |
<option value="9">Col 9: Cycle 3 Current (A) [Raw]</option>
|
| 97 |
<option value="11">Col 11: Cycle 3 Current (A) [Adjusted]</option>
|
| 98 |
<option value="1">Col 1: Cycle 1 Current (A) [Raw]</option>
|
|
@@ -135,7 +135,7 @@
|
|
| 135 |
<input type="number" id="v_max" name="v_max" step="0.05" value="1.0" required>
|
| 136 |
</div>
|
| 137 |
<div class="form-group">
|
| 138 |
-
<label for="skip_factor" title="Downsample factor for faster
|
| 139 |
<input type="number" id="skip_factor" name="skip_factor" min="1" max="50" value="5" required>
|
| 140 |
</div>
|
| 141 |
<div class="form-group">
|
|
@@ -147,7 +147,7 @@
|
|
| 147 |
|
| 148 |
<!-- Advanced Optimization Settings -->
|
| 149 |
<div class="advanced-section">
|
| 150 |
-
<button type="button" class="advanced-toggle" id="advanced-toggle" aria-expanded="false">
|
| 151 |
<span>Advanced Solver Settings</span>
|
| 152 |
<span class="toggle-icon" id="toggle-icon">▼</span>
|
| 153 |
</button>
|
|
@@ -185,14 +185,14 @@
|
|
| 185 |
<label for="backend-url-input">Server API / WebSocket URL</label>
|
| 186 |
<div class="input-action-row">
|
| 187 |
<input type="text" id="backend-url-input" placeholder="Auto-detected origin or Hugging Face Space URL" style="flex: 1; padding: 8px 12px; border: 1px solid var(--color-border); border-radius: 6px; font-family: monospace; font-size: 0.85rem;">
|
| 188 |
-
<button type="button" id="backend-save-btn" class="btn-secondary" style="padding: 8px 16px;">Connect</button>
|
| 189 |
</div>
|
| 190 |
<div class="preset-links-row" style="margin-top: 6px; display: flex; gap: 8px; font-size: 0.8rem;">
|
| 191 |
-
<button type="button" class="btn-text-link" id="preset-origin-btn">⚡ Use Current Host</button>
|
| 192 |
<span>•</span>
|
| 193 |
-
<button type="button" class="btn-text-link" id="preset-hf-btn">☁️ Use HF Cloud Space</button>
|
| 194 |
<span>•</span>
|
| 195 |
-
<button type="button" class="btn-text-link" id="preset-local-btn">💻 Use Localhost</button>
|
| 196 |
</div>
|
| 197 |
</div>
|
| 198 |
</fieldset>
|
|
@@ -204,11 +204,11 @@
|
|
| 204 |
<legend>Solver Architecture</legend>
|
| 205 |
<div class="form-group">
|
| 206 |
<div class="engine-badge-row">
|
| 207 |
-
<span class="badge-tag-online">
|
| 208 |
</div>
|
| 209 |
<div class="engine-help-row" style="margin-top: 8px;">
|
| 210 |
<span class="engine-status-msg" id="engine-status-msg">Probing Python solver engine...</span>
|
| 211 |
-
<button type="button" class="btn-text-link" id="backend-help-link">Deployment & Setup Guide</button>
|
| 212 |
</div>
|
| 213 |
</div>
|
| 214 |
</fieldset>
|
|
@@ -243,8 +243,8 @@
|
|
| 243 |
<header class="panel-header results-header-row">
|
| 244 |
<h2>Extracted Physical Parameters</h2>
|
| 245 |
<div class="export-actions">
|
| 246 |
-
<button type="button" class="btn-export" id="export-json-btn">Export JSON</button>
|
| 247 |
-
<button type="button" class="btn-export" id="export-csv-btn">Export Curves CSV</button>
|
| 248 |
</div>
|
| 249 |
</header>
|
| 250 |
<div class="panel-body">
|
|
@@ -283,7 +283,7 @@
|
|
| 283 |
<div class="modal-content">
|
| 284 |
<div class="modal-header">
|
| 285 |
<h2 id="doc-title">Physical Model & Theory Documentation</h2>
|
| 286 |
-
<button type="button" class="modal-close" id="doc-close-btn" aria-label="Close modal">×</button>
|
| 287 |
</div>
|
| 288 |
<div class="modal-body">
|
| 289 |
<section class="doc-section">
|
|
@@ -329,7 +329,7 @@
|
|
| 329 |
</section>
|
| 330 |
</div>
|
| 331 |
<div class="modal-footer">
|
| 332 |
-
<button type="button" class="btn-primary modal-ok-btn" id="doc-ok-btn">Close Documentation</button>
|
| 333 |
</div>
|
| 334 |
</div>
|
| 335 |
</div>
|
|
@@ -338,17 +338,17 @@
|
|
| 338 |
<div class="modal-backdrop hidden" id="backend-modal" role="dialog" aria-modal="true" aria-labelledby="backend-modal-title">
|
| 339 |
<div class="modal-card">
|
| 340 |
<div class="modal-header">
|
| 341 |
-
<h2 id="backend-modal-title">⚡ 100% Free Python JAX
|
| 342 |
-
<button type="button" class="modal-close-btn" id="backend-close-btn" aria-label="Close modal">×</button>
|
| 343 |
</div>
|
| 344 |
<div class="modal-body">
|
| 345 |
<section class="doc-section">
|
| 346 |
-
<h3>Free Hugging Face Spaces Cloud Deployment ($0/month)</h3>
|
| 347 |
-
<p>To let any user run the JAX solver from their browser
|
| 348 |
<ol style="margin-left: 1.25rem; font-size: 0.9rem; line-height: 1.6;">
|
| 349 |
<li>Go to <a href="https://huggingface.co/new-space" target="_blank" style="color: var(--color-accent); text-decoration: underline;"><strong>huggingface.co/new-space</strong></a>.</li>
|
| 350 |
-
<li>Name your Space (e.g. <code>cv-curve-
|
| 351 |
-
<li>Choose <strong>Hardware:
|
| 352 |
<li>Push this repository to Hugging Face. Your web app will build and go live immediately!</li>
|
| 353 |
</ol>
|
| 354 |
</section>
|
|
@@ -363,7 +363,7 @@
|
|
| 363 |
</section>
|
| 364 |
</div>
|
| 365 |
<div class="modal-footer">
|
| 366 |
-
<button type="button" class="btn-primary modal-ok-btn" id="backend-ok-btn">Got It</button>
|
| 367 |
</div>
|
| 368 |
</div>
|
| 369 |
</div>
|
|
@@ -371,10 +371,12 @@
|
|
| 371 |
<!-- Footer -->
|
| 372 |
<footer class="site-footer">
|
| 373 |
<div class="footer-container">
|
| 374 |
-
<p>© 2026 CV Curve Fitting Pro • Physics-Based Electrochemical Optimizer • 100% Free
|
| 375 |
</div>
|
| 376 |
</footer>
|
| 377 |
|
|
|
|
|
|
|
| 378 |
<script src="app.js"></script>
|
| 379 |
</body>
|
| 380 |
-
</html>
|
|
|
|
| 14 |
<div class="nav-container">
|
| 15 |
<div class="nav-brand">
|
| 16 |
<span class="brand-title">⚡ CV Curve Fitting Pro</span>
|
| 17 |
+
<span class="brand-subtitle">JAX Diffusion & DOS Optimizer (Free ZeroGPU • NVIDIA A100)</span>
|
| 18 |
</div>
|
| 19 |
<div class="nav-links">
|
| 20 |
+
<div class="engine-badge-btn" id="engine-status-badge" onclick="window.toggleModal && window.toggleModal('backend-modal', true);" title="Click to view backend connection guide">
|
| 21 |
<span class="status-dot probing" id="engine-dot"></span>
|
| 22 |
<span class="engine-text" id="engine-label">Probing JAX Engine...</span>
|
| 23 |
</div>
|
| 24 |
<a href="#solver" id="nav-solver-btn" class="active">Solver</a>
|
| 25 |
+
<a href="#documentation" id="nav-doc-btn" onclick="window.toggleModal && window.toggleModal('doc-modal', true);">Documentation</a>
|
| 26 |
</div>
|
| 27 |
</div>
|
| 28 |
</nav>
|
|
|
|
| 37 |
<h2>Optimization Configuration</h2>
|
| 38 |
</header>
|
| 39 |
<div class="panel-body">
|
| 40 |
+
<form id="cv-form" onsubmit="window.handleFormSubmit && window.handleFormSubmit(event);">
|
| 41 |
<!-- File Upload & Drag-and-Drop Area -->
|
| 42 |
+
<div class="form-group file-upload-wrapper" id="drop-zone" onclick="document.getElementById('csv-file') && document.getElementById('csv-file').click();" ondragover="event.preventDefault(); event.stopPropagation(); this.classList.add('dragover');" ondragleave="event.preventDefault(); event.stopPropagation(); this.classList.remove('dragover');" ondrop="event.preventDefault(); event.stopPropagation(); this.classList.remove('dragover'); window.handleCSVDrop && window.handleCSVDrop(event);" style="cursor: pointer;">
|
| 43 |
+
<label style="pointer-events: none;">Upload Cyclic Voltammetry File (.csv)</label>
|
| 44 |
+
<div class="file-upload-custom" style="pointer-events: none;">
|
| 45 |
+
<span class="btn-secondary" id="choose-file-btn">📁 Choose CSV File</span>
|
| 46 |
<span class="drag-hint">or drag and drop file here</span>
|
| 47 |
</div>
|
| 48 |
+
<div class="file-name-row" style="pointer-events: none;">
|
| 49 |
<span id="file-name-display">No file chosen</span>
|
| 50 |
</div>
|
| 51 |
+
<input type="file" id="csv-file" name="file" accept=".csv,.txt" class="hidden-file-input" onchange="window.handleCSVFileChange && window.handleCSVFileChange(this);" onclick="event.stopPropagation();">
|
| 52 |
</div>
|
| 53 |
|
| 54 |
<!-- Data Mapping & Column Selector -->
|
|
|
|
| 57 |
<div class="cycle-preset-container" id="cycle-preset-container">
|
| 58 |
<div class="preset-row">
|
| 59 |
<span class="preset-cycle-tag">Cycle 1:</span>
|
| 60 |
+
<button type="button" class="preset-pill-btn" data-pot="0" data-cur="1" data-skip="5" onclick="window.applyCyclePreset && window.applyCyclePreset(0, 1, 5, this);">Raw (0, 1)</button>
|
| 61 |
+
<button type="button" class="preset-pill-btn" data-pot="2" data-cur="3" data-skip="1" onclick="window.applyCyclePreset && window.applyCyclePreset(2, 3, 1, this);">Adjusted (2, 3)</button>
|
| 62 |
</div>
|
| 63 |
<div class="preset-row">
|
| 64 |
<span class="preset-cycle-tag">Cycle 2:</span>
|
| 65 |
+
<button type="button" class="preset-pill-btn" data-pot="4" data-cur="5" data-skip="5" onclick="window.applyCyclePreset && window.applyCyclePreset(4, 5, 5, this);">Raw (4, 5)</button>
|
| 66 |
+
<button type="button" class="preset-pill-btn" data-pot="6" data-cur="7" data-skip="1" onclick="window.applyCyclePreset && window.applyCyclePreset(6, 7, 1, this);">Adjusted (6, 7)</button>
|
| 67 |
</div>
|
| 68 |
<div class="preset-row">
|
| 69 |
<span class="preset-cycle-tag">Cycle 3:</span>
|
| 70 |
+
<button type="button" class="preset-pill-btn active" data-pot="8" data-cur="9" data-skip="5" onclick="window.applyCyclePreset && window.applyCyclePreset(8, 9, 5, this);">Raw (8, 9)</button>
|
| 71 |
+
<button type="button" class="preset-pill-btn" data-pot="10" data-cur="11" data-skip="1" onclick="window.applyCyclePreset && window.applyCyclePreset(10, 11, 1, this);">Adjusted (10, 11)</button>
|
| 72 |
</div>
|
| 73 |
<div class="preset-row">
|
| 74 |
<span class="preset-cycle-tag">Cycle 4:</span>
|
| 75 |
+
<button type="button" class="preset-pill-btn" data-pot="12" data-cur="13" data-skip="5" onclick="window.applyCyclePreset && window.applyCyclePreset(12, 13, 5, this);">Raw (12, 13)</button>
|
| 76 |
+
<button type="button" class="preset-pill-btn" data-pot="14" data-cur="15" data-skip="1" onclick="window.applyCyclePreset && window.applyCyclePreset(14, 15, 1, this);">Adjusted (14, 15)</button>
|
| 77 |
</div>
|
| 78 |
</div>
|
| 79 |
<div class="input-grid">
|
| 80 |
<div class="form-group">
|
| 81 |
<label for="pot_col">Potential (V) Column</label>
|
| 82 |
+
<select id="pot_col" name="pot_col" class="engine-dropdown" onchange="window.updateLivePreviewFromColumns && window.updateLivePreviewFromColumns();" required>
|
| 83 |
<option value="8">Col 8: Cycle 3 Potential (V) [Raw]</option>
|
| 84 |
<option value="10">Col 10: Cycle 3 Potential (V) [Adjusted]</option>
|
| 85 |
<option value="0">Col 0: Cycle 1 Potential (V) [Raw]</option>
|
|
|
|
| 92 |
</div>
|
| 93 |
<div class="form-group">
|
| 94 |
<label for="cur_col">Current (A) Column</label>
|
| 95 |
+
<select id="cur_col" name="cur_col" class="engine-dropdown" onchange="window.updateLivePreviewFromColumns && window.updateLivePreviewFromColumns();" required>
|
| 96 |
<option value="9">Col 9: Cycle 3 Current (A) [Raw]</option>
|
| 97 |
<option value="11">Col 11: Cycle 3 Current (A) [Adjusted]</option>
|
| 98 |
<option value="1">Col 1: Cycle 1 Current (A) [Raw]</option>
|
|
|
|
| 135 |
<input type="number" id="v_max" name="v_max" step="0.05" value="1.0" required>
|
| 136 |
</div>
|
| 137 |
<div class="form-group">
|
| 138 |
+
<label for="skip_factor" title="Downsample factor for faster execution">Downsample Factor</label>
|
| 139 |
<input type="number" id="skip_factor" name="skip_factor" min="1" max="50" value="5" required>
|
| 140 |
</div>
|
| 141 |
<div class="form-group">
|
|
|
|
| 147 |
|
| 148 |
<!-- Advanced Optimization Settings -->
|
| 149 |
<div class="advanced-section">
|
| 150 |
+
<button type="button" class="advanced-toggle" id="advanced-toggle" onclick="window.toggleAdvanced && window.toggleAdvanced();" aria-expanded="false">
|
| 151 |
<span>Advanced Solver Settings</span>
|
| 152 |
<span class="toggle-icon" id="toggle-icon">▼</span>
|
| 153 |
</button>
|
|
|
|
| 185 |
<label for="backend-url-input">Server API / WebSocket URL</label>
|
| 186 |
<div class="input-action-row">
|
| 187 |
<input type="text" id="backend-url-input" placeholder="Auto-detected origin or Hugging Face Space URL" style="flex: 1; padding: 8px 12px; border: 1px solid var(--color-border); border-radius: 6px; font-family: monospace; font-size: 0.85rem;">
|
| 188 |
+
<button type="button" id="backend-save-btn" onclick="window.saveBackendUrl && window.saveBackendUrl();" class="btn-secondary" style="padding: 8px 16px;">Connect</button>
|
| 189 |
</div>
|
| 190 |
<div class="preset-links-row" style="margin-top: 6px; display: flex; gap: 8px; font-size: 0.8rem;">
|
| 191 |
+
<button type="button" class="btn-text-link" id="preset-origin-btn" onclick="window.setBackendPreset && window.setBackendPreset('origin');">⚡ Use Current Host</button>
|
| 192 |
<span>•</span>
|
| 193 |
+
<button type="button" class="btn-text-link" id="preset-hf-btn" onclick="window.setBackendPreset && window.setBackendPreset('hf');">☁️ Use HF Cloud Space</button>
|
| 194 |
<span>•</span>
|
| 195 |
+
<button type="button" class="btn-text-link" id="preset-local-btn" onclick="window.setBackendPreset && window.setBackendPreset('local');">💻 Use Localhost</button>
|
| 196 |
</div>
|
| 197 |
</div>
|
| 198 |
</fieldset>
|
|
|
|
| 204 |
<legend>Solver Architecture</legend>
|
| 205 |
<div class="form-group">
|
| 206 |
<div class="engine-badge-row">
|
| 207 |
+
<span class="badge-tag-online">⚡ 100% Free Python JAX Engine (ZeroGPU • NVIDIA A100)</span>
|
| 208 |
</div>
|
| 209 |
<div class="engine-help-row" style="margin-top: 8px;">
|
| 210 |
<span class="engine-status-msg" id="engine-status-msg">Probing Python solver engine...</span>
|
| 211 |
+
<button type="button" class="btn-text-link" id="backend-help-link" onclick="window.toggleModal && window.toggleModal('backend-modal', true);">Deployment & Setup Guide</button>
|
| 212 |
</div>
|
| 213 |
</div>
|
| 214 |
</fieldset>
|
|
|
|
| 243 |
<header class="panel-header results-header-row">
|
| 244 |
<h2>Extracted Physical Parameters</h2>
|
| 245 |
<div class="export-actions">
|
| 246 |
+
<button type="button" class="btn-export" id="export-json-btn" onclick="window.exportResultsJson && window.exportResultsJson();">Export JSON</button>
|
| 247 |
+
<button type="button" class="btn-export" id="export-csv-btn" onclick="window.exportResultsCsv && window.exportResultsCsv();">Export Curves CSV</button>
|
| 248 |
</div>
|
| 249 |
</header>
|
| 250 |
<div class="panel-body">
|
|
|
|
| 283 |
<div class="modal-content">
|
| 284 |
<div class="modal-header">
|
| 285 |
<h2 id="doc-title">Physical Model & Theory Documentation</h2>
|
| 286 |
+
<button type="button" class="modal-close" id="doc-close-btn" onclick="window.toggleModal && window.toggleModal('doc-modal', false);" aria-label="Close modal">×</button>
|
| 287 |
</div>
|
| 288 |
<div class="modal-body">
|
| 289 |
<section class="doc-section">
|
|
|
|
| 329 |
</section>
|
| 330 |
</div>
|
| 331 |
<div class="modal-footer">
|
| 332 |
+
<button type="button" class="btn-primary modal-ok-btn" id="doc-ok-btn" onclick="window.toggleModal && window.toggleModal('doc-modal', false);">Close Documentation</button>
|
| 333 |
</div>
|
| 334 |
</div>
|
| 335 |
</div>
|
|
|
|
| 338 |
<div class="modal-backdrop hidden" id="backend-modal" role="dialog" aria-modal="true" aria-labelledby="backend-modal-title">
|
| 339 |
<div class="modal-card">
|
| 340 |
<div class="modal-header">
|
| 341 |
+
<h2 id="backend-modal-title">⚡ 100% Free Python JAX ZeroGPU Guide</h2>
|
| 342 |
+
<button type="button" class="modal-close-btn" id="backend-close-btn" onclick="window.toggleModal && window.toggleModal('backend-modal', false);" aria-label="Close modal">×</button>
|
| 343 |
</div>
|
| 344 |
<div class="modal-body">
|
| 345 |
<section class="doc-section">
|
| 346 |
+
<h3>Free Hugging Face Spaces Cloud Deployment (ZeroGPU - $0/month)</h3>
|
| 347 |
+
<p>To let any user run the JAX solver from their browser with 100% free NVIDIA A100/H100 acceleration:</p>
|
| 348 |
<ol style="margin-left: 1.25rem; font-size: 0.9rem; line-height: 1.6;">
|
| 349 |
<li>Go to <a href="https://huggingface.co/new-space" target="_blank" style="color: var(--color-accent); text-decoration: underline;"><strong>huggingface.co/new-space</strong></a>.</li>
|
| 350 |
+
<li>Name your Space (e.g. <code>cv-curve-fitting</code>) and choose <strong>Space SDK: Gradio</strong>.</li>
|
| 351 |
+
<li>Choose <strong>Hardware: ZeroGPU (NVIDIA A100 • 100% Free)</strong>.</li>
|
| 352 |
<li>Push this repository to Hugging Face. Your web app will build and go live immediately!</li>
|
| 353 |
</ol>
|
| 354 |
</section>
|
|
|
|
| 363 |
</section>
|
| 364 |
</div>
|
| 365 |
<div class="modal-footer">
|
| 366 |
+
<button type="button" class="btn-primary modal-ok-btn" id="backend-ok-btn" onclick="window.toggleModal && window.toggleModal('backend-modal', false);">Got It</button>
|
| 367 |
</div>
|
| 368 |
</div>
|
| 369 |
</div>
|
|
|
|
| 371 |
<!-- Footer -->
|
| 372 |
<footer class="site-footer">
|
| 373 |
<div class="footer-container">
|
| 374 |
+
<p>© 2026 CV Curve Fitting Pro • Physics-Based Electrochemical Optimizer • 100% Free ZeroGPU Engine</p>
|
| 375 |
</div>
|
| 376 |
</footer>
|
| 377 |
|
| 378 |
+
<!-- Bootstrap Trigger to ensure JS runs regardless of iframe or innerHTML injection -->
|
| 379 |
+
<img src="data:image/svg+xml;utf8,<svg/>" style="display:none" onload="window.__initCVApp && window.__initCVApp();" onerror="window.__initCVApp && window.__initCVApp();" />
|
| 380 |
<script src="app.js"></script>
|
| 381 |
</body>
|
| 382 |
+
</html>
|