diff --git a/src/admin.css b/src/admin.css
index 79154a9..7db73fb 100644
--- a/src/admin.css
+++ b/src/admin.css
@@ -875,6 +875,18 @@ body {
.form-image-toolbar.has-impact-picker {
grid-template-columns: minmax(220px, 340px) minmax(0, 1fr);
}
+.form-image-toolbar.has-impact-picker.has-impact-actions {
+ grid-template-columns: minmax(260px, 420px) minmax(0, 1fr);
+}
+.asset-impact-picker {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ min-width: 0;
+}
+.asset-impact-picker .asset-impact-select {
+ flex: 1 1 0;
+}
.form-image-toolbar > * {
min-width: 0;
}
@@ -904,7 +916,8 @@ body {
white-space: nowrap;
}
@container (max-width: 1200px) {
- .form-image-toolbar.has-impact-picker {
+ .form-image-toolbar.has-impact-picker,
+ .form-image-toolbar.has-impact-picker.has-impact-actions {
grid-template-columns: minmax(0, 1fr);
}
}
@@ -1482,8 +1495,12 @@ body {
}
/* 镜头影响和素材定位使用固定底色;高亮只表示当前定位,不代表素材失效。 */
.asset-impact-context {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
padding: 14px 16px;
background: var(--app-subtle);
+ margin-bottom: 12px;
}
.asset-impact-select {
min-width: 0;
diff --git a/src/components/ui/flatTheme.test.ts b/src/components/ui/flatTheme.test.ts
index 0ef00c0..0858b47 100644
--- a/src/components/ui/flatTheme.test.ts
+++ b/src/components/ui/flatTheme.test.ts
@@ -152,8 +152,10 @@ describe('全站平面主题', () => {
/\.form-image-toolbar\.has-impact-picker\s*\{[^}]*grid-template-columns:\s*minmax\(220px, 340px\) minmax\(0, 1fr\);/
)
expect(css).toMatch(
- /@container \(max-width: 1200px\)\s*\{\s*\.form-image-toolbar\.has-impact-picker\s*\{[^}]*grid-template-columns:\s*minmax\(0, 1fr\);/
+ /@container \(max-width: 1200px\)\s*\{\s*\.form-image-toolbar\.has-impact-picker,\s*\.form-image-toolbar\.has-impact-picker\.has-impact-actions\s*\{[^}]*grid-template-columns:\s*minmax\(0, 1fr\);/
)
+ expect(css).toMatch(/\.asset-impact-picker\s*\{[^}]*align-items:\s*center;[^}]*gap:\s*8px;/)
+ expect(css).toMatch(/\.asset-impact-context\s*\{[^}]*gap:\s*10px;[^}]*margin-bottom:\s*12px;/)
})
it('单图标按钮以当前控件高度为边长,尺寸与内容按钮互不影响', () => {
diff --git a/src/features/subject-images/SubjectImagesPage.vue b/src/features/subject-images/SubjectImagesPage.vue
index 70a3d8e..d81cb17 100644
--- a/src/features/subject-images/SubjectImagesPage.vue
+++ b/src/features/subject-images/SubjectImagesPage.vue
@@ -6,7 +6,7 @@ import WorkspaceTools from '../../components/ui/WorkspaceTools.vue'
import { NAlert, NButton, NCheckbox, NCollapse, NCollapseItem, NInput, NInputNumber, NSelect, NTag } from 'naive-ui'
import { computed, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
-import { Search, RefreshCw, Download, ImagePlus, ArrowRight, AlertTriangle } from '@lucide/vue'
+import { Search, RefreshCw, Download, ImagePlus, ArrowLeft, ArrowRight, LayoutGrid, AlertTriangle } from '@lucide/vue'
import { AssetImage, EmptyState, StatusBadge } from '../../components/ui'
import { downloadText } from '../../lib/format'
import ConfirmAction from '../workflows/ConfirmAction.vue'
@@ -51,6 +51,35 @@ const targetForm = computed(() => forms.value.find(form => form.id === targetFor
const impact = useKeyframeImpact(id, sourceShotId)
const sourceShot = impact.source
const linkedReferences = computed(() => referenceTargets(impact.references.data.value, []))
+/** 定位说明仅在有实际状态、引用或错误时出现,避免两项导航操作单独撑起空白横条。 */
+const sourceMissing = computed(
+ () => sourceShotId.value && !sourceShot.value && !impact.query.loading.value && !impact.query.error.value
+)
+const sourceCurrent = computed(
+ () =>
+ sourceShot.value &&
+ !sourceShot.value.primaryKeyframeStale &&
+ !impact.query.loading.value &&
+ !impact.query.error.value
+)
+const targetUnlinked = computed(
+ () =>
+ targetForm.value &&
+ impact.references.data.value &&
+ !impact.references.error.value &&
+ !impact.relatedForms.value.has(targetForm.value.id)
+)
+const showImpactDetails = computed(
+ () =>
+ sourceShotId.value &&
+ (sourceMissing.value ||
+ sourceCurrent.value ||
+ sourceShot.value?.inconsistent ||
+ targetUnlinked.value ||
+ linkedReferences.value.length ||
+ impact.references.loading.value ||
+ impact.references.error.value)
+)
const sourceLocation = computed(() =>
sourceShot.value
? {
@@ -380,17 +409,53 @@ async function showStaleForms() {
- 来源镜头不存在或不属于当前项目,未读取其素材。 -
-+
来源镜头不存在或不属于当前项目,未读取其素材。
+当前检查:{{ - sourceShot.primaryKeyframeId ? '该镜头主首帧未被标记为过期' : '该镜头暂无主首帧' + sourceShot?.primaryKeyframeId ? '该镜头主首帧未被标记为过期' : '该镜头暂无主首帧' }}。请以后端最新就绪状态为准。
-+
当前镜头:首帧检查未标记过期,但视频检查报告过期。请核对后端检查逻辑与身份母版,暂不建议重复生图。
-+
指定形态不在该镜头当前的有效引用列表中,关联可能已调整或主图缺失,请从下方关联素材重新核对。
正在读取镜头关联素材…
-+
正在读取镜头关联素材…
+
{{ impact.references.error.value }}