# Marathon：给其他 Agent 的复现提示词

用Three.js/GLTFLoader/GSAP独立实现翻滚的3D iPhone App展示。使用../../marathon-gallery/的vendor库，assets/iphone.glb、assets/marathon-bg.jpg与slides.json所列照片（均在该原目录assets下）。本目录slides.json和index.html静态样式可复用，不读取旧JS。背景固定跑步照片，不改为数据中的渐变；渐变只用于App屏幕。Playfair Display500/600、Inter400/500/600/700。

场景renderer alpha/antialias、DPR<=2、outputEncoding=sRGBEncoding。PerspectiveCamera(32,W/H,.1,80)，位置桌面(0,0,23)、W<767时(0,3,32)。Ambient白.55；Directional暖#fff5e6/1.6@(3,6,5)，冷#cfe0ff/.6@(-4,2,3)，Point#ffd8c0/.8@(0,2,-6)。模型包围盒最长边缩放到10.57，内组平移−原中心*scale、scale统一。克隆每个mesh材质，name包含screen_bg或screen bg则color#020208、emissive=accent/.08；其他glass/screen/flash/logo/camera_pixel保持原材质；剩余有color的改bodyColor、metalness.82/roughness.38。

找到最后一个材质名含screen_bg的mesh，世界包围盒size*scale、center=(屏幕中心−模型中心)*scale。每台手机另加PlaneGeometry(.995size.x,.995size.y)，MeshBasicMaterial/toneMapped false贴App CanvasTexture，平面中心z=screenCenter.z+size.z/2+.012。CanvasTexture encoding sRGB、anisotropy4。保留每屏3组复制，总数slides.length*3；不是单一模型换图片。

## App屏幕绘制
Canvas620×1340。渐变bgFrom@0/bgVia@.55/bgTo@1。非live-run顶部照片高1340*.46，cover居中clip；从照片高*.55到满高叠透明→bgFrom渐变。标题600 30px Inter @48,1340*.55；eyebrow600 15px/accent @48,1340*.5；subtitle按句号后空白分行400 19px/fgMuted，@48,1340*.6+i*28。四条chips y=1340*.68+i*88，白.55圆角框(40,y,540,72,r22)，label700 13px/fgMuted @(62,y+28)，value600 26px/fgPrimary @(62,y+58)，accent色小圆角块(524,y+22,34,28,r10)。圆角路径采用moveTo+四次arcTo。

live-run在上述绘制之后覆盖全画布#20160f：白色9:41/22px@(40,58)，Sunset trail/bold44px@(36,150)，灰#b5a99a LIVE RUN · GPS CONNECTED/18px@(36,190)（原文空格保留）。16条地形线#6c5340/2px：从(0,280+i*50)到Bezier(200,180+i*50,400,420+i*30,620,300+i*50)。路线#ef6225/8px从(255,900)，三段Bezier(95,810,390,760,300,620)、(460,720,490,650,400,460)、(340,260,190,320,220,480)。起点白圆r11。白字PACE[15空格]DISTANCE/20px@(36,1060)，5:32[9空格]4.7/54px@(36,1128)，ELAPSED/20px@(36,1198)，23:55/76px@(36,1290)，橙圆(532,1240,r40)。

## 运动与UI
pos=target=slides.length，从中间组开始。wheel target+=deltaY*.0016，touch target+=(旧Y−新Y)*.006，每帧pos+=(target−pos)*.085。槽i的rel=i−pos，y=−16.8rel,z=−1.2abs(rel)，rotationY=relπ,rotationX=.06rel，仅abs(rel)<1.45可见。原案例没有首尾重定位，不自行增加循环滚动。

active=正模(round(pos),slides.length)，变化时更新eyebrow/title/subtitle/vibeTag、4颗chip和指示点。初始先instant展示第0屏，但current仍−1，首帧会再触发第0屏入场。文案从opacity0/y22/blur8到1/0/blur0，.8秒power3.out/stagger.07；chip GSAP从opacity0/scale.9到1/1，.7秒back.out(1.6)/stagger.05，同时每帧位置/透明度覆盖保持原效果。

clock=rafTimestamp/1000，frac=pos−round(pos)，facing=max(0,cos(fracπ))，a=chip.angle+clock*.06，r=chip.radius*min(W,H)*.052；translate(-50%,-50%) translate(cos(a)*r,sin(a)*r*.62+sin(clock*.9+i)*6)，坐标1位；scale=.9+.1*z+.1*facing，3位；opacity=.95*facing，3位。

文案桌面left5vw/top8vh/max410，h2字号clamp(64px,8.5vw,122px)/.96、400；手机最终top12%、h2 40px、正文隐藏、eyebrow/vibe8px。STRIDE右上白字，rail/hint隐藏。加载完照片/模型生成全部手机后loading加gone。resize更新renderer尺寸/相机宽高比与位置，不改变原DPR更新规则。清理动画、事件、贴图/几何/材质/renderer。

验收1440×1000和390×844、16ms固定帧：640ms入场、2640ms稳定、wheel625后128/1728ms、wheel1250后1600ms、−1875后1600ms、touch500→300后1400ms。运行 ../scripts/check-marathon.mjs，所有手机姿态、每屏Canvas像素、文案和chips状态一致。

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

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