feat(timeline): P1 白模演出预览——时间线+俯视舞台播放
- /api/pointsets 增 anchors(含 pos/rot/kind/npc 坐标),保留 points 名字数组兼容下拉 - 新增 static/timeline.js:线性化主路径→按时长铺多轨时间线 + 2D 俯视白模舞台播放 (走位插值/对话打字机/镜头俯视框示意/playhead/点击跳转);战斗/选择/随机仅标点不模拟 - 工具栏加「演出预览」按钮 + 预览遮罩 + 暗金主题样式 - 时长模型:对话=字数×打字机速度,走位=坐标距离÷速度,动画/镜头给缺省时长 - node 离线测试两样张(含 out_ref+fight+skip)逻辑全过;修掉结局重复渲染 bug 设计文档见主仓 docs/plans/2026-06-13-story-timeline-editor-and-whitebox-preview-design.md (P1 期)
This commit is contained in:
@ -222,3 +222,36 @@ button.mini { padding:2px 8px; font-size:12px; }
|
||||
.pt-choices button { display:block; width:100%; text-align:left; margin:5px 0; }
|
||||
.pt-choices button.locked { opacity:.55; }
|
||||
.pt-q { color:#b89a5a; font-size:12px; margin:8px 0 4px; }
|
||||
|
||||
/* ---- 演出预览(timeline + 白模舞台)---- */
|
||||
.modal.huge { width:840px; max-width:94vw; }
|
||||
.tl-mapinfo { font-size:12px; color:#9a8f7e; margin-left:12px; font-weight:normal; }
|
||||
#tl-stagewrap { background:#15130d; border:1px solid #3a322a; border-radius:6px; overflow:hidden; line-height:0; }
|
||||
#tl-stage { width:100%; height:auto; display:block; }
|
||||
#tl-controls { display:flex; align-items:center; gap:10px; margin:10px 0 6px; }
|
||||
#tl-controls .tip { font-size:11.5px; color:#7a7264; }
|
||||
.tl-time { font-size:13px; color:#e6c878; font-variant-numeric:tabular-nums; min-width:90px; }
|
||||
#tl-tracks { position:relative; overflow-x:auto; overflow-y:hidden; max-height:34vh;
|
||||
background:#19150f; border:1px solid #3a322a; border-radius:6px; padding-top:20px; }
|
||||
.tl-ruler { position:relative; height:16px; border-bottom:1px solid #2a2419; }
|
||||
.tl-tick { position:absolute; top:0; height:16px; border-left:1px solid #2a2419; }
|
||||
.tl-tick span { font-size:9px; color:#6a6256; padding-left:3px; }
|
||||
.tl-lane { position:relative; border-bottom:1px solid #211c15; }
|
||||
.tl-lane-label { position:sticky; left:0; z-index:3; display:inline-block; min-width:54px;
|
||||
padding:2px 6px; font-size:11px; color:#b89a5a; background:#211c15;
|
||||
border-right:1px solid #2a2419; height:100%; box-sizing:border-box; line-height:26px; }
|
||||
.tl-clip { position:absolute; top:3px; height:22px; line-height:22px; padding:0 5px;
|
||||
font-size:11px; color:#1a1710; border-radius:3px; overflow:hidden; white-space:nowrap;
|
||||
text-overflow:ellipsis; cursor:pointer; box-sizing:border-box; box-shadow:0 1px 2px rgba(0,0,0,.4); }
|
||||
.tl-clip.active { outline:2px solid #fff; outline-offset:-1px; z-index:2; }
|
||||
.tl-clip.k-dialogue { background:#7ec8e3; }
|
||||
.tl-clip.k-move { background:#e6c878; }
|
||||
.tl-clip.k-anim { background:#9ee37e; }
|
||||
.tl-clip.k-camera { background:#c89ee3; }
|
||||
.tl-clip.k-branch { background:#9ec0f0; }
|
||||
.tl-clip.k-fight { background:#e38f7e; }
|
||||
.tl-clip.k-reward { background:#e0c060; }
|
||||
.tl-clip.k-ending { background:#e0a850; }
|
||||
.tl-clip.k-stop { background:#d87878; color:#fff; }
|
||||
.tl-playhead { position:absolute; top:0; bottom:0; width:2px; background:#ff5a4a;
|
||||
pointer-events:none; z-index:4; box-shadow:0 0 4px rgba(255,90,74,.7); }
|
||||
|
||||
Reference in New Issue
Block a user