-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
114 lines (109 loc) · 7.58 KB
/
Copy pathindex.html
File metadata and controls
114 lines (109 loc) · 7.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AnemiaGuard — Image Standardization Pipeline</title>
<meta name="description" content="Illumination-invariant image standardization for non-invasive anemia detection." />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="/src/styles/main.css" />
</head>
<body>
<header id="app-header">
<div class="header-left">
<div class="logo-icon">
<svg viewBox="0 0 32 32" fill="none"><circle cx="16" cy="16" r="14" stroke="url(#g1)" stroke-width="2.5"/><path d="M16 6C16 6 10 12 10 17C10 20.3 12.7 23 16 23C19.3 23 22 20.3 22 17C22 12 16 6 16 6Z" fill="url(#g2)"/><defs><linearGradient id="g1" x1="0" y1="0" x2="32" y2="32"><stop stop-color="#00d4aa"/><stop offset="1" stop-color="#7c4dff"/></linearGradient><linearGradient id="g2" x1="12" y1="6" x2="20" y2="23"><stop stop-color="#ff5252"/><stop offset="1" stop-color="#ff8a80"/></linearGradient></defs></svg>
</div>
<div class="logo-text"><h1>AnemiaGuard</h1><span class="tagline">Image Standardization Pipeline</span></div>
</div>
<div class="header-right">
<div class="status-badge" id="app-status"><span class="status-dot"></span><span class="status-text">Ready</span></div>
</div>
</header>
<main id="app-main">
<section id="input-section" class="panel">
<div class="panel-header"><h2><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21,15 16,10 5,21"/></svg> Image Input</h2></div>
<div class="mode-selector" id="mode-selector">
<button class="mode-btn active" id="btn-upload" data-mode="upload"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17,8 12,3 7,8"/><line x1="12" y1="3" x2="12" y2="15"/></svg><span>Upload File</span></button>
<button class="mode-btn" id="btn-camera" data-mode="camera"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/><circle cx="12" cy="13" r="4"/></svg><span>Camera</span></button>
</div>
<div class="input-area" id="upload-area">
<div class="dropzone" id="dropzone">
<div class="dropzone-content">
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" opacity="0.5"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17,8 12,3 7,8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>
<p class="dropzone-title">Drop your image here</p>
<p class="dropzone-sub">or click to browse • JPG, PNG accepted</p>
</div>
<input type="file" id="file-input" accept="image/jpeg,image/png,image/jpg" hidden />
</div>
</div>
<div class="input-area hidden" id="camera-area">
<div class="camera-container">
<video id="camera-video" autoplay playsinline></video>
<div class="camera-overlay"><div class="camera-guide"></div></div>
<div class="camera-controls">
<button class="camera-flip-btn" id="camera-flip" title="Switch camera"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="1,4 1,10 7,10"/><polyline points="23,20 23,14 17,14"/><path d="M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15"/></svg></button>
<button class="camera-capture-btn" id="camera-capture" title="Capture"><div class="capture-ring"><div class="capture-dot"></div></div></button>
<button class="camera-stop-btn" id="camera-stop" title="Stop"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="6" y="6" width="12" height="12" rx="1"/></svg></button>
</div>
</div>
</div>
<div class="image-preview hidden" id="image-preview">
<div class="preview-container"><canvas id="preview-canvas"></canvas><button class="preview-remove" id="preview-remove" title="Remove">✕</button></div>
<div class="preview-info" id="preview-info"></div>
</div>
<div class="metadata-panel hidden" id="metadata-panel">
<h3>📋 Metadata</h3>
<div class="metadata-grid" id="metadata-grid"></div>
</div>
<button class="process-btn hidden" id="process-btn"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="5,3 19,12 5,21 5,3"/></svg><span>Run Standardization Pipeline</span></button>
</section>
<section id="pipeline-section" class="panel hidden">
<div class="panel-header"><h2>⚡ Processing Pipeline</h2><span class="pipeline-timer" id="pipeline-timer">0.00s</span></div>
<div class="pipeline-steps" id="pipeline-steps"></div>
</section>
<section id="results-section" class="panel hidden">
<div class="panel-header"><h2>✅ Results</h2></div>
<div class="confidence-container" id="confidence-container">
<div class="confidence-gauge" id="confidence-gauge">
<svg viewBox="0 0 120 120"><circle class="gauge-bg" cx="60" cy="60" r="52"/><circle class="gauge-fill" id="gauge-fill" cx="60" cy="60" r="52"/></svg>
<div class="gauge-value" id="gauge-value">--</div>
<div class="gauge-label">Confidence</div>
</div>
</div>
<div class="comparison-container" id="comparison-container">
<div class="comparison-slider" id="comparison-slider">
<canvas id="before-canvas" class="comparison-canvas"></canvas>
<canvas id="after-canvas" class="comparison-canvas"></canvas>
<div class="slider-handle" id="slider-handle"><div class="slider-line"></div><div class="slider-grip">◀▶</div></div>
<span class="comparison-label label-before">Before</span>
<span class="comparison-label label-after">After</span>
</div>
</div>
<div class="histograms-container" id="histograms-container">
<div class="histogram-card"><h4>Input Histogram</h4><canvas id="hist-before" width="300" height="150"></canvas></div>
<div class="histogram-card"><h4>Output Histogram</h4><canvas id="hist-after" width="300" height="150"></canvas></div>
</div>
<div class="diagnostics-panel" id="diagnostics-panel">
<h3>ℹ️ Diagnostics</h3>
<div class="diagnostics-grid" id="diagnostics-grid"></div>
</div>
<div class="actions-bar">
<button class="download-btn" id="download-btn"><span>⬇ Download Standardized Image</span></button>
<button class="reset-btn" id="reset-btn"><span>🔄 New Image</span></button>
</div>
</section>
<div class="error-overlay hidden" id="error-overlay">
<div class="error-card">
<div class="error-icon">⚠️</div>
<h3 id="error-title">Unrecoverable Image</h3>
<p id="error-message">The image cannot be standardized.</p>
<button class="error-dismiss" id="error-dismiss">Try Another Image</button>
</div>
</div>
</main>
<script type="module" src="/src/main.js"></script>
</body>
</html>