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

独立实现Words have weight可变字体标题，字母随鼠标变粗/轻微膨胀并弹回，点击发出字重冲击波，光标留下细微光点。使用Google Fonts Inter:wght@100..900真正可变字体；禁止旧JS或iframe，字母弹簧状态、测量、Canvas渲染、输入分离。

浅色bg#fafafa/fg#16151a/muted#6b6b6b、暗色#08080a/#f2f2f2/#9a9a9a，切换.5s；居中UI padding56px24px64px、z10，Canvas全屏z0。标题margin0、center、字号clamp(3.2rem,11vw,9rem)/1.05、−.03em；三词inline-block，前两词margin-right.22em，每字slot内glyph，slot可溢出、vertical-aligntop、固定宽。说明13px/1.7、max28rem/margin20，Cursor-driven variable typography. Every character responds / with spring physics. Click to send a shockwave.。CTA margin32/gap12，Get this section和View code、href#、13px500/padding10 28胶囊。social margin36、28px圆头像+1.5px边框/margin-right−8，12px2,400+ creators joined。头像依次https://randomuser.me/api/portraits/{women/44,men/32,women/68,men/75,women/90}.jpg。主题按钮隐藏。

每glyph初始weight300/wVel0/scale1/sVel0/readyfalse/cx0/cy0。lockWidths先清所有slot宽度、glyph设'wght'300，强制head回流，再逐glyph读getBoundingClientRect.width写slot像素宽；measure逐glyph读中心相对舞台，保留实际transform影响。初始化首rAF执行resizeCanvas/lock/measure；fonts.ready再lock/measure并标measured；首次mousemove若未测也执行；resize重设Canvas，若已测则lock，再measure。Canvas按devicePixelRatio缩放。

time0/idle1，每帧time+=.016，idle以.05追随鼠标不在场1/在场0。对ready字母：targetWeight300/targetScale1；鼠标在场时d=hypot(中心−mouse)，.5<d<180则e=(1−d/180)²，targetWeight=300+550e，targetScale=1+.12e。另加(.5sin(.8time+.5i)+.5)*20*idle到targetWeight。wVel+=(targetWeight−weight)*.035，再*=.92，weight+=wVel；scale用同参数独立sVel。glyph font-variation-settings='wght' round(clamp(weight,100,900))，transform scale(scale4位)，hot=max(0,(weight−300)/550)，hot>.1时shadow0 0 30hot px rgba(glow,.15hot)，否则none；glow浅[80,70,55]暗[245,235,210]。

mousemove记录局部x/y，speed=hypot(x−prevX,y−prevY)，prev初始0，activetrue；离开activefalse、x/y−9999。click添加radius0/maxRadius=.6max(W,H)波纹。每帧先更新所有弹簧及DOM，再逆序波纹radius+=5、超max移除；strength=1−radius/max，遍历ready字母，band=abs(距波源−radius)，band<60时k=1−band/60，wVel+=strength*k*45，sVel+=strength*k*.008（影响下一帧）。

清Canvas后，如果active且performance.now−lastTrail>18，添加光点size=max(3,12−.04speed)、age0/maxAge=45+15random，lastTrail=now。逆序光点每帧age++，超过max移除；a=1−age/max，半径size*(.5+.5a)，填色浅[100,90,75]/alpha.045a，暗[245,235,210]/alpha.055a。波纹每圈两道：k=radius/max,a=(1−k)²，颜色浅[140,130,110]/暗[200,190,170]；外圈radius/alpha.22a/线宽2.5*(1−.5k)，内圈.92radius/alpha.1a/线宽8*(1−k)。

首rAF启动入场：Canvas opacity0→1、2s power2.inOut；说明/CTA/social初始opacity0/y30/scale.94/blur6，timeline delay.4，起点.13i、正常1s power4.out。每glyph opacity0/y40/scale.85/blur8→1/0/1/0、.9s power4.out、delay.5+.045i；完成清filter并readytrue，最后一字完成再measure。glyph初始opacity0；保留入场后物理系统直接设置scale行为。退出清理事件/rAF/首帧请求/tween。

验收1440×1000和390×844，固定随机种子：闲置呼吸、悬停、点击波纹、移动光点、离开回落、暗色。当前字重、缩放、光晕、锁定字宽与Canvas像素全部精确对照一致。脚本rewrite/scripts/check-liquid-type.mjs；证据artifacts/rewrite-validation/liquid-type/。

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

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