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

独立实现Canvas摄影心形到照片墙，保留本目录 index.html 静态CSS/文案与people.json，图片 ../../amour-gallery/assets/p01.jpg 到p40.jpg。不读取旧JS。Inter400/500/600/800，Canvas背景#0b0b0d，DPR上限2。标题AMOUR为800/负字距−.04em、difference混合；四角文案、中央♥、隐藏但hover/focus出现的CTA、详情玻璃卡保留模板。

## 确定布局
W/H为room尺寸，heartH=min(.655H,W*(W/H<.9?.9:.94)/1.06)，heartW=1.06heartH，cx=W/2，top=(H−heartH)/2，gap=max(1.5,.006heartH)。词块宽.44heartW、高.17heartH，中心(cx,top+.34heartH)，标题字号.92词块高。

行权重[1,1,.655,.575,.52,.41,.32,.3,.17]，unit=heartH/权重和。每行ch=unit*weight,cw=ch/1.16，v=.84−(行y+ch/2−top)/heartH*1.84，count=ceil(heartW/cw)+2，候选中心x=cx+(i−(count−1)/2)*cw。归一化u=(中心x−cx)/heartW*2.24。a=v−.34，outer=abs(a)<.5?.62+sqrt(.25−a²):0；a<=0时outer=max(outer,1.12*((v+1)/1.34)^.59)；inner=(a<=0或a>=.5)?0:max(0,.62−sqrt(.25−a²))。仅inner<=abs(u)<=outer保留；候选矩形与词块交叠宽>.38cw且高>.38ch则跳过。最终矩形xy加gap/2、wh减gap。

固定LCGseed0x13527d1，每次seed=(1664525*seed+1013904223)>>>0，random=seed/4294967296。墙columns=max(3,round(sqrt(W/H*n)))，rows=ceil(n/columns)，grid1.2W×1.2H、起点−.1W/−.1H，cellW/H相应除列/行；pad=.22min(cellW,cellH)，maxW=max(12,min(cellW−pad,(cellH−pad)/1.16))。行优先生成槽位，然后从末到首Fisher–Yates打乱。

每卡随机顺序：depth=random^1.8；fw=maxW*mix(.42,1,depth),fh=1.16fw；jx/jy=max(0,(cellW/H−pad−fw/h)/2)，槽中心bx/by，fx=bx+(2random−1)*jx、fy同理。与词块的扩展交叠mx=wordW/2+fw/2+12−abs(fx−cx)，my=wordH/2+fh/2+12−abs(fy−词块中心y)；二者>0则沿较小轴推出，再clamp到槽中心±jitter；y方向符号判断用fy>=词块top。再依次tilt=(random−.5)*.05、photo=i%40、drop=H*(.4+.35random)、spin=(random−.5)*.5、delay=.34+row*.12+.1random；fdelay=.8*距(cx,top+.45heartH)/max(heartW,heartH)。最后按depth升序绘制。resize重建，保证随机相同。

## 状态与绘制
m初始0，首帧记时间起点。自动delay3.8秒后m→1，2.1秒power2.inOut。滚轮正/负或CTA把m→1/0，1.6秒power3.inOut、overwrite true；CTA对应切文案。pointer初始−9999，move记录room内xy/inside，leave清空；每帧smoothXY+=(target−smooth)*.12。

push：m>.002且inside时，dx=sx−fx,dy=sy−fy,d=hypot，R=.3min(W,H)；1<=d<R才推，k=smoothstep(1−d/R)*m*.45*mix(.6,1,depth)*40，位移=−(dx,dy)/d*k。hit从绘制列表末端倒查，以fx/fy+push为中心、fw/fh矩形命中（不含倾斜与hover放大）。只有m>.8才hover；点卡只在m>=.8且目标不是CTA/详情card时有效。

每帧appear=clamp((t−delay)/1.18)，e=1−(1−appear)^3，局部m=smoothstep(clamp((全局m−fdelay*.5)/(1−fdelay*.5)))。中心从心卡中心（y另加(1−e)*drop）插值到fx/fy，再加push。wh对应插值，scale=mix(.86,1,e)*(hover?1.06:1)。alpha=clamp(appear*2.2)，先rotate(spin*(1−e))，再rotate(tilt*m*(.55+.8depth))，再scale。照片矩形clip、cover，横向居中、纵向裁切系数.36。未加载色#1a1a1e。dim=m*(1−depth)^1.7*.34*(非hover)，>.004时以globalAlpha=min(1,dim)覆盖#0b0b0d。appear<=0不画。

♥ opacity=clamp((全局m−.7)/.3)，AMOUR opacity=clamp(1−1.4m)，两处copy=clamp(1−1.6m)。详情按卡photo取people，显示照片、name、tags与✕；from y20/opacity0/scale.96到0/1/1，.45秒power3.out。✕或sheet空白关闭；不自行添加Escape规则。清理事件、rAF、tweens。

验收两个视口1440×1000/390×844，以16ms时间步检查800ms组装、2600ms心形、4600ms展开中途、6600ms墙，hover640ms、详情600ms、反向800/2000ms。运行 ../scripts/check-amour.mjs。已验证所有这些Canvas像素与详情状态一致。

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

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