2026-05-18-19-31-18 增加原始视频查看入口

This commit is contained in:
2026-05-18 19:33:14 +08:00
parent e5f0b1dca9
commit c62f6e3401
7 changed files with 168 additions and 1 deletions

View File

@@ -27,6 +27,12 @@ const resultCount = document.querySelector("#resultCount");
const jobMeta = document.querySelector("#jobMeta");
const detailDialog = document.querySelector("#detailDialog");
const closeDialog = document.querySelector("#closeDialog");
const openSourceButton = document.querySelector("#openSourceButton");
const sourceDialog = document.querySelector("#sourceDialog");
const closeSourceDialog = document.querySelector("#closeSourceDialog");
const sourceTitle = document.querySelector("#sourceTitle");
const sourceVideo = document.querySelector("#sourceVideo");
const sourceImage = document.querySelector("#sourceImage");
const methodLabels = new Map();
const methodDescriptions = new Map();
@@ -68,12 +74,17 @@ function renderPreview(file) {
previewEmpty.hidden = true;
videoPreview.hidden = true;
imagePreview.hidden = true;
openSourceButton.hidden = false;
if (file.type.startsWith("video/")) {
videoPreview.src = currentObjectUrl;
videoPreview.hidden = false;
openSourceButton.textContent = "查看原始视频";
sourceTitle.textContent = "原始视频";
} else {
imagePreview.src = currentObjectUrl;
imagePreview.hidden = false;
openSourceButton.textContent = "查看原始图像";
sourceTitle.textContent = "原始图像";
}
jobMeta.textContent = `已选择 ${file.name}`;
}
@@ -213,6 +224,12 @@ function clearAll() {
imagePreview.removeAttribute("src");
videoPreview.hidden = true;
imagePreview.hidden = true;
sourceVideo.hidden = true;
sourceImage.hidden = true;
sourceVideo.removeAttribute("src");
sourceImage.removeAttribute("src");
openSourceButton.hidden = true;
if (sourceDialog.open) sourceDialog.close();
previewEmpty.hidden = false;
resultGrid.innerHTML = "";
emptyState.hidden = false;
@@ -253,6 +270,20 @@ dropZone.addEventListener("drop", (event) => {
sampleButton.addEventListener("click", loadSample);
clearButton.addEventListener("click", clearAll);
closeDialog.addEventListener("click", () => detailDialog.close());
closeSourceDialog.addEventListener("click", () => sourceDialog.close());
openSourceButton.addEventListener("click", () => {
if (!selectedFile || !currentObjectUrl) return;
sourceVideo.hidden = true;
sourceImage.hidden = true;
if (selectedFile.type.startsWith("video/")) {
sourceVideo.src = currentObjectUrl;
sourceVideo.hidden = false;
} else {
sourceImage.src = currentObjectUrl;
sourceImage.hidden = false;
}
sourceDialog.showModal();
});
form.addEventListener("submit", async (event) => {
event.preventDefault();

View File

@@ -85,7 +85,10 @@
<p class="eyebrow">Live Workspace</p>
<h2>预览与结果</h2>
</div>
<div class="job-meta" id="jobMeta">等待输入</div>
<div class="viewer-actions">
<button class="ghost media-button" id="openSourceButton" type="button" hidden>查看原始视频</button>
<div class="job-meta" id="jobMeta">等待输入</div>
</div>
</div>
<div class="preview-stage" id="previewStage">
@@ -144,6 +147,20 @@
<dl class="detail-metrics" id="detailMetrics"></dl>
</dialog>
<dialog class="detail-dialog source-dialog" id="sourceDialog">
<div class="dialog-head">
<div>
<p class="eyebrow">Source Media</p>
<h2 id="sourceTitle">原始视频</h2>
</div>
<button class="icon-button" id="closeSourceDialog" type="button" aria-label="关闭原始媒体">×</button>
</div>
<div class="source-stage">
<video id="sourceVideo" controls hidden></video>
<img id="sourceImage" alt="原始输入图像" hidden />
</div>
</dialog>
<template id="resultCardTemplate">
<article class="result-card" tabindex="0">
<div class="card-top">

View File

@@ -367,6 +367,20 @@ input[type="range"] {
margin-bottom: 14px;
}
.viewer-actions {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 10px;
flex-wrap: wrap;
}
.media-button {
min-height: 38px;
padding: 0 12px;
color: var(--accent);
}
.job-meta {
color: var(--muted);
font-size: 13px;
@@ -603,6 +617,26 @@ dd {
aspect-ratio: 4 / 3;
}
.source-dialog {
width: min(1180px, calc(100vw - 36px));
}
.source-stage {
display: grid;
place-items: center;
min-height: 520px;
background: #050605;
}
#sourceVideo,
#sourceImage {
display: block;
width: 100%;
max-height: min(72vh, 720px);
object-fit: contain;
background: #050605;
}
@media (max-width: 980px) {
.app-shell {
width: min(100vw - 20px, 760px);
@@ -626,6 +660,10 @@ dd {
flex-wrap: wrap;
}
.viewer-actions {
justify-content: flex-start;
}
.summary-strip,
.detail-images {
grid-template-columns: 1fr;