Spaces:
Running on Zero
Running on Zero
ref-audio player
Browse files- index.html +23 -3
index.html
CHANGED
|
@@ -369,7 +369,17 @@
|
|
| 369 |
transition: all 0.15s;
|
| 370 |
}
|
| 371 |
.file-drop:hover, .file-drop.drag { border-color: var(--accent); color: var(--accent-text); background: var(--accent-soft); }
|
| 372 |
-
.file-name { font-size: 11px; color: var(--accent-text); margin-top: 4px; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 373 |
|
| 374 |
/* Reference uploader tabs */
|
| 375 |
.ref-tabs {
|
|
@@ -775,6 +785,7 @@
|
|
| 775 |
</div>
|
| 776 |
</div>
|
| 777 |
<div class="file-name" id="file-name"></div>
|
|
|
|
| 778 |
</div>
|
| 779 |
|
| 780 |
<div class="advanced" id="advanced">
|
|
@@ -808,7 +819,7 @@ const els = {
|
|
| 808 |
advancedToggle: $("advanced-toggle"), advanced: $("advanced"),
|
| 809 |
advancedSummary: $("advanced-summary"),
|
| 810 |
refSection: $("ref-section"),
|
| 811 |
-
drop: $("drop"), fileInput: $("file-input"), fileName: $("file-name"),
|
| 812 |
micBtn: $("mic-btn"), micIcon: $("mic-icon"), micState: $("mic-state"), micTime: $("mic-time"),
|
| 813 |
sliders: $("sliders"),
|
| 814 |
examples: $("examples"),
|
|
@@ -890,7 +901,16 @@ els.fileInput.addEventListener("change", (e) => { const f = e.target.files[0]; i
|
|
| 890 |
["dragenter", "dragover"].forEach(ev => els.drop.addEventListener(ev, (e) => { e.preventDefault(); els.drop.classList.add("drag"); }));
|
| 891 |
["dragleave", "drop"].forEach(ev => els.drop.addEventListener(ev, (e) => { e.preventDefault(); els.drop.classList.remove("drag"); }));
|
| 892 |
els.drop.addEventListener("drop", (e) => { const f = e.dataTransfer.files[0]; if (f) setRefFile(f); });
|
| 893 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 894 |
|
| 895 |
// ---------- Microphone recording (MediaRecorder API) ----------
|
| 896 |
let mediaRecorder = null;
|
|
|
|
| 369 |
transition: all 0.15s;
|
| 370 |
}
|
| 371 |
.file-drop:hover, .file-drop.drag { border-color: var(--accent); color: var(--accent-text); background: var(--accent-soft); }
|
| 372 |
+
.file-name { font-size: 11px; color: var(--accent-text); margin-top: 4px; grid-column: 1 / -1; }
|
| 373 |
+
|
| 374 |
+
/* Reference preview player: small embedded audio to hear the recorded /
|
| 375 |
+
uploaded clip before rendering. Spans the full ref panel width. */
|
| 376 |
+
.ref-preview {
|
| 377 |
+
grid-column: 1 / -1;
|
| 378 |
+
width: 100%;
|
| 379 |
+
height: 34px;
|
| 380 |
+
margin-top: 6px;
|
| 381 |
+
}
|
| 382 |
+
.ref-preview.hidden { display: none; }
|
| 383 |
|
| 384 |
/* Reference uploader tabs */
|
| 385 |
.ref-tabs {
|
|
|
|
| 785 |
</div>
|
| 786 |
</div>
|
| 787 |
<div class="file-name" id="file-name"></div>
|
| 788 |
+
<audio class="ref-preview hidden" id="ref-preview" controls preload="metadata"></audio>
|
| 789 |
</div>
|
| 790 |
|
| 791 |
<div class="advanced" id="advanced">
|
|
|
|
| 819 |
advancedToggle: $("advanced-toggle"), advanced: $("advanced"),
|
| 820 |
advancedSummary: $("advanced-summary"),
|
| 821 |
refSection: $("ref-section"),
|
| 822 |
+
drop: $("drop"), fileInput: $("file-input"), fileName: $("file-name"), refPreview: $("ref-preview"),
|
| 823 |
micBtn: $("mic-btn"), micIcon: $("mic-icon"), micState: $("mic-state"), micTime: $("mic-time"),
|
| 824 |
sliders: $("sliders"),
|
| 825 |
examples: $("examples"),
|
|
|
|
| 901 |
["dragenter", "dragover"].forEach(ev => els.drop.addEventListener(ev, (e) => { e.preventDefault(); els.drop.classList.add("drag"); }));
|
| 902 |
["dragleave", "drop"].forEach(ev => els.drop.addEventListener(ev, (e) => { e.preventDefault(); els.drop.classList.remove("drag"); }));
|
| 903 |
els.drop.addEventListener("drop", (e) => { const f = e.dataTransfer.files[0]; if (f) setRefFile(f); });
|
| 904 |
+
let refPreviewUrl = null;
|
| 905 |
+
const setRefFile = (f) => {
|
| 906 |
+
refFile = f;
|
| 907 |
+
els.fileName.textContent = `✓ ${f.name}`;
|
| 908 |
+
// Let the user hear the clip they just recorded / uploaded before rendering.
|
| 909 |
+
if (refPreviewUrl) URL.revokeObjectURL(refPreviewUrl);
|
| 910 |
+
refPreviewUrl = URL.createObjectURL(f);
|
| 911 |
+
els.refPreview.src = refPreviewUrl;
|
| 912 |
+
els.refPreview.classList.remove("hidden");
|
| 913 |
+
};
|
| 914 |
|
| 915 |
// ---------- Microphone recording (MediaRecorder API) ----------
|
| 916 |
let mediaRecorder = null;
|