261 lines
6.4 KiB
HTML
261 lines
6.4 KiB
HTML
<!doctype html>
|
||
<html lang="de">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
<title>AZA – Browser MVP</title>
|
||
<style>
|
||
:root {
|
||
--bg: #f6f7fb;
|
||
--card: #ffffff;
|
||
--text: #1f2937;
|
||
--muted: #6b7280;
|
||
--border: #d1d5db;
|
||
--accent: #2563eb;
|
||
--accent-hover: #1d4ed8;
|
||
--danger-bg: #fef2f2;
|
||
--danger-text: #991b1b;
|
||
--ok-bg: #ecfdf5;
|
||
--ok-text: #065f46;
|
||
}
|
||
|
||
* { box-sizing: border-box; }
|
||
|
||
body {
|
||
margin: 0;
|
||
font-family: Arial, Helvetica, sans-serif;
|
||
background: var(--bg);
|
||
color: var(--text);
|
||
line-height: 1.45;
|
||
}
|
||
|
||
.page {
|
||
max-width: 920px;
|
||
margin: 0 auto;
|
||
padding: 32px 20px 48px;
|
||
}
|
||
|
||
.hero {
|
||
margin-bottom: 24px;
|
||
}
|
||
|
||
.hero h1 {
|
||
margin: 0 0 8px;
|
||
font-size: 32px;
|
||
}
|
||
|
||
.hero p {
|
||
margin: 0;
|
||
color: var(--muted);
|
||
font-size: 16px;
|
||
}
|
||
|
||
.card {
|
||
background: var(--card);
|
||
border: 1px solid var(--border);
|
||
border-radius: 14px;
|
||
padding: 20px;
|
||
margin-bottom: 18px;
|
||
}
|
||
|
||
.section-title {
|
||
margin: 0 0 14px;
|
||
font-size: 18px;
|
||
}
|
||
|
||
.field {
|
||
margin-bottom: 16px;
|
||
}
|
||
|
||
.field label {
|
||
display: block;
|
||
font-weight: 700;
|
||
margin-bottom: 8px;
|
||
}
|
||
|
||
.field select,
|
||
.field input[type="file"],
|
||
.result-box {
|
||
width: 100%;
|
||
border: 1px solid var(--border);
|
||
border-radius: 10px;
|
||
padding: 12px;
|
||
font-size: 15px;
|
||
background: #fff;
|
||
}
|
||
|
||
.result-box {
|
||
min-height: 220px;
|
||
white-space: pre-wrap;
|
||
}
|
||
|
||
.actions {
|
||
display: flex;
|
||
gap: 12px;
|
||
flex-wrap: wrap;
|
||
}
|
||
|
||
button {
|
||
border: 0;
|
||
border-radius: 10px;
|
||
padding: 12px 18px;
|
||
font-size: 15px;
|
||
font-weight: 700;
|
||
cursor: pointer;
|
||
}
|
||
|
||
.primary {
|
||
background: var(--accent);
|
||
color: #fff;
|
||
}
|
||
|
||
.primary:hover {
|
||
background: var(--accent-hover);
|
||
}
|
||
|
||
.secondary {
|
||
background: #eef2ff;
|
||
color: #1e3a8a;
|
||
}
|
||
|
||
.status {
|
||
border-radius: 10px;
|
||
padding: 12px 14px;
|
||
font-size: 14px;
|
||
margin-bottom: 16px;
|
||
display: none;
|
||
}
|
||
|
||
.status.error {
|
||
display: block;
|
||
background: var(--danger-bg);
|
||
color: var(--danger-text);
|
||
}
|
||
|
||
.status.success {
|
||
display: block;
|
||
background: var(--ok-bg);
|
||
color: var(--ok-text);
|
||
}
|
||
|
||
.footer-links {
|
||
display: flex;
|
||
gap: 18px;
|
||
flex-wrap: wrap;
|
||
margin-top: 8px;
|
||
}
|
||
|
||
.footer-links a {
|
||
color: var(--accent);
|
||
text-decoration: none;
|
||
font-weight: 700;
|
||
}
|
||
|
||
.hint {
|
||
color: var(--muted);
|
||
font-size: 14px;
|
||
margin-top: 8px;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<main class="page">
|
||
<section class="hero">
|
||
<h1>AZA</h1>
|
||
<p>Browser-MVP für medizinische Transkription.</p>
|
||
</section>
|
||
|
||
<section class="card">
|
||
<h2 class="section-title">Eingabe</h2>
|
||
|
||
<div class="field">
|
||
<label for="specialty">Fachrichtung</label>
|
||
<select id="specialty" name="specialty">
|
||
<option value="">Bitte wählen</option>
|
||
<option value="allgemeinmedizin">Allgemeinmedizin</option>
|
||
<option value="innere-medizin">Innere Medizin</option>
|
||
<option value="dermatologie">Dermatologie</option>
|
||
<option value="kardiologie">Kardiologie</option>
|
||
<option value="orthopaedie">Orthopädie</option>
|
||
<option value="psychiatrie">Psychiatrie</option>
|
||
<option value="radiologie">Radiologie</option>
|
||
<option value="chirurgie">Chirurgie</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="field">
|
||
<label for="audioFile">Audio-Datei</label>
|
||
<input id="audioFile" name="audioFile" type="file" accept=".m4a,.wav,.mp3,audio/*" />
|
||
<div class="hint">MVP-Web-Shell: Dateiauswahl ist vorbereitet, Backend-Verdrahtung folgt im nächsten Slice.</div>
|
||
</div>
|
||
|
||
<div id="statusBox" class="status success">Bereit für Upload.</div>
|
||
|
||
<div class="actions">
|
||
<button id="uploadButton" class="primary" type="button">Upload starten</button>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="card">
|
||
<h2 class="section-title">Ergebnis</h2>
|
||
<div id="resultBox" class="result-box">Hier erscheint das Transkript.</div>
|
||
<div class="actions" style="margin-top: 14px;">
|
||
<button id="copyButton" class="secondary" type="button">Transkript kopieren</button>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="card">
|
||
<h2 class="section-title">Support & Rechtliches</h2>
|
||
<div class="footer-links">
|
||
<a href="/support">Support</a>
|
||
<a href="/privacy">Privacy</a>
|
||
<a href="/terms">Terms</a>
|
||
</div>
|
||
</section>
|
||
</main>
|
||
|
||
<script>
|
||
(function () {
|
||
const statusBox = document.getElementById("statusBox");
|
||
const resultBox = document.getElementById("resultBox");
|
||
const copyButton = document.getElementById("copyButton");
|
||
const uploadButton = document.getElementById("uploadButton");
|
||
const specialty = document.getElementById("specialty");
|
||
const audioFile = document.getElementById("audioFile");
|
||
|
||
function setStatus(message, kind) {
|
||
statusBox.textContent = message;
|
||
statusBox.className = "status " + kind;
|
||
}
|
||
|
||
uploadButton.addEventListener("click", function () {
|
||
if (!specialty.value) {
|
||
setStatus("Bitte zuerst eine Fachrichtung wählen.", "error");
|
||
return;
|
||
}
|
||
|
||
if (!audioFile.files || audioFile.files.length === 0) {
|
||
setStatus("Bitte zuerst eine Audio-Datei auswählen.", "error");
|
||
return;
|
||
}
|
||
|
||
setStatus("Upload-Flow ist als nächster Slice vorgesehen. Diese Seite ist die erste MVP-Web-Shell.", "success");
|
||
resultBox.textContent =
|
||
"Ausgewählte Fachrichtung: " + specialty.value + "\n" +
|
||
"Ausgewählte Datei: " + audioFile.files[0].name + "\n\n" +
|
||
"Backend-Anbindung an /v1/transcribe folgt im nächsten Patch.";
|
||
});
|
||
|
||
copyButton.addEventListener("click", async function () {
|
||
try {
|
||
await navigator.clipboard.writeText(resultBox.textContent);
|
||
setStatus("Transkripttext wurde in die Zwischenablage kopiert.", "success");
|
||
} catch (error) {
|
||
setStatus("Kopieren war nicht möglich.", "error");
|
||
}
|
||
});
|
||
})();
|
||
</script>
|
||
</body>
|
||
</html>
|