feat: 电商页面 KeepAlive 保活机制,切换页面不再丢失生成状态
通过 display:none 模式实现轻量 KeepAlive,电商页面首次访问后保持挂载, 切换到其他页面再切回时所有右侧面板状态(上传图片、生成进度、结果)完整保留。 同时清理项目中的临时文件和本地冗余图片。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -180,6 +180,9 @@
|
||||
overflow: auto;
|
||||
background: #101318;
|
||||
padding: 26px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.ecom-video-flow-map {
|
||||
@@ -499,6 +502,7 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
color: #697486;
|
||||
font-size: 13px;
|
||||
@@ -708,4 +712,382 @@
|
||||
.ecom-video-flow-node--scene {
|
||||
width: 118px;
|
||||
}
|
||||
|
||||
.ecom-video-tree {
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.ecom-video-tree__trunk {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ecom-video-tree__row {
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
/* ═══════════════════════════════════════════════════
|
||||
Tree Layout — 分支树状流程图 (参考图风格)
|
||||
原图 → 分支连接线 → [分镜文本 → 分镜图 → 分镜视频] × N
|
||||
═══════════════════════════════════════════════════ */
|
||||
|
||||
.ecom-video-tree {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0;
|
||||
width: 100%;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
/* ── Source node ── */
|
||||
.ecom-video-tree__source {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
flex-shrink: 0;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
border: 1.5px solid #2c3038;
|
||||
border-radius: 10px;
|
||||
background: #171c22;
|
||||
transition: border-color 280ms ease, box-shadow 280ms ease, transform 280ms ease;
|
||||
animation: ecom-tree-node-in 420ms var(--ease-out-expo, cubic-bezier(0.16, 1, 0.3, 1)) both;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node--source {
|
||||
width: 150px;
|
||||
height: 190px;
|
||||
flex-shrink: 0;
|
||||
border-color: #1c4d3a;
|
||||
background: #162820;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node--source img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node__label {
|
||||
color: #a0b0aa;
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* ── Text node (分镜文本) ── */
|
||||
.ecom-video-tree-node--text {
|
||||
min-width: 120px;
|
||||
max-width: 150px;
|
||||
padding: 14px 12px;
|
||||
cursor: default;
|
||||
border-color: #2a3d30;
|
||||
background: #131d1a;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node--text.is-completed {
|
||||
border-color: #1c4d3a;
|
||||
background: #162820;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node--text.is-active {
|
||||
border-color: #1a4d4d;
|
||||
animation: ecom-tree-breathe 1.8s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node__inner {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node__title {
|
||||
color: #e2eaf4;
|
||||
font-size: 13px;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node__desc {
|
||||
color: #6b7a8a;
|
||||
font-size: 11px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/* ── Image node (分镜图) ── */
|
||||
.ecom-video-tree-node--image,
|
||||
.ecom-video-tree-node--video {
|
||||
width: 150px;
|
||||
height: 120px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node--image img,
|
||||
.ecom-video-tree-node--image video,
|
||||
.ecom-video-tree-node--video img,
|
||||
.ecom-video-tree-node--video video {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node--image.is-completed,
|
||||
.ecom-video-tree-node--video.is-completed {
|
||||
border-color: #1c4d3a;
|
||||
background: #162820;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node--image.is-active,
|
||||
.ecom-video-tree-node--video.is-active {
|
||||
border-color: #1a4d4d;
|
||||
animation: ecom-tree-breathe 1.8s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node--video.is-failed {
|
||||
border-color: #4d1a1a;
|
||||
background: #2a1b1d;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node__placeholder {
|
||||
display: grid;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
place-items: center;
|
||||
background: linear-gradient(135deg, #171c22 0%, #12161b 100%);
|
||||
color: #5a6a78;
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node__placeholder span {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node__tag {
|
||||
position: absolute;
|
||||
left: 8px;
|
||||
top: 8px;
|
||||
max-width: calc(100% - 16px);
|
||||
overflow: hidden;
|
||||
border: 1px solid #303540;
|
||||
border-radius: 999px;
|
||||
background: rgba(18, 20, 26, 0.9);
|
||||
backdrop-filter: blur(6px);
|
||||
color: #c8d4e0;
|
||||
padding: 3px 9px;
|
||||
font-size: 10px;
|
||||
font-weight: 800;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node__progress {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
color: #53e5ff;
|
||||
font-size: 14px;
|
||||
font-weight: 900;
|
||||
}
|
||||
|
||||
.ecom-video-tree-node__retry {
|
||||
position: absolute;
|
||||
right: 8px;
|
||||
top: 8px;
|
||||
z-index: 5;
|
||||
display: grid;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
place-items: center;
|
||||
border: 1px solid #4d1a1a;
|
||||
border-radius: 999px;
|
||||
background: #241417;
|
||||
color: #ffb1b1;
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* ── Trunk connector (分支连接线) ── */
|
||||
.ecom-video-tree__trunk {
|
||||
position: relative;
|
||||
width: 48px;
|
||||
flex-shrink: 0;
|
||||
align-self: stretch;
|
||||
}
|
||||
|
||||
.ecom-video-tree__trunk-line {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 50%;
|
||||
width: 24px;
|
||||
height: 2px;
|
||||
background: #3a4550;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.ecom-video-tree__trunk-line::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, transparent, #00ff88, transparent);
|
||||
animation: ecom-tree-trunk-flow 2.4s ease-in-out infinite;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.ecom-video-tree__branches-line {
|
||||
position: absolute;
|
||||
left: 24px;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
width: 24px;
|
||||
}
|
||||
|
||||
.ecom-video-tree__branches-line::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
width: 2px;
|
||||
background: #3a4550;
|
||||
}
|
||||
|
||||
.ecom-video-tree__branch-tap {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 2px;
|
||||
background: #3a4550;
|
||||
}
|
||||
|
||||
.ecom-video-tree__branch-tap:nth-child(1) { top: 0; }
|
||||
.ecom-video-tree__branch-tap:nth-child(2) { top: 50%; transform: translateY(-50%); }
|
||||
.ecom-video-tree__branch-tap:nth-child(3) { bottom: 0; }
|
||||
|
||||
.ecom-video-tree__branch-tap::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, transparent, #00ff88, transparent);
|
||||
animation: ecom-tree-branch-flow 2.4s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.ecom-video-tree__branch-tap:nth-child(2)::after { animation-delay: 0.3s; }
|
||||
.ecom-video-tree__branch-tap:nth-child(3)::after { animation-delay: 0.6s; }
|
||||
|
||||
/* ── Arrow between nodes ── */
|
||||
.ecom-video-tree__arrow {
|
||||
flex-shrink: 0;
|
||||
width: 36px;
|
||||
height: 20px;
|
||||
color: #4a5565;
|
||||
transition: color 280ms ease;
|
||||
}
|
||||
|
||||
.ecom-video-tree__arrow svg {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.ecom-video-tree__arrow svg path {
|
||||
transition: stroke 280ms ease;
|
||||
}
|
||||
|
||||
.ecom-video-tree__row:hover .ecom-video-tree__arrow {
|
||||
color: #00ff88;
|
||||
}
|
||||
|
||||
/* ── Rows container ── */
|
||||
.ecom-video-tree__rows {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
gap: 20px;
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
align-self: center;
|
||||
padding: 8px 0;
|
||||
}
|
||||
|
||||
.ecom-video-tree__row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
animation: ecom-tree-row-in 480ms var(--ease-out-expo, cubic-bezier(0.16, 1, 0.3, 1)) both;
|
||||
}
|
||||
|
||||
.ecom-video-tree__row--empty {
|
||||
opacity: 0.5;
|
||||
transition: opacity 320ms ease;
|
||||
}
|
||||
|
||||
.ecom-video-tree__row--empty.is-planning {
|
||||
opacity: 0.75;
|
||||
}
|
||||
|
||||
.ecom-video-tree__row--empty.is-planning .ecom-video-tree-node {
|
||||
border-color: rgba(var(--accent-rgb, 0, 255, 136), 0.15);
|
||||
}
|
||||
|
||||
/* ── Animations ── */
|
||||
@keyframes ecom-tree-node-in {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(8px) scale(0.96);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0) scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes ecom-tree-row-in {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(-16px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes ecom-tree-breathe {
|
||||
0%, 100% {
|
||||
border-color: #1a4d4d;
|
||||
box-shadow: 0 0 0 0 rgba(83, 229, 255, 0);
|
||||
}
|
||||
50% {
|
||||
border-color: #53e5ff;
|
||||
box-shadow: 0 0 16px 2px rgba(83, 229, 255, 0.12);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes ecom-tree-trunk-flow {
|
||||
0% { opacity: 0; transform: translateX(-100%); }
|
||||
30% { opacity: 0.6; }
|
||||
70% { opacity: 0.6; }
|
||||
100% { opacity: 0; transform: translateX(100%); }
|
||||
}
|
||||
|
||||
@keyframes ecom-tree-branch-flow {
|
||||
0% { opacity: 0; transform: translateX(-100%); }
|
||||
30% { opacity: 0.5; }
|
||||
70% { opacity: 0.5; }
|
||||
100% { opacity: 0; transform: translateX(100%); }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user