The Renaissance
Edition拆解
这不是观感笔记。以下每一个色值、缓动、时长、着色器公式,都来自 shopify.com/editions/winter2026 的计算样式、样式表原文、三十个 JS chunk 与十三份 Theatre.js 状态文件的直接抽取。
Editions 是 Shopify 每半年一次的产品发布会网站,每一届自造一个世界观。这一届的世界观写在标题的字缝里:标题 SVG 把「ai」两个字母独立成组、改花体斜体、单独滑入(实锤:title__word--ai 组 + 独立 slide 动画)——官方文案只说「现代时代的文艺复兴」,把双关留给看得见的人(AI 释义为推断,置信高)。
三层设计意图(推断,证据充分)
| 意图 | 证据 |
|---|---|
| 正典与异端的拼贴:文艺复兴油画世界里插入滑板、咖啡杯、购物袋、紫色眼罩、亮粉毛线帽 | hero 美术、Sidekick 章肖像、#beanie 彩蛋(均实锤存在) |
| 把「作坊」搬进页面:达·芬奇构造线、黄金分割、罗马数字、花体首字,全部用工程手段实现而非贴图 | SVG pathLength 描线、CSS counter 罗马数字、ImperialScript 首字下沉(样式表实锤) |
| 自证产品力:页面本身就是一家 Shopify 店——帽子用真实 variant 走真实 cart 链接结账 | storeURL/cart/variantId:quantity(JS 原文实锤) |
营销层 vs 产品层
这站是纯营销层:Hydrogen(Remix)+ Oxygen 边缘托管,内容从 CMS 下发(连 Theatre.js 动画时间轴都是 CMS 资产)。它不承载产品功能,唯一的「产品」是那顶 $14.52 的毛线帽——而这恰是全站最锋利的一句自我介绍:发布会网站本身就是一家可结账的 Shopify 商店。
外部视角(全部带来源,清单见文档)
| 事实 | 出处 |
|---|---|
| 2025-12-10 发布,官方口径「over 150 launches」;产品副总裁公开信解释文艺复兴主题:进步、势能、勇气与新开端 | shopify.com/news 两篇官方文 |
| Awwwards Site of the Day(2026-02-09,总分 7.92)+ Developer Award(动效与过渡子项 9.40,全项最高)+ 当月 Site of the Month | awwwards.com/sites/the-renaissance-edition |
| CSSDA Website of the Day(终审 8.71:UI 8.73 / UX 8.63 / 创新 8.76) | cssdesignawards.com |
| 由 Shopify 内部创意团队制作(Awwwards 提交方为 Shopify Design;上届幕后文自述设计、开发、动效、内容全内部,近四届均为 Hydrogen 店铺) | 官方幕后文 + Awwwards 署名 |
| webgpu.com 收录并评为「半画廊半技术演示」:滚动驱动的辉光、折射着色器与体积云 | webgpu.com/showcase |
Editions 世界观年表(官方归档页,一年两届「Every six months」):Summer '22 Connect to Consumer → Winter '23 Built to Last → Summer '23 Imagine My Business → Winter '24 Foundations(Awwwards HM)→ Summer '24 Unified(SOTD)→ Winter '25 Boring(刻意无聊的极简站 + CRT 彩蛋宇宙)→ Summer '25 Horizons(内置浏览器赛车游戏)→ Winter '26 Renaissance(本届)→ Spring '26 Everywhere(点云体积光,官方在 Codrops 发工程复盘)。
/editions/winter2026/key(HTTP 200,注入 three@0.159 import map 的独立彩蛋场景);URL 追加 ?theatre 参数会动态加载 Theatre.js Studio 编辑器(发布版里留着创作后门)。公开网络上尚无人记录这两处。双主角:暖纸 #f7f7ee 与橄榄近黑 #292919(词频并列第一,各 23 处)。灰阶带橄榄底色而非中性灰——纸张氧化的颜色。唯一的品牌强调是 Sidekick 紫;亮粉只存在于画作里,CSS 里一处都没有。
data-nav-theme、data-sidebar-theme、data-title-theme,各有独立阈值,由 WebGL 幕布位置实时计算(见第 VI 章)。light 态时 body 直接落在幕布同色 #dcdcd0 上,网页背景与 WebGL 画面无缝相接。
三角关系:怪诞体标题(Neue Montreal,商业字体)、衬线叙事(HWCigars,家族名实锤,风格近 Times 展示切)、花体点睛(Imperial Script)。第四支 Inter Variable 只服务全局导航。正文竟然全部用 700 字重——小号加粗,是这站排版最反直觉的决定。
| 层级 | 字族 | 移动端 | 桌面 clamp | 行高 / 字距 |
|---|---|---|---|---|
| headline-1 | NeueMontreal 700 | 72px | 120→220px(10.965vw) | .9 / −.03em |
| headline-2 | NeueMontreal 700 | 64px | 100→140px | .9 / −.03em |
| headline-3 | NeueMontreal 700 | 54px | 54→64px | .9 / −.02em |
| headline-4/5/6 | NeueMontreal 700 | 32 / 24 / 18px | 固定 | .95 / −.02~.03em |
| narrative-1/2/3/4 | HWCigars 400 | 28 / 24 / 20 / 12px | 32→48 / 25→29 / 20 / 12px | .96–1.07 / −.04~.05em |
| bodycopy-1/2 | NeueMontreal 700 | 16 / 14px | 14 / 11px(桌面更小) | 1.1 |
| script-1 / drop-cap | ImperialScript 400 | 70px | 96→120px | .96 / −.02em |
text-box: trim-both cap alphabetic——2024 年落地的 leading-trim 标准,把字框上下的空白裁到大写高度与基线,使 .9 的行高不糊排。全站是这个新特性目前最大规模的生产使用之一。日语环境自动放弃花体与衬线(:lang(ja) 覆写),德语标题降一档字号防爆行。栅格(实锤)
| 总容器 | max-width 105rem(1680px),container-type: inline-size |
| 左侧手稿框 | 固定 1/5 宽 · aspect 340/464 · min(340px, 100vw−24px) |
| 内容列 | 右侧 4/5 · 12 列 · gap clamp(12px,1vw,16px) |
| 断点 | 599 / 768 / 939 / 940 / 1181px · global-lg=58.75rem(940) |
| 章节 hero | min-height 70svh,桌面 140svh(双拍) |
| 产品卡列宽 | numberOfColumns 12/6/4/3 → col-span 映射 |
Lenis(原文实锤)
new Lenis({
duration: 1,
easing: t => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // easeOutExpo
orientation: "vertical",
smoothWheel: true,
wheelMultiplier: 1
}) // 仅桌面;移动端原生滚动 + 场景端 0.5 lerp 平滑
分区进度机(JS 原文实锤)
每章是一个进度区间。区间长 = 章高 + 视口高;从第三章起提前 20% 视口开始交叉(earlyCrossfade: .2)。进度写进 zustand,再由每章的 Theatre.js sheet 消费:
sequencePosition = progress × (sectionH + vh) / vh // 每章时间轴长度 10;hero 开场另加 −1→0 的 5s 序曲
导航明暗阈值(实锤)
| 信号 | 切 light 的窗口 |
|---|---|
| 倒数第二章 transitionProgress | sidebar ≥.4 · title ≥.7 · nav ≥.75 |
| finalOverlayPosition | sidebar [−.85,.15] · title [−.3,.7] · nav [−.25,.75] |
| 切换瞬间 | data-*-immediate 骨架帧禁过渡 |
content-visibility:auto + contain-intrinsic-size;产品卡视频退出视口即移除 <source> 并 load() 释放解码器;Rive 进视口 300/600ms 后才实例化。五万像素高的页面就是这样保持顺滑的。这站最被低估的事实:所有 WebGL 编排不写在代码里。十三份 Theatre.js 工程状态 JSON(Hero + 十二章)作为 CMS 资产下发,设计师在 Theatre 编辑器里排好相机、资产层、辉光、幕布的关键帧,前端只做一件事——把滚动进度写进 sequence.position。
场景构成(实锤)
| 画面 | 多层图像平面(bg diffuse KTX2 + 每章 desktop.ktx2 资产层),非全 3D——「多平面立体书」 |
| 相机 | fov 10–120 可编排 · freeOrbit 态锁 fov 90 · gaze 指针注视 0–1 |
| 灯光 | light-1 红 light-2 蓝(补色打底),环境贴图 studio_small_09 PMREM KTX2 |
| 辉光 | bloom 默认 luminanceThreshold .9 / smoothing .025 / radius .85;Theatre 轨道量程 0–100,默认 8 |
| 幕布 | overlay position −1→1(含 mobilePosition 独立轨),颜色默认 #dcdcd0;darken 0–1;fadeCenter xyz ±10 |
| 纹理管线 | KTX2 流式解码:读满 80 字节即解析头,ZSTD wasm + worker 池边下边播 |
画质分级(JS 原文实锤)
detect-gpu → tier 0 → fallback(静态图版) tier 1 / 2 / 3 → low / medium / high 移动端默认 → fallback(可 forceWebGL) 运行时降级链 → high → medium → low
Hero 开场序曲(实锤)
加载完成 + 无 hash + scrollY<100 → 延迟 100ms,5000ms 内 offset = −1 + (1 − (1−t)³) // cubic ease-out → sequence.position 从「负一个视口」推进到 0
这就是首屏那记缓慢的「入画」运镜。跳章直达或已滚动时直接置 0,绝不强迫看片头。
蝴蝶——会呼吸的实例化群(着色器原文实锤)
float flapSpeed = 4.0 + rand.y * 4.0;
float flapAmp = 0.8 + rand.z * 0.5;
float t = uTime * 1.2 * flapSpeed + rand.x * 6.28;
float wave = sin(t)
+ sin(t * 2.1 + rand.w * 3.14) * 0.2
+ sin(t * 0.37 + rand.z * 5.0) * 0.3; // 三层叠波
float wingBlend = smoothstep(0.02, 0.4, abs(pos.x)); // 身体不动翅膀动
float asym = 1.0 + sign(pos.x) * sin(t*0.7 + rand.w*6.28) * 0.08;
pos.y += smoothstep(1.0, -0.5, wave) * 0.25; // 落翼时抬升
| 数量上限 | 50 只(Kt=50) |
| 几何与贴图 | rest.json(顶点/UV/索引)+ butterfly2_256.ktx2 · 均已落盘 |
| 出生分布 | 半径 ≤4 的圆环 · y=(rand−.5)×2+.5 · z −5 偏移 |
| 颜色 | 逐实例 HSL 色相偏移(uHue + rand×.05) |
| 辉光 | 边缘 #88DDFF × pulse(sin 3t×.3+.7),最终 pow(color,1.5) |
| 体型 | uScale .08 × (0.8 + rand×0.4) |
三层不同频率的正弦叠加 + 左右翅 8% 不对称 + 拍翅反作用力的身体起伏——没有一只蝴蝶的振翅相同。第 VII 章有可跑复现。
Renaissance
Edition
wave = sin(t) + 0.2·sin(2.1t+φ) + 0.3·sin(0.37t+φ');身体在落翼时上浮 smoothstep(1,−.5,wave)×0.25。边缘辉光取原站 uGlowColor #88DDFF。几何为示意简化,公式与参数为实锤原值。grid-template-rows 0fr→1fr,300ms 回弹曲线,延迟 50ms。原站的计数徽章由 EventSource 直播全网 Sidekick 技能实时使用数(本 demo 以定时增量模拟;计数上升动画为原值:1s 三次方缓出)。counter(quantity, upper-roman) 显示;价格悬停时整行上翻,露出罗马数字写法的美元金额(dollars 与 cents 各一个 counter)。$14.52 是那顶帽子的真实定价——XIV.LII。深链 #beanie 会滚到 Checkout 章并打开真实可结账的弹窗。
manual_HeroScene.theatre-project-state_15.json 的全部 32 条有效轨道(含贝塞尔手柄原值),求值方式与 Theatre 相同——相邻关键帧间做 cubic-bezier(左帧右手柄, 右帧左手柄) 缓动。曲线板里能看见 hero 序章的全部编排:相机 z 从 −18.57 冲到 6.45 再退到 −2.29、landscape 的 KTX2 帧序列 0→124、bloom 在 1.767–2.233 处的尖峰 4→1、粒子透明度四段折线。选一条轨道看它的真实曲线。manual_rest.json(position/normal/uv/index 全套,2,589 顶点);顶点着色器为 Butterflies chunk 原文——三层叠波驱动 |x| 方向的翼面绕体轴折叠,左右翼相位差 ±8%。原站以 50 只 instancedMesh + KTX2 翼面贴图 + PMREM 环境铺满 hero;此处单只标本、以法线明暗替代贴图(KTX2/UASTC 需 wasm 转码器,属体裁取舍),边缘辉光公式与脉动为原值。十二章共 200 张产品卡(Sidekick 20 · Agentic 2 · Online 23 · Retail 17 · Marketing 13 · Checkout 10 · Operations 22 · Shop app 6 · B2B 14 · Finance 12 · Shipping 7 · Developer 54,按 HTML article 计数,实锤)。每章结构一律:WebGL hero(70svh,桌面 140svh 双拍)→ 花体首字导语 → 白纸内容区。


序Hero · 创世纪与星夜蚀刻
"A new world of commerce. 150+ product updates."
加载框先行(6s 描边到 80%),随后 5 秒序曲运镜入画。滚动离场时整幅油画反相成星夜蚀刻——白昼与黑夜、油画与底稿的显影切换,是 Theatre 时间轴上 effects 轨的杰作。十二章目录悬浮画中,罗马数字由 CSS counter 生成。


ISidekick · 紫眼罩肖像与技能星座
"The AI-powered Shopify expert who's just as obsessed with your business as you are."
本章 20 卡是全站交互密度之最:SMIL 动画的吉祥物脸(悬停才眨眼,3.34s 循环)、EventSource 直播的技能使用计数、emoji 升腾(确定性伪随机 sin(i·12.9898+s·78.233)·43758.5453——把 GLSL 经典 hash 搬进 JS)、移动端触觉反馈 navigator.vibrate(10)、Apps 卡云的指针斥力视差。还有一个隐藏按钮:下载 emoji 包 zip。


IIAgentic · 窗景与流线画布
"Sell directly in AI chats with built-in tools that syndicate your products to every AI platform."
仅 2 卡的短章,讲「在 ChatGPT 里直接卖货」。XXL 卡带 Canvas 2D 流线装置:60 条三段贝塞尔管道、每条 3 颗粒子,喉部提速 3.5 倍、缘部 0.3 倍——商品数据穿过「AI 咽喉」的隐喻。由 Rive 事件 showCanvas/hideCanvas 开关。


IIIOnline · 建站与 23 卡长章
"Validate store changes with A/B testing and an AI tool that simulates shopping behavior."
Rollouts、SimGym(AI 模拟购物行为)、Tinker——三张注册表特色卡都在本章。Rollouts 卡另配流线画布第二处实例。产品卡媒体优先级链(实锤):customVideo > Rive > video > image,四级响应式视频源矩阵(mov/webm/mp4 × 1x/2x × 桌面/移动 = 12 路 source)。


IVRetail · POS Hub 硬件陈列
"New in-store hardware that provides unwavering reliability."
17 卡讲线下硬件。hero 的 140svh 双拍在此最典型:第一拍全景油画,第二拍相机推近资产层(Theatre camera 轨),文字换场。


VMarketing · 产品网络
"Grow your sales with a first-of-its-kind product network."
13 卡。特色卡「Shopify Product Network」以 25vh 的 sticky 空间陈述——跨店商品分发网络,是本届最重的商业发布之一。


VICheckout · 帽子与素描结账
"Convert customers with personalized checkout experiences and more payment options."
全站王牌彩蛋。打开购买弹窗的瞬间,WebGL 场景切换 Sobel 边缘检测——整幅油画退成 [.995,.995,.933] 底色的铅笔素描,唯有那顶实拍的亮粉毛线帽保持彩色。挂真实 Shopify variant,cart/{variantId}:{qty} 直达结账;数量与悬停价格全部罗马数字。弹窗开场 800ms、收场 500ms,其间全站主题翻 light。


VIIOperations · 白纸区的标准形态
"Improve everyday workflows with flexible inventory modeling and trend-spotting analytics."
22 卡。右图是全站内容区的标准解剖:白纸底、12 列栅格、卡片容器查询(@container 480/576px 两档内容宽),文字列表区铺 400px 平铺纸纹。


VIII–IXShop app · B2B
"Reach millions of high-intent shoppers…" · "Take your wholesale business global…"
Shop app 6 卡(全站最短)与 B2B 14 卡。两章 hero 布局变体相反:前者 place-content-end + 30vh 標題底距,后者 27vh 顶距——同一套系统在 Ds 映射表里逐章微调(实锤)。


X–XIFinance · Shipping
"Modern financial tools designed for growing your business and getting that coin." · "Ship confidently and cheetah-fast…"
12 卡与 7 卡。文案口吻在此彻底放飞(getting that coin / cheetah-fast),与油画的庄重形成反差——整站的语调策略:画面越古典,文字越街头。


XIIDeveloper · 54 卡的终章
"A completely new way to build for commerce with the power of AI."
54 卡,占全站四分之一强——这届 Editions 把最大的篇幅给了开发者(.dev dash、Agents、Checkout Kit、MCP)。终章之后页面收在暖纸色页尾。Developer 章列表区独享无纹理处理(isListTextured=false,实锤)。
控制台的花体拉丁文只是请柬。真正的彩蛋是一台双窗口 WebGL 装置:Shipping 章的猎豹鞍带上挂着一把金钥匙(three.js 场景内可点击、悬停自旋 2π/600ms),点击后 window.open 弹出一扇 4:3 的小窗——宽 = min(vw,vh)×0.53×4/3,以点击点为中心,窗名 ripple_popup,加载独立路由 /editions/winter2026/key(three@0.159 + 92KB 专属 bundle popup.min)。这扇小窗不是页面,是一支透镜。
captureStream(60)(≤5Mbps、每 16ms requestFrame),经 BroadcastChannel 信令(offer 每 100ms 重发、10s 超时)建 RTCPeerConnection,把直播流塞给弹窗做 VideoTexture。第二幕·弹窗按 window.screenX 与主窗广播的画布矩形做屏幕级对齐(fov 50、planeZ −5、lerp .25)——拖动小窗划过屏幕,窗里的画面始终与主画面逐像素对位:透镜成立。第三幕·每章一支片元着色器重新冲洗直播画面(下表),且每章掉落一件镀金收藏品(#BF9852 · metalness 1 · roughness .2 · 仓库 HDR),点击拾起→彩带鱼群多一尾(Boids,上限 12)。第四幕·Shipping 章锁孔现身(keyhole.glb,命中高亮 envMapIntensity 1→10),把钥匙拖近 2 世界单位内放下:KEY_INSERT_COMPLETE 广播——主窗口 Theatre 轨道 coinRain 触发 150 枚 instanced 金币雨(重力 4、初速 2.5、寿命至 y<−3),鞍带金锁的 GLB 动画被 0.08 lerp 擦到开锁位。第五幕·弹窗切入 blacklight 紫光灯着色器 + Graffiti-Canvas KTX2 加法叠层(1:2 长卷、随主页滚动展开、mud_normal 扰动 + 哈希闪烁)——小窗变成 UV 手电,照出全站隐藏的涂鸦。十二章 · 十二件镀金收藏品(原文实锤)
| 章 | 模型 | scale |
|---|---|---|
| Hero | skateboard.glb | 1.25 |
| Sidekick | compass.glb | .7 |
| Online | scroll.glb(卷轴) | 1.2 |
| Retail | pos.glb | 5 |
| Marketing | lute.glb(鲁特琴) | 1.2 |
| Checkout | cardreader.glb | 10 |
| Operations | compass.glb | .7 |
| Shop app | duck.glb(橡皮鸭) | 14 |
| B2B | iphone.glb | 14 |
| Finance | skateboard.glb | 1.25 |
| Shipping | key.glb(钥匙) | 2.6 |
| Developer | ring.glb(戒指) | 1.2 |
透镜着色器(每章一支,全文在库)
| 章 | 处理 |
|---|---|
| hero | 20px 网格化 + 4×4 Bayer 抖动(/25)→ 铜版画 |
| marketing | 水面折射(8 步 × 7 向、freq 8、gain 700)+ mud 法线扰动 |
| shop-app / developer | 3px Bayer 抖动(/20),一反相一正相 |
| finance / shipping | pow(rgb, 2.0) 显影加深 |
| 其余章 | pow(rgb, 2.5) 暗房基调 |
| blacklight(涂鸦) | luma 紫光灯 + fwidth 边缘检测 ×10 → 蓝边发光 + 径向衰减 |
Boids 彩带鱼群(原文实锤)
1 尾起步,每「发现」一章 +1,上限 12 霓虹 12 色 ⇄ 拾起时渐变金 12 色(lerp .15) 带状网格:15±1 节 · 链式 lerp .28±.05 鱼形宽度 pow(1−t,.3)·pow(t+.1,.5) × .06 体波 sin 双频(6–9Hz)×t² · 螺旋泳姿三层 分离力平方反比(r²<.16)·环绕半径 1.5×(1−moving×.7) AdditiveBlending · DoubleSide · depthWrite off
跨窗协议(BroadcastChannel «shop-popup-sync» + localStorage 兜底)
| 消息 | 方向 · 语义 |
|---|---|
| CANVAS_RECT / MAIN_WINDOW | 主→弹 · 画布矩形 + 窗位/滚动(rAF 逐帧) |
| ACTIVE_SECTION | 主→弹 · 章名/进度/theatreTime(同一公式 (h+vh)/vh) |
| POPUP_POSITION / POPUP_CENTER | 弹→主 · 屏幕矩形 + 归一坐标/速度/颜色 |
| POPUP_RIPPLE | 弹→主 · 拾起时的涟漪坐标 + 霓虹色(7 色 4s 自轮换) |
| WHEEL_EVENT | 弹→主 · 滚轮转发,主窗每帧吸收 15% |
| KEY_INSERT_COMPLETE / KEY_SEQUENCE_RESET | 弹⇄主 · 开锁 / 复位(金币雨、锁动画、涂鸦切换) |
| WEBRTC_READY / POPUP_CLOSED / KEY_ANIMATED_OUT | 握手成功 / 关窗清理 / 主画面钥匙飞离 |
生存法则与后门(原文实锤)
弹窗失焦 10s → window.close() 文档隐藏 9s → 关闭;视频冻结 3s×3 → 重连(≤3 次) WebRTC 断 → 直接关窗(透镜不许离线) STUN: stun.l.google.com:19302(localhost 免) ?mode=scan → 扫描模式(色锁黄,无涂鸦线) ?debug=1 → 调试;?popup=(空值)→ 免点击直开弹窗 主窗 beforeunload → 反手关掉自己的弹窗
| 细节 | 数值(全部实锤) |
|---|---|
| 视频灯箱 = View Transitions API | viewTransitionName: video-container / -background / -close-button;old contain → new cover |
| 灯箱底是达·芬奇网格纸 | Line_Grid.svg 三档响应式(已落盘) |
| 模态无障碍 | main/footer/header/aside 全部 inert + 焦点陷阱 + Esc |
| 视频退出即卸源 | removeChild(source) + load() 释放解码器 |
| 响应式视频矩阵 | mov/webm/mp4 × 1x/2x × 桌面/移动 = 12 路 + 1 路 mp4 兜底 |
| 图片 srcset 阶梯 | 8 档 × 400w 起步(1680×2/8 取整) |
| 技能计数直播 | EventSource:init 全量 + update 增量(newUsers) |
| 触觉反馈 | navigator.vibrate(10)(触屏点击技能标签) |
| popup 滚轮转发 | 跨窗口 wheel 广播,主页面每帧吸收 15% |
| 跳转焦点通道 | 每章末隐形「Back to navigation」按钮(focus-visible 才现身) |
| 细节 | 数值(全部实锤) |
|---|---|
| 吉祥物 SVG | SMIL 动画 · 3.33667s · 悬停播放 · 面 #1c004f 罩 #7126ff |
| 技能弹窗方向自适应 | 按象限翻转 --popup-top/left/translate/origin/border |
| emoji 升腾 | 10–14 枚 · delay rand×2+.3s · scale .6–1.2 · 时长=scale×2 |
| 计数上升 | 1s 三次方缓出 rAF 数字滚动 |
| Apps 云入场 | WAAPI scale ×.5→1 · 0–800ms 随机延迟 · ease-out-back |
| Apps 云斥力 | maxDistance 300 · repulsion 20 · 视差 ±15px |
| 控制台彩蛋 = 藏宝图 | ASCII 手稿画 + 花体拉丁文「clavis reserat」→ /key 双窗装置(全链路见 IX 隐藏章) |
| 创作后门 | URL ?theatre 参数动态加载 Theatre.js Studio |
| emoji 包下载彩蛋 | shopify-w26-emoji-pack.zip 隐形按钮 |
| 加载序列 | 线框 6s→80% · 就绪后 1s 收口 · 标题居中→ai 滑入(−898px, .6s)→侧栏归位 |
| 降级观 | prefers-reduced-motion 全链路:Lenis 关、序曲跳、View Transition 禁 |
:root{
--paper:#f7f7ee; --ink:#292919;
--grey-light:#dcdcd0; --grey-mid:#909083;
--grey-dark:#5c5c4e; --nav-grey:#e2e2d9;
--sidekick:#8051ff; --glow:#88DDFF;
--ease-back:cubic-bezier(.34,1.56,.64,1);
--ease-frame:cubic-bezier(.72,.16,.19,.96);
--ease-lines:cubic-bezier(.34,.22,.47,.84);
--ease-fade:cubic-bezier(.25,.46,.45,.94);
--grid-gap:clamp(12px,1vw,16px);
}
/* 罗马数字目录(原站原法) */
nav li a::after{
counter-increment:nav-item;
content:counters(nav-item,".",upper-roman);
}
/* 花体首字下沉 */
.drop-cap::first-letter{
font-family:ImperialScript,Georgia,serif;
font-size:clamp(6rem,75.79px + 2.63vw,7.5rem);
line-height:0;
}
// 滚动 → Theatre 时间轴(架构核心)
const scale = (sectionH + vh) / vh
sheet.sequence.position =
clamp01(progress) * scale + introOffset
// 分区进度(earlyCrossfade = .2 从第三章起)
zone = sectionH + vh + vh * earlyCrossfade
progress = (scrollY - (top - vh - early)) / zone
// 构造线:pathLength=1 归一化描线
path{stroke-dasharray:1;stroke-dashoffset:1px;
transition:stroke-dashoffset 3s var(--ease-lines)}
// 选型决策 */
编排密 → Theatre.js(设计师拥有时间轴)
矢量微交互 → Rive(状态机 + 事件回调)
数据流示意 → Canvas 2D(够用即止)
油画世界 → 多层图像平面,不做全 3D
实锤(直接抽取)
- 计算样式探针 + 样式表原文两份合计 130,780B(Tailwind v4.2.2 单文件 129,725B + 字体声明 1,055B)
- 30 个 JS chunk 全量下载精读(路由包 243KB 至场景包 1.2KB)
- 13 份 Theatre.js state JSON(3 份已落盘入库)
- 四支字体真文件 + rest.json 蝴蝶几何 + butterfly2_256.ktx2 + PMREM 环境贴图 + 纸纹 + 网格纸
- 六个 .bin 级证据以 manifest.json 逐文件记账
- 33 张逐屏截图(SwiftShader 软渲染 WebGL)+ 8 帧滚动关键帧
推断(证据充分)
- Hydrogen/Remix:路由命名 ($locale).editions.winter2026 + Oxygen CDN 路径(高)
- 美术为 AI 生成 + 人工拼贴修饰:文件名残留提示词(高)
- 「作坊 / 手稿」为有意母题:构造线 + 罗马数字 + 花体的系统性(高,意图类)
这站把「营销页」做成了「作品」的原因只有一个:工具链的权力分配。Theatre.js 把时间轴交给设计师,CMS 把场景交给内容团队,代码只保留物理与纪律——于是十二章油画各自成戏,而工程始终只有一套。






