1仕組みと動作原理
実装原理は「まず静的タイポグラフィを完全に固め、その後に動きを論じる」こと:アニメーションで粗悪なタイポグラフィを救うことはできないため、分割やアニメーションの前にまず行送り、文字間、配置、フォントウェイトを確定させます。
Motion cannot rescue bad type. Before animating, lock line-height (1.1-1.2 for display headlines, 1.4-1.6 for body), tracking (tighten display by -1% to -3%, e.g. `letter-spacing: -0.02em`), alignment, and weight. Then split and animate.
分割の粒度は3段階(行/単語/文字)のみとし、各段階を感情や適用シーンに紐付けた上で、「長文の文字単位分割は騒がしく見える」という経験則を明示します。
- **By character** — most kinetic/playful; risk of feeling busy on long copy. Reserve for short strings.
テキストの分割はセマンティクスを損なうため、アクセシビリティは推奨ではなく厳格なルールとする:コンテナの aria-label に完全な文字列を設定し、すべての分割要素に aria-hidden を付与します。
Critical accessibility note: splitting into per-character spans destroys the text for screen readers and breaks copy-paste. Always set `aria-label` on the container with the full string and `aria-hidden="true"` on the split fragments.
4つの主要リビール手法にはそれぞれトレードオフが存在する:マスク/切り抜きによる上昇が最も安定的(ブラーのアーティファクトがなく、GPU負荷が低く、業界標準)、ブラーインは負荷が高いがソフト、clip-path による方向性ワイプ、文字スタッガー。
- **Mask / clip reveal (most robust)** — wrap each line in `overflow: hidden`; animate the child from `translateY(100%)` to `0`. The text wipes up from a hidden baseline. No blur artifacts, GPU-cheap, the industry-standard headline reveal.
タイミングパラメータはインラインで具体的な値を指定(easeOutExpo、フラグメントあたり400〜600ms、行/単語/文字のスタッガーは60〜100/40〜70/20〜40ms、総再生時間は約800msの上限)し、外部知識に頼らずスキル単体で利用可能とします。
Enter with ease-out: `cubic-bezier(0.16, 1, 0.3, 1)` (easeOutExpo) feels premium.
バリアブルフォントのアニメーションは font-weight ではなく font-variation-settings を操作することを要求し、値が暗黙的にクランプされるのを防ぐため、事前にバリアブルフォントであることと軸の範囲を必ず確認させます。
Animate `font-variation-settings` (covers any axis: `wght`, `wdth`, `slnt`, `opsz`, plus custom axes), not `font-weight`, to hit non-standard values and to interpolate smoothly.
フォントの読み込みタイミングを検収の前提条件とする:document.fonts.ready の完了を待ってから分割を実行しなければ、フリーズフレームの改行が実機と一致しなくなる(単一ファイル HTML + 1つのアニメーションドライバー + ?t=N フリーズハーネスの納品規約と連動)。
Split AFTER `document.fonts.ready` so line breaks are correct in the frozen frame.
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | npx playwright screenshot(验证回路:截 file:// 页面冻结帧) |
| cli | 仓库根共享脚本 scripts/seek-shot.sh、scripts/contact-sheet.sh(截图与接触表拼图;不在 skill 目录内) |
| package | 前端动画生态(按技法选用):SplitType / GSAP SplitText、Framer Motion、Remotion |
| network | 产物期引用:输出契约允许用一条 CDN 的 GSAP <script>;仓库根演示页 showcase.html 另引 Google Fonts 与 cdnjs 的 gsap |
| package | 字体:变量字体(如 Inter var)与示例字体家族——产物期由浏览器加载,且 SKILL.md 要求先确认是变量字体与轴范围 |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: (SKILL.md の指示)npx playwright screenshot --wait-for-timeout=500 "file://$PWD/
- 网络端点: 外部ネットワークアクセスの宣言: スキルディレクトリ内にネットワーク呼び出しコードは存在せず、実行時のネットワーク面は `npx playwright` のツール取得(npm registry + Chromium バイナリ)のみ
- 本地工作目录: ファイルの読み書きと成果物出力: 納品物本体:単一の type.html(エージェントが出力規約に従って生成)
5二重目の独立検証
- [ok] 「skill 目录内无脚本」是否成立(蓝档的关键前提) — 文件清单实证:目录内只有 SKILL.md、README.md(0 B)、references/reveal-recipes.md。SKILL.md 引用的 scripts/seek-shot.sh 与 scripts/contact-sheet.sh 属仓库根资产,已在 reason/risks 记录为「单装 skill 目录会悬空」。
- [ok] 凭证/环境变量读取是否存在 — 本仓全仓 `process.env|API_KEY|TOKEN|SECRET|Authorization` 零命中;credential_reads 为空成立。
- [ok] 是否有更高的触发条件被漏掉(红档特征) — `sandbox|automationcontrolled|no-verify|stealth|bypass|ignoreHTTPSErrors|dangerously` 全仓零命中;产物是浏览器沙箱内的 CSS/SVG 动画,无任意代码执行面。
- [unlocatable] 任务提示的「安全区(title safe)规则」是否能定位 — 对 skill 目录与全仓检索 `safe[- ]area|title safe|overscan|margin` 均未发现「安全区/标题安全」类版式规则;文档里的版式规则只有:静态排版前置(行高/字距/对齐/字重)、切分后的 aria 补偿,以及「文字不压脸与关键物体」这类通用要求与「裁切字形/descender」验收项。故不把它写成 capability,仅记录为「任务提示与源码不符:本 skill 无安全区规则」;竖屏或平台裁切场景需使用者自行加边距。
- [ok] 无障碍声明是否有可执行形态(非口号) — SKILL.md 要求容器 aria-label + 碎片 aria-hidden,完成清单第 5 条写成验收项;reveal-recipes.md 第 1 节的 HTML 已按此写(<span class="line"><span aria-hidden="true">Built for</span></span>),并在开头声明 'Accessibility rule for every per-fragment split'。属可照抄实现。
- [ok] 时间参数与「单一动画驱动」是否自洽 — SKILL.md 内联给出 easeOutExpo、400–600ms、行/词/字错位区间与约 800ms 上限;输出契约要求「CSS @keyframes 或单条 GSAP timeline,不能两者并存」,harness 也对两种驱动给分支写法(负延迟暂停 / tl.pause()+seek),无相互矛盾。
- [ok] 「字体就绪后再切分」是否真能解决冻结帧换行问题 — SKILL.md 写 'Split AFTER `document.fonts.ready` so line breaks are correct in the frozen frame.';冻结 harness 在 ?t=N 时把动画钉到负延迟 + paused 并置 window.__ready 供无头等待。先等字体、再切分、再冻结,三段配合成立。
6結論
7defb6b40cabee55…