# Pixels：可直接交给其他 Agent 的复现提示词

独立实现四个像素精灵随滚动逐格溶解，文案同步被扫描线裁切，鼠标可推开像素，点击发冲量。art.json是静态资产：sprites为4张56×44格颜色数组（null空、@主题描边），依次橙怪/青机器人/心/星；story/nav/foot为原文案，保持顺序。禁止旧JS或iframe，拆分像素物理、溶解/绘制和输入。

Poppins，浅bg#f5f4f0/fg#17150f/muted#a29d90，暗#010101/#f3f0e8/#6d685d。全屏100svh，无滚动，Canvas容器居中。上下导航padding clamp(16px,4vw,44px)、top/bottom clamp(16px,3.2vh,30px)，字体clamp(7px,1.9vw,11px)500、字距clamp(.05em,.4vw,.16em)，大写灰色。标题左右4vw/top19.2%、clamp(32px,4.72vw,68px)500/1.16/−.035em；正文右对齐bottom19%/max390/12px1.5，文字fg。手机≤767标题top15%、正文bottom16%/max260/10px。主题按钮隐藏。

C56/R44/PAD32；mobile=W<820。cell=max(4,floor(min(W*(mobile?.82:.46)/56,H*(mobile?.46:.56)/44)))；topY=H*(mobile?.13:.16)，botY=H*(1−(mobile?.11:.13))，注意文案裁切锚点保留此值，与CSS覆盖后的top/bottom不同。Canvas逻辑宽(56+64)*cell、高(44+64)*cell，DPR=min(2.5,devicePixelRatio)，物理尺寸round，imageSmoothingEnabledfalse。

为每格预先存Float32 noise/reveal、Uint8 tear：hash(x)=fract(sin(x)*43758.5453)；noise=(hash(13.13y+2.1)−.5)*1.2+(hash(7.71x+131.7y)−.5)*.7；tear=1+floor(hash(3.3x+9.7y)*3)；reveal=hash((x+1)*12.98+(y+1)*78.23)。位移offX/Y和速度velX/Y也必须Float32Array，保留舍入。

current/target0，每帧current+=(target−current)*.16；advance(d)先target=max(current−1.1,min(current+1.1,target+d))，再限制0…3。pointerenter设overtrue，leave false并禁hover；滚轮仅over时preventDefault并advance(deltaY*.0026)。touchstart记录Y/overtrue；touchmove advance((prevY−y)*.0026*2.4)、preventDefault。首帧startAt，intro=since<250?0:clamp((since−250)/1300)。from=min(3,floor(current))，frac=current−from，to=min(from+1,3)。lineY=botY+3cell+(topY−3cell−botY−3cell)*frac；sprite屏幕顶scrollY=(H−44cell)/2。

鼠标位置相对Canvas；仅在[pad,pad+56cell]×[pad,pad+44cell]内有效，首次进入sx/sy直接置鼠标，之后每帧.2追随。pointerdown在同范围内设click x/y,t0,risingtrue。每格若新旧都null或intro<1且reveal>intro则跳过（不更新物理）。ax=−offX*.045、ay同；hover作用半径hr=10cell，d²在(1e−4,hr²)内则f=(1−d/hr)*.5cell，a+=方向*f；方向由带当前off的格中心减平滑鼠标。click.rising或t>8e−4时，f=1/(1+d²/(20cell)²)*.56cell*click.t，a+=方向*f，d=sqrt(d²)||1。v=(旧v+a)*.86，nextOff=旧off+v；长度超过32cell则缩回该长度；写回Float32数组，但当帧绘制使用未舍入的nextOff。click强度在所有格之后更新：rising每帧+.05到1后false，否则*=.965到≤8e−4归0。

透明清屏后先画格线：浅grid#e7e5dd/每4格#dcd9cf，暗#211f1b/#292621，横竖fillRect1px。cellLine=scrollY+(y+.5)cell+noise*cell，lineY<cellLine取新格否则旧格；位置pad+x/y*cell+nextOff。@浅#141109、暗#efe9dd。intro<1且e=intro−reveal<.16时s=1+.85*(1−e/.16)，offset=(s−1)*cell*.5，globalAlpha=clamp(e/.072)，放大方块居中；否则正常cell方块。每次后alpha复位1。

frac在(.001,.999)时tearAlpha=clamp(.25+6abs(target−current))*.7，否则0。新旧颜色不同且abs(lineY−cellLine)<2.4cell，取新非空否则旧，横画tear格宽、1格高、alpha=tearAlpha；tear3再画亮扫描线y+.4cell、高max(1,.16cell)、alpha.5tearAlpha、浅白/暗#fff4dc。

标题与正文只显示from/to。h=offsetHeight||1，标题u=clamp((lineY−topY)/h)，正文u=clamp((lineY−(botY−h))/h)。from==to clipnone，否则旧inset(0 0 (1−u)*100% 0)，新inset(u*100% 0 0 0)，百分比2位。其他opacity0。水平rule translateY(lineY)，opacity=.5clamp(min(frac,1−frac)/.07)。主题切根data-theme。入场Canvasopacity0→1/.9s power2.out/delay.15；所有标题正文y30→0/.9s power4.out/stagger.04/delay.25；nav/footeropacity0/y−16和16→1/0/.8s power3.out/stagger.08/delay.35。销毁清理rAF/事件/tween。

验收1440×1000/390×844：逐格入场、hover、点击爆散/回位、三次滚动的擦除中帧/四精灵、逆向、暗色、触摸推进。当前Canvas像素、文案裁切与扫描线状态全一致。脚本rewrite/scripts/check-pixels.mjs，证据artifacts/rewrite-validation/pixels/，16ms受控帧。

## 本地图片与中英文（2026-09-21 更新）

本轮已接入本地公开图片和中英双语。复现时同时遵循 [共享规范](../../shared/README.md)：沿用当前本地图片路径，使用共享词典与语言偏好（`zh` / `en`），覆盖动态内容、辅助标签和 Canvas 文字；不要恢复旧的远程图片链接。中文拆字标题应先翻译再拆分，并保持原有动画机制。图片来源与替换映射在共享规范中列出。
