/* 统一层次：浅色场景底、立体主体、前景细节；主题颜色沿用各项目。 */
.cover-v2{isolation:isolate;display:grid!important;place-items:center;perspective:850px;--cover-x:0;--cover-y:0;--cv-duration:1.5s;--cv-sway-duration:1.8s;--cv-stagger:.14s;--cv-paper:#fffdf5;--cv-tint:#e3e9d8;--cv-border:#758b6d;--cv-shadow:#293a301e;--cv-detail:#69805d}
.cover-v2 .cover-scene{display:block;width:88%;height:78%;max-width:390px;overflow:visible;z-index:1;stroke:none;transform:rotateX(calc(var(--cover-y)*-5deg)) rotateY(calc(var(--cover-x)*7deg));transition:transform .3s ease;pointer-events:none}
.project-card .cover-v2{height:240px}
.cover-v2 .art-index{top:13px;left:17px;right:15px;font-size:7px;letter-spacing:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;z-index:3;pointer-events:none}
.cover-v2 .art-caption{right:13px;bottom:10px;font-size:8px;z-index:3;pointer-events:none}
.cover-v2 .cover-image{transition:transform .35s ease;transform:translate(calc(var(--cover-x)*3px),calc(var(--cover-y)*3px)) scale(1.015)}
.cover-v2 .cv-orbit{position:absolute;border:1px solid var(--cv-border);opacity:.12;border-radius:50%;width:77%;height:115%;pointer-events:none;transition:transform .6s ease}
.cover-v2 .cv-orbit-one{transform:rotate(-32deg);left:8%;top:-13%}.cover-v2 .cv-orbit-two{width:48%;height:80%;right:-12%;bottom:-37%}
.cover-v2.is-playing .cv-orbit-one{animation:cv-orbit var(--cv-sway-duration) ease-in-out both}
.cover-v2 .cv-paper,.cover-v2 .cv-window{fill:var(--cv-paper);stroke:var(--cv-border);stroke-width:.7}
.cover-v2 .cv-tint,.cover-v2 .cv-page-shadow{fill:var(--cv-tint);stroke:var(--cv-border);stroke-width:.6}
.cover-v2 .cv-shadow{filter:drop-shadow(4px 7px 5px var(--cv-shadow))}
.cover-v2 text{fill:var(--art-ink);stroke:none;font-family:var(--serif);font-weight:400}.cover-v2 .cv-micro{font:8px var(--sans);letter-spacing:.7px;opacity:.7}.cover-v2 .cv-small{font:10px var(--sans)}.cover-v2 .cv-label{font-size:13px}.cover-v2 .cv-word{font-size:16px}.cover-v2 .cv-symbol{font-size:43px}.cover-v2 .cv-code{font:28px monospace}.cover-v2 .cv-root-word{font-size:41px}
.cover-v2 .cv-rule,.cover-v2 .cv-lines,.cover-v2 .cv-line{fill:none;stroke:var(--cv-border);stroke-width:1}.cover-v2 .cv-rule{opacity:.55}.cover-v2 .cv-lines{opacity:.4;stroke-width:2}
.cover-v2 .cv-chip{fill:var(--cv-paper);stroke:var(--cv-border);stroke-width:.6}.cover-v2 .cv-seal{fill:var(--art-ink);stroke:var(--cv-border);stroke-width:.7}.cover-v2.art-word .cv-seal+text,.cover-v2 .cv-core-label{fill:var(--cv-paper)}
.cover-v2 .cv-halo{fill:var(--cv-tint);opacity:.45}.cover-v2 .cv-ring{fill:none;stroke:var(--cv-detail);stroke-width:1.6}
.cover-v2 .cv-node{fill:var(--cv-paper);stroke:var(--cv-border);stroke-width:1.2}.cover-v2 .cv-dot{fill:var(--cv-detail)}
.cover-v2 .cv-float{transform:translate(calc(var(--cover-x)*-2px),calc(var(--cover-y)*-2px));transition:transform .35s ease}
.cover-v2 .cv-book-cloth{fill:var(--cv-tint);stroke:var(--cv-border);stroke-width:1}.cover-v2 .cv-poem-character{font-size:74px}.cover-v2 .cv-poem{font-size:10px;letter-spacing:2px}.cover-v2 .cv-side-note{font-size:9px;letter-spacing:2px;opacity:.7}.cover-v2 .cv-bookmark{fill:var(--cv-detail);opacity:.7}
/* 诗语恢复原立体书本：整体轻晃，书脊、文字和纸页一起移动。 */
.cover-v2.art-poetry{grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr)}
.cover-v2 .poetry-scene{position:relative;grid-area:1/1;height:84%;container-type:inline-size;transform:translate(calc(var(--cover-x)*2px),calc(var(--cover-y)*2px))}
.cover-v2 .poetry-scene .poetry-book{left:24%;top:8%;width:52%;height:80%;padding:12px 13px 10px;display:flex;flex-direction:column;transform:rotate(-7deg);transform-origin:50% 65%}
.cover-v2 .book-top{font-size:clamp(7px,2cqw,9px);padding-bottom:6px;flex-shrink:0}.cover-v2 .book-top span:first-child{font-size:clamp(10px,3cqw,13px)}
.cover-v2 .book-body{height:auto;flex:1;min-height:0;gap:9px}.cover-v2 .book-character{font-size:clamp(46px,20cqw,84px)}.cover-v2 .poem-lines{font-size:clamp(8px,2.5cqw,11px);line-height:1.75;letter-spacing:1px}
.cover-v2 .book-bottom{font-size:clamp(6px,1.8cqw,7px);padding-top:6px;gap:4px;letter-spacing:0;flex-shrink:0}
.cover-v2 .poetry-scene .vertical-note{position:absolute;right:2%;top:14%;font-size:clamp(8px,2.4cqw,10px);writing-mode:vertical-rl;letter-spacing:2px}
.cover-v2 .poetry-scene .floating-label{left:25%;bottom:5%;max-width:74%;padding:7px 10px;font-size:clamp(8px,2.5cqw,11px);z-index:2}
.cover-v2 .cv-response,.cover-v2 .cv-root-line,.cover-v2 .cv-link-trace,.cover-v2 .cv-check{fill:none;stroke:var(--cv-detail);stroke-width:1.5;stroke-linecap:round}
.cover-v2 .cv-landscape{fill:var(--cv-tint);opacity:.65}.cover-v2 .cv-selection{fill:none;stroke:var(--cv-detail);stroke-width:1.5}.cover-v2 .cv-scan{fill:var(--cv-detail);opacity:0}
.cover-v2 .cover-route{display:inline}.cover-v2 .cv-route-line{fill:none;stroke:var(--cv-detail);stroke-width:1.8}.cover-v2 .cv-highlight{fill:var(--cv-detail);opacity:.17}
.cover-v2 .cv-flow-trace{fill:none;stroke:var(--cv-detail);stroke-width:2;stroke-linecap:round;stroke-dasharray:5 4;opacity:0}
.cover-v2 .cv-map-grid{fill:none;stroke:var(--cv-border);stroke-width:.5;opacity:.14}.cover-v2 .cv-edges{fill:none;stroke:var(--cv-border);stroke-width:1.4}.cover-v2 .cv-pulse-ring{fill:none;stroke:var(--cv-detail);opacity:.25}
.cover-v2 .cv-folder-back{fill:var(--cv-border);opacity:.5}.cover-v2 .cv-folder-front{fill:var(--cv-tint);stroke:var(--cv-border);stroke-width:.7}
.art-debate.cover-v2{--cv-tint:#f1dfcb;--cv-border:#b39279;--cv-detail:#986e53}.art-dictionary.cover-v2{--cv-tint:#d4e6e9;--cv-border:#86a7b0;--cv-detail:#537e8d}.art-word.cover-v2{--cv-tint:#f0e5c9;--cv-border:#b7a16b;--cv-detail:#977e43}.art-cards.cover-v2{--cv-tint:#e4dff0;--cv-border:#a49abb;--cv-detail:#86789e}.art-papers.cover-v2{--cv-tint:#e0e6ee;--cv-border:#94a1b9;--cv-detail:#829a72}.art-tree.cover-v2,.art-mods.cover-v2{--cv-tint:#e9dece;--cv-border:#ae9980;--cv-detail:#7c8965}
[data-theme="dark"] .cover-v2{--cv-paper:#2c3b33;--cv-tint:#40533e;--cv-border:#7d9376;--cv-detail:#b4cb9e;--cv-shadow:#0004}
[data-theme="dark"] .art-debate.cover-v2,[data-theme="dark"] .art-tree.cover-v2{--cv-paper:#40392f;--cv-tint:#564936;--cv-border:#96816a;--cv-detail:#d3b791}
[data-theme="dark"] .art-dictionary.cover-v2{--cv-paper:#2b3d45;--cv-tint:#3c5260;--cv-border:#7294a6;--cv-detail:#a4ced8}
[data-theme="dark"] .art-word.cover-v2{--cv-paper:#3d3a2e;--cv-tint:#524c34;--cv-border:#a89a65;--cv-detail:#daca92}
[data-theme="dark"] .art-cards.cover-v2,[data-theme="dark"] .art-papers.cover-v2{--cv-paper:#373749;--cv-tint:#49465d;--cv-border:#9690ae;--cv-detail:#b8b1da}
/* 一轮的首尾与静态姿态相同；手机留更长的阅读时间，完成信号由真实动画提供。 */
.cover-v2.is-playing .poetry-book{animation:poetry-sway var(--cv-sway-duration) ease-in-out both}
.cover-v2.is-playing .cv-dialogue-left{animation:cv-left var(--cv-duration) ease-in-out both}.cover-v2.is-playing .cv-dialogue-right{animation:cv-right var(--cv-duration) ease-in-out var(--cv-stagger) both}
.cover-v2.is-playing .cv-response,.cover-v2.is-playing .cv-root-line,.cover-v2.is-playing .cv-link-trace,.cover-v2.is-playing .cv-check{animation:cv-draw var(--cv-duration) ease-in-out both;stroke-dasharray:180;stroke-dashoffset:0}
.cover-v2.is-playing .cv-scan{animation:cv-scan var(--cv-duration) ease-in-out both}.cover-v2.is-playing .cv-lookup{animation:cv-lift var(--cv-duration) ease-in-out both}
.cover-v2.is-playing .cv-root-prefix{animation:cv-left var(--cv-duration) ease-in-out both}.cover-v2.is-playing .cv-root-stem{animation:cv-right var(--cv-duration) ease-in-out both}
.cover-v2.is-playing .cv-card-back{animation:cv-card-back var(--cv-duration) ease-in-out both}.cover-v2.is-playing .cv-card-front{animation:cv-card-front var(--cv-duration) ease-in-out both}
.cover-v2.is-playing .cv-flow-trace{animation:cv-flow var(--cv-duration) linear both}.cover-v2.is-playing .cv-code-panel{animation:cv-lift var(--cv-duration) ease-in-out both}
.cover-v2.is-playing .cv-highlight{animation:cv-mark var(--cv-duration) ease-in-out both;transform-box:fill-box;transform-origin:left center}.cover-v2.is-playing .cv-highlight-next{animation-delay:var(--cv-stagger)}
.cover-v2.is-playing .cv-pulse-ring{animation:cv-pulse var(--cv-duration) ease-in-out both;transform-box:fill-box;transform-origin:center}
.cover-v2.is-playing .cv-tree-row{animation:cv-row var(--cv-duration) ease-in-out both}.cover-v2.is-playing .cv-row-2{animation-delay:var(--cv-stagger)}.cover-v2.is-playing .cv-row-3{animation-delay:calc(var(--cv-stagger)*2)}
@keyframes cv-orbit{0%,100%{transform:rotate(-32deg)}45%{transform:rotate(-25deg) scale(1.025)}}
@keyframes poetry-sway{0%,100%{transform:rotate(-7deg) translateY(0)}32%{transform:rotate(-3deg) translateY(-4px)}68%{transform:rotate(-8deg) translateY(-1px)}}
@keyframes cv-left{0%,100%{transform:translateX(0)}45%{transform:translateX(-7px)}}@keyframes cv-right{0%,100%{transform:translateX(0)}45%{transform:translateX(7px)}}
@keyframes cv-draw{0%,100%{stroke-dashoffset:0;opacity:1}25%{stroke-dashoffset:180;opacity:.25}78%{stroke-dashoffset:0;opacity:1}}
@keyframes cv-scan{0%,100%{opacity:0;transform:translateY(0)}20%{opacity:.6}70%{opacity:.6;transform:translateY(31px)}85%{opacity:0;transform:translateY(31px)}}
@keyframes cv-lift{0%,100%{transform:translate(calc(var(--cover-x)*-2px),calc(var(--cover-y)*-2px))}40%{transform:translate(calc(var(--cover-x)*-2px),calc(var(--cover-y)*-2px - 6px))}}
/* CSS 动画和静态旋转用相同的 SVG 坐标原点，避免落回 transform 属性时位置跳变。 */
.cover-v2 .cv-card-back{transform-box:view-box;transform-origin:118px 90px;transform:rotate(-12deg)}.cover-v2 .cv-card-front{transform-box:view-box;transform-origin:190px 114px;transform:rotate(3deg)}
@keyframes cv-card-back{0%,100%{transform:rotate(-12deg) translate(0,0)}45%{transform:rotate(-17deg) translate(-4px,-2px)}}@keyframes cv-card-front{0%,100%{transform:rotate(3deg) translate(0,0)}45%{transform:rotate(0deg) translate(4px,-4px)}}
/* 实线保持原样，运动虚线单独渐入渐出；两端隐藏，整四个虚线周期后回到同一相位。 */
@keyframes cv-flow{0%{stroke-dashoffset:36;opacity:0}18%,78%{opacity:.85}100%{stroke-dashoffset:0;opacity:0}}@keyframes cv-mark{0%,100%{transform:scaleX(1)}20%{transform:scaleX(.1)}75%{transform:scaleX(1)}}
@keyframes cv-pulse{0%,100%{transform:scale(1);opacity:.25}45%{transform:scale(1.18);opacity:.65}}@keyframes cv-row{0%,100%{transform:translateX(0)}45%{transform:translateX(5px)}}
.cover-controls{display:flex;justify-content:flex-end;margin:-12px 0 18px}.cover-replay{font:12px var(--sans);padding:7px 12px;background:var(--surface-2);color:var(--accent);border:1px solid var(--line);border-radius:20px;min-height:36px}.cover-replay:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
@media(max-width:560px),(hover:none) and (pointer:coarse){.cover-v2{--cv-duration:3s;--cv-sway-duration:3.4s;--cv-stagger:.24s}}
@media(prefers-reduced-motion:reduce){.cover-v2 *{animation:none!important;transition:none!important}.cover-v2 .cover-scene,.cover-v2 .cover-image,.cover-v2 .cv-float{transform:none!important}.cover-v2 .cv-scan{opacity:0!important}}
@media(max-width:360px){.project-card .cover-v2{height:220px}}
