/* 沙箱与网络授权动画 —— 场景样式(主页 feature 行 / anim2-demo 页共用) 无边框无底色,融于星空;无 glow。恶意命令红 --danger 定义在 .anim2-window 作用域。 */ /* ───────── 动画容器 ───────── */ .anim2-window { --danger: #d47b6b; /* 恶意命令红,仅本动画作用域 */ width: 100%; height: 100%; display: flex; flex-direction: column; } /* ───────── 场景区 ───────── */ .anim2-stage { position: relative; flex: 1; overflow: hidden; } /* 防御者:右侧,六边形 + 盾牌(尺寸与 04 版本控制的智能体一致:70×70) */ .defender { position: absolute; right: 36px; bottom: 26px; width: 70px; height: 70px; } .defender-avatar { display: block; width: 70px; height: 70px; color: var(--text-1); } .defender-avatar .astrion-avatar { width: 100%; height: 100%; } /* 盾牌举向左上方:顺时针倾斜(尖底朝左下),与六边形左上部分重叠遮挡,实色填充不透底 */ .defender-shield { position: absolute; left: -19px; /* 与角色同比例(96→70,×0.729)等比缩小 */ top: -9px; width: 51px; height: 51px; color: var(--accent); fill: var(--bg-1); transform: rotate(24deg); } /* 盾牌/智能体受击后坐回弹 */ @keyframes defender-brace { 0% { transform: translateX(0); } 30% { transform: translateX(5px); } 60% { transform: translateX(-1.5px); } 100% { transform: translateX(0); } } .defender.is-hit { animation: defender-brace 0.34s ease; } /* ───────── 飞行中的命令块 ───────── */ .cmd-projectile { position: absolute; left: 0; top: 0; font-family: var(--font-mono); font-size: 13.5px; font-weight: 600; color: var(--danger); white-space: nowrap; will-change: transform; /* 装填入场只动透明度:fill both 保持 transform 会压住 JS 逐帧位移动画 */ animation: cmd-load 0.4s ease both; } @keyframes cmd-load { from { opacity: 0; } to { opacity: 1; } } /* ───────── 字符碎片(撞击后炸开) ───────── */ .cmd-shard { position: absolute; left: 0; top: 0; font-family: var(--font-mono); font-size: 13.5px; font-weight: 600; color: var(--danger); will-change: transform, opacity; } /* ───────── 撞击扩散环(描边圆环,非光晕) ───────── */ .impact-ring { position: absolute; width: 41px; /* 随盾牌等比(56×0.729) */ height: 41px; border: 2px solid var(--accent-strong); border-radius: 50%; opacity: 0; pointer-events: none; transform: translate(-50%, -50%) scale(0.3); } .impact-ring.is-active { animation: impact-expand 0.45s ease-out both; } @keyframes impact-expand { 0% { opacity: 0.75; transform: translate(-50%, -50%) scale(0.3); } 100% { opacity: 0; transform: translate(-50%, -50%) scale(1.35); } }