wireframe-portal-title
A wireframe portal bursts open, the title comes through, then its letters swap into a second phrase. HyperFrames block, 1920×1080, 8s, 9 variables.
1How It Works & Mechanism
Output shot: Builds extruded wireframe glyphs from bundled Geist font via TTF parsing and polygon offset, revealing them through a "bursting portal" (burst chaos is tunable); in the second beat, letters swap into an alternative phrase.
Extruded wireframe letterforms are built from the bundled Geist face with a TTF loader and polygon offsetting, then revealed through a portal burst whose chaos is a variable. … A second beat swaps the letters into a replacement phrase with whole-word wrapping and auto type size, staggered with a tunable easing curve and settle glitch, with optional depth fog.
Dual-canvas layering: The 3D layer (wpt-three) and warp layer (wpt-warp) are both created at runtime, with no <canvas> present in the static markup.
["wpt-three", "wpt-warp"].forEach(function (id) { var canvas = document.createElement("canvas"); canvas.id = id; canvas.width = 1920; canvas.height = 1080;
Typesetting relies on offscreen canvas measurement: Measures character widths based on Geist 700 176px with +3% letter-spacing, followed by whole-word wrapping and auto-adjusting font size.
const measure = document.createElement("canvas").getContext("2d"); measure.font = "700 176px Geist"; const tracking = 176 * 0.03; const advance = (char) => measure.measureText(char).width + tracking;
Fonts are local assets: Fetches ArrayBuffer via host-provided assetUrl("assets/fonts/Geist-Bold.ttf"), which is then parsed by TTFLoader/FontLoader.
const ttfBuffer = await fetch(assetUrl("assets/fonts/Geist-Bold.ttf")).then((r) => r.arrayBuffer(), ); const font = new FontLoader().parse(new TTFLoader().parse(ttfBuffer));
Randomness replaces the original experiment's Math.random with two independent seeds: one for the scene (20260824) and one for staggered phrase timing (20260831), ensuring both phrase swapping and the burst are reproducible.
// ---------- seeded PRNG (replaces the experiment's Math.random) ---------- … const rand = mulberry32(20260824); const phraseRand = mulberry32(20260831);
First-frame warmup has a clear purpose: At t=0, the portal is closed and nothing is drawn; waiting for the first actual draw during playback would push all shader linking into the playback phase.
The portal is closed at t=0 and draws nothing, so the first real draw would link every shader mid-playback. Draw across the timeline and flush the GPU
Deterministic contract across the family: The paused timeline is registered to window.__timelines["wireframe-portal-title"], hf-seek resynchronizes, and each frame is a closed-form function of t.
One paused GSAP timeline registered as `window.__timelines["wireframe-portal-title"]`. … Re-syncs on the `hf-seek` CustomEvent; every frame is a closed-form function of time (seeded PRNG only, no rAF loops, no Date.now).
2Core Capabilities
3External Dependencies
| Kind | Dependency / Endpoint |
|---|---|
| cli | HyperFrames 官方 CLI(add / render) |
| network | jsDelivr CDN:GSAP 3.14.2(产物期脚本) |
| network | jsDelivr CDN:clipper-lib 6.4.2(多边形偏移,构建线框字形轮廓) |
| network | jsDelivr CDN:three.js 0.181.2 与 examples/jsm(importmap 解析,含后处理模块) |
| package | 本地字体(Geist ×3,OFL)随块分发;其余依赖见上(三个 CDN 脚本) |
4Recommended Governance & Evidence
- scripts/: Executes local script or command: wireframe-portal-title.html (Executed in browser/renderer: parses variables → creates two canvases → generates wireframe glyph geometry → registers p
- 网络端点: Declares external network access: cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js (Production phase: browser execution)
5Second-Pass Verification
- [ok] 变量数与声明一致性(frontmatter 自称 9 variables) — 脚本实测:SKILL.md 变量表 9 行、html data-composition-variables 解析出 9 项、frontmatter 写 9 —— 一致。
- [ok] 外链清单与 SKILL.md 声称一致 — html 命中三处 jsdelivr(gsap、clipper-lib、three importmap + addons 前缀),与 SKILL.md 的 External runtime dependencies 逐项对应。
- [ok] 字体加载路径 — 字体经 assetUrl("assets/fonts/Geist-Bold.ttf") 取回;assets/fonts/ 三枚 ttf 与 OFL 文本都在盘上,registry-item 也全列(6/6 文件存在)。
- [ok] 种子化声称 — mulberry32 定义与两个常数种子(20260824 / 20260831)逐字命中;全文 grep Math.random / Date.now / requestAnimationFrame 零命中。
- [ok] 双画布与 Studio 解析器约束 — 静态 markup 中无 <canvas>;两块 canvas 由 forEach 在运行时创建(wpt-three / wpt-warp),与 SKILL.md 编辑纪律第 2 条一致。
- [ok] 首帧预热的理由是否成立 — html 注释给出可核查的理由(t=0 传送门关闭、不绘制 → 首次真绘制会链接全部 shader),且代码确在注册时间线后按 tl.time() 预绘一遍。
6Verdict & Scenarios
7c548c8702b7c0cf…