- 视觉按 HEL-647 融合规范并入 :root 统一 Token(不叠加覆盖层) - 动效只动 transform/opacity,可中断;减少动态效果统一降级到 ≤120ms 淡变 - 单条记录删除改为立即收起 + 5 秒撤销;删工作流用居中确认弹层(有执行中任务时禁止) - 隔离原型,不连后端,不改正式代码 Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: multica-agent <github@multica.ai>
759 lines
45 KiB
CSS
759 lines
45 KiB
CSS
/* HEL-648 融合原型 · 流水台结构 + 放映厅配色。色值与动效参数以 HEL-647 融合规范为准;
|
||
设计 Token 统一在 :root,组件只引用变量 */
|
||
:root {
|
||
/* 蓝黑四阶:页面底 → 面板/卡片 → 浮起/选中 → 最浮/进度条底 */
|
||
--bg: #07090e;
|
||
--bg-2: #0c0f16;
|
||
--bg-3: #121724;
|
||
--bg-4: #1a2133;
|
||
--line: #1b2233;
|
||
--line-2: #2a3450;
|
||
--text: #f4f6fa;
|
||
--text-2: #aab2c5;
|
||
--text-3: #6d7690;
|
||
--page-glow: radial-gradient(1200px 500px at 70% -10%, rgba(38, 52, 92, 0.25), transparent 60%);
|
||
--float-bg: linear-gradient(180deg, #10152a, var(--bg-2));
|
||
--composer-bg: linear-gradient(180deg, #0e1220, var(--bg-2));
|
||
--composer-focus: 0 0 0 1px rgba(242, 199, 132, 0.12), 0 8px 28px rgba(0, 0, 0, 0.4);
|
||
--rail-bg: rgba(7, 9, 14, 0.6);
|
||
|
||
/* 放映金:只给关键动作与选中 */
|
||
--accent: #f2c784;
|
||
--accent-ink: #23170a;
|
||
--accent-soft: rgba(242, 199, 132, 0.13);
|
||
--accent-hi: #f7d9a2;
|
||
--accent-lo: #ecaf63;
|
||
--accent-glow: rgba(236, 175, 99, 0.28);
|
||
--accent-grad: linear-gradient(180deg, var(--accent-hi), var(--accent-lo));
|
||
--accent-grad-hover: linear-gradient(180deg, #fbe3b6, #f0b968);
|
||
--accent-wash: linear-gradient(180deg, rgba(242, 199, 132, 0.05), transparent 40%);
|
||
--accent-line: rgba(242, 199, 132, 0.55);
|
||
--accent-ring: 0 0 0 1px rgba(242, 199, 132, 0.7), 0 0 22px var(--accent-glow);
|
||
--btn-glow: 0 2px 14px var(--accent-glow), inset 0 1px 0 rgba(255, 255, 255, 0.35);
|
||
--btn-glow-hover: 0 4px 18px var(--accent-glow), inset 0 1px 0 rgba(255, 255, 255, 0.4);
|
||
--sel-shadow: 0 0 0 1px rgba(242, 199, 132, 0.15), 0 6px 24px rgba(0, 0, 0, 0.35);
|
||
|
||
/* 信号色:青=进行中/在线、绿=完成、红=失败、琥珀=待确认/缺失 */
|
||
--run: #54dfd2;
|
||
--run-soft: rgba(84, 223, 210, 0.13);
|
||
--run-grad: linear-gradient(90deg, #3bbfb4, var(--run));
|
||
--ok: #49cb90;
|
||
--ok-soft: rgba(73, 203, 144, 0.13);
|
||
--err: #f0645a;
|
||
--err-soft: rgba(240, 100, 90, 0.13);
|
||
--err-line: rgba(240, 100, 90, 0.6);
|
||
--warn: #f0b45c;
|
||
--warn-soft: rgba(240, 180, 92, 0.13);
|
||
|
||
/* 放映厅专属符号:胶片齿孔、放映光晕 */
|
||
--sprocket: radial-gradient(circle 2px, var(--line-2) 98%, transparent);
|
||
--stage-bg: radial-gradient(60% 45% at 50% 38%, rgba(242, 199, 132, 0.07), transparent 70%), radial-gradient(80% 70% at 50% 50%, #0d1220, #05070c);
|
||
|
||
/* 叠在媒体上的遮罩 */
|
||
--media-scrim: rgba(7, 9, 14, 0.65);
|
||
--overlay: rgba(3, 5, 9, 0.6);
|
||
--on-media: #fff;
|
||
--on-media-line: rgba(255, 255, 255, 0.05);
|
||
|
||
--r-sm: 6px;
|
||
--r-md: 10px;
|
||
--r-lg: 14px;
|
||
--shadow-float: 0 14px 44px rgba(0, 0, 0, 0.6), 0 0 0 1px var(--line-2);
|
||
|
||
--font: "PingFang SC", "Noto Sans SC", "Microsoft YaHei", system-ui, sans-serif;
|
||
--mono: ui-monospace, "JetBrains Mono", "SFMono-Regular", Menlo, monospace;
|
||
|
||
/* 动效参数:HEL-647 动效参数总表 */
|
||
--ease-out: cubic-bezier(0.23, 1, 0.32, 1);
|
||
--ease-in-out: cubic-bezier(0.77, 0, 0.175, 1);
|
||
--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1);
|
||
--ease-spring: cubic-bezier(0.34, 1.45, 0.44, 1);
|
||
--d-press: 120ms;
|
||
--d-state: 150ms;
|
||
--d-pop: 180ms;
|
||
--d-leave: 200ms;
|
||
--d-enter: 220ms;
|
||
--d-drawer: 280ms;
|
||
--d-flash: 900ms;
|
||
--d-progress: 400ms;
|
||
--press-scale: 0.97;
|
||
}
|
||
|
||
/* 减少动态:位移/缩放全部取消,只留 ≤120ms 透明度 */
|
||
:root[data-reduce="1"] {
|
||
--d-press: 0ms;
|
||
--d-state: 120ms;
|
||
--d-pop: 120ms;
|
||
--d-leave: 120ms;
|
||
--d-enter: 120ms;
|
||
--d-drawer: 120ms;
|
||
--d-flash: 0ms;
|
||
--d-progress: 0ms;
|
||
--press-scale: 1;
|
||
--ease-spring: ease;
|
||
}
|
||
|
||
* { box-sizing: border-box; }
|
||
html, body { height: 100%; margin: 0; }
|
||
body {
|
||
background: var(--page-glow), var(--bg);
|
||
color: var(--text);
|
||
font: 13px/1.55 var(--font);
|
||
-webkit-font-smoothing: antialiased;
|
||
overflow: hidden;
|
||
}
|
||
button, input, textarea, select { font: inherit; color: inherit; }
|
||
button { cursor: pointer; background: none; border: 0; padding: 0; }
|
||
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-sm); }
|
||
.mono { font-family: var(--mono); font-variant-numeric: tabular-nums; }
|
||
.muted { color: var(--text-3); }
|
||
.sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
|
||
|
||
/* ---------- 壳层 ---------- */
|
||
.app { display: grid; grid-template-columns: 60px minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); height: 100vh; height: 100dvh; }
|
||
.rail {
|
||
position: relative; display: flex; flex-direction: column; align-items: center; gap: 4px;
|
||
padding: 12px 0; border-right: 1px solid var(--line); background: var(--rail-bg);
|
||
}
|
||
.rail .logo {
|
||
width: 34px; height: 34px; border-radius: 9px; margin-bottom: 14px;
|
||
display: grid; place-items: center; font-weight: 700; font-size: 16px;
|
||
background: linear-gradient(160deg, var(--accent-hi), var(--accent-lo)); color: var(--accent-ink);
|
||
box-shadow: 0 2px 12px var(--accent-glow);
|
||
}
|
||
.rail .spacer { flex: 1; }
|
||
.rail-btn {
|
||
position: relative; width: 44px; height: 44px; border-radius: var(--r-md);
|
||
display: grid; place-items: center; color: var(--text-3);
|
||
transition: color var(--d-state) ease, background-color var(--d-state) ease, transform var(--d-press) var(--ease-out);
|
||
}
|
||
.rail-btn:active { transform: scale(var(--press-scale)); }
|
||
.rail-btn svg { width: 20px; height: 20px; }
|
||
.rail-btn[aria-current="page"] { color: var(--text); background: var(--bg-3); }
|
||
.rail-ind {
|
||
position: absolute; left: 0; top: 0; width: 3px; height: 20px; border-radius: 0 3px 3px 0;
|
||
background: var(--accent-grad); box-shadow: 0 0 8px var(--accent-glow); pointer-events: none; opacity: 0;
|
||
transform: translateY(var(--y, 0));
|
||
transition: transform var(--d-pop) var(--ease-out), opacity var(--d-state) ease;
|
||
}
|
||
.rail-ind.on { opacity: 1; }
|
||
:root[data-reduce="1"] .rail-ind { transition: opacity var(--d-state) ease; }
|
||
.rail-btn .tip {
|
||
position: absolute; left: 52px; white-space: nowrap; pointer-events: none;
|
||
background: var(--bg-4); color: var(--text); padding: 4px 8px; border-radius: var(--r-sm);
|
||
font-size: 12px; opacity: 0; transform: translateX(-4px);
|
||
transition: opacity var(--d-pop) var(--ease-out), transform var(--d-pop) var(--ease-out);
|
||
z-index: 30;
|
||
}
|
||
@media (hover: hover) and (pointer: fine) {
|
||
.rail-btn:hover { color: var(--text); background: var(--bg-2); }
|
||
.rail-btn:hover .tip { opacity: 1; transform: none; transition-delay: 350ms; }
|
||
}
|
||
|
||
.main { display: grid; grid-template-rows: 52px minmax(0, 1fr); min-width: 0; }
|
||
.topbar {
|
||
display: flex; align-items: center; gap: 10px; padding: 0 16px;
|
||
border-bottom: 1px solid var(--line); background: var(--bg-2);
|
||
}
|
||
.crumb { display: flex; align-items: center; gap: 6px; min-width: 0; }
|
||
.crumb h1 { font-size: 15px; font-weight: 600; margin: 0; white-space: nowrap; }
|
||
.capsule {
|
||
display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 10px;
|
||
border: 1px solid var(--line-2); border-radius: 999px; color: var(--text-2); white-space: nowrap;
|
||
background: var(--bg-3);
|
||
transition: border-color var(--d-state) ease, color var(--d-state) ease, transform var(--d-press) var(--ease-out);
|
||
}
|
||
.capsule:active { transform: scale(var(--press-scale)); }
|
||
.capsule .dot { position: relative; width: 7px; height: 7px; border-radius: 50%; background: var(--run); box-shadow: 0 0 6px var(--run-soft); transition: background-color var(--d-state) ease; }
|
||
.capsule .dot.run { background: var(--run); }
|
||
.capsule .dot.err { background: var(--err); }
|
||
/* 任务数变化:胶囊轻弹一次 + 状态灯扩散一圈,只播一次 */
|
||
.capsule.bump { animation: bump 320ms var(--ease-out); }
|
||
.capsule.bump .dot::after {
|
||
content: ""; position: absolute; inset: -1px; border-radius: 50%; border: 2px solid currentColor;
|
||
color: inherit; animation: ping 700ms var(--ease-out) forwards;
|
||
}
|
||
.capsule.bump .dot.run::after { color: var(--run); }
|
||
@keyframes bump { 40% { transform: scale(1.06); } }
|
||
@keyframes ping { from { transform: scale(1); opacity: 0.9; } to { transform: scale(3.2); opacity: 0; } }
|
||
:root[data-reduce="1"] .capsule.bump, :root[data-reduce="1"] .capsule.bump .dot::after { animation: none; }
|
||
@media (hover: hover) and (pointer: fine) {
|
||
.capsule:hover { border-color: var(--text-3); color: var(--text); }
|
||
}
|
||
.topbar .grow { flex: 1; }
|
||
.kbd {
|
||
font: 11px var(--mono); color: var(--text-3); border: 1px solid var(--line-2);
|
||
border-bottom-width: 2px; border-radius: 4px; padding: 0 5px; line-height: 16px;
|
||
}
|
||
.search-btn { min-width: 240px; justify-content: space-between; }
|
||
|
||
/* 通用按钮 */
|
||
.btn {
|
||
display: inline-flex; align-items: center; justify-content: center; gap: 6px;
|
||
height: 32px; padding: 0 12px; border-radius: var(--r-md);
|
||
border: 1px solid var(--line-2); color: var(--text); background: var(--bg-3);
|
||
transition: transform var(--d-press) var(--ease-out), background-color var(--d-state) ease, border-color var(--d-state) ease, box-shadow var(--d-state) ease, color var(--d-state) ease, opacity var(--d-state) ease;
|
||
white-space: nowrap;
|
||
}
|
||
.btn svg { width: 15px; height: 15px; }
|
||
.btn:active:not(:disabled) { transform: scale(var(--press-scale)); }
|
||
.btn:disabled { opacity: 0.45; cursor: not-allowed; }
|
||
.btn.primary { background: var(--accent-grad); color: var(--accent-ink); border-color: transparent; font-weight: 600; box-shadow: var(--btn-glow); }
|
||
.btn.primary:disabled { box-shadow: none; }
|
||
.btn.ghost { background: transparent; border-color: transparent; color: var(--text-2); }
|
||
.btn.danger { color: var(--err); }
|
||
.btn.danger-solid { background: var(--err); border-color: transparent; color: var(--on-media); font-weight: 600; }
|
||
.btn.sm { height: 26px; padding: 0 8px; font-size: 12px; border-radius: var(--r-sm); }
|
||
@media (hover: hover) and (pointer: fine) {
|
||
.btn:hover:not(:disabled) { border-color: var(--text-3); }
|
||
.btn.primary:hover:not(:disabled) { background: var(--accent-grad-hover); box-shadow: var(--btn-glow-hover); }
|
||
.btn.danger-solid:hover:not(:disabled) { box-shadow: 0 0 0 1px var(--err-line), 0 0 18px var(--err-soft); }
|
||
.btn.ghost:hover:not(:disabled) { background: var(--bg-4); color: var(--text); }
|
||
.btn.ghost.danger:hover:not(:disabled) { background: var(--err-soft); color: var(--err); }
|
||
}
|
||
|
||
.tag {
|
||
display: inline-flex; align-items: center; gap: 4px; height: 20px; padding: 0 7px;
|
||
border-radius: 999px; font-size: 11px; color: var(--text-2); background: var(--bg-4);
|
||
white-space: nowrap;
|
||
transition: color var(--d-state) ease, background-color var(--d-state) ease;
|
||
}
|
||
.tag.swap { animation: tag-swap var(--d-enter) var(--ease-out); }
|
||
@keyframes tag-swap { from { opacity: 0.2; transform: translateY(3px); } }
|
||
:root[data-reduce="1"] .tag.swap { animation: fade-in var(--d-state) ease; }
|
||
@keyframes fade-in { from { opacity: 0; } }
|
||
.tag.accent { color: var(--accent); background: var(--accent-soft); }
|
||
.tag.ok { color: var(--ok); background: var(--ok-soft); }
|
||
.tag.run { color: var(--run); background: var(--run-soft); }
|
||
.tag.err { color: var(--err); background: var(--err-soft); }
|
||
.tag.warn { color: var(--warn); background: var(--warn-soft); }
|
||
|
||
/* ---------- 视图切换 ---------- */
|
||
.view { display: none; min-height: 0; }
|
||
.view.on { display: grid; animation: fade-in var(--d-enter) var(--ease-out); }
|
||
.page.on { animation: view-in var(--d-enter) var(--ease-out); }
|
||
@keyframes view-in { from { opacity: 0; transform: translateY(6px); } }
|
||
:root[data-reduce="1"] .page.on { animation: fade-in var(--d-state) ease; }
|
||
|
||
/* ---------- 生成台 ---------- */
|
||
.desk {
|
||
grid-template-columns: minmax(0, 1fr) 420px; grid-template-rows: minmax(0, 1fr); min-height: 0;
|
||
transition: grid-template-columns var(--d-drawer) var(--ease-drawer);
|
||
}
|
||
.desk.insp-off { grid-template-columns: minmax(0, 1fr) 0px; }
|
||
:root[data-reduce="1"] .desk { transition: none; }
|
||
.desk-center { display: flex; flex-direction: column; min-height: 0; min-width: 0; }
|
||
.context-bar {
|
||
display: none; align-items: center; gap: 10px; margin: 10px 20px 0; padding: 8px 12px;
|
||
border-radius: var(--r-md); background: var(--run-soft); color: var(--text); font-size: 12px;
|
||
}
|
||
.context-bar.on { display: flex; }
|
||
.context-bar b { color: var(--run); font-weight: 600; }
|
||
.filters { display: flex; align-items: center; gap: 6px; padding: 10px 20px; border-bottom: 1px solid var(--line); }
|
||
|
||
/* 分段控件:选中底块在选项间滑动 */
|
||
.seg { position: relative; display: inline-flex; padding: 2px; border-radius: var(--r-md); background: var(--bg-2); border: 1px solid var(--line); }
|
||
.seg-pill {
|
||
position: absolute; top: 2px; bottom: 2px; left: 0; width: var(--w, 0); border-radius: 8px;
|
||
background: var(--bg-4); box-shadow: inset 0 0 0 1px var(--line-2); pointer-events: none;
|
||
transform: translateX(var(--x, 0));
|
||
transition: transform var(--d-pop) var(--ease-out), width var(--d-pop) var(--ease-out);
|
||
}
|
||
.seg-pill.instant, :root[data-reduce="1"] .seg-pill { transition: none; }
|
||
.seg button {
|
||
position: relative; height: 26px; padding: 0 10px; border-radius: 8px; color: var(--text-3);
|
||
transition: color var(--d-state) ease;
|
||
}
|
||
.seg button[aria-pressed="true"] { color: var(--text); }
|
||
.filters .count { margin-left: auto; color: var(--text-3); font-size: 12px; }
|
||
.insp-open { display: none; }
|
||
.desk.insp-off .insp-open { display: inline-flex; }
|
||
|
||
.feed { position: relative; flex: 1; overflow-y: auto; padding: 16px 20px 8px; scroll-behavior: smooth; }
|
||
:root[data-reduce="1"] .feed { scroll-behavior: auto; }
|
||
.feed-day { color: var(--text-3); font-size: 12px; margin: 10px 0 8px; display: flex; align-items: center; gap: 8px; }
|
||
.feed-day::after { content: ""; flex: 1; height: 1px; background: var(--line); }
|
||
|
||
/* 选中框:金色描边从上一条记录滑到新选中的记录(app.js slideMark) */
|
||
.sel-mark {
|
||
position: absolute; inset: -1px; z-index: 3; border: 1px solid var(--accent-line); border-radius: inherit;
|
||
pointer-events: none; display: none;
|
||
}
|
||
.take.selected > .sel-mark { display: block; }
|
||
|
||
.take {
|
||
position: relative; display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px 14px;
|
||
padding: 12px 14px; margin-bottom: 8px; border-radius: var(--r-lg);
|
||
border: 1px solid var(--line); background: var(--bg-2); cursor: pointer;
|
||
transition: border-color var(--d-state) ease, background-color var(--d-state) ease, opacity var(--d-enter) var(--ease-out), transform var(--d-enter) var(--ease-out);
|
||
}
|
||
.take.new { animation: take-in var(--d-enter) var(--ease-out); }
|
||
@keyframes take-in { from { opacity: 0; transform: translateY(8px); } }
|
||
:root[data-reduce="1"] .take.new { animation: fade-in var(--d-state) ease; }
|
||
.take.selected { background: var(--accent-wash), var(--bg-3); border-color: transparent; box-shadow: var(--sel-shadow); }
|
||
.take.leaving { opacity: 0; transform: translateX(-10px); pointer-events: none; transition-duration: var(--d-leave); transition-timing-function: var(--ease-drawer); }
|
||
:root[data-reduce="1"] .take.leaving { transform: none; }
|
||
.take.done-flash { animation: done-flash var(--d-flash) var(--ease-out); }
|
||
@keyframes done-flash { from { box-shadow: var(--accent-ring); } }
|
||
.take.shake { animation: shake 320ms var(--ease-out); }
|
||
@keyframes shake { 20% { transform: translateX(-4px); } 45% { transform: translateX(4px); } 70% { transform: translateX(-2px); } }
|
||
:root[data-reduce="1"] .take.shake, :root[data-reduce="1"] .take.done-flash { animation: none; }
|
||
@media (hover: hover) and (pointer: fine) {
|
||
.take:hover:not(.selected) { border-color: var(--line-2); background: var(--bg-3); }
|
||
}
|
||
.take-head { display: flex; align-items: center; gap: 8px; min-width: 0; }
|
||
.take-head .name { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
||
.take-head .meta { color: var(--text-3); font-size: 12px; white-space: nowrap; }
|
||
.take-prompt {
|
||
grid-column: 1; color: var(--text-2); font-size: 12.5px;
|
||
display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
|
||
}
|
||
.take-inputs { display: flex; gap: 4px; align-items: center; }
|
||
.take-inputs .mini { width: 26px; height: 26px; border-radius: 5px; background-size: cover; background-position: center; border: 1px solid var(--line-2); }
|
||
.take-inputs .more { font-size: 11px; color: var(--text-3); padding-left: 2px; }
|
||
.take-out { grid-column: 2; grid-row: 1 / span 3; align-self: start; }
|
||
.thumb {
|
||
position: relative; width: 150px; aspect-ratio: 16 / 9; border-radius: var(--r-md); overflow: hidden;
|
||
background: var(--bg-4) center / cover no-repeat; box-shadow: inset 0 0 0 1px var(--on-media-line);
|
||
}
|
||
.thumb.portrait { width: 96px; aspect-ratio: 3 / 4; }
|
||
.thumb.fresh { animation: thumb-in 320ms var(--ease-out); }
|
||
@keyframes thumb-in { from { opacity: 0; transform: scale(0.96); } }
|
||
:root[data-reduce="1"] .thumb.fresh { animation: fade-in var(--d-state) ease; }
|
||
.thumb .badge {
|
||
position: absolute; right: 6px; bottom: 6px; font: 11px var(--mono); padding: 1px 5px; border-radius: 4px;
|
||
background: var(--media-scrim); color: var(--on-media);
|
||
}
|
||
.thumb .play {
|
||
position: absolute; left: 6px; bottom: 6px; width: 22px; height: 22px; border-radius: 50%;
|
||
display: grid; place-items: center; background: var(--media-scrim);
|
||
}
|
||
.thumb .play svg { width: 10px; height: 10px; fill: var(--on-media); }
|
||
.thumb.missing, .thumb.pending {
|
||
display: grid; place-items: center; text-align: center; font-size: 11px; color: var(--text-3);
|
||
border: 1px dashed var(--line-2); background: var(--bg-2); padding: 6px;
|
||
}
|
||
.thumb.pending { border-style: solid; overflow: hidden; color: var(--run); }
|
||
.thumb.pending::after {
|
||
content: ""; position: absolute; inset: 0;
|
||
background: linear-gradient(100deg, transparent 30%, var(--run-soft) 50%, transparent 70%);
|
||
animation: sheen 1.4s linear infinite;
|
||
}
|
||
@keyframes sheen { from { transform: translateX(-100%); } to { transform: translateX(100%); } }
|
||
:root[data-reduce="1"] .thumb.pending::after { animation: none; }
|
||
|
||
.take-state { grid-column: 1; display: flex; align-items: center; gap: 8px; font-size: 12px; min-height: 22px; }
|
||
.take-state .txt { color: var(--text-2); }
|
||
.take-state .err-txt { color: var(--err); }
|
||
.bar { position: relative; flex: 0 0 140px; height: 4px; border-radius: 4px; background: var(--bg-4); overflow: hidden; }
|
||
.bar i {
|
||
position: absolute; inset: 0; background: var(--run-grad); box-shadow: 0 0 8px var(--run-soft); transform-origin: left;
|
||
transform: scaleX(var(--p, 0)); transition: transform var(--d-progress) linear;
|
||
}
|
||
.take-actions { display: flex; gap: 4px; margin-left: auto; opacity: 0; transition: opacity var(--d-state) ease; }
|
||
.take:focus-within .take-actions, .take.selected .take-actions { opacity: 1; }
|
||
@media (hover: hover) and (pointer: fine) { .take:hover .take-actions { opacity: 1; } }
|
||
@media (hover: none) { .take-actions { opacity: 1; } }
|
||
/* 高度展开/收起:0fr ↔ 1fr,可中途反向 */
|
||
.collapse {
|
||
display: grid; grid-template-rows: 0fr; opacity: 0;
|
||
transition: grid-template-rows var(--d-enter) var(--ease-out), opacity var(--d-state) ease;
|
||
}
|
||
.collapse.open { grid-template-rows: 1fr; opacity: 1; }
|
||
.collapse > .collapse-in { overflow: hidden; min-height: 0; }
|
||
:root[data-reduce="1"] .collapse { transition: opacity var(--d-state) ease; }
|
||
.take > .collapse { grid-column: 1 / -1; margin-top: -10px; }
|
||
.err-detail { margin: 10px 0 0; padding: 8px 10px 8px 26px; border-radius: var(--r-md); background: var(--err-soft); color: var(--text-2); font-size: 12px; }
|
||
.err-detail li { margin: 2px 0; }
|
||
|
||
/* ---------- 输入台 ---------- */
|
||
.composer-wrap { position: relative; padding: 12px 20px 16px; }
|
||
/* 胶片齿孔:只出现在记录流与输入台之间 */
|
||
.composer-wrap::before {
|
||
content: ""; position: absolute; left: 24px; right: 24px; top: 3px; height: 6px;
|
||
background-image: var(--sprocket); background-size: 18px 6px; background-repeat: repeat-x; background-position: center;
|
||
opacity: 0.55;
|
||
}
|
||
.composer {
|
||
border: 1px solid var(--line-2); border-radius: 16px; background: var(--composer-bg);
|
||
transition: border-color var(--d-state) ease, box-shadow var(--d-state) ease;
|
||
}
|
||
.composer:focus-within { border-color: var(--accent-line); box-shadow: var(--composer-focus); }
|
||
.composer.drag { border-color: var(--accent-line); box-shadow: 0 0 0 3px var(--accent-soft); }
|
||
.slots { display: flex; flex-wrap: wrap; gap: 8px; padding: 10px 12px 0; overflow: hidden; }
|
||
.slots:empty { padding-top: 0; }
|
||
.slot-group.enter { animation: view-in var(--d-enter) var(--ease-out); }
|
||
:root[data-reduce="1"] .slot-group.enter { animation: fade-in var(--d-state) ease; }
|
||
.slot-group { display: flex; flex-direction: column; gap: 6px; }
|
||
.slot-label { font-size: 11.5px; color: var(--text-3); display: flex; gap: 6px; align-items: center; }
|
||
.slot-label .req { color: var(--warn); }
|
||
.slot-row { display: flex; gap: 6px; flex-wrap: wrap; }
|
||
.tile {
|
||
position: relative; width: 58px; height: 58px; border-radius: var(--r-md);
|
||
background: var(--bg-3) center / cover no-repeat; border: 1px solid var(--line-2);
|
||
display: grid; place-items: center; color: var(--text-3);
|
||
transition: border-color var(--d-state) ease, background-color var(--d-state) ease, color var(--d-state) ease, transform var(--d-press) var(--ease-out), opacity var(--d-state) ease;
|
||
}
|
||
.tile.enter { animation: tile-in var(--d-enter) var(--ease-spring); }
|
||
@keyframes tile-in { from { opacity: 0; transform: scale(0.86); } }
|
||
:root[data-reduce="1"] .tile.enter { animation: fade-in var(--d-state) ease; }
|
||
.tile.out { opacity: 0; transform: scale(0.86); pointer-events: none; }
|
||
:root[data-reduce="1"] .tile.out { transform: none; }
|
||
.tile.add { border-style: dashed; }
|
||
.tile.add svg { width: 18px; height: 18px; }
|
||
.tile.add:active { transform: scale(var(--press-scale)); }
|
||
.tile.drag { border-color: var(--accent); background-color: var(--accent-soft); color: var(--accent); }
|
||
.tile.bad { border-color: var(--err); }
|
||
.tile.need { border-color: var(--warn); animation: shake 320ms var(--ease-out); }
|
||
:root[data-reduce="1"] .tile.need { animation: none; }
|
||
/* 上传:真实进度环 → 成功勾 + 一次金色光晕 */
|
||
.tile .ring {
|
||
position: absolute; inset: 0; border-radius: inherit; background: var(--media-scrim);
|
||
display: grid; place-items: center; transition: opacity var(--d-state) ease;
|
||
}
|
||
.tile .ring i {
|
||
width: 26px; height: 26px; border-radius: 50%;
|
||
background: conic-gradient(var(--accent) calc(var(--p, 0) * 1turn), rgba(255, 255, 255, 0.16) 0);
|
||
-webkit-mask: radial-gradient(circle, transparent 9.5px, #000 10.5px);
|
||
mask: radial-gradient(circle, transparent 9.5px, #000 10.5px);
|
||
}
|
||
.tile .ring.done { opacity: 0; }
|
||
.tile.flash { animation: tile-flash var(--d-flash) var(--ease-out); }
|
||
@keyframes tile-flash { from { box-shadow: var(--accent-ring); border-color: var(--accent); } }
|
||
:root[data-reduce="1"] .tile.flash { animation: none; }
|
||
.tile .ok-badge {
|
||
position: absolute; right: 3px; bottom: 3px; width: 16px; height: 16px; border-radius: 50%;
|
||
display: grid; place-items: center; background: var(--ok); color: var(--bg);
|
||
animation: pop-in var(--d-enter) var(--ease-spring); transition: opacity var(--d-state) ease;
|
||
}
|
||
.tile .ok-badge svg { width: 10px; height: 10px; }
|
||
.tile .ok-badge.gone { opacity: 0; }
|
||
@keyframes pop-in { from { opacity: 0; transform: scale(0.4); } }
|
||
:root[data-reduce="1"] .tile .ok-badge { animation: fade-in var(--d-state) ease; }
|
||
.tile .x {
|
||
position: absolute; top: -6px; right: -6px; width: 18px; height: 18px; border-radius: 50%;
|
||
background: var(--bg-4); border: 1px solid var(--line-2); display: grid; place-items: center; opacity: 0;
|
||
transition: opacity var(--d-state) ease;
|
||
}
|
||
.tile .x svg { width: 9px; height: 9px; }
|
||
.tile:focus-within .x { opacity: 1; }
|
||
@media (hover: hover) and (pointer: fine) { .tile:hover .x { opacity: 1; } .tile.add:hover { border-color: var(--text-3); color: var(--text); } }
|
||
@media (hover: none) { .tile .x { opacity: 1; } }
|
||
.tile .idx { position: absolute; left: 3px; top: 2px; font: 10px var(--mono); color: var(--on-media); text-shadow: 0 1px 2px #000; }
|
||
.slot-hint { font-size: 11px; color: var(--text-3); }
|
||
.slot-hint.err { color: var(--err); }
|
||
.slot-label .cnt { transition: color var(--d-state) ease; }
|
||
.slot-label .cnt.tick { color: var(--accent); }
|
||
|
||
.prompt {
|
||
display: block; width: 100%; resize: none; border: 0; outline: 0; background: transparent;
|
||
padding: 12px 14px 6px; min-height: 52px; max-height: 180px; line-height: 1.6;
|
||
}
|
||
.prompt::placeholder { color: var(--text-3); }
|
||
.composer-foot { display: flex; align-items: center; gap: 6px; padding: 6px 8px 8px 8px; flex-wrap: wrap; }
|
||
.chip {
|
||
display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 10px; border-radius: 999px;
|
||
background: var(--bg-3); color: var(--text-2); font-size: 12px; white-space: nowrap; max-width: 280px;
|
||
transition: background-color var(--d-state) ease, color var(--d-state) ease, transform var(--d-press) var(--ease-out);
|
||
}
|
||
.chip:active { transform: scale(var(--press-scale)); }
|
||
.chip .lbl { overflow: hidden; text-overflow: ellipsis; }
|
||
.chip svg { width: 14px; height: 14px; flex: none; }
|
||
.chip.wf { color: var(--text); background: var(--bg-4); font-weight: 500; box-shadow: inset 0 0 0 1px var(--line-2); }
|
||
.chip.wf.flash { animation: chip-flash 700ms var(--ease-out); }
|
||
@keyframes chip-flash { from { background: var(--accent-soft); color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent-line); } }
|
||
:root[data-reduce="1"] .chip.wf.flash { animation: none; }
|
||
.chip.warn { color: var(--warn); }
|
||
.chip.err { color: var(--err); }
|
||
.chip.changed { color: var(--accent); }
|
||
@media (hover: hover) and (pointer: fine) { .chip:hover { background: var(--bg-4); color: var(--text); } }
|
||
.submit-group { margin-left: auto; display: flex; align-items: center; gap: 10px; }
|
||
.why { font-size: 12px; color: var(--warn); white-space: nowrap; text-decoration: underline dotted; text-underline-offset: 3px; }
|
||
.why.err { color: var(--err); }
|
||
/* 生成按钮:按下即缩,提交后文字换成「已提交」约 0.9 秒,期间仍可再次提交 */
|
||
.gen-btn { height: 34px; padding: 0 18px; border-radius: 999px; display: inline-grid; min-width: 84px; }
|
||
.gen-btn > span { grid-area: 1 / 1; display: inline-flex; align-items: center; justify-content: center; gap: 4px; transition: opacity var(--d-state) ease, transform var(--d-pop) var(--ease-out); }
|
||
.gen-btn > span svg { width: 13px; height: 13px; }
|
||
.gen-btn .l-sent { opacity: 0; transform: translateY(8px); }
|
||
.gen-btn.sent .l-idle { opacity: 0; transform: translateY(-8px); }
|
||
.gen-btn.sent .l-sent { opacity: 1; transform: none; }
|
||
:root[data-reduce="1"] .gen-btn > span { transform: none !important; }
|
||
|
||
/* ---------- 右侧检视区 ---------- */
|
||
.inspector {
|
||
border-left: 1px solid var(--line); display: flex; flex-direction: column; align-items: flex-end;
|
||
min-height: 0; min-width: 0; overflow: hidden; background: var(--bg);
|
||
transition: opacity var(--d-drawer) ease;
|
||
}
|
||
.inspector > * { width: 420px; max-width: 100%; flex: none; }
|
||
.inspector > .insp-body { flex: 1; }
|
||
.desk.insp-off .inspector { opacity: 0; pointer-events: none; }
|
||
.insp-tabs { display: flex; gap: 4px; padding: 10px 12px; border-bottom: 1px solid var(--line); align-items: center; }
|
||
.insp-body { overflow-y: auto; padding: 14px; }
|
||
.insp-body.slide-l { animation: slide-l var(--d-pop) var(--ease-out); }
|
||
.insp-body.slide-r { animation: slide-r var(--d-pop) var(--ease-out); }
|
||
@keyframes slide-l { from { opacity: 0; transform: translateX(-10px); } }
|
||
@keyframes slide-r { from { opacity: 0; transform: translateX(10px); } }
|
||
:root[data-reduce="1"] .insp-body.slide-l, :root[data-reduce="1"] .insp-body.slide-r { animation: fade-in var(--d-state) ease; }
|
||
.stage { position: relative; border-radius: var(--r-lg); overflow: hidden; background: var(--stage-bg); aspect-ratio: 16 / 9; box-shadow: 0 0 0 1px var(--line); transition: box-shadow var(--d-state) ease; }
|
||
.stage.playing { box-shadow: 0 0 0 1px var(--accent-line); }
|
||
.stage-badge {
|
||
position: absolute; left: 10px; top: 10px; z-index: 4; display: inline-flex; align-items: center; gap: 6px;
|
||
height: 24px; padding: 0 9px; border-radius: 999px; font-size: 11px; color: var(--accent);
|
||
background: var(--media-scrim); box-shadow: inset 0 0 0 1px var(--accent-line); pointer-events: none;
|
||
opacity: 0; transition: opacity var(--d-state) ease;
|
||
}
|
||
.stage.playing .stage-badge { opacity: 1; }
|
||
.stage-badge .eq { display: inline-flex; gap: 2px; align-items: flex-end; height: 10px; }
|
||
.stage-badge .eq i { width: 2px; background: currentColor; border-radius: 1px; animation: eq 900ms ease-in-out infinite; }
|
||
.stage-badge .eq i:nth-child(2) { animation-delay: -300ms; }
|
||
.stage-badge .eq i:nth-child(3) { animation-delay: -600ms; }
|
||
@keyframes eq { 0%, 100% { height: 3px; } 50% { height: 10px; } }
|
||
:root[data-reduce="1"] .stage-badge .eq i { animation: none; height: 7px; }
|
||
.stage-progress { position: absolute; left: 16px; right: 16px; bottom: 16px; height: 3px; border-radius: 3px; background: var(--bg-4); overflow: hidden; }
|
||
.stage-progress i { position: absolute; inset: 0; background: var(--run-grad); transform-origin: left; transform: scaleX(var(--p, 0)); transition: transform var(--d-progress) linear; }
|
||
.stage.portrait { aspect-ratio: 3 / 4; max-height: 480px; margin: 0 auto; }
|
||
.stage > img, .stage > video, .stage > .stage-empty { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; transition: opacity var(--d-state) ease; }
|
||
.stage .fade-out { opacity: 0; }
|
||
.stage-empty { display: grid; place-items: center; color: var(--text-3); font-size: 12px; background: var(--bg-2); }
|
||
.stage-meta { display: flex; flex-wrap: wrap; gap: 6px 12px; margin: 12px 0; font-size: 12px; color: var(--text-3); }
|
||
.stage-meta b { color: var(--text-2); font-weight: 500; }
|
||
.stage-actions { display: flex; flex-wrap: wrap; gap: 6px; }
|
||
.section-title { font-size: 12px; color: var(--text-3); margin: 18px 0 8px; display: flex; align-items: center; gap: 8px; }
|
||
.kv { display: grid; grid-template-columns: 92px 1fr; gap: 6px 10px; font-size: 12px; }
|
||
.kv dt { color: var(--text-3); }
|
||
.kv dd { margin: 0; color: var(--text-2); word-break: break-all; }
|
||
|
||
/* 参数表单(按工作流 JSON 生成) */
|
||
.field { display: grid; gap: 6px; margin-bottom: 12px; }
|
||
.field label { display: flex; justify-content: space-between; font-size: 12px; color: var(--text-2); }
|
||
.field label .orig { color: var(--text-3); font-family: var(--mono); font-size: 11px; }
|
||
.input {
|
||
height: 32px; border-radius: var(--r-sm); border: 1px solid var(--line-2); background: var(--bg-3);
|
||
padding: 0 10px; outline: 0; width: 100%;
|
||
transition: border-color var(--d-state) ease;
|
||
}
|
||
.input:focus { border-color: var(--text-3); }
|
||
.input.changed { border-color: var(--accent-line); }
|
||
textarea.input { height: auto; min-height: 64px; padding: 8px 10px; resize: vertical; }
|
||
.fold { border-top: 1px solid var(--line); margin-top: 6px; }
|
||
.fold-head {
|
||
width: 100%; padding: 10px 0; display: flex; align-items: center; gap: 6px; color: var(--text-2); font-size: 12px; text-align: left;
|
||
transition: color var(--d-state) ease;
|
||
}
|
||
.fold-head svg { width: 12px; height: 12px; transition: transform var(--d-pop) var(--ease-out); }
|
||
.fold-head[aria-expanded="true"] svg { transform: rotate(90deg); }
|
||
@media (hover: hover) and (pointer: fine) { .fold-head:hover { color: var(--text); } }
|
||
.fold .collapse-in > :first-child { margin-top: 2px; }
|
||
.note { font-size: 12px; color: var(--text-3); padding: 8px 10px; border-radius: var(--r-md); background: var(--bg-3); margin-bottom: 12px; }
|
||
.note.warn { color: var(--warn); background: var(--warn-soft); }
|
||
.note.err { color: var(--err); background: var(--err-soft); }
|
||
.note ul { margin: 6px 0 0; padding-left: 18px; }
|
||
|
||
/* ---------- 浮层:工作流面板 ---------- */
|
||
.pop {
|
||
position: fixed; z-index: 50; width: 520px; max-height: min(560px, 70vh); display: flex; flex-direction: column;
|
||
border-radius: var(--r-lg); background: var(--float-bg); box-shadow: var(--shadow-float);
|
||
opacity: 0; transform: scale(0.96); pointer-events: none; transform-origin: var(--origin, bottom left);
|
||
transition: opacity var(--d-pop) var(--ease-out), transform var(--d-pop) var(--ease-out);
|
||
}
|
||
.pop.on { opacity: 1; transform: none; pointer-events: auto; }
|
||
.pop.instant { transition: none; }
|
||
:root[data-reduce="1"] .pop { transform: none; }
|
||
.pop-search { display: flex; align-items: center; gap: 8px; padding: 12px 14px; border-bottom: 1px solid var(--line); }
|
||
.pop-search input { flex: 1; background: transparent; border: 0; outline: 0; font-size: 14px; }
|
||
.pop-list { overflow-y: auto; padding: 6px; }
|
||
.pop-group { font-size: 11px; color: var(--text-3); padding: 10px 10px 4px; display: flex; gap: 6px; }
|
||
.wf-row {
|
||
display: grid; grid-template-columns: 1fr auto; gap: 2px 10px; width: 100%; text-align: left;
|
||
padding: 8px 10px; border-radius: var(--r-md);
|
||
}
|
||
.wf-row[aria-selected="true"] { background: var(--bg-4); }
|
||
.wf-row .n .cur { color: var(--accent); }
|
||
.wf-row .n { font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
||
.wf-row .s { grid-column: 1; display: flex; gap: 4px; flex-wrap: wrap; }
|
||
.wf-row .r { grid-column: 2; grid-row: 1 / span 2; align-self: center; font-size: 11px; text-align: right; }
|
||
.wf-row.off .n { color: var(--text-3); }
|
||
.pop-foot { border-top: 1px solid var(--line); padding: 8px; display: flex; gap: 6px; align-items: center; }
|
||
.pop-foot .hint { margin-left: auto; font-size: 11px; color: var(--text-3); display: flex; gap: 6px; align-items: center; }
|
||
|
||
.menu { width: 260px; }
|
||
.menu .pop-list button { display: flex; width: 100%; padding: 8px 10px; border-radius: var(--r-sm); gap: 8px; align-items: center; transition: background-color var(--d-state) ease; }
|
||
.menu .pop-list button:hover, .menu .pop-list button[aria-selected="true"] { background: var(--bg-4); }
|
||
.menu .pop-list button[aria-selected="true"] { color: var(--accent); }
|
||
|
||
/* 删除确认:只用于删工作流/删项目这类不可逆的大操作;屏幕居中,从中心 scale(.96)→1 */
|
||
.danger-zone { margin-top: 18px; padding-top: 12px; border-top: 1px solid var(--line); }
|
||
.confirm { z-index: 62; width: 400px; padding: 16px 16px 14px; gap: 10px; border: 1px solid var(--err-line); }
|
||
.confirm h3 { margin: 0; font-size: 14px; display: flex; align-items: center; gap: 8px; }
|
||
.confirm h3::before { content: "!"; width: 18px; height: 18px; border-radius: 50%; display: grid; place-items: center; font-size: 11px; font-weight: 700; color: var(--err); background: var(--err-soft); }
|
||
.confirm p { margin: 0; color: var(--text-2); font-size: 12px; }
|
||
.confirm .row-actions { justify-content: flex-end; }
|
||
|
||
/* ---------- 抽屉:导入工作流 ---------- */
|
||
.scrim { position: fixed; inset: 0; background: var(--overlay); opacity: 0; pointer-events: none; transition: opacity var(--d-drawer) ease; z-index: 60; }
|
||
.scrim.on { opacity: 1; pointer-events: auto; }
|
||
.drawer {
|
||
position: fixed; top: 0; right: 0; bottom: 0; width: 520px; max-width: 100vw; z-index: 61;
|
||
background: var(--float-bg); border-left: 1px solid var(--line-2); display: flex; flex-direction: column;
|
||
transform: translateX(100%); transition: transform var(--d-drawer) var(--ease-drawer);
|
||
}
|
||
.drawer.on { transform: none; }
|
||
:root[data-reduce="1"] .drawer { transform: none; opacity: 0; pointer-events: none; transition: opacity var(--d-drawer) ease; }
|
||
:root[data-reduce="1"] .drawer.on { opacity: 1; pointer-events: auto; }
|
||
.drawer-head { display: flex; align-items: center; gap: 10px; padding: 14px 16px; border-bottom: 1px solid var(--line); }
|
||
.drawer-head h2 { font-size: 15px; margin: 0; flex: 1; }
|
||
.drawer-body { flex: 1; overflow-y: auto; padding: 16px; }
|
||
.drawer-foot { display: flex; gap: 8px; justify-content: flex-end; padding: 12px 16px; border-top: 1px solid var(--line); }
|
||
.drop {
|
||
border: 1px dashed var(--line-2); border-radius: var(--r-lg); padding: 14px; display: grid; gap: 10px;
|
||
transition: border-color var(--d-state) ease, background-color var(--d-state) ease;
|
||
}
|
||
.drop.drag { border-color: var(--accent); background: var(--accent-soft); }
|
||
.drop textarea { width: 100%; min-height: 110px; background: var(--bg); border: 1px solid var(--line); border-radius: var(--r-md); padding: 10px; font: 12px/1.5 var(--mono); color: var(--text-2); resize: vertical; outline: 0; }
|
||
.checks { display: grid; gap: 8px; margin-top: 14px; }
|
||
.check { display: grid; grid-template-columns: 22px 1fr; gap: 2px 10px; padding: 10px 12px; border-radius: var(--r-md); background: var(--bg); border: 1px solid var(--line); }
|
||
.check .ic { width: 20px; height: 20px; border-radius: 50%; display: grid; place-items: center; background: var(--bg-4); color: var(--text-3); font-size: 11px; transition: background-color var(--d-state) ease, color var(--d-state) ease; }
|
||
.check.ok .ic { background: var(--ok-soft); color: var(--ok); }
|
||
.check.bad .ic { background: var(--err-soft); color: var(--err); }
|
||
.check.run .ic { background: var(--run-soft); color: var(--run); }
|
||
.check .t { font-weight: 500; }
|
||
.check .d { grid-column: 2; color: var(--text-3); font-size: 12px; }
|
||
.check .d ul { margin: 4px 0 0; padding-left: 16px; }
|
||
.slot-map { display: grid; gap: 6px; margin-top: 8px; }
|
||
.slot-map div { display: flex; justify-content: space-between; gap: 8px; font-size: 12px; padding: 6px 8px; border-radius: var(--r-sm); background: var(--bg-3); }
|
||
.usage-pick { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
|
||
.usage-pick button { height: 28px; padding: 0 10px; border-radius: 999px; border: 1px solid var(--line-2); color: var(--text-2); font-size: 12px; }
|
||
.usage-pick button[aria-pressed="true"] { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); }
|
||
|
||
/* ---------- Toast ---------- */
|
||
.toasts { position: fixed; right: 24px; bottom: 24px; z-index: 80; display: grid; gap: 8px; pointer-events: none; max-width: 400px; }
|
||
.toast {
|
||
display: flex; align-items: center; gap: 12px; padding: 10px 12px 10px 14px; border-radius: var(--r-md);
|
||
background: var(--float-bg); box-shadow: var(--shadow-float); pointer-events: auto; min-width: 280px;
|
||
transition: opacity var(--d-enter) var(--ease-drawer), transform var(--d-enter) var(--ease-drawer);
|
||
}
|
||
@starting-style { .toast { opacity: 0; transform: translateY(100%); } }
|
||
.toast.out { opacity: 0; transform: translateY(100%); }
|
||
:root[data-reduce="1"] .toast, :root[data-reduce="1"] .toast.out { transform: none; }
|
||
.toast .grow { flex: 1; }
|
||
.toast .ic { width: 18px; height: 18px; border-radius: 50%; flex: none; display: grid; place-items: center; background: var(--ok-soft); color: var(--ok); }
|
||
.toast .ic svg { width: 10px; height: 10px; }
|
||
.toast .ic.err { background: var(--err-soft); color: var(--err); }
|
||
.toast button { color: var(--accent); font-weight: 600; }
|
||
|
||
/* ---------- 任务托盘 ---------- */
|
||
.tray { width: 340px; }
|
||
.tray-row { display: grid; grid-template-columns: 36px 1fr auto; gap: 10px; align-items: center; padding: 8px 10px; border-radius: var(--r-md); width: 100%; text-align: left; }
|
||
.tray-row:hover { background: var(--bg-3); }
|
||
.tray-row .t { width: 36px; height: 36px; border-radius: 6px; background: var(--bg-4) center / cover; }
|
||
.tray-row .n { font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
||
.tray-row .m { font-size: 11px; color: var(--text-3); }
|
||
|
||
/* ---------- 项目 / 创作流程 ---------- */
|
||
.page { overflow-y: auto; padding: 24px 28px 40px; align-content: start; gap: 18px; }
|
||
.hero {
|
||
display: grid; grid-template-columns: 300px 1fr; gap: 20px; padding: 16px; border-radius: var(--r-lg); background: var(--bg-2); border: 1px solid var(--line); overflow: hidden;
|
||
}
|
||
.hero .cover { aspect-ratio: 16 / 9; border-radius: var(--r-md); background: var(--bg-4) center / cover; box-shadow: inset 0 0 0 1px var(--on-media-line); }
|
||
.hero h2 { margin: 2px 0 6px; font-size: 20px; }
|
||
.hero p { margin: 0 0 12px; color: var(--text-2); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
|
||
.track { display: grid; grid-template-columns: repeat(5, 1fr); gap: 4px; margin: 10px 0 14px; }
|
||
.track button { text-align: left; padding: 8px 10px; border-radius: var(--r-md); background: var(--bg-3); font-size: 12px; color: var(--text-2); transition: background-color var(--d-state) ease; }
|
||
.track button .k { display: block; font-size: 11px; color: var(--text-3); }
|
||
.track button.done .k { color: var(--ok); }
|
||
.track button.cur { background: var(--accent-wash), var(--bg-4); color: var(--text); box-shadow: inset 0 -2px 0 var(--accent-lo); }
|
||
.track button.cur .k { color: var(--accent); }
|
||
.track button[aria-current="step"] { outline: 1px solid var(--text-3); }
|
||
.proj-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 10px; }
|
||
.proj { display: grid; gap: 6px; padding: 12px; border-radius: var(--r-lg); background: var(--bg-2); border: 1px solid var(--line); text-align: left; transition: border-color var(--d-state) ease, background-color var(--d-state) ease, transform var(--d-press) var(--ease-out); }
|
||
.proj:active { transform: scale(var(--press-scale)); }
|
||
@media (hover: hover) and (pointer: fine) { .proj:hover { border-color: var(--line-2); background: var(--bg-3); } }
|
||
.proj .pips { display: flex; gap: 3px; }
|
||
.proj .pips i { flex: 1; height: 3px; border-radius: 3px; background: var(--bg-4); }
|
||
.proj .pips i.d { background: var(--ok); }
|
||
.proj .pips i.c { background: var(--accent); }
|
||
.row-actions { display: flex; gap: 8px; flex-wrap: wrap; }
|
||
.shot { display: grid; grid-template-columns: 44px 1fr auto; gap: 12px; padding: 12px 14px; border-radius: var(--r-lg); background: var(--bg-2); border: 1px solid var(--line); align-items: start; }
|
||
.shot .no { font: 600 13px var(--mono); color: var(--accent-lo); }
|
||
.shot .p { color: var(--text-2); font-size: 12.5px; }
|
||
.shot .en { margin-top: 6px; font: 11.5px/1.5 var(--mono); color: var(--text-3); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
|
||
.placeholder { place-items: center; text-align: center; color: var(--text-3); padding: 40px; }
|
||
.placeholder h2 { color: var(--text); font-size: 16px; }
|
||
|
||
/* 原型标记 */
|
||
.proto-flag { font-size: 11px; color: var(--text-3); border: 1px dashed var(--line-2); padding: 2px 8px; border-radius: 999px; white-space: nowrap; }
|
||
.switch { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--text-2); cursor: pointer; white-space: nowrap; }
|
||
.switch input { accent-color: var(--accent-lo); }
|
||
|
||
/* 底部标签栏(窄屏) */
|
||
.tabbar { display: none; }
|
||
.mobile-only { display: none; }
|
||
|
||
/* ---------- 中屏:检视区改为右侧浮层 ---------- */
|
||
@media (max-width: 1180px) {
|
||
.desk, .desk.insp-off { grid-template-columns: minmax(0, 1fr); }
|
||
.desk.insp-off .inspector { opacity: 1; pointer-events: auto; }
|
||
.desk.insp-off .insp-open, .insp-toggle { display: none; }
|
||
.inspector {
|
||
position: fixed; top: 52px; right: 0; bottom: 0; width: 400px; z-index: 40; box-shadow: var(--shadow-float);
|
||
transform: translateX(100%); transition: transform var(--d-drawer) var(--ease-drawer);
|
||
}
|
||
.inspector.on { transform: none; }
|
||
:root[data-reduce="1"] .inspector { transform: none; opacity: 0; pointer-events: none; transition: opacity var(--d-drawer) ease; }
|
||
:root[data-reduce="1"] .inspector.on { opacity: 1; pointer-events: auto; }
|
||
.insp-close { display: inline-flex !important; }
|
||
.search-btn { min-width: 0; }
|
||
.search-btn .lbl { display: none; }
|
||
}
|
||
|
||
/* ---------- 窄屏:底部标签栏 + 输入台底部抽屉 ---------- */
|
||
@media (max-width: 760px) {
|
||
.app { grid-template-columns: 1fr; }
|
||
.rail { display: none; }
|
||
.main { grid-template-rows: 48px minmax(0, 1fr) 56px; }
|
||
.topbar { padding: 0 12px; gap: 8px; }
|
||
.topbar .hide-sm { display: none; }
|
||
.mobile-only { display: inline-flex; }
|
||
.tabbar {
|
||
display: grid; grid-template-columns: repeat(4, 1fr); border-top: 1px solid var(--line); background: var(--bg-2);
|
||
}
|
||
.tabbar button { display: grid; place-items: center; gap: 2px; font-size: 11px; color: var(--text-3); padding-top: 6px; }
|
||
.tabbar button svg { width: 20px; height: 20px; }
|
||
.tabbar button[aria-current="page"] { color: var(--accent); }
|
||
.filters { padding: 8px 12px; overflow-x: auto; }
|
||
.filters .count { display: none; }
|
||
.feed { padding: 12px 12px 4px; }
|
||
.take { grid-template-columns: minmax(0, 1fr) auto; padding: 10px; }
|
||
.take-head { flex-wrap: wrap; row-gap: 2px; }
|
||
.take-out { grid-row: 1 / span 2; }
|
||
.take-state { grid-column: 1 / -1; flex-wrap: wrap; }
|
||
.take-state .txt, .take-state .err-txt { white-space: nowrap; }
|
||
.take-actions { margin-left: auto; }
|
||
.toasts { left: 12px; right: 12px; bottom: 124px; max-width: none; }
|
||
.thumb { width: 108px; }
|
||
.thumb.portrait { width: 72px; }
|
||
.bar { flex-basis: 80px; }
|
||
.composer-wrap { padding: 6px 10px 10px; }
|
||
.composer:not(.expanded) .slots, .composer:not(.expanded) .opt-chip { display: none; }
|
||
.composer:not(.expanded) .prompt { min-height: 40px; max-height: 40px; padding: 10px 12px 2px; white-space: nowrap; overflow: hidden; }
|
||
.composer.expanded { position: fixed; left: 0; right: 0; bottom: 56px; z-index: 45; border-radius: 16px 16px 0 0; border-bottom: 0; box-shadow: var(--shadow-float); }
|
||
.chip { max-width: 170px; }
|
||
.inspector { top: 0; width: 100vw; bottom: 0; z-index: 70; }
|
||
.pop { left: 0 !important; right: 0; top: auto !important; bottom: 0 !important; width: 100vw; border-radius: 16px 16px 0 0; max-height: 78vh; --origin: bottom center; }
|
||
.drawer { width: 100vw; }
|
||
.page { padding: 16px 12px 24px; }
|
||
.hero { grid-template-columns: 1fr; }
|
||
.track { grid-template-columns: repeat(5, minmax(64px, 1fr)); overflow-x: auto; }
|
||
.shot { grid-template-columns: 30px 1fr; }
|
||
.shot .btn { grid-column: 2; justify-self: start; }
|
||
}
|
||
|
||
/* 滚动条 */
|
||
::-webkit-scrollbar { width: 10px; height: 10px; }
|
||
::-webkit-scrollbar-thumb { background: var(--bg-4); border-radius: 6px; border: 2px solid var(--bg); }
|
||
::-webkit-scrollbar-thumb:hover { background: var(--line-2); }
|
||
:root[data-reduce="1"] .composer-wrap::before { opacity: 0.3; }
|
||
|
||
/* 系统「减少动态效果」由 app.js 同步为 :root[data-reduce="1"],所有降级规则只写一处 */
|