glyphdust 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sampling.ts","../src/shaders.ts","../src/dom-overlay.ts","../src/drivers.ts","../src/useReducedMotion.ts","../src/GlyphPoints.tsx","../src/GlyphDust.tsx","../src/index.ts"],"names":["ALPHA_THRESHOLD","useCallback","useState","useEffect","THREE","useRef","useThree","useMemo","useFrame","jsx","clamp01","THREE2","Fragment","jsxs","Canvas"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * sampling.ts — 文字 → 粒子ターゲット座標の生成。\n *\n * オフスクリーン Canvas にテキストを描画し、塗りピクセルをサンプリングして\n * 各粒子のワールド座標ターゲット(Float32Array, xyz × count)を作る。\n * フォント非依存・任意文字対応(CJK 含む)。\n *\n * 2 つの戦略:\n * - {@link buildTextTargets} … 通常密度。読める字形をフォールバック付きで生成。\n * - {@link buildDenseTextTargets} … 高密度・均一カバレッジ。穴の目立たないワードマーク向け。\n *\n * いずれも SSR セーフ(`document` 不在時は原点クラスタ or 空配列を返し、例外を投げない)。\n */\n\n/** alpha がこの値を超えるピクセルを「塗り」とみなす。 */\nconst ALPHA_THRESHOLD = 128;\n\n/**\n * Knuth の乗算ハッシュ定数(2^32 / 黄金比)。\n * 連番 i を擬似ランダムに散らし、塗りピクセルへ均しく割り当てるために使う。\n */\nconst HASH_MULTIPLIER = 2654435761;\n\n/** 0..1 を返す乱数生成器。テスト時に決定論的な関数を注入できる。 */\nexport type Random = () => number;\n\n/** {@link buildTextTargets} のオプション。 */\nexport interface TextTargetOptions {\n /** Canvas2D の `font` 文字列(例 `\"600 64px 'Noto Sans JP', sans-serif\"`)。 */\n font: string;\n /** 字形を収める可視ワールド幅。canvas 幅 `cw` 全体がこの幅にマップされる。 */\n worldW: number;\n /** 行送り(px, canvas 座標)。複数行のとき行間に使う。 */\n lineHeight: number;\n /** ワールド y オフセット(上が +)。既定 0。 */\n offsetY?: number;\n /** ワールド x オフセット(右が +)。既定 0。 */\n offsetX?: number;\n /** z 方向の厚み。既定 0.18。 */\n thickness?: number;\n /** ピクセル走査間隔。大きいほど粗く高速。既定 2。 */\n step?: number;\n /** オフスクリーン canvas 幅。既定 1280。 */\n cw?: number;\n /** オフスクリーン canvas 高さ。既定 480。 */\n ch?: number;\n /** テキスト寄せ。DOM 見出しと重ねるときは `\"left\"`。既定 `\"center\"`。 */\n align?: \"center\" | \"left\";\n /** 乱数生成器(ジッタ・フォールバック用)。既定 `Math.random`。 */\n random?: Random;\n}\n\n/** {@link buildDenseTextTargets} のオプション。 */\nexport interface DenseTextTargetOptions {\n /** Canvas2D の `font` 文字列。 */\n font: string;\n /** 字形を収める可視ワールド幅。 */\n worldW: number;\n /** ワールド y オフセット(上が +)。既定 0。 */\n offsetY?: number;\n /** ワールド x オフセット(右が +)。既定 0。 */\n offsetX?: number;\n /** z 方向の厚み。既定 0.08(字形塗りにきっちり乗せる)。 */\n thickness?: number;\n /** ピクセル走査間隔。密に拾うため既定 1。 */\n step?: number;\n /** オフスクリーン canvas 幅。既定 1280。 */\n cw?: number;\n /** オフスクリーン canvas 高さ。既定 400。 */\n ch?: number;\n /** 行送りを `ch` 比で指定。既定 0.46。 */\n lineHeightRatio?: number;\n /** 乱数生成器。既定 `Math.random`。 */\n random?: Random;\n}\n\n/**\n * オフスクリーン 2D canvas コンテキストを作る。\n * SSR / 2D 非対応時は null を返す(呼び出し側でフォールバック)。\n */\nfunction createSamplingContext(\n cw: number,\n ch: number,\n): CanvasRenderingContext2D | null {\n if (typeof document === \"undefined\") return null;\n const canvas = document.createElement(\"canvas\");\n canvas.width = cw;\n canvas.height = ch;\n return canvas.getContext(\"2d\", { willReadFrequently: true });\n}\n\n/**\n * 塗りピクセルの座標を `[x0, y0, x1, y1, ...]` 形式で収集する。\n * 戻り値の長さ / 2 が塗りピクセル数。\n */\nfunction collectFilledPixels(\n ctx: CanvasRenderingContext2D,\n cw: number,\n ch: number,\n step: number,\n): number[] {\n const { data } = ctx.getImageData(0, 0, cw, ch);\n const pts: number[] = [];\n for (let y = 0; y < ch; y += step) {\n for (let x = 0; x < cw; x += step) {\n if (data[(y * cw + x) * 4 + 3]! > ALPHA_THRESHOLD) pts.push(x, y);\n }\n }\n return pts;\n}\n\n/**\n * 塗りピクセルが 0 個だったときのフォールバック。\n * 粒子を小さな楕円体クラスタに集約し、真っ白・破綻を防ぐ。\n */\nfunction fillScatterCluster(\n out: Float32Array,\n count: number,\n offsetX: number,\n offsetY: number,\n random: Random,\n): void {\n for (let i = 0; i < count; i++) {\n const r = Math.cbrt(random()) * 1.4;\n const th = random() * Math.PI * 2;\n out[i * 3] = Math.cos(th) * r + offsetX;\n out[i * 3 + 1] = Math.sin(th) * r * 0.4 + offsetY;\n out[i * 3 + 2] = (random() - 0.5) * 0.2;\n }\n}\n\n/**\n * テキスト行をオフスクリーン canvas に描画し、塗りピクセルをワールド座標ターゲットへ変換する。\n *\n * 割り当ては「連番ベース + 乗算ハッシュ散らし」で、塗りピクセルを均しく巡回カバーする。\n * 塗りが 0 のときは {@link fillScatterCluster} へフォールバック。\n *\n * @param count 粒子数(戻り値は `count * 3` の Float32Array)\n * @param lines 描画する行(文言は呼び出し側が決める。本関数は文言非依存)\n */\nexport function buildTextTargets(\n count: number,\n lines: string[],\n opts: TextTargetOptions,\n): Float32Array {\n const out = new Float32Array(count * 3);\n const random = opts.random ?? Math.random;\n const cw = opts.cw ?? 1280;\n const ch = opts.ch ?? 480;\n\n const ctx = createSamplingContext(cw, ch);\n if (!ctx) return out;\n\n const align = opts.align ?? \"center\";\n ctx.clearRect(0, 0, cw, ch);\n ctx.fillStyle = \"#000\";\n ctx.textAlign = align === \"left\" ? \"left\" : \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = opts.font;\n\n // 左寄せ時は左端に余白を取り、各行を揃える。\n const drawX = align === \"left\" ? cw * 0.04 : cw / 2;\n const lh = opts.lineHeight;\n const blockH = lh * (lines.length - 1);\n lines.forEach((line, i) => {\n ctx.fillText(line, drawX, ch / 2 - blockH / 2 + i * lh);\n });\n\n const step = opts.step ?? 2;\n const pts = collectFilledPixels(ctx, cw, ch, step);\n const filled = pts.length / 2;\n\n const offsetX = opts.offsetX ?? 0;\n const offsetY = opts.offsetY ?? 0;\n\n if (filled === 0) {\n fillScatterCluster(out, count, offsetX, offsetY, random);\n return out;\n }\n\n const scale = opts.worldW / cw;\n const thickness = opts.thickness ?? 0.18;\n\n for (let i = 0; i < count; i++) {\n const idx =\n (Math.floor((i / count) * filled) + ((i * HASH_MULTIPLIER) % filled)) %\n filled;\n const px = pts[idx * 2]!;\n const py = pts[idx * 2 + 1]!;\n\n const wx = (px - cw / 2) * scale + offsetX;\n const wy = -(py - ch / 2) * scale + offsetY;\n const jx = (random() - 0.5) * scale * step;\n const jy = (random() - 0.5) * scale * step;\n\n out[i * 3] = wx + jx;\n out[i * 3 + 1] = wy + jy;\n out[i * 3 + 2] = (random() - 0.5) * thickness;\n }\n\n return out;\n}\n\n/**\n * 高密度・均一カバレッジで字形をサンプリングする(穴の目立たないワードマーク用)。\n *\n * 細かい step で塗りピクセルを収集 → 一度だけ Fisher–Yates シャッフル → 粒子へ巡回割当。\n * 各塗りピクセルに `floor/ceil(count / filled)` 個がほぼ均等に乗り、粗密ムラ・穴を防ぐ。\n * ジッタ・z 厚みは小さめにして字形塗りにきっちり乗せる。\n */\nexport function buildDenseTextTargets(\n count: number,\n lines: string[],\n opts: DenseTextTargetOptions,\n): Float32Array {\n const out = new Float32Array(count * 3);\n const random = opts.random ?? Math.random;\n const cw = opts.cw ?? 1280;\n const ch = opts.ch ?? 400;\n\n const ctx = createSamplingContext(cw, ch);\n if (!ctx) return out;\n\n ctx.clearRect(0, 0, cw, ch);\n ctx.fillStyle = \"#000\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = opts.font;\n\n const lh = ch * (opts.lineHeightRatio ?? 0.46);\n const blockH = lh * (lines.length - 1);\n lines.forEach((line, i) => {\n ctx.fillText(line, cw / 2, ch / 2 - blockH / 2 + i * lh);\n });\n\n const step = opts.step ?? 1; // 細かく走査して密に拾う\n const pts = collectFilledPixels(ctx, cw, ch, step);\n const filled = pts.length / 2;\n\n const offsetX = opts.offsetX ?? 0;\n const offsetY = opts.offsetY ?? 0;\n\n if (filled === 0) {\n fillScatterCluster(out, count, offsetX, offsetY, random);\n return out;\n }\n\n const scale = opts.worldW / cw;\n const thickness = opts.thickness ?? 0.08;\n\n // インデックスを一度だけシャッフル(Fisher–Yates)→ 巡回割当で均一カバレッジ。\n const order = new Uint32Array(filled);\n for (let i = 0; i < filled; i++) order[i] = i;\n for (let i = filled - 1; i > 0; i--) {\n const j = (random() * (i + 1)) | 0;\n const t = order[i]!;\n order[i] = order[j]!;\n order[j] = t;\n }\n\n // ジッタは塗り内に収める控えめな量(穴が開かない範囲)。\n const jitter = scale * step * 0.5;\n for (let i = 0; i < count; i++) {\n const idx = order[i % filled]!;\n const px = pts[idx * 2]!;\n const py = pts[idx * 2 + 1]!;\n const wx = (px - cw / 2) * scale + offsetX;\n const wy = -(py - ch / 2) * scale + offsetY;\n out[i * 3] = wx + (random() - 0.5) * jitter;\n out[i * 3 + 1] = wy + (random() - 0.5) * jitter;\n out[i * 3 + 2] = (random() - 0.5) * thickness;\n }\n\n return out;\n}\n","/**\n * shaders.ts — THREE.Points 用の GLSL(頂点 / フラグメント)。\n *\n * 位置補間は「キーフレーム数」に依存するため、頂点シェーダは\n * {@link buildVertexShader} で動的生成する(GLSL は属性の動的添字を許さないので\n * 隣接キーフレーム間の `mix` 連鎖をアンロールして埋め込む)。\n *\n * 演出スカラ(burst / drift / settle / form / swap / resolve)は\n * 「どのキーフレームが scatter か text か」を知る CPU 側(GlyphPoints, useFrame)が\n * 毎フレーム算出して uniform で渡す。これでシェーダはキーフレーム数だけに依存し、\n * 意味論を持たない。\n *\n * 属性(GlyphPoints が設定):\n * - `aPos0 .. aPos{N-1}` … 各キーフレームのターゲット座標(vec3)\n * - `aSeed` … 0..1 個体差シード(ドリフト位相・サイズ・きらめき)\n * - `aAccent` … 0/1 アクセント色フラグ\n *\n * uniform(頂点):\n * - `uTimes[N]` … 各キーフレームの正規化時刻 0..1(補間区間の境界)\n * - `uStage` … 進捗 0..1(位置補間に使う。CPU 側で easing 済みでも可)\n * - `uTime` … アイドル漂い用の時計(秒)\n * - `uForm` … 0..1 字形に締まった度合い(サイズ均一化・ドリフト停止)\n * - `uSettle` … 0..1 整列ホールド度合い(ドリフト減衰・エッジ締め)\n * - `uBurst` … 0..1 外向き飛散量(飛散区間中で上げる)\n * - `uSwap` … 0..1 可視ゲート(最初のスワップ点まで 0)\n * - `uResolve` … 0..1 フィナーレで実 DOM 文字へ受け渡す減衰\n * - `uReduced` … 0/1 reduced-motion\n * - `uPointer` … vec3 ワールド空間のポインタ位置\n * - `uPointerActive`… 0/1 ポインタ反発の有効化\n * - `uSize` … 基準点サイズ\n * - `uPixelRatio` … dpr\n *\n * uniform(フラグメント):\n * - `uColorInk` / `uColorAccent` … 配色\n */\n\n/** 位置ターゲット属性の接頭辞。`aPos0`, `aPos1`, ... */\nexport const GLYPH_POSITION_ATTRIBUTE_PREFIX = \"aPos\";\n\n/** キーフレーム番号 i に対応する位置属性名を返す。 */\nexport function glyphPositionAttribute(index: number): string {\n return `${GLYPH_POSITION_ATTRIBUTE_PREFIX}${index}`;\n}\n\n/**\n * キーフレーム数 N に対応する頂点シェーダ文字列を生成する。\n *\n * 隣接キーフレーム間を `smoothRange(uTimes[k], uTimes[k+1], uStage)` で補間し、\n * `mix` 連鎖でつなぐ。各区間の t は順次 0→1 になるため、uStage が区間 k にあるとき\n * 先行区間は t=1(次キーフレームへ到達済み)・後続は t=0 となり、正しく k→k+1 を補間する。\n *\n * @param keyframeCount キーフレーム数(>= 1)\n * @throws keyframeCount < 1 のとき\n */\nexport function buildVertexShader(keyframeCount: number): string {\n if (!Number.isInteger(keyframeCount) || keyframeCount < 1) {\n throw new Error(\n `buildVertexShader: keyframeCount must be an integer >= 1 (got ${keyframeCount})`,\n );\n }\n\n const attributeDecls = Array.from(\n { length: keyframeCount },\n (_, i) => ` attribute vec3 ${glyphPositionAttribute(i)};`,\n ).join(\"\\n\");\n\n // 隣接キーフレームの mix 連鎖(アンロール)。N==1 のときは補間なし。\n const mixChain = Array.from(\n { length: keyframeCount - 1 },\n (_, k) =>\n ` pos = mix(pos, ${glyphPositionAttribute(k + 1)}, ` +\n `smoothRange(uTimes[${k}], uTimes[${k + 1}], uStage));`,\n ).join(\"\\n\");\n\n return /* glsl */ `\n uniform float uTime;\n uniform float uStage;\n uniform float uTimes[${keyframeCount}];\n uniform float uForm;\n uniform float uSettle;\n uniform float uBurst;\n uniform float uSwap;\n uniform float uResolve;\n uniform float uReduced;\n uniform vec3 uPointer;\n uniform float uPointerActive;\n uniform float uSize;\n uniform float uSizeScale;\n uniform float uDrift;\n uniform float uPixelRatio;\n\n${attributeDecls}\n attribute float aSeed;\n attribute float aAccent;\n\n varying float vSeed;\n varying float vAccent;\n varying float vDepth;\n varying float vForm;\n varying float vAlpha;\n varying float vSettle;\n\n float smoothRange(float a, float b, float x) {\n float t = clamp((x - a) / (b - a), 0.0, 1.0);\n return t * t * (3.0 - 2.0 * t);\n }\n\n void main() {\n vSeed = aSeed;\n vAccent = aAccent;\n vForm = uForm;\n\n // --- キーフレーム間の位置補間(隣接ペアの mix 連鎖) ---\n vec3 pos = ${glyphPositionAttribute(0)};\n${mixChain}\n\n // 遷移中(飛散区間)に外向きドリフトを足してダイナミックに。\n // 方向は原点からの外向き(特定キーフレームに依存しない一般形)。\n float ph = aSeed * 6.2831;\n vec3 dir = normalize(pos + 0.0001);\n pos += dir * uBurst * (0.4 + aSeed * 0.6);\n\n // アイドルの漂い(整列時 settle / 字形時 form で弱める)。\n vSettle = uSettle;\n float drift = (1.0 - uReduced) * (1.0 - uSettle * 0.9) * (1.0 - uForm) * uDrift;\n pos.x += sin(uTime * 0.35 + ph) * 0.06 * drift;\n pos.y += cos(uTime * 0.30 + ph * 1.7) * 0.06 * drift;\n pos.z += sin(uTime * 0.27 + ph * 2.3) * 0.06 * drift;\n\n // ワールド空間でポインタ反発(回転後の見た目に合わせ modelMatrix 経由)。\n vec4 world = modelMatrix * vec4(pos, 1.0);\n if (uPointerActive > 0.5) {\n vec3 diff = world.xyz - uPointer;\n float dist = length(diff);\n float radius = 1.3;\n float force = (1.0 - smoothstep(0.0, radius, dist)) * 0.55;\n world.xyz += normalize(diff + 0.0001) * force;\n }\n\n vec4 mvPosition = viewMatrix * world;\n vDepth = -mvPosition.z;\n gl_Position = projectionMatrix * mvPosition;\n\n // --- 透明度: スワップ点まで不可視、スワップ点で即・不透明(フェード無し)。 ---\n // DOM 見出しと同位置・同サイズで一致しているため、瞬時の切替が「文字→粒子」に見える。\n // フィナーレ(uResolve)で粒子を素早く消し、実 DOM 文字へ受け渡す。\n vAlpha = uSwap * (1.0 - uResolve);\n\n // 点サイズ(遠近 + 個体差)。整列時はやや均一・小さめにして可読性を上げる。\n float sizeVar = mix(0.55 + aSeed * 0.9, 0.72 + aSeed * 0.35, uSettle);\n // 字形収束時は隣接粒子で隙間を埋めるためわずかに大きめ&均一に。\n sizeVar = mix(sizeVar, 0.95 + aSeed * 0.18, uForm);\n // 高 dpr 環境では小粒・上限低めの方がエッジが締まり高精細に見える\n // (コーポレートサイト実装で実証。0.62 と clamp 4〜5 が最も「霞まない」)。\n float s = uSize * sizeVar * 0.62 * uSizeScale;\n gl_PointSize = s * uPixelRatio * (1.0 / -mvPosition.z);\n gl_PointSize = clamp(gl_PointSize, 1.0, mix(4.0, 5.0, uForm) * uPixelRatio);\n }\n`;\n}\n\n/**\n * フラグメントシェーダ。キーフレーム数に依存しないため定数。\n * 円形ソフト点 + アクセント色 + きらめき + 奥行き濃淡。\n */\nexport const FRAGMENT_SHADER = /* glsl */ `\n uniform vec3 uColorInk;\n uniform vec3 uColorAccent;\n uniform float uSparkle;\n\n varying float vSeed;\n varying float vAccent;\n varying float vDepth;\n varying float vForm;\n varying float vAlpha;\n varying float vSettle;\n\n void main() {\n // 円形のソフトな点。中心で 1、縁で 0(smoothstep は edge0<edge1 必須なので反転して使う)。\n vec2 uv = gl_PointCoord - 0.5;\n float r = length(uv);\n float alpha = 1.0 - smoothstep(0.12, 0.5, r);\n if (alpha < 0.02) discard;\n\n // 主体はインク、一部の粒だけアクセント色。字形収束時はやや控えめに。\n float accentAmt = vAccent * mix(0.85, 0.55, vForm);\n vec3 col = mix(uColorInk, uColorAccent, accentAmt);\n\n // 一部の粒に明るいきらめき(飛散時に映える)。整列時は控えめ。\n float spark = step(0.94, vSeed);\n col = mix(col, uColorAccent, spark * mix(0.45, 0.15, vSettle) * uSparkle);\n\n // 奥行きで濃淡(明背景での視認性確保のため下限を持たせる)。\n float floorFade = mix(0.45, 0.78, vSettle);\n float depthFade = clamp(1.0 - (vDepth - 3.0) * 0.10, floorFade, 1.0);\n\n // 整列時は不透明寄りにしてエッジを締める。\n float a = alpha * depthFade * vAlpha;\n a = mix(a, clamp(a * 1.3, 0.0, 1.0), vSettle);\n\n gl_FragColor = vec4(col, a);\n }\n`;\n","/**\n * dom-overlay.ts — 実 DOM 文字との重ね合わせ/受け渡しのための幾何ユーティリティ。\n *\n * - {@link viewSizeAtZ0} … カメラから z=0 平面の可視ワールド幅・高さを求める(screen↔world 変換の素)。\n * - {@link buildGlyphFromDOM} … 指定セレクタの DOM 要素の矩形・フォントから粒子ターゲットを生成。\n * 粒子字形が実 DOM 文字とピクセル単位で重なる(クロスフェードで文字が動かない)。\n * - {@link computeScreenRect} … 粒子ターゲット群の world 範囲を screen(px) 矩形へ変換。\n * フィナーレで実 DOM 文字を同位置・同サイズに合わせるのに使う。\n *\n * いずれも SSR セーフ(`document` / `window` 不在時は null を返す)。\n * グローバル変数や固定イベント名には依存しない(配信方法は呼び出し側が決める)。\n */\n\nimport type { Random } from \"./sampling.js\";\n\n/** alpha がこの値を超えるピクセルを「塗り」とみなす。 */\nconst ALPHA_THRESHOLD = 128;\n\n/** z=0 平面における可視ワールド寸法。 */\nexport interface ViewSize {\n worldW: number;\n worldH: number;\n}\n\n/**\n * カメラ(縦 fov / z=cameraZ)から、z=0 平面の可視ワールド幅・高さを返す。\n * screen(px) → world 変換のスケール算出に使う(等方: `worldW/viewportW === worldH/viewportH`)。\n */\nexport function viewSizeAtZ0(\n viewportW: number,\n viewportH: number,\n fovDeg: number,\n cameraZ: number,\n): ViewSize {\n const worldH = 2 * Math.tan((fovDeg * Math.PI) / 360) * cameraZ;\n const worldW = worldH * (viewportW / viewportH);\n return { worldH, worldW };\n}\n\n/** {@link buildGlyphFromDOM} のオプション。 */\nexport interface DomGlyphOptions {\n /** 対象 DOM 要素のセレクタ(`document.querySelector`)。 */\n selector: string;\n /** カメラ縦 fov(度)。canvas が viewport 全面の sticky 前提。 */\n fovDeg: number;\n /** カメラ z 位置。 */\n cameraZ: number;\n /** CSS px に対する描画倍率(文字を太く拾うため高め)。既定 2。 */\n resolution?: number;\n /** ピクセル走査間隔。既定 2。 */\n step?: number;\n /** z 方向の厚み。既定 0.14。 */\n thickness?: number;\n /** ベースライン近似に使うアセント比(fontSize に対する)。既定 0.82。 */\n ascentRatio?: number;\n /**\n * 実際の canvas 表示サイズ(CSS px)。省略時は window.innerWidth/Height。\n * 縦スクロールバーがあると innerWidth と canvas 幅が数 px ずれ、\n * 画面→ワールド変換が狂って粒子字形が横にずれる。整列には canvas 実寸を渡す。\n */\n viewportW?: number;\n viewportH?: number;\n /** 乱数生成器(ジッタ用)。既定 `Math.random`。 */\n random?: Random;\n}\n\n/**\n * 指定セレクタの DOM 要素の画面矩形・computed フォントから粒子ターゲットを生成する。\n * - 要素の rect / computed font をそのまま使い、同サイズのオフスクリーン Canvas に行を描画。\n * - 各塗りピクセルを「画面座標(px)」→「ワールド座標(z=0平面)」へ変換。\n * → 粒子字形が DOM 要素とピタリ重なり、クロスフェード中に文字が動かない。\n * - 要素が無い / 小さすぎる / 塗りが 0 のときは null(呼び出し側でフォールバック)。\n *\n * @param count 粒子数(戻り値は `count * 3` の Float32Array)\n * @param lines 描画する行(要素のテキストを行分割したもの。文言は呼び出し側が決める)\n */\nexport function buildGlyphFromDOM(\n count: number,\n lines: string[],\n opts: DomGlyphOptions,\n): Float32Array | null {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return null;\n }\n const el = document.querySelector(opts.selector);\n if (!el) return null;\n\n const rect = el.getBoundingClientRect();\n if (rect.width < 2 || rect.height < 2) return null;\n\n const random = opts.random ?? Math.random;\n const cs = window.getComputedStyle(el);\n const fontSize = parseFloat(cs.fontSize) || 64;\n // line-height は \"normal\" の場合があるので算出。\n let lineHeight = parseFloat(cs.lineHeight);\n if (!isFinite(lineHeight) || lineHeight <= 0) lineHeight = fontSize * 1.1;\n const letterSpacing = parseFloat(cs.letterSpacing) || 0;\n const fontWeight = cs.fontWeight || \"600\";\n const fontFamily = cs.fontFamily || \"sans-serif\";\n\n // パディング/ボーダーを除いたコンテンツ左端・上端。\n const padL = parseFloat(cs.paddingLeft) || 0;\n const padT = parseFloat(cs.paddingTop) || 0;\n const contentLeft = rect.left + padL;\n const contentTop = rect.top + padT;\n\n const res = opts.resolution ?? 2;\n const cw = Math.max(2, Math.ceil(rect.width * res));\n const ch = Math.max(2, Math.ceil(rect.height * res));\n const canvas = document.createElement(\"canvas\");\n canvas.width = cw;\n canvas.height = ch;\n const ctx = canvas.getContext(\"2d\", { willReadFrequently: true });\n if (!ctx) return null;\n\n ctx.clearRect(0, 0, cw, ch);\n ctx.scale(res, res); // 以降は CSS px 座標で描く\n ctx.fillStyle = \"#000\";\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"alphabetic\";\n ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n if (\"letterSpacing\" in ctx) {\n try {\n (ctx as CanvasRenderingContext2D & { letterSpacing: string }).letterSpacing =\n `${letterSpacing}px`;\n } catch {\n /* 一部ブラウザ非対応。無視 */\n }\n }\n\n // ベースライン位置をブラウザの行レイアウトに正確に合わせる。\n // 行ボックス内では baseline = 行頂点 + half-leading + fontAscent。\n // フォントの実アセント/ディセントは canvas の measureText から取得する\n // (近似 ascentRatio=0.82 では実フォントと数 px ずれ、DOM 整列が崩れるため)。\n const fm = ctx.measureText(lines[0] ?? \"M\");\n const fbAsc = fm.fontBoundingBoxAscent;\n const fbDesc = fm.fontBoundingBoxDescent;\n const useMetrics = Number.isFinite(fbAsc) && Number.isFinite(fbDesc);\n const fallbackAscent = fontSize * (opts.ascentRatio ?? 0.82);\n lines.forEach((line, i) => {\n const lineTop = i * lineHeight;\n const baseline = useMetrics\n ? lineTop + (lineHeight - (fbAsc + fbDesc)) / 2 + fbAsc\n : lineTop + (lineHeight - fontSize) / 2 + fallbackAscent;\n ctx.fillText(line, 0, baseline);\n });\n\n const { data } = ctx.getImageData(0, 0, cw, ch);\n const pts: number[] = [];\n const step = opts.step ?? 2;\n for (let y = 0; y < ch; y += step) {\n for (let x = 0; x < cw; x += step) {\n if (data[(y * cw + x) * 4 + 3]! > ALPHA_THRESHOLD) pts.push(x, y);\n }\n }\n const filled = pts.length / 2;\n if (filled === 0) return null;\n\n // 画面(px) → ワールド(z=0) 変換係数。canvas は sticky で viewport 全面。\n // スクロールバー分のズレを避けるため、可能なら canvas 実寸を使う。\n const vpW = opts.viewportW ?? window.innerWidth;\n const vpH = opts.viewportH ?? window.innerHeight;\n const { worldW, worldH } = viewSizeAtZ0(vpW, vpH, opts.fovDeg, opts.cameraZ);\n const pxToWorld = worldW / vpW; // = worldH / vpH(等方)\n const thickness = opts.thickness ?? 0.14;\n\n const out = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n const idx =\n (Math.floor((i / count) * filled) + ((i * 2654435761) % filled)) % filled;\n const cx = pts[idx * 2]! / res; // canvas → CSS px(コンテンツ原点)\n const cy = pts[idx * 2 + 1]! / res;\n\n // CSS px(画面絶対座標)。\n const sx = contentLeft + cx;\n const sy = contentTop + cy;\n\n // 画面 → ワールド(中央原点・y上向き)。\n const wx = (sx / vpW - 0.5) * worldW;\n const wy = -(sy / vpH - 0.5) * worldH;\n\n // 格子感を消す微小ジッタ + 薄い厚み。\n out[i * 3] = wx + (random() - 0.5) * pxToWorld * step;\n out[i * 3 + 1] = wy + (random() - 0.5) * pxToWorld * step;\n out[i * 3 + 2] = (random() - 0.5) * thickness;\n }\n return out;\n}\n\n/** 画面座標(px・左上原点)での字形矩形。実 DOM 文字を重ねるのに使う。 */\nexport interface GlyphScreenRect {\n left: number;\n top: number;\n width: number;\n height: number;\n /** 中心 x。 */\n cx: number;\n /** 中心 y。 */\n cy: number;\n}\n\n/**\n * 粒子ターゲット群(world 座標)の範囲を screen(px) 矩形へ変換する。\n * z=0 / 無回転前提(フィナーレは正面復帰している前提で成立)。\n *\n * @param targets `[x,y,z, ...]` の Float32Array(build*Targets の戻り値)\n * @param viewportW / viewportH 画面ピクセル寸法\n * @param visibleWorldW z=0 平面の可視ワールド幅({@link viewSizeAtZ0} の `worldW`)\n * @returns 字形矩形。targets が空などで算出不能なら null。\n */\nexport function computeScreenRect(\n targets: Float32Array,\n viewportW: number,\n viewportH: number,\n visibleWorldW: number,\n): GlyphScreenRect | null {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < targets.length; i += 3) {\n const x = targets[i]!;\n const y = targets[i + 1]!;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n if (!isFinite(minX)) return null;\n\n const worldW = visibleWorldW;\n const worldH = visibleWorldW * (viewportH / viewportW);\n // world(中央原点・y上向き) → screen(px・左上原点・y下向き)\n const toScreenX = (wx: number) => (wx / worldW + 0.5) * viewportW;\n const toScreenY = (wy: number) => (0.5 - wy / worldH) * viewportH;\n const left = toScreenX(minX);\n const right = toScreenX(maxX);\n const top = toScreenY(maxY); // 上端 = world y 最大\n const bottom = toScreenY(minY);\n return {\n left,\n top,\n width: right - left,\n height: bottom - top,\n cx: (left + right) / 2,\n cy: (top + bottom) / 2,\n };\n}\n","/**\n * drivers.ts — 進捗 0→1 の供給源。\n *\n * - scroll … sticky トリガー領域のスクロール量から進捗を算出(標準)。\n * - manual … 呼び出し側が `progress` を注入(時間・GSAP・任意)。\n *\n * 進捗ゲッターは「毎フレーム呼ばれる純粋な関数」として表現する(useFrame から polling)。\n * SSR セーフ(`window` 不在時は 0 を返す)。\n */\n\nimport { useCallback } from \"react\";\nimport type { RefObject } from \"react\";\n\n/** sticky トリガー領域の既定高さ(×100vh)。 */\nexport const DEFAULT_TRIGGER_HEIGHT = 2;\n\n/** スクロール連動ドライバ設定。 */\nexport interface ScrollDriverConfig {\n type: \"scroll\";\n /**\n * sticky トリガー領域の高さ(×100vh)。大きいほど演出がゆっくり進む。既定 {@link DEFAULT_TRIGGER_HEIGHT}。\n * (ラッパー要素の高さ生成に使う。進捗式自体は要素実寸から算出するため値に依存しない。)\n */\n triggerHeight?: number;\n}\n\n/** 手動ドライバ設定(progress を外部制御)。 */\nexport interface ManualDriverConfig {\n type: \"manual\";\n /** 0..1 の進捗。 */\n progress: number;\n}\n\n/**\n * 自動再生ドライバ設定。スクロール不要で、時間ベースに進捗 0→1 を進める。\n * 「普通にテキストとして、どんな箱にも置いて勝手に動かす」用途の標準。\n * 既定では画面内に入った瞬間に再生開始(`playOnView`)。\n */\nexport interface AutoplayDriverConfig {\n type: \"autoplay\";\n /** 0→1 にかける秒数。既定 4。 */\n duration?: number;\n /** 再生開始までの遅延秒。既定 0。 */\n delay?: number;\n /** ループ再生。既定 false(1 回で 1.0 に張り付く)。 */\n loop?: boolean;\n /** ループ時に 0→1→0 を往復する(loop 必須)。既定 false。 */\n pingpong?: boolean;\n /** 画面内に入ってから再生開始(IntersectionObserver)。既定 true。 */\n playOnView?: boolean;\n}\n\n/** ドライバ設定の合併型。 */\nexport type DriverConfig =\n | ScrollDriverConfig\n | ManualDriverConfig\n | AutoplayDriverConfig;\n\n/** 0→1→0 の三角波(pingpong 用)。 */\nfunction triangle(x: number): number {\n const t = x % 2;\n return t <= 1 ? t : 2 - t;\n}\n\n/**\n * 自動再生ドライバの進捗を、経過秒から純粋に算出する。\n * `loop`/`pingpong`/`delay` を解決し 0..1 を返す。SSR セーフ(時計は呼び出し側が渡す)。\n */\nexport function computeAutoplayProgress(\n elapsedSec: number,\n cfg: Pick<AutoplayDriverConfig, \"duration\" | \"delay\" | \"loop\" | \"pingpong\">,\n): number {\n const duration = cfg.duration && cfg.duration > 0 ? cfg.duration : 4;\n const delay = cfg.delay && cfg.delay > 0 ? cfg.delay : 0;\n const t = elapsedSec - delay;\n if (t <= 0) return 0;\n const raw = t / duration;\n if (cfg.loop) {\n return cfg.pingpong ? triangle(raw) : raw % 1;\n }\n return clamp01(raw);\n}\n\n/** 0..1 にクランプ。 */\nfunction clamp01(x: number): number {\n return x < 0 ? 0 : x > 1 ? 1 : x;\n}\n\n/**\n * 要素の sticky スクロール進捗 0→1 を返すゲッターを作る。\n * 進捗 = `-rect.top / (rect.height - innerHeight)`(要素上端が viewport 上端を通過し切るまでで 0→1)。\n * SSR / 要素 null 時は 0。\n */\nexport function createScrollProgress(\n element: HTMLElement | null,\n): () => number {\n return () => {\n if (element === null || typeof window === \"undefined\") return 0;\n const rect = element.getBoundingClientRect();\n const total = rect.height - window.innerHeight;\n if (total <= 0) return 0;\n return clamp01(-rect.top / total);\n };\n}\n\n/**\n * sticky トリガー要素の ref からスクロール進捗ゲッターを返す React フック。\n * 返り値は ref を遅延参照する安定した関数(useFrame からそのまま polling できる)。\n */\nexport function useScrollProgress(\n ref: RefObject<HTMLElement | null>,\n): () => number {\n return useCallback(() => {\n const el = ref.current;\n if (el === null || typeof window === \"undefined\") return 0;\n const rect = el.getBoundingClientRect();\n const total = rect.height - window.innerHeight;\n if (total <= 0) return 0;\n return clamp01(-rect.top / total);\n }, [ref]);\n}\n","/**\n * useReducedMotion.ts — `prefers-reduced-motion: reduce` の購読。\n *\n * 演出を無効化(静的フォールバック表示)すべきかの判定に使う。\n * SSR では false から始め、マウント後にメディアクエリへ同期する(ハイドレーション不一致回避)。\n */\n\nimport { useEffect, useState } from \"react\";\n\nconst QUERY = \"(prefers-reduced-motion: reduce)\";\n\n/** 現在 reduced-motion かを同期的に返す(イベント購読なし。imperative 用)。 */\nexport function prefersReducedMotion(): boolean {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(QUERY).matches;\n}\n\n/**\n * `prefers-reduced-motion: reduce` を購読する React フック。\n * 変更にも追随する。SSR セーフ(初期 false → マウント後に同期)。\n */\nexport function useReducedMotion(): boolean {\n const [reduced, setReduced] = useState(false);\n\n useEffect(() => {\n if (\n typeof window === \"undefined\" ||\n typeof window.matchMedia !== \"function\"\n ) {\n return;\n }\n const mq = window.matchMedia(QUERY);\n setReduced(mq.matches);\n const onChange = () => setReduced(mq.matches);\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n }, []);\n\n return reduced;\n}\n","/**\n * GlyphPoints.tsx — THREE.Points + ShaderMaterial 本体。\n *\n * keyframes から各キーフレームの位置ターゲット(aPos0..aPosN-1)を生成し、\n * 進捗 0→1 を毎フレーム読んで補間スカラ(stage/form/settle/burst/swap/resolve)を\n * 算出し uniform に流す。位置補間自体はシェーダ({@link buildVertexShader})が行う。\n */\n\nimport { useEffect, useMemo, useRef } from \"react\";\nimport type { RefObject } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\n\nimport {\n buildTextTargets,\n buildDenseTextTargets,\n type Random,\n} from \"./sampling.js\";\nimport {\n buildGlyphFromDOM,\n computeScreenRect,\n viewSizeAtZ0,\n} from \"./dom-overlay.js\";\nimport {\n buildVertexShader,\n FRAGMENT_SHADER,\n glyphPositionAttribute,\n} from \"./shaders.js\";\nimport type { Keyframe } from \"./types.js\";\n\n/** GlyphPoints が解決済みで受け取る配色。 */\nexport interface ResolvedColors {\n ink: THREE.Color;\n accent: THREE.Color;\n accentRatio: number;\n}\n\n/** GlyphPoints が解決済みで受け取る質感(プリセット+上書き済み)。 */\nexport interface ResolvedStyle {\n size: number;\n blend: \"normal\" | \"additive\";\n drift: number;\n sparkle: number;\n}\n\n/**\n * シェーダの uniform 群(型付き)。\n * r3f は `uniforms` prop をクローンしてマテリアルへ適用するため、\n * 毎フレームの更新は必ず `material.uniforms`(このクローン側)を直接ミューテートする。\n * 元の useMemo オブジェクトを更新しても GPU には届かない。\n */\ninterface GlyphUniforms {\n uTime: THREE.IUniform<number>;\n uStage: THREE.IUniform<number>;\n uTimes: THREE.IUniform<number[]>;\n uForm: THREE.IUniform<number>;\n uSettle: THREE.IUniform<number>;\n uBurst: THREE.IUniform<number>;\n uSwap: THREE.IUniform<number>;\n uResolve: THREE.IUniform<number>;\n uReduced: THREE.IUniform<number>;\n uPointer: THREE.IUniform<THREE.Vector3>;\n uPointerActive: THREE.IUniform<number>;\n uSize: THREE.IUniform<number>;\n uSizeScale: THREE.IUniform<number>;\n uDrift: THREE.IUniform<number>;\n uSparkle: THREE.IUniform<number>;\n uPixelRatio: THREE.IUniform<number>;\n uColorInk: THREE.IUniform<THREE.Color>;\n uColorAccent: THREE.IUniform<THREE.Color>;\n}\n\n/** GlyphPoints が解決済みで受け取る設定。 */\nexport interface GlyphPointsProps {\n keyframes: Keyframe[];\n count: number;\n colors: ResolvedColors;\n style: ResolvedStyle;\n cameraZ: number;\n cameraFov: number;\n pointer: boolean;\n drag: boolean;\n getProgress: () => number;\n /** 各キーフレームの正規化時刻(省略時は等間隔)。 */\n timing?: number[] | undefined;\n /** resolveToDom 用の実文字オーバーレイ要素。 */\n resolveRef?: RefObject<HTMLDivElement | null> | undefined;\n /**\n * resolveToDom の解決先が「ユーザーの実 DOM 要素」のときのセレクタ。\n * 指定時は自前オーバーレイを使わず、粒子がピクセル整列している\n * その実要素の不透明度を直接フェードする(整列が原理保証される)。\n */\n resolveDomSelector?: string | undefined;\n}\n\nconst DEFAULT_TEXT_FONT =\n \"700 140px system-ui, 'Hiragino Sans', 'Noto Sans JP', sans-serif\";\nconst DEFAULT_DENSE_FONT =\n \"900 260px 'Helvetica Neue', Helvetica, Arial, sans-serif\";\n\nfunction isMobile(): boolean {\n return (\n typeof window !== \"undefined\" &&\n window.matchMedia(\"(max-width: 768px)\").matches\n );\n}\n\nfunction smooth(a: number, b: number, x: number): number {\n const t = THREE.MathUtils.clamp((x - a) / (b - a), 0, 1);\n return t * t * (3 - 2 * t);\n}\n\n/** 中心 c で 1、左右の neighbor 時刻でほぼ 0 になる山。 */\nfunction bump(x: number, c: number, prev: number, next: number): number {\n const rise = c <= 0 ? 1 : smooth(prev, c, x);\n const fall = c >= 1 ? 1 : 1 - smooth(c, next, x);\n return rise * fall;\n}\n\n/** 飛散雲(ランダム球殻)を生成。 */\nfunction buildScatter(\n count: number,\n spread: number,\n random: Random,\n): Float32Array {\n const out = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n const r = (3.0 + Math.cbrt(random()) * 2.6) * spread;\n const theta = random() * Math.PI * 2;\n const phi = Math.acos(2 * random() - 1);\n out[i * 3] = r * Math.sin(phi) * Math.cos(theta);\n out[i * 3 + 1] = r * Math.sin(phi) * Math.sin(theta) * 0.8;\n out[i * 3 + 2] = r * Math.cos(phi) * 0.9;\n }\n return out;\n}\n\n/** 1 つのキーフレームの位置ターゲットを生成。 */\nfunction buildKeyframeTargets(\n kf: Keyframe,\n count: number,\n ctx: { visW: number; mobile: boolean; cameraFov: number; cameraZ: number },\n): Float32Array {\n if (kf.type === \"scatter\") {\n return buildScatter(count, kf.spread ?? 1, Math.random);\n }\n\n const lines = kf.text.split(\"\\n\");\n\n // 実 DOM 要素に重ねる(取得できればピクセル一致)。\n if (kf.domSelector) {\n const dom = buildGlyphFromDOM(count, lines, {\n selector: kf.domSelector,\n fovDeg: ctx.cameraFov,\n cameraZ: ctx.cameraZ,\n });\n if (dom) return dom;\n // 取れなければ通常サンプリングへフォールバック。\n }\n\n if (kf.dense) {\n return buildDenseTextTargets(count, lines, {\n font: kf.font ?? DEFAULT_DENSE_FONT,\n worldW: kf.worldW ?? ctx.visW * (ctx.mobile ? 0.86 : 0.62),\n offsetX: kf.offsetX ?? 0,\n offsetY: kf.offsetY ?? 0,\n thickness: 0.06,\n cw: 1400,\n ch: 440,\n step: 1,\n });\n }\n\n return buildTextTargets(count, lines, {\n font: kf.font ?? DEFAULT_TEXT_FONT,\n worldW: kf.worldW ?? ctx.visW * 0.7,\n lineHeight: 178,\n offsetX: kf.offsetX ?? 0,\n offsetY: kf.offsetY ?? 0,\n thickness: 0.16,\n cw: 1280,\n ch: 560,\n step: 2,\n });\n}\n\nexport function GlyphPoints(props: GlyphPointsProps) {\n const {\n keyframes,\n count,\n colors,\n style,\n cameraZ,\n cameraFov,\n pointer: pointerEnabled,\n drag: dragEnabled,\n getProgress,\n timing,\n resolveRef,\n resolveDomSelector,\n } = props;\n\n const pointsRef = useRef<THREE.Points>(null);\n // domSelector 解決先の実 DOM 要素をキャッシュ(毎フレーム querySelector を避ける)。\n const resolveDomElRef = useRef<HTMLElement | null>(null);\n const matRef = useRef<THREE.ShaderMaterial>(null);\n const { size, gl } = useThree();\n\n const pointer = useRef({ x: 0, y: 0, active: 0 });\n const rot = useRef({ x: 0, y: 0, vx: 0, vy: 0 });\n const dragState = useRef({ down: false, lx: 0, ly: 0 });\n const stage = useRef(0);\n // 「字形が読める度合い」を frame 間で共有(ドラッグの効き調整に使う)。\n const guardRef = useRef(0);\n\n const n = keyframes.length;\n\n // 各キーフレームの正規化時刻(補間境界)。\n // 既定: 最終キーフレームが text の場合は 0.85 で形成し切り、0.85→1.0 を「くっきり保持」区間にする\n //(最後の瞬間まで雲のままにせず、字形を読ませる/フィナーレ解決へ綺麗に受け渡すため)。\n const times = useMemo<number[]>(() => {\n if (timing && timing.length === n) return timing.slice();\n if (n <= 1) return [0];\n const lastIsText = keyframes[n - 1]?.type === \"text\";\n const end = lastIsText ? 0.85 : 1;\n return Array.from({ length: n }, (_, i) => (i / (n - 1)) * end);\n }, [timing, n, keyframes]);\n\n // タイムライン上の意味論(どこが text / scatter か、解決の有無)。\n const timeline = useMemo(() => {\n const isText = keyframes.map((k) => k.type === \"text\");\n const isScatter = keyframes.map((k) => k.type === \"scatter\");\n const last = keyframes[n - 1];\n const hasResolve =\n n >= 1 && last?.type === \"text\" && last.resolveToDom === true;\n const resolveText =\n last?.type === \"text\" ? last.text.replace(/\\n/g, \" \") : \"\";\n const swapAt = times[1] !== undefined ? times[1] * 0.15 : 0;\n return { isText, isScatter, hasResolve, resolveText, swapAt };\n }, [keyframes, n, times]);\n\n // geometry(aPos0..aPosN-1 + aSeed + aAccent)。\n const built = useMemo(() => {\n const geo = new THREE.BufferGeometry();\n const seed = new Float32Array(count);\n const accent = new Float32Array(count);\n for (let i = 0; i < count; i++) {\n seed[i] = Math.random();\n accent[i] = Math.random() < colors.accentRatio ? 1 : 0;\n }\n\n const mobile = isMobile();\n const vpW = typeof window !== \"undefined\" ? window.innerWidth : 1440;\n const vpH = typeof window !== \"undefined\" ? window.innerHeight : 900;\n const { worldW: visW } = viewSizeAtZ0(vpW, vpH, cameraFov, cameraZ);\n\n const buffers = keyframes.map((kf) =>\n buildKeyframeTargets(kf, count, {\n visW,\n mobile,\n cameraFov,\n cameraZ,\n }),\n );\n\n buffers.forEach((buf, i) => {\n geo.setAttribute(\n glyphPositionAttribute(i),\n new THREE.BufferAttribute(buf, 3),\n );\n });\n geo.setAttribute(\"aSeed\", new THREE.BufferAttribute(seed, 1));\n geo.setAttribute(\"aAccent\", new THREE.BufferAttribute(accent, 1));\n // position は shader で計算するが、bounding 用にダミー(最初のキーフレーム)。\n const first = buffers[0] ?? new Float32Array(count * 3);\n geo.setAttribute(\"position\", new THREE.BufferAttribute(first.slice(), 3));\n geo.computeBoundingSphere();\n\n return { geo, buffers, visW, vpW, vpH };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [keyframes, count, colors.accentRatio, cameraFov, cameraZ]);\n\n const vertexShader = useMemo(() => buildVertexShader(Math.max(n, 1)), [n]);\n\n const uniforms = useMemo(\n () => ({\n uTime: { value: 0 },\n uStage: { value: 0 },\n uTimes: { value: times.slice() },\n uForm: { value: 0 },\n uSettle: { value: 0 },\n uBurst: { value: 0 },\n uSwap: { value: 0 },\n uResolve: { value: 0 },\n uReduced: { value: 0 },\n uPointer: { value: new THREE.Vector3(0, 0, 0) },\n uPointerActive: { value: 0 },\n uSize: { value: 1 },\n uSizeScale: { value: style.size },\n uDrift: { value: style.drift },\n uSparkle: { value: style.sparkle },\n uPixelRatio: { value: 1 },\n uColorInk: { value: colors.ink.clone() },\n uColorAccent: { value: colors.accent.clone() },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [vertexShader],\n );\n\n // resolveToDom: 実文字オーバーレイを粒子グリフにピクセル整列させる。\n // 粒子グリフは最終キーフレームのフォント(既定 Helvetica Neue 900)でサンプリングされる。\n // クロスフェードで字形がズレないよう、実文字も同じフォントファミリ/ウェイトにし、\n // フォントサイズは「高さ基準」ではなく「粒子グリフの実幅にフィット」させる\n // (幅広ワードマークは高さ基準だと痩せて中央に縮こまるため)。\n const positionOverlay = () => {\n const el = resolveRef?.current;\n if (!el || !timeline.hasResolve) return;\n const finalBuf = built.buffers[n - 1];\n if (!finalBuf) return;\n const vpW = window.innerWidth;\n const vpH = window.innerHeight;\n const { worldW: visW } = viewSizeAtZ0(vpW, vpH, cameraFov, cameraZ);\n const rect = computeScreenRect(finalBuf, vpW, vpH, visW);\n if (!rect) return;\n\n // 最終キーフレームのフォント文字列から family / weight を取り出す\n // (例 \"900 260px 'Helvetica Neue', Helvetica, Arial, sans-serif\")。\n const finalKf = keyframes[n - 1];\n const fontStr =\n finalKf?.type === \"text\" && finalKf.font\n ? finalKf.font\n : DEFAULT_DENSE_FONT;\n const fontMatch = fontStr.match(/^\\s*(\\d+)\\s+[\\d.]+px\\s+(.+)$/);\n const fontWeight = fontMatch?.[1] ?? \"900\";\n const fontFamily = fontMatch?.[2] ?? \"sans-serif\";\n\n // 実文字を粒子グリフへ厳密整列させる。\n // 字送り幅(advance)ではなく「実際のインク範囲」をオフスクリーン canvas で\n // ピクセル走査し、インクの中心を粒子グリフ矩形の中心へ合わせる。\n // (L と O など左右ベアリングが非対称な語は advance 基準だと横にズレる。)\n const text = timeline.resolveText;\n const ctx = document.createElement(\"canvas\").getContext(\"2d\", {\n willReadFrequently: true,\n });\n\n let positioned = false;\n if (ctx && text) {\n // 1) 基準サイズで描いて塗りピクセルの bbox を実測。\n const baseSize = 200;\n ctx.font = `${fontWeight} ${baseSize}px ${fontFamily}`;\n const advBase = ctx.measureText(text).width;\n const pad = Math.ceil(baseSize * 0.6);\n const cw = Math.ceil(advBase + pad * 2);\n const ch = Math.ceil(baseSize * 1.8);\n const oc = document.createElement(\"canvas\");\n oc.width = cw;\n oc.height = ch;\n const octx = oc.getContext(\"2d\", { willReadFrequently: true });\n if (octx) {\n const drawX = pad;\n const drawY = Math.round(ch * 0.72);\n octx.font = `${fontWeight} ${baseSize}px ${fontFamily}`;\n octx.textAlign = \"left\";\n octx.textBaseline = \"alphabetic\";\n octx.fillStyle = \"#000\";\n octx.fillText(text, drawX, drawY);\n const data = octx.getImageData(0, 0, cw, ch).data;\n let minX = cw;\n let maxX = 0;\n let minY = ch;\n let maxY = 0;\n let found = 0;\n for (let y = 0; y < ch; y++) {\n for (let x = 0; x < cw; x++) {\n if (data[(y * cw + x) * 4 + 3]! > 20) {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n found++;\n }\n }\n }\n if (found > 0) {\n // 2) インク幅を粒子グリフ幅に合わせて fontSize を決定。\n const fontSize = baseSize * (rect.width / (maxX - minX));\n const scale = fontSize / baseSize;\n // 描画原点(text 先頭, baseline)基準のインク中心オフセット(fitted px)。\n const inkCenterXFromStart = ((minX + maxX) / 2 - drawX) * scale;\n const inkCenterYFromBaseline = ((minY + maxY) / 2 - drawY) * scale;\n // line-height:1 のときの「要素頂点 → ベースライン」距離。\n ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n const fm = ctx.measureText(text);\n const leading = fontSize - (fm.fontBoundingBoxAscent + fm.fontBoundingBoxDescent);\n const baselineFromTop = leading / 2 + fm.fontBoundingBoxAscent;\n // 3) インク中心 = 粒子グリフ矩形の中心 となるよう left/top を決める。\n const targetCx = rect.left + rect.width / 2;\n const targetCy = rect.top + rect.height / 2;\n el.style.display = \"block\";\n el.style.textAlign = \"left\";\n el.style.whiteSpace = \"nowrap\";\n el.style.width = \"auto\";\n el.style.height = \"auto\";\n el.style.fontFamily = fontFamily;\n el.style.fontWeight = fontWeight;\n el.style.fontSize = `${fontSize}px`;\n el.style.left = `${targetCx - inkCenterXFromStart}px`;\n el.style.top = `${targetCy - inkCenterYFromBaseline - baselineFromTop}px`;\n positioned = true;\n }\n }\n }\n\n // フォールバック(canvas 不可): 従来の矩形フィット。\n if (!positioned) {\n const measureSize = 100;\n let fontSize = rect.height * 0.92;\n if (ctx && text) {\n ctx.font = `${fontWeight} ${measureSize}px ${fontFamily}`;\n const w = ctx.measureText(text).width;\n if (w > 0) fontSize = measureSize * (rect.width / w);\n }\n el.style.left = `${rect.left}px`;\n el.style.top = `${rect.top}px`;\n el.style.width = `${rect.width}px`;\n el.style.height = `${rect.height}px`;\n el.style.fontFamily = fontFamily;\n el.style.fontWeight = fontWeight;\n el.style.fontSize = `${fontSize}px`;\n }\n };\n\n // 初回 / フォント読込 / リサイズで再サンプリング・再配置(DOM とピタリ重ねる)。\n const rebuildDomGlyphs = () => {\n keyframes.forEach((kf, i) => {\n if (kf.type !== \"text\" || !kf.domSelector) return;\n const next = buildGlyphFromDOM(count, kf.text.split(\"\\n\"), {\n selector: kf.domSelector,\n fovDeg: cameraFov,\n cameraZ,\n // 粒子がレンダリングされる canvas の実寸(CSS px)。\n // window.innerWidth だとスクロールバー分ずれるため size を使う。\n viewportW: size.width,\n viewportH: size.height,\n });\n if (!next) return;\n const attr = built.geo.getAttribute(glyphPositionAttribute(i)) as\n | THREE.BufferAttribute\n | undefined;\n if (!attr) return;\n (attr.array as Float32Array).set(next);\n attr.needsUpdate = true;\n });\n positionOverlay();\n };\n\n useEffect(() => {\n const raf = requestAnimationFrame(rebuildDomGlyphs);\n const t1 = window.setTimeout(rebuildDomGlyphs, 120);\n const t2 = window.setTimeout(rebuildDomGlyphs, 500);\n const fonts = (document as Document & { fonts?: FontFaceSet }).fonts;\n if (fonts && typeof fonts.ready?.then === \"function\") {\n fonts.ready.then(() => rebuildDomGlyphs()).catch(() => {});\n }\n const onResize = () => rebuildDomGlyphs();\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => {\n cancelAnimationFrame(raf);\n window.clearTimeout(t1);\n window.clearTimeout(t2);\n window.removeEventListener(\"resize\", onResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [built]);\n\n // ポインタ / ドラッグ。\n useEffect(() => {\n if (!pointerEnabled && !dragEnabled) return;\n const el = gl.domElement;\n const toNDC = (clientX: number, clientY: number) => {\n const r = el.getBoundingClientRect();\n return {\n x: ((clientX - r.left) / r.width) * 2 - 1,\n y: -(((clientY - r.top) / r.height) * 2 - 1),\n };\n };\n const onMove = (e: PointerEvent) => {\n if (pointerEnabled) {\n const ndc = toNDC(e.clientX, e.clientY);\n pointer.current.x = ndc.x;\n pointer.current.y = ndc.y;\n pointer.current.active = 1;\n }\n if (dragEnabled && dragState.current.down) {\n const dx = e.clientX - dragState.current.lx;\n const dy = e.clientY - dragState.current.ly;\n const grip = 1.0 - guardRef.current * 0.85;\n rot.current.vy += dx * 0.00035 * grip;\n rot.current.vx += dy * 0.00025 * grip;\n dragState.current.lx = e.clientX;\n dragState.current.ly = e.clientY;\n }\n };\n const onDown = (e: PointerEvent) => {\n dragState.current.down = true;\n dragState.current.lx = e.clientX;\n dragState.current.ly = e.clientY;\n };\n const onUp = () => {\n dragState.current.down = false;\n };\n const onLeave = () => {\n pointer.current.active = 0;\n dragState.current.down = false;\n };\n el.addEventListener(\"pointermove\", onMove, { passive: true });\n if (dragEnabled) el.addEventListener(\"pointerdown\", onDown, { passive: true });\n window.addEventListener(\"pointerup\", onUp, { passive: true });\n el.addEventListener(\"pointerleave\", onLeave, { passive: true });\n return () => {\n el.removeEventListener(\"pointermove\", onMove);\n el.removeEventListener(\"pointerdown\", onDown);\n window.removeEventListener(\"pointerup\", onUp);\n el.removeEventListener(\"pointerleave\", onLeave);\n };\n }, [gl, pointerEnabled, dragEnabled]);\n\n // 解像度に応じた点サイズ。マテリアル側 uniforms(クローン)を更新する。\n useEffect(() => {\n const mat = matRef.current;\n if (!mat) return;\n const u = mat.uniforms as unknown as GlyphUniforms;\n u.uPixelRatio.value = Math.min(window.devicePixelRatio || 1, 3);\n u.uSize.value = Math.min(size.height / 18, 26);\n }, [size]);\n\n // 質感(プリセット+上書き)をマテリアル uniforms / 合成モードへ反映。\n // uniforms メモは vertexShader にしか依存しないため、style 変化はここで同期する。\n useEffect(() => {\n const mat = matRef.current;\n if (!mat) return;\n const u = mat.uniforms as unknown as GlyphUniforms;\n u.uSizeScale.value = style.size;\n u.uDrift.value = style.drift;\n u.uSparkle.value = style.sparkle;\n mat.blending =\n style.blend === \"additive\"\n ? THREE.AdditiveBlending\n : THREE.NormalBlending;\n mat.needsUpdate = true;\n }, [style.size, style.drift, style.sparkle, style.blend]);\n\n useFrame((state, delta) => {\n const p = pointsRef.current;\n const mat = matRef.current;\n if (!p || !mat) return;\n const u = mat.uniforms as unknown as GlyphUniforms;\n const d = Math.min(delta, 0.05);\n\n const raw = THREE.MathUtils.clamp(getProgress(), 0, 1);\n // スクロール進捗を直接ステージに反映(lerp 追従は間延びの原因になる)。\n // 慣性は driver 側(Lenis 等)で付けるのが正しい役割分担。\n stage.current = raw;\n const s = stage.current;\n\n // --- 補間スカラ(CPU 側で意味論を解決し uniform へ) ---\n let settle = 0;\n let burst = 0;\n for (let i = 0; i < n; i++) {\n const c = times[i] ?? 0;\n const prev = times[i - 1] ?? 0;\n const next = times[i + 1] ?? 1;\n const b = bump(s, c, prev, next);\n if (timeline.isText[i]) settle = Math.max(settle, b);\n if (timeline.isScatter[i]) burst = Math.max(burst, b);\n }\n\n // form: 最終キーフレームが text のとき、その最終遷移の進捗。\n let form = 0;\n const lastIsText = timeline.isText[n - 1] === true;\n if (lastIsText && n >= 2) {\n form = smooth(times[n - 2] ?? 0, times[n - 1] ?? 1, s);\n }\n // 先頭キーフレームが text のとき: 冒頭は「字形が締まった」状態から始め、\n // 最初の遷移で解けていく。これがないと「実文字が消えてから粒子が湧く」空白が出る。\n const firstIsText = timeline.isText[0] === true;\n if (firstIsText && n >= 2) {\n const formStart = 1 - smooth(times[0] ?? 0, times[1] ?? 1, s);\n form = Math.max(form, formStart);\n }\n const guard = THREE.MathUtils.clamp(Math.max(settle, form), 0, 1);\n guardRef.current = guard;\n\n const swapped = raw >= timeline.swapAt ? 1 : 0;\n // 粒子の消失(フェードアウト)。\n const resolve = timeline.hasResolve ? smooth(0.9, 0.98, raw) : 0;\n // 実文字の出現(フェードイン)は粒子の消失より少し遅らせる。\n // 同じカーブだと粒子と実文字が同時に重なり二重像になるため、\n // 「粒子が消えてから文字が立つ」クリーンな受け渡しにする(0.92→1.0)。\n const textReveal = timeline.hasResolve ? smooth(0.92, 1.0, raw) : 0;\n\n u.uTime.value = state.clock.elapsedTime;\n u.uStage.value = s;\n u.uForm.value = form;\n u.uSettle.value = settle;\n u.uBurst.value = burst * (1 - form);\n u.uSwap.value = swapped;\n u.uResolve.value = resolve;\n\n u.uPointer.value.set(pointer.current.x * 3.2, pointer.current.y * 2.0, 0);\n u.uPointerActive.value = pointer.current.active * (1.0 - guard);\n\n // ドラッグ回転(慣性 + 飛散時の自転 + 字形整列で正面復帰)。\n rot.current.x += rot.current.vx;\n rot.current.y += rot.current.vy;\n rot.current.vx *= 0.92;\n rot.current.vy *= 0.92;\n rot.current.y += d * 0.05 * (1.0 - guard);\n const recenter = 0.02 + guard * 0.2;\n const wrappedY = Math.atan2(\n Math.sin(rot.current.y),\n Math.cos(rot.current.y),\n );\n rot.current.y = THREE.MathUtils.lerp(\n rot.current.y,\n rot.current.y - wrappedY,\n recenter,\n );\n rot.current.x = THREE.MathUtils.lerp(rot.current.x, 0, 0.04 + guard * 0.14);\n p.rotation.x = rot.current.x;\n p.rotation.y = rot.current.y;\n\n // resolveToDom: 解決先(自前オーバーレイ or 実 DOM 要素)の不透明度を\n // textReveal(少し遅らせた出現)に同期する。\n if (timeline.hasResolve) {\n let target: HTMLElement | null = resolveRef?.current ?? null;\n if (!target && resolveDomSelector) {\n if (!resolveDomElRef.current) {\n resolveDomElRef.current =\n document.querySelector<HTMLElement>(resolveDomSelector);\n }\n target = resolveDomElRef.current;\n }\n if (target) target.style.opacity = String(textReveal);\n }\n });\n\n return (\n <points ref={pointsRef} geometry={built.geo} frustumCulled={false}>\n <shaderMaterial\n ref={matRef}\n uniforms={uniforms}\n transparent\n depthWrite={false}\n blending={\n style.blend === \"additive\"\n ? THREE.AdditiveBlending\n : THREE.NormalBlending\n }\n vertexShader={vertexShader}\n fragmentShader={FRAGMENT_SHADER}\n />\n </points>\n );\n}\n","/**\n * GlyphDust.tsx — 公開コンポーネント。\n *\n * Canvas ラッパー + フォールバック判定 + ドライバ(scroll / manual)の結線。\n * reduced-motion / WebGL 不可時は `fallback` をそのまま描画(真っ白防止)。\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Canvas } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\n\nimport { GlyphPoints, type ResolvedColors, type ResolvedStyle } from \"./GlyphPoints.js\";\nimport { DEFAULT_TRIGGER_HEIGHT, computeAutoplayProgress } from \"./drivers.js\";\nimport { useReducedMotion } from \"./useReducedMotion.js\";\nimport type { GlyphDustProps, GlyphPreset } from \"./types.js\";\n\nconst DEFAULT_INK = \"#1b2330\";\nconst DEFAULT_ACCENT = \"#0055ff\";\nconst DEFAULT_ACCENT_RATIO = 0.18;\nconst DEFAULT_COUNT_DESKTOP = 11000;\nconst DEFAULT_COUNT_MOBILE = 5200;\nconst DEFAULT_CAMERA_Z = 7;\nconst DEFAULT_CAMERA_FOV = 42;\nconst DEFAULT_DPR: [number, number] = [1, 1.75];\n\n/** 質感プリセット → 解決済みスタイル。`style` で部分上書きされる土台。 */\nconst PRESETS: Record<GlyphPreset, ResolvedStyle> = {\n default: { size: 1, blend: \"normal\", drift: 1, sparkle: 1 },\n minimal: { size: 0.92, blend: \"normal\", drift: 0.35, sparkle: 0 },\n lively: { size: 1.05, blend: \"normal\", drift: 1.4, sparkle: 1.4 },\n glow: { size: 1.1, blend: \"additive\", drift: 1.1, sparkle: 1.5 },\n};\n\nfunction clamp01(x: number): number {\n return x < 0 ? 0 : x > 1 ? 1 : x;\n}\n\nfunction isWebGLAvailable(): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n const canvas = document.createElement(\"canvas\");\n return Boolean(\n window.WebGLRenderingContext &&\n (canvas.getContext(\"webgl\") ||\n canvas.getContext(\"experimental-webgl\")),\n );\n } catch {\n return false;\n }\n}\n\nexport function GlyphDust(props: GlyphDustProps) {\n const {\n keyframes,\n driver = { type: \"scroll\" },\n preset = \"default\",\n style,\n colors,\n count,\n dpr = DEFAULT_DPR,\n interaction,\n camera,\n timing,\n fallback = null,\n className,\n } = props;\n\n const reduced = useReducedMotion();\n const [webgl, setWebgl] = useState(true);\n useEffect(() => {\n setWebgl(isWebGLAvailable());\n }, []);\n\n const [mobile, setMobile] = useState(false);\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n setMobile(window.matchMedia(\"(max-width: 768px)\").matches);\n }, []);\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const resolveRef = useRef<HTMLDivElement>(null);\n\n // 手動進捗は ref に保持(getProgress を安定させる)。\n const manualRef = useRef(0);\n if (driver.type === \"manual\") manualRef.current = clamp01(driver.progress);\n\n // autoplay 用: 再生中フラグと開始時刻(playOnView の場合は画面内で起動)。\n const autoplay = driver.type === \"autoplay\" ? driver : null;\n const playingRef = useRef(false);\n const startMsRef = useRef<number | null>(null);\n const lastAutoRef = useRef(0);\n\n // autoplay: playOnView が false なら即再生、true なら IntersectionObserver で起動。\n useEffect(() => {\n if (!autoplay) return;\n if (autoplay.playOnView === false) {\n playingRef.current = true;\n return;\n }\n const el = wrapperRef.current;\n if (el === null || typeof IntersectionObserver === \"undefined\") {\n playingRef.current = true; // 観測不可なら無条件再生(真っ白防止)。\n return;\n }\n const io = new IntersectionObserver(\n (entries) => {\n for (const e of entries) {\n if (e.isIntersecting && !playingRef.current) {\n playingRef.current = true;\n startMsRef.current = null; // 入った瞬間を開始点に。\n }\n }\n },\n { threshold: 0.25 },\n );\n io.observe(el);\n return () => io.disconnect();\n // duration/loop 等の変化では貼り直し不要(毎フレーム参照するため)。\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [autoplay?.playOnView]);\n\n const getProgress = useCallback(() => {\n if (driver.type === \"manual\") return manualRef.current;\n if (driver.type === \"autoplay\") {\n if (!playingRef.current || typeof performance === \"undefined\") {\n return lastAutoRef.current;\n }\n if (startMsRef.current === null) startMsRef.current = performance.now();\n const elapsed = (performance.now() - startMsRef.current) / 1000;\n lastAutoRef.current = computeAutoplayProgress(elapsed, driver);\n return lastAutoRef.current;\n }\n const el = wrapperRef.current;\n if (el === null || typeof window === \"undefined\") return 0;\n const rect = el.getBoundingClientRect();\n const total = rect.height - window.innerHeight;\n if (total <= 0) return 0;\n return clamp01(-rect.top / total);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [driver]);\n\n // プリセット+上書き: プリセットを土台に、style で指定された項目だけ上書き。\n const resolvedStyle = useMemo<ResolvedStyle>(() => {\n const base = PRESETS[preset] ?? PRESETS.default;\n return {\n size: style?.size ?? base.size,\n blend: style?.blend ?? base.blend,\n drift: style?.drift ?? base.drift,\n sparkle: style?.sparkle ?? base.sparkle,\n };\n }, [preset, style?.size, style?.blend, style?.drift, style?.sparkle]);\n\n const resolvedColors = useMemo<ResolvedColors>(\n () => ({\n ink: new THREE.Color(colors?.ink ?? DEFAULT_INK),\n accent: new THREE.Color(colors?.accent ?? DEFAULT_ACCENT),\n accentRatio: colors?.accentRatio ?? DEFAULT_ACCENT_RATIO,\n }),\n [colors?.ink, colors?.accent, colors?.accentRatio],\n );\n\n const particleCount = mobile\n ? (count?.mobile ?? DEFAULT_COUNT_MOBILE)\n : (count?.desktop ?? DEFAULT_COUNT_DESKTOP);\n\n const cameraZ = camera?.z ?? DEFAULT_CAMERA_Z;\n const cameraFov = camera?.fov ?? DEFAULT_CAMERA_FOV;\n const pointerEnabled = interaction?.pointer ?? true;\n const dragEnabled = interaction?.drag ?? true;\n\n const finalKf = keyframes[keyframes.length - 1];\n const hasResolve =\n finalKf?.type === \"text\" && finalKf.resolveToDom === true;\n // 最終キーフレームが domSelector を持つなら、その「実 DOM 要素」へ解決する。\n // 粒子はその要素にピクセル整列してサンプリングされる(最初の見出しと同じ仕組み)ため、\n // 別オーバーレイをフィットさせる必要がなく、整列が原理的に保証される。\n const resolveDomSelector =\n finalKf?.type === \"text\" && finalKf.resolveToDom === true && finalKf.domSelector\n ? finalKf.domSelector\n : undefined;\n // 自前オーバーレイを使うのは「resolveToDom かつ domSelector 無し」のときだけ。\n const useOwnOverlay = hasResolve && !resolveDomSelector;\n const resolveText =\n finalKf?.type === \"text\" ? finalKf.text.replace(/\\n/g, \" \") : \"\";\n\n // reduced-motion / WebGL 不可 → フォールバックを描画(真っ白防止)。\n if (reduced || !webgl) {\n return <>{fallback}</>;\n }\n\n const scene = (\n <>\n <Canvas\n dpr={dpr}\n camera={{ position: [0, 0, cameraZ], fov: cameraFov }}\n gl={{ antialias: true, alpha: true, powerPreference: \"high-performance\" }}\n frameloop=\"always\"\n style={{ width: \"100%\", height: \"100%\" }}\n >\n <GlyphPoints\n keyframes={keyframes}\n count={particleCount}\n colors={resolvedColors}\n style={resolvedStyle}\n cameraZ={cameraZ}\n cameraFov={cameraFov}\n pointer={pointerEnabled}\n drag={dragEnabled}\n getProgress={getProgress}\n timing={timing}\n resolveRef={useOwnOverlay ? resolveRef : undefined}\n resolveDomSelector={resolveDomSelector}\n />\n </Canvas>\n {useOwnOverlay ? (\n <div\n ref={resolveRef}\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n opacity: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n lineHeight: 1,\n whiteSpace: \"nowrap\",\n fontWeight: 900,\n color: colors?.ink ?? DEFAULT_INK,\n pointerEvents: \"none\",\n }}\n >\n {resolveText}\n </div>\n ) : null}\n </>\n );\n\n // manual / autoplay: 親要素にフィット(どんな箱にも置ける)。\n // scroll のみ背の高いラッパー + sticky 内枠でフルスクリーン演出。\n if (driver.type === \"manual\" || driver.type === \"autoplay\") {\n return (\n <div\n ref={wrapperRef}\n className={className}\n style={{ position: \"relative\", width: \"100%\", height: \"100%\" }}\n >\n {scene}\n </div>\n );\n }\n\n const triggerHeight = driver.triggerHeight ?? DEFAULT_TRIGGER_HEIGHT;\n return (\n <div\n ref={wrapperRef}\n className={className}\n style={{ position: \"relative\", height: `${triggerHeight * 100}vh` }}\n >\n <div\n style={{\n position: \"sticky\",\n top: 0,\n height: \"100vh\",\n width: \"100%\",\n overflow: \"hidden\",\n }}\n >\n {scene}\n </div>\n </div>\n );\n}\n","/**\n * glyphdust — scroll-driven text → particles → glyph → real-text resolve\n * for react-three-fiber.\n *\n * 公開 API はこのファイルから re-export する。\n */\n\n/** ライブラリのバージョン(package.json と一致させる)。 */\nexport const VERSION = \"0.2.1\";\n\n// 文字 → 粒子ターゲット生成(Task-002)\nexport {\n buildTextTargets,\n buildDenseTextTargets,\n type Random,\n type TextTargetOptions,\n type DenseTextTargetOptions,\n} from \"./sampling.js\";\n\n// GLSL シェーダ(Task-003)\nexport {\n buildVertexShader,\n FRAGMENT_SHADER,\n glyphPositionAttribute,\n GLYPH_POSITION_ATTRIBUTE_PREFIX,\n} from \"./shaders.js\";\n\n// DOM 重ね合わせ・幾何(Task-004)\nexport {\n viewSizeAtZ0,\n buildGlyphFromDOM,\n computeScreenRect,\n type ViewSize,\n type DomGlyphOptions,\n type GlyphScreenRect,\n} from \"./dom-overlay.js\";\n\n// 進捗ドライバ\nexport {\n createScrollProgress,\n useScrollProgress,\n computeAutoplayProgress,\n DEFAULT_TRIGGER_HEIGHT,\n type DriverConfig,\n type ScrollDriverConfig,\n type ManualDriverConfig,\n type AutoplayDriverConfig,\n} from \"./drivers.js\";\n\n// reduced-motion(Task-005)\nexport { useReducedMotion, prefersReducedMotion } from \"./useReducedMotion.js\";\n\n// 公開コンポーネント(Task-006)\nexport { GlyphDust } from \"./GlyphDust.js\";\n\n// 公開型(Task-006 / 007)\nexport type {\n Keyframe,\n TextKeyframe,\n ScatterKeyframe,\n GlyphColors,\n GlyphStyle,\n GlyphPreset,\n GlyphCount,\n GlyphCamera,\n GlyphInteraction,\n GlyphDustProps,\n} from \"./types.js\";\n"]}
1
+ {"version":3,"sources":["../src/sampling.ts","../src/shaders.ts","../src/dom-overlay.ts","../src/drivers.ts","../src/useReducedMotion.ts","../src/GlyphPoints.tsx","../src/GlyphDust.tsx","../src/index.ts"],"names":["ALPHA_THRESHOLD","useCallback","useState","useEffect","THREE","useRef","useThree","useMemo","useFrame","jsx","clamp01","THREE2","Fragment","jsxs","Canvas"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * sampling.ts — 文字 → 粒子ターゲット座標の生成。\n *\n * オフスクリーン Canvas にテキストを描画し、塗りピクセルをサンプリングして\n * 各粒子のワールド座標ターゲット(Float32Array, xyz × count)を作る。\n * フォント非依存・任意文字対応(CJK 含む)。\n *\n * 2 つの戦略:\n * - {@link buildTextTargets} … 通常密度。読める字形をフォールバック付きで生成。\n * - {@link buildDenseTextTargets} … 高密度・均一カバレッジ。穴の目立たないワードマーク向け。\n *\n * いずれも SSR セーフ(`document` 不在時は原点クラスタ or 空配列を返し、例外を投げない)。\n */\n\nimport type { TextSegment } from \"./types.js\";\n\n/** alpha がこの値を超えるピクセルを「塗り」とみなす。 */\nconst ALPHA_THRESHOLD = 128;\n\n/**\n * Knuth の乗算ハッシュ定数(2^32 / 黄金比)。\n * 連番 i を擬似ランダムに散らし、塗りピクセルへ均しく割り当てるために使う。\n */\nconst HASH_MULTIPLIER = 2654435761;\n\n/** 0..1 を返す乱数生成器。テスト時に決定論的な関数を注入できる。 */\nexport type Random = () => number;\n\n/** {@link buildTextTargets} のオプション。 */\nexport interface TextTargetOptions {\n /** Canvas2D の `font` 文字列(例 `\"600 64px 'Noto Sans JP', sans-serif\"`)。 */\n font: string;\n /**\n * 書体混在の区間列。指定すると `lines` の代わりに各区間を `font` 付きで\n * インライン描画する(区間内 `\\n` で改行)。区間の `font` 省略時は上の `font`。\n */\n segments?: TextSegment[] | undefined;\n /** 字形を収める可視ワールド幅。canvas 幅 `cw` 全体がこの幅にマップされる。 */\n worldW: number;\n /** 行送り(px, canvas 座標)。複数行のとき行間に使う。 */\n lineHeight: number;\n /** ワールド y オフセット(上が +)。既定 0。 */\n offsetY?: number;\n /** ワールド x オフセット(右が +)。既定 0。 */\n offsetX?: number;\n /** z 方向の厚み。既定 0.18。 */\n thickness?: number;\n /** ピクセル走査間隔。大きいほど粗く高速。既定 2。 */\n step?: number;\n /** オフスクリーン canvas 幅。既定 1280。 */\n cw?: number;\n /** オフスクリーン canvas 高さ。既定 480。 */\n ch?: number;\n /** テキスト寄せ。DOM 見出しと重ねるときは `\"left\"`。既定 `\"center\"`。 */\n align?: \"center\" | \"left\";\n /** 乱数生成器(ジッタ・フォールバック用)。既定 `Math.random`。 */\n random?: Random;\n}\n\n/** {@link buildDenseTextTargets} のオプション。 */\nexport interface DenseTextTargetOptions {\n /** Canvas2D の `font` 文字列。 */\n font: string;\n /** 書体混在の区間列({@link TextTargetOptions.segments} と同じ)。 */\n segments?: TextSegment[] | undefined;\n /** 字形を収める可視ワールド幅。 */\n worldW: number;\n /** ワールド y オフセット(上が +)。既定 0。 */\n offsetY?: number;\n /** ワールド x オフセット(右が +)。既定 0。 */\n offsetX?: number;\n /** z 方向の厚み。既定 0.08(字形塗りにきっちり乗せる)。 */\n thickness?: number;\n /** ピクセル走査間隔。密に拾うため既定 1。 */\n step?: number;\n /** オフスクリーン canvas 幅。既定 1280。 */\n cw?: number;\n /** オフスクリーン canvas 高さ。既定 400。 */\n ch?: number;\n /** 行送りを `ch` 比で指定。既定 0.46。 */\n lineHeightRatio?: number;\n /** 乱数生成器。既定 `Math.random`。 */\n random?: Random;\n}\n\n/**\n * オフスクリーン 2D canvas コンテキストを作る。\n * SSR / 2D 非対応時は null を返す(呼び出し側でフォールバック)。\n */\nfunction createSamplingContext(\n cw: number,\n ch: number,\n): CanvasRenderingContext2D | null {\n if (typeof document === \"undefined\") return null;\n const canvas = document.createElement(\"canvas\");\n canvas.width = cw;\n canvas.height = ch;\n return canvas.getContext(\"2d\", { willReadFrequently: true });\n}\n\n/**\n * 塗りピクセルの座標を `[x0, y0, x1, y1, ...]` 形式で収集する。\n * 戻り値の長さ / 2 が塗りピクセル数。\n */\nfunction collectFilledPixels(\n ctx: CanvasRenderingContext2D,\n cw: number,\n ch: number,\n step: number,\n): number[] {\n const { data } = ctx.getImageData(0, 0, cw, ch);\n const pts: number[] = [];\n for (let y = 0; y < ch; y += step) {\n for (let x = 0; x < cw; x += step) {\n if (data[(y * cw + x) * 4 + 3]! > ALPHA_THRESHOLD) pts.push(x, y);\n }\n }\n return pts;\n}\n\n/**\n * 塗りピクセルが 0 個だったときのフォールバック。\n * 粒子を小さな楕円体クラスタに集約し、真っ白・破綻を防ぐ。\n */\nfunction fillScatterCluster(\n out: Float32Array,\n count: number,\n offsetX: number,\n offsetY: number,\n random: Random,\n): void {\n for (let i = 0; i < count; i++) {\n const r = Math.cbrt(random()) * 1.4;\n const th = random() * Math.PI * 2;\n out[i * 3] = Math.cos(th) * r + offsetX;\n out[i * 3 + 1] = Math.sin(th) * r * 0.4 + offsetY;\n out[i * 3 + 2] = (random() - 0.5) * 0.2;\n }\n}\n\n/** レイアウト済みのラン(1 区間ぶんの文字+確定書体)。 */\ninterface SegRun {\n text: string;\n font: string;\n}\n\n/**\n * 区間列を「行(ランの並び)」へ展開する。\n * 各区間の `\\n` で改行し、次の区間は新しい行の続きに流れる。\n * 空文字のランは捨てる(測定・描画に寄与しない)。\n */\nfunction segmentsToRunLines(\n segments: TextSegment[],\n defaultFont: string,\n): SegRun[][] {\n const lines: SegRun[][] = [[]];\n for (const seg of segments) {\n const font = seg.font ?? defaultFont;\n const parts = seg.text.split(\"\\n\");\n parts.forEach((part, i) => {\n if (i > 0) lines.push([]);\n if (part.length > 0) lines[lines.length - 1]!.push({ text: part, font });\n });\n }\n return lines;\n}\n\n/**\n * 書体混在の行をオフスクリーン canvas に描画する。\n * 各行は左→右にランを流し(区間ごとに `ctx.font` を切替え measureText で字送り)、\n * `align` に応じて行全体を中央寄せ/左寄せする。塗りは黒・baseline middle。\n */\nfunction drawSegmentedLines(\n ctx: CanvasRenderingContext2D,\n runLines: SegRun[][],\n cw: number,\n ch: number,\n lineHeight: number,\n align: \"center\" | \"left\",\n leftPad: number,\n): void {\n ctx.fillStyle = \"#000\";\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n const blockH = lineHeight * (runLines.length - 1);\n runLines.forEach((runs, i) => {\n const y = ch / 2 - blockH / 2 + i * lineHeight;\n let total = 0;\n for (const r of runs) {\n ctx.font = r.font;\n total += ctx.measureText(r.text).width;\n }\n let x = align === \"left\" ? leftPad : cw / 2 - total / 2;\n for (const r of runs) {\n ctx.font = r.font;\n ctx.fillText(r.text, x, y);\n x += ctx.measureText(r.text).width;\n }\n });\n}\n\n/**\n * テキスト行をオフスクリーン canvas に描画し、塗りピクセルをワールド座標ターゲットへ変換する。\n *\n * 割り当ては「連番ベース + 乗算ハッシュ散らし」で、塗りピクセルを均しく巡回カバーする。\n * 塗りが 0 のときは {@link fillScatterCluster} へフォールバック。\n *\n * @param count 粒子数(戻り値は `count * 3` の Float32Array)\n * @param lines 描画する行(文言は呼び出し側が決める。本関数は文言非依存)\n */\nexport function buildTextTargets(\n count: number,\n lines: string[],\n opts: TextTargetOptions,\n): Float32Array {\n const out = new Float32Array(count * 3);\n const random = opts.random ?? Math.random;\n const cw = opts.cw ?? 1280;\n const ch = opts.ch ?? 480;\n\n const ctx = createSamplingContext(cw, ch);\n if (!ctx) return out;\n\n const align = opts.align ?? \"center\";\n const lh = opts.lineHeight;\n ctx.clearRect(0, 0, cw, ch);\n\n if (opts.segments && opts.segments.length > 0) {\n // 書体混在: 区間ごとに font を切替えてインライン描画。\n const runLines = segmentsToRunLines(opts.segments, opts.font);\n drawSegmentedLines(ctx, runLines, cw, ch, lh, align, cw * 0.04);\n } else {\n ctx.fillStyle = \"#000\";\n ctx.textAlign = align === \"left\" ? \"left\" : \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = opts.font;\n\n // 左寄せ時は左端に余白を取り、各行を揃える。\n const drawX = align === \"left\" ? cw * 0.04 : cw / 2;\n const blockH = lh * (lines.length - 1);\n lines.forEach((line, i) => {\n ctx.fillText(line, drawX, ch / 2 - blockH / 2 + i * lh);\n });\n }\n\n const step = opts.step ?? 2;\n const pts = collectFilledPixels(ctx, cw, ch, step);\n const filled = pts.length / 2;\n\n const offsetX = opts.offsetX ?? 0;\n const offsetY = opts.offsetY ?? 0;\n\n if (filled === 0) {\n fillScatterCluster(out, count, offsetX, offsetY, random);\n return out;\n }\n\n const scale = opts.worldW / cw;\n const thickness = opts.thickness ?? 0.18;\n\n for (let i = 0; i < count; i++) {\n const idx =\n (Math.floor((i / count) * filled) + ((i * HASH_MULTIPLIER) % filled)) %\n filled;\n const px = pts[idx * 2]!;\n const py = pts[idx * 2 + 1]!;\n\n const wx = (px - cw / 2) * scale + offsetX;\n const wy = -(py - ch / 2) * scale + offsetY;\n const jx = (random() - 0.5) * scale * step;\n const jy = (random() - 0.5) * scale * step;\n\n out[i * 3] = wx + jx;\n out[i * 3 + 1] = wy + jy;\n out[i * 3 + 2] = (random() - 0.5) * thickness;\n }\n\n return out;\n}\n\n/**\n * 高密度・均一カバレッジで字形をサンプリングする(穴の目立たないワードマーク用)。\n *\n * 細かい step で塗りピクセルを収集 → 一度だけ Fisher–Yates シャッフル → 粒子へ巡回割当。\n * 各塗りピクセルに `floor/ceil(count / filled)` 個がほぼ均等に乗り、粗密ムラ・穴を防ぐ。\n * ジッタ・z 厚みは小さめにして字形塗りにきっちり乗せる。\n */\nexport function buildDenseTextTargets(\n count: number,\n lines: string[],\n opts: DenseTextTargetOptions,\n): Float32Array {\n const out = new Float32Array(count * 3);\n const random = opts.random ?? Math.random;\n const cw = opts.cw ?? 1280;\n const ch = opts.ch ?? 400;\n\n const ctx = createSamplingContext(cw, ch);\n if (!ctx) return out;\n\n ctx.clearRect(0, 0, cw, ch);\n const lh = ch * (opts.lineHeightRatio ?? 0.46);\n\n if (opts.segments && opts.segments.length > 0) {\n const runLines = segmentsToRunLines(opts.segments, opts.font);\n drawSegmentedLines(ctx, runLines, cw, ch, lh, \"center\", cw * 0.04);\n } else {\n ctx.fillStyle = \"#000\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = opts.font;\n\n const blockH = lh * (lines.length - 1);\n lines.forEach((line, i) => {\n ctx.fillText(line, cw / 2, ch / 2 - blockH / 2 + i * lh);\n });\n }\n\n const step = opts.step ?? 1; // 細かく走査して密に拾う\n const pts = collectFilledPixels(ctx, cw, ch, step);\n const filled = pts.length / 2;\n\n const offsetX = opts.offsetX ?? 0;\n const offsetY = opts.offsetY ?? 0;\n\n if (filled === 0) {\n fillScatterCluster(out, count, offsetX, offsetY, random);\n return out;\n }\n\n const scale = opts.worldW / cw;\n const thickness = opts.thickness ?? 0.08;\n\n // インデックスを一度だけシャッフル(Fisher–Yates)→ 巡回割当で均一カバレッジ。\n const order = new Uint32Array(filled);\n for (let i = 0; i < filled; i++) order[i] = i;\n for (let i = filled - 1; i > 0; i--) {\n const j = (random() * (i + 1)) | 0;\n const t = order[i]!;\n order[i] = order[j]!;\n order[j] = t;\n }\n\n // ジッタは塗り内に収める控えめな量(穴が開かない範囲)。\n const jitter = scale * step * 0.5;\n for (let i = 0; i < count; i++) {\n const idx = order[i % filled]!;\n const px = pts[idx * 2]!;\n const py = pts[idx * 2 + 1]!;\n const wx = (px - cw / 2) * scale + offsetX;\n const wy = -(py - ch / 2) * scale + offsetY;\n out[i * 3] = wx + (random() - 0.5) * jitter;\n out[i * 3 + 1] = wy + (random() - 0.5) * jitter;\n out[i * 3 + 2] = (random() - 0.5) * thickness;\n }\n\n return out;\n}\n","/**\n * shaders.ts — THREE.Points 用の GLSL(頂点 / フラグメント)。\n *\n * 位置補間は「キーフレーム数」に依存するため、頂点シェーダは\n * {@link buildVertexShader} で動的生成する(GLSL は属性の動的添字を許さないので\n * 隣接キーフレーム間の `mix` 連鎖をアンロールして埋め込む)。\n *\n * 演出スカラ(burst / drift / settle / form / swap / resolve)は\n * 「どのキーフレームが scatter か text か」を知る CPU 側(GlyphPoints, useFrame)が\n * 毎フレーム算出して uniform で渡す。これでシェーダはキーフレーム数だけに依存し、\n * 意味論を持たない。\n *\n * 属性(GlyphPoints が設定):\n * - `aPos0 .. aPos{N-1}` … 各キーフレームのターゲット座標(vec3)\n * - `aSeed` … 0..1 個体差シード(ドリフト位相・サイズ・きらめき)\n * - `aAccent` … 0/1 アクセント色フラグ\n *\n * uniform(頂点):\n * - `uTimes[N]` … 各キーフレームの正規化時刻 0..1(補間区間の境界)\n * - `uStage` … 進捗 0..1(位置補間に使う。CPU 側で easing 済みでも可)\n * - `uTime` … アイドル漂い用の時計(秒)\n * - `uForm` … 0..1 字形に締まった度合い(サイズ均一化・ドリフト停止)\n * - `uSettle` … 0..1 整列ホールド度合い(ドリフト減衰・エッジ締め)\n * - `uBurst` … 0..1 外向き飛散量(飛散区間中で上げる)\n * - `uSwap` … 0..1 可視ゲート(最初のスワップ点まで 0)\n * - `uResolve` … 0..1 フィナーレで実 DOM 文字へ受け渡す減衰\n * - `uReduced` … 0/1 reduced-motion\n * - `uPointer` … vec3 ワールド空間のポインタ位置\n * - `uPointerActive`… 0/1 ポインタ反発の有効化\n * - `uSize` … 基準点サイズ\n * - `uPixelRatio` … dpr\n *\n * uniform(フラグメント):\n * - `uColorInk` / `uColorAccent` … 配色\n */\n\n/** 位置ターゲット属性の接頭辞。`aPos0`, `aPos1`, ... */\nexport const GLYPH_POSITION_ATTRIBUTE_PREFIX = \"aPos\";\n\n/** キーフレーム番号 i に対応する位置属性名を返す。 */\nexport function glyphPositionAttribute(index: number): string {\n return `${GLYPH_POSITION_ATTRIBUTE_PREFIX}${index}`;\n}\n\n/**\n * キーフレーム数 N に対応する頂点シェーダ文字列を生成する。\n *\n * 隣接キーフレーム間を `smoothRange(uTimes[k], uTimes[k+1], uStage)` で補間し、\n * `mix` 連鎖でつなぐ。各区間の t は順次 0→1 になるため、uStage が区間 k にあるとき\n * 先行区間は t=1(次キーフレームへ到達済み)・後続は t=0 となり、正しく k→k+1 を補間する。\n *\n * @param keyframeCount キーフレーム数(>= 1)\n * @throws keyframeCount < 1 のとき\n */\nexport function buildVertexShader(keyframeCount: number): string {\n if (!Number.isInteger(keyframeCount) || keyframeCount < 1) {\n throw new Error(\n `buildVertexShader: keyframeCount must be an integer >= 1 (got ${keyframeCount})`,\n );\n }\n\n const attributeDecls = Array.from(\n { length: keyframeCount },\n (_, i) => ` attribute vec3 ${glyphPositionAttribute(i)};`,\n ).join(\"\\n\");\n\n // 隣接キーフレームの mix 連鎖(アンロール)。N==1 のときは補間なし。\n const mixChain = Array.from(\n { length: keyframeCount - 1 },\n (_, k) =>\n ` pos = mix(pos, ${glyphPositionAttribute(k + 1)}, ` +\n `smoothRange(uTimes[${k}], uTimes[${k + 1}], uStage));`,\n ).join(\"\\n\");\n\n return /* glsl */ `\n uniform float uTime;\n uniform float uStage;\n uniform float uTimes[${keyframeCount}];\n uniform float uForm;\n uniform float uSettle;\n uniform float uBurst;\n uniform float uSwap;\n uniform float uResolve;\n uniform float uReduced;\n uniform vec3 uPointer;\n uniform float uPointerActive;\n uniform float uSize;\n uniform float uSizeScale;\n uniform float uDrift;\n uniform float uPixelRatio;\n\n${attributeDecls}\n attribute float aSeed;\n attribute float aAccent;\n\n varying float vSeed;\n varying float vAccent;\n varying float vDepth;\n varying float vForm;\n varying float vAlpha;\n varying float vSettle;\n\n float smoothRange(float a, float b, float x) {\n float t = clamp((x - a) / (b - a), 0.0, 1.0);\n return t * t * (3.0 - 2.0 * t);\n }\n\n void main() {\n vSeed = aSeed;\n vAccent = aAccent;\n vForm = uForm;\n\n // --- キーフレーム間の位置補間(隣接ペアの mix 連鎖) ---\n vec3 pos = ${glyphPositionAttribute(0)};\n${mixChain}\n\n // 遷移中(飛散区間)に外向きドリフトを足してダイナミックに。\n // 方向は原点からの外向き(特定キーフレームに依存しない一般形)。\n float ph = aSeed * 6.2831;\n vec3 dir = normalize(pos + 0.0001);\n pos += dir * uBurst * (0.4 + aSeed * 0.6);\n\n // アイドルの漂い(整列時 settle / 字形時 form で弱める)。\n vSettle = uSettle;\n float drift = (1.0 - uReduced) * (1.0 - uSettle * 0.9) * (1.0 - uForm) * uDrift;\n pos.x += sin(uTime * 0.35 + ph) * 0.06 * drift;\n pos.y += cos(uTime * 0.30 + ph * 1.7) * 0.06 * drift;\n pos.z += sin(uTime * 0.27 + ph * 2.3) * 0.06 * drift;\n\n // ワールド空間でポインタ反発(回転後の見た目に合わせ modelMatrix 経由)。\n vec4 world = modelMatrix * vec4(pos, 1.0);\n if (uPointerActive > 0.5) {\n vec3 diff = world.xyz - uPointer;\n float dist = length(diff);\n float radius = 1.3;\n float force = (1.0 - smoothstep(0.0, radius, dist)) * 0.55;\n world.xyz += normalize(diff + 0.0001) * force;\n }\n\n vec4 mvPosition = viewMatrix * world;\n vDepth = -mvPosition.z;\n gl_Position = projectionMatrix * mvPosition;\n\n // --- 透明度: スワップ点まで不可視、スワップ点で即・不透明(フェード無し)。 ---\n // DOM 見出しと同位置・同サイズで一致しているため、瞬時の切替が「文字→粒子」に見える。\n // フィナーレ(uResolve)で粒子を素早く消し、実 DOM 文字へ受け渡す。\n vAlpha = uSwap * (1.0 - uResolve);\n\n // 点サイズ(遠近 + 個体差)。整列時はやや均一・小さめにして可読性を上げる。\n float sizeVar = mix(0.55 + aSeed * 0.9, 0.72 + aSeed * 0.35, uSettle);\n // 字形収束時は隣接粒子で隙間を埋めるためわずかに大きめ&均一に。\n sizeVar = mix(sizeVar, 0.95 + aSeed * 0.18, uForm);\n // 高 dpr 環境では小粒・上限低めの方がエッジが締まり高精細に見える\n // (コーポレートサイト実装で実証。0.62 と clamp 4〜5 が最も「霞まない」)。\n float s = uSize * sizeVar * 0.62 * uSizeScale;\n gl_PointSize = s * uPixelRatio * (1.0 / -mvPosition.z);\n gl_PointSize = clamp(gl_PointSize, 1.0, mix(4.0, 5.0, uForm) * uPixelRatio);\n }\n`;\n}\n\n/**\n * フラグメントシェーダ。キーフレーム数に依存しないため定数。\n * 円形ソフト点 + アクセント色 + きらめき + 奥行き濃淡。\n */\nexport const FRAGMENT_SHADER = /* glsl */ `\n uniform vec3 uColorInk;\n uniform vec3 uColorAccent;\n uniform float uSparkle;\n\n varying float vSeed;\n varying float vAccent;\n varying float vDepth;\n varying float vForm;\n varying float vAlpha;\n varying float vSettle;\n\n void main() {\n // 円形のソフトな点。中心で 1、縁で 0(smoothstep は edge0<edge1 必須なので反転して使う)。\n vec2 uv = gl_PointCoord - 0.5;\n float r = length(uv);\n float alpha = 1.0 - smoothstep(0.12, 0.5, r);\n if (alpha < 0.02) discard;\n\n // 主体はインク、一部の粒だけアクセント色。字形収束時はやや控えめに。\n float accentAmt = vAccent * mix(0.85, 0.55, vForm);\n vec3 col = mix(uColorInk, uColorAccent, accentAmt);\n\n // 一部の粒に明るいきらめき(飛散時に映える)。整列時は控えめ。\n float spark = step(0.94, vSeed);\n col = mix(col, uColorAccent, spark * mix(0.45, 0.15, vSettle) * uSparkle);\n\n // 奥行きで濃淡(明背景での視認性確保のため下限を持たせる)。\n float floorFade = mix(0.45, 0.78, vSettle);\n float depthFade = clamp(1.0 - (vDepth - 3.0) * 0.10, floorFade, 1.0);\n\n // 整列時は不透明寄りにしてエッジを締める。\n float a = alpha * depthFade * vAlpha;\n a = mix(a, clamp(a * 1.3, 0.0, 1.0), vSettle);\n\n gl_FragColor = vec4(col, a);\n }\n`;\n","/**\n * dom-overlay.ts — 実 DOM 文字との重ね合わせ/受け渡しのための幾何ユーティリティ。\n *\n * - {@link viewSizeAtZ0} … カメラから z=0 平面の可視ワールド幅・高さを求める(screen↔world 変換の素)。\n * - {@link buildGlyphFromDOM} … 指定セレクタの DOM 要素の矩形・フォントから粒子ターゲットを生成。\n * 粒子字形が実 DOM 文字とピクセル単位で重なる(クロスフェードで文字が動かない)。\n * - {@link computeScreenRect} … 粒子ターゲット群の world 範囲を screen(px) 矩形へ変換。\n * フィナーレで実 DOM 文字を同位置・同サイズに合わせるのに使う。\n *\n * いずれも SSR セーフ(`document` / `window` 不在時は null を返す)。\n * グローバル変数や固定イベント名には依存しない(配信方法は呼び出し側が決める)。\n */\n\nimport type { Random } from \"./sampling.js\";\n\n/** alpha がこの値を超えるピクセルを「塗り」とみなす。 */\nconst ALPHA_THRESHOLD = 128;\n\n/** z=0 平面における可視ワールド寸法。 */\nexport interface ViewSize {\n worldW: number;\n worldH: number;\n}\n\n/**\n * カメラ(縦 fov / z=cameraZ)から、z=0 平面の可視ワールド幅・高さを返す。\n * screen(px) → world 変換のスケール算出に使う(等方: `worldW/viewportW === worldH/viewportH`)。\n */\nexport function viewSizeAtZ0(\n viewportW: number,\n viewportH: number,\n fovDeg: number,\n cameraZ: number,\n): ViewSize {\n const worldH = 2 * Math.tan((fovDeg * Math.PI) / 360) * cameraZ;\n const worldW = worldH * (viewportW / viewportH);\n return { worldH, worldW };\n}\n\n/** {@link buildGlyphFromDOM} のオプション。 */\nexport interface DomGlyphOptions {\n /** 対象 DOM 要素のセレクタ(`document.querySelector`)。 */\n selector: string;\n /** カメラ縦 fov(度)。canvas が viewport 全面の sticky 前提。 */\n fovDeg: number;\n /** カメラ z 位置。 */\n cameraZ: number;\n /** CSS px に対する描画倍率(文字を太く拾うため高め)。既定 2。 */\n resolution?: number;\n /** ピクセル走査間隔。既定 2。 */\n step?: number;\n /** z 方向の厚み。既定 0.14。 */\n thickness?: number;\n /** ベースライン近似に使うアセント比(fontSize に対する)。既定 0.82。 */\n ascentRatio?: number;\n /**\n * 実際の canvas 表示サイズ(CSS px)。省略時は window.innerWidth/Height。\n * 縦スクロールバーがあると innerWidth と canvas 幅が数 px ずれ、\n * 画面→ワールド変換が狂って粒子字形が横にずれる。整列には canvas 実寸を渡す。\n */\n viewportW?: number;\n viewportH?: number;\n /** 乱数生成器(ジッタ用)。既定 `Math.random`。 */\n random?: Random;\n}\n\n/**\n * 指定セレクタの DOM 要素の画面矩形・computed フォントから粒子ターゲットを生成する。\n * - 要素の rect / computed font をそのまま使い、同サイズのオフスクリーン Canvas に行を描画。\n * - 各塗りピクセルを「画面座標(px)」→「ワールド座標(z=0平面)」へ変換。\n * → 粒子字形が DOM 要素とピタリ重なり、クロスフェード中に文字が動かない。\n * - 要素が無い / 小さすぎる / 塗りが 0 のときは null(呼び出し側でフォールバック)。\n *\n * @param count 粒子数(戻り値は `count * 3` の Float32Array)\n * @param lines 描画する行(要素のテキストを行分割したもの。文言は呼び出し側が決める)\n */\nexport function buildGlyphFromDOM(\n count: number,\n lines: string[],\n opts: DomGlyphOptions,\n): Float32Array | null {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return null;\n }\n const el = document.querySelector(opts.selector);\n if (!el) return null;\n\n const rect = el.getBoundingClientRect();\n if (rect.width < 2 || rect.height < 2) return null;\n\n const random = opts.random ?? Math.random;\n const cs = window.getComputedStyle(el);\n const fontSize = parseFloat(cs.fontSize) || 64;\n // line-height は \"normal\" の場合があるので算出。\n let lineHeight = parseFloat(cs.lineHeight);\n if (!isFinite(lineHeight) || lineHeight <= 0) lineHeight = fontSize * 1.1;\n const letterSpacing = parseFloat(cs.letterSpacing) || 0;\n const fontWeight = cs.fontWeight || \"600\";\n const fontFamily = cs.fontFamily || \"sans-serif\";\n\n // パディング/ボーダーを除いたコンテンツ左端・上端。\n const padL = parseFloat(cs.paddingLeft) || 0;\n const padT = parseFloat(cs.paddingTop) || 0;\n const contentLeft = rect.left + padL;\n const contentTop = rect.top + padT;\n\n const res = opts.resolution ?? 2;\n const cw = Math.max(2, Math.ceil(rect.width * res));\n const ch = Math.max(2, Math.ceil(rect.height * res));\n const canvas = document.createElement(\"canvas\");\n canvas.width = cw;\n canvas.height = ch;\n const ctx = canvas.getContext(\"2d\", { willReadFrequently: true });\n if (!ctx) return null;\n\n ctx.clearRect(0, 0, cw, ch);\n ctx.scale(res, res); // 以降は CSS px 座標で描く\n ctx.fillStyle = \"#000\";\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"alphabetic\";\n ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n if (\"letterSpacing\" in ctx) {\n try {\n (ctx as CanvasRenderingContext2D & { letterSpacing: string }).letterSpacing =\n `${letterSpacing}px`;\n } catch {\n /* 一部ブラウザ非対応。無視 */\n }\n }\n\n // ベースライン位置をブラウザの行レイアウトに正確に合わせる。\n // 行ボックス内では baseline = 行頂点 + half-leading + fontAscent。\n // フォントの実アセント/ディセントは canvas の measureText から取得する\n // (近似 ascentRatio=0.82 では実フォントと数 px ずれ、DOM 整列が崩れるため)。\n const fm = ctx.measureText(lines[0] ?? \"M\");\n const fbAsc = fm.fontBoundingBoxAscent;\n const fbDesc = fm.fontBoundingBoxDescent;\n const useMetrics = Number.isFinite(fbAsc) && Number.isFinite(fbDesc);\n const fallbackAscent = fontSize * (opts.ascentRatio ?? 0.82);\n lines.forEach((line, i) => {\n const lineTop = i * lineHeight;\n const baseline = useMetrics\n ? lineTop + (lineHeight - (fbAsc + fbDesc)) / 2 + fbAsc\n : lineTop + (lineHeight - fontSize) / 2 + fallbackAscent;\n ctx.fillText(line, 0, baseline);\n });\n\n const { data } = ctx.getImageData(0, 0, cw, ch);\n const pts: number[] = [];\n const step = opts.step ?? 2;\n for (let y = 0; y < ch; y += step) {\n for (let x = 0; x < cw; x += step) {\n if (data[(y * cw + x) * 4 + 3]! > ALPHA_THRESHOLD) pts.push(x, y);\n }\n }\n const filled = pts.length / 2;\n if (filled === 0) return null;\n\n // 画面(px) → ワールド(z=0) 変換係数。canvas は sticky で viewport 全面。\n // スクロールバー分のズレを避けるため、可能なら canvas 実寸を使う。\n const vpW = opts.viewportW ?? window.innerWidth;\n const vpH = opts.viewportH ?? window.innerHeight;\n const { worldW, worldH } = viewSizeAtZ0(vpW, vpH, opts.fovDeg, opts.cameraZ);\n const pxToWorld = worldW / vpW; // = worldH / vpH(等方)\n const thickness = opts.thickness ?? 0.14;\n\n const out = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n const idx =\n (Math.floor((i / count) * filled) + ((i * 2654435761) % filled)) % filled;\n const cx = pts[idx * 2]! / res; // canvas → CSS px(コンテンツ原点)\n const cy = pts[idx * 2 + 1]! / res;\n\n // CSS px(画面絶対座標)。\n const sx = contentLeft + cx;\n const sy = contentTop + cy;\n\n // 画面 → ワールド(中央原点・y上向き)。\n const wx = (sx / vpW - 0.5) * worldW;\n const wy = -(sy / vpH - 0.5) * worldH;\n\n // 格子感を消す微小ジッタ + 薄い厚み。\n out[i * 3] = wx + (random() - 0.5) * pxToWorld * step;\n out[i * 3 + 1] = wy + (random() - 0.5) * pxToWorld * step;\n out[i * 3 + 2] = (random() - 0.5) * thickness;\n }\n return out;\n}\n\n/** 画面座標(px・左上原点)での字形矩形。実 DOM 文字を重ねるのに使う。 */\nexport interface GlyphScreenRect {\n left: number;\n top: number;\n width: number;\n height: number;\n /** 中心 x。 */\n cx: number;\n /** 中心 y。 */\n cy: number;\n}\n\n/**\n * 粒子ターゲット群(world 座標)の範囲を screen(px) 矩形へ変換する。\n * z=0 / 無回転前提(フィナーレは正面復帰している前提で成立)。\n *\n * @param targets `[x,y,z, ...]` の Float32Array(build*Targets の戻り値)\n * @param viewportW / viewportH 画面ピクセル寸法\n * @param visibleWorldW z=0 平面の可視ワールド幅({@link viewSizeAtZ0} の `worldW`)\n * @returns 字形矩形。targets が空などで算出不能なら null。\n */\nexport function computeScreenRect(\n targets: Float32Array,\n viewportW: number,\n viewportH: number,\n visibleWorldW: number,\n): GlyphScreenRect | null {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < targets.length; i += 3) {\n const x = targets[i]!;\n const y = targets[i + 1]!;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n if (!isFinite(minX)) return null;\n\n const worldW = visibleWorldW;\n const worldH = visibleWorldW * (viewportH / viewportW);\n // world(中央原点・y上向き) → screen(px・左上原点・y下向き)\n const toScreenX = (wx: number) => (wx / worldW + 0.5) * viewportW;\n const toScreenY = (wy: number) => (0.5 - wy / worldH) * viewportH;\n const left = toScreenX(minX);\n const right = toScreenX(maxX);\n const top = toScreenY(maxY); // 上端 = world y 最大\n const bottom = toScreenY(minY);\n return {\n left,\n top,\n width: right - left,\n height: bottom - top,\n cx: (left + right) / 2,\n cy: (top + bottom) / 2,\n };\n}\n","/**\n * drivers.ts — 進捗 0→1 の供給源。\n *\n * - scroll … sticky トリガー領域のスクロール量から進捗を算出(標準)。\n * - manual … 呼び出し側が `progress` を注入(時間・GSAP・任意)。\n *\n * 進捗ゲッターは「毎フレーム呼ばれる純粋な関数」として表現する(useFrame から polling)。\n * SSR セーフ(`window` 不在時は 0 を返す)。\n */\n\nimport { useCallback } from \"react\";\nimport type { RefObject } from \"react\";\n\n/** sticky トリガー領域の既定高さ(×100vh)。 */\nexport const DEFAULT_TRIGGER_HEIGHT = 2;\n\n/** スクロール連動ドライバ設定。 */\nexport interface ScrollDriverConfig {\n type: \"scroll\";\n /**\n * sticky トリガー領域の高さ(×100vh)。大きいほど演出がゆっくり進む。既定 {@link DEFAULT_TRIGGER_HEIGHT}。\n * (ラッパー要素の高さ生成に使う。進捗式自体は要素実寸から算出するため値に依存しない。)\n */\n triggerHeight?: number;\n}\n\n/** 手動ドライバ設定(progress を外部制御)。 */\nexport interface ManualDriverConfig {\n type: \"manual\";\n /** 0..1 の進捗。 */\n progress: number;\n}\n\n/**\n * 自動再生ドライバ設定。スクロール不要で、時間ベースに進捗 0→1 を進める。\n * 「普通にテキストとして、どんな箱にも置いて勝手に動かす」用途の標準。\n * 既定では画面内に入った瞬間に再生開始(`playOnView`)。\n */\nexport interface AutoplayDriverConfig {\n type: \"autoplay\";\n /** 0→1 にかける秒数。既定 4。 */\n duration?: number;\n /** 再生開始までの遅延秒。既定 0。 */\n delay?: number;\n /** ループ再生。既定 false(1 回で 1.0 に張り付く)。 */\n loop?: boolean;\n /** ループ時に 0→1→0 を往復する(loop 必須)。既定 false。 */\n pingpong?: boolean;\n /** 画面内に入ってから再生開始(IntersectionObserver)。既定 true。 */\n playOnView?: boolean;\n}\n\n/** ドライバ設定の合併型。 */\nexport type DriverConfig =\n | ScrollDriverConfig\n | ManualDriverConfig\n | AutoplayDriverConfig;\n\n/** 0→1→0 の三角波(pingpong 用)。 */\nfunction triangle(x: number): number {\n const t = x % 2;\n return t <= 1 ? t : 2 - t;\n}\n\n/**\n * 自動再生ドライバの進捗を、経過秒から純粋に算出する。\n * `loop`/`pingpong`/`delay` を解決し 0..1 を返す。SSR セーフ(時計は呼び出し側が渡す)。\n */\nexport function computeAutoplayProgress(\n elapsedSec: number,\n cfg: Pick<AutoplayDriverConfig, \"duration\" | \"delay\" | \"loop\" | \"pingpong\">,\n): number {\n const duration = cfg.duration && cfg.duration > 0 ? cfg.duration : 4;\n const delay = cfg.delay && cfg.delay > 0 ? cfg.delay : 0;\n const t = elapsedSec - delay;\n if (t <= 0) return 0;\n const raw = t / duration;\n if (cfg.loop) {\n return cfg.pingpong ? triangle(raw) : raw % 1;\n }\n return clamp01(raw);\n}\n\n/** 0..1 にクランプ。 */\nfunction clamp01(x: number): number {\n return x < 0 ? 0 : x > 1 ? 1 : x;\n}\n\n/**\n * 要素の sticky スクロール進捗 0→1 を返すゲッターを作る。\n * 進捗 = `-rect.top / (rect.height - innerHeight)`(要素上端が viewport 上端を通過し切るまでで 0→1)。\n * SSR / 要素 null 時は 0。\n */\nexport function createScrollProgress(\n element: HTMLElement | null,\n): () => number {\n return () => {\n if (element === null || typeof window === \"undefined\") return 0;\n const rect = element.getBoundingClientRect();\n const total = rect.height - window.innerHeight;\n if (total <= 0) return 0;\n return clamp01(-rect.top / total);\n };\n}\n\n/**\n * sticky トリガー要素の ref からスクロール進捗ゲッターを返す React フック。\n * 返り値は ref を遅延参照する安定した関数(useFrame からそのまま polling できる)。\n */\nexport function useScrollProgress(\n ref: RefObject<HTMLElement | null>,\n): () => number {\n return useCallback(() => {\n const el = ref.current;\n if (el === null || typeof window === \"undefined\") return 0;\n const rect = el.getBoundingClientRect();\n const total = rect.height - window.innerHeight;\n if (total <= 0) return 0;\n return clamp01(-rect.top / total);\n }, [ref]);\n}\n","/**\n * useReducedMotion.ts — `prefers-reduced-motion: reduce` の購読。\n *\n * 演出を無効化(静的フォールバック表示)すべきかの判定に使う。\n * SSR では false から始め、マウント後にメディアクエリへ同期する(ハイドレーション不一致回避)。\n */\n\nimport { useEffect, useState } from \"react\";\n\nconst QUERY = \"(prefers-reduced-motion: reduce)\";\n\n/** 現在 reduced-motion かを同期的に返す(イベント購読なし。imperative 用)。 */\nexport function prefersReducedMotion(): boolean {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(QUERY).matches;\n}\n\n/**\n * `prefers-reduced-motion: reduce` を購読する React フック。\n * 変更にも追随する。SSR セーフ(初期 false → マウント後に同期)。\n */\nexport function useReducedMotion(): boolean {\n const [reduced, setReduced] = useState(false);\n\n useEffect(() => {\n if (\n typeof window === \"undefined\" ||\n typeof window.matchMedia !== \"function\"\n ) {\n return;\n }\n const mq = window.matchMedia(QUERY);\n setReduced(mq.matches);\n const onChange = () => setReduced(mq.matches);\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n }, []);\n\n return reduced;\n}\n","/**\n * GlyphPoints.tsx — THREE.Points + ShaderMaterial 本体。\n *\n * keyframes から各キーフレームの位置ターゲット(aPos0..aPosN-1)を生成し、\n * 進捗 0→1 を毎フレーム読んで補間スカラ(stage/form/settle/burst/swap/resolve)を\n * 算出し uniform に流す。位置補間自体はシェーダ({@link buildVertexShader})が行う。\n */\n\nimport { useEffect, useMemo, useRef } from \"react\";\nimport type { RefObject } from \"react\";\nimport { useFrame, useThree } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\n\nimport {\n buildTextTargets,\n buildDenseTextTargets,\n type Random,\n} from \"./sampling.js\";\nimport {\n buildGlyphFromDOM,\n computeScreenRect,\n viewSizeAtZ0,\n} from \"./dom-overlay.js\";\nimport {\n buildVertexShader,\n FRAGMENT_SHADER,\n glyphPositionAttribute,\n} from \"./shaders.js\";\nimport type { Keyframe } from \"./types.js\";\n\n/** GlyphPoints が解決済みで受け取る配色。 */\nexport interface ResolvedColors {\n ink: THREE.Color;\n accent: THREE.Color;\n accentRatio: number;\n}\n\n/** GlyphPoints が解決済みで受け取る質感(プリセット+上書き済み)。 */\nexport interface ResolvedStyle {\n size: number;\n blend: \"normal\" | \"additive\";\n drift: number;\n sparkle: number;\n}\n\n/**\n * シェーダの uniform 群(型付き)。\n * r3f は `uniforms` prop をクローンしてマテリアルへ適用するため、\n * 毎フレームの更新は必ず `material.uniforms`(このクローン側)を直接ミューテートする。\n * 元の useMemo オブジェクトを更新しても GPU には届かない。\n */\ninterface GlyphUniforms {\n uTime: THREE.IUniform<number>;\n uStage: THREE.IUniform<number>;\n uTimes: THREE.IUniform<number[]>;\n uForm: THREE.IUniform<number>;\n uSettle: THREE.IUniform<number>;\n uBurst: THREE.IUniform<number>;\n uSwap: THREE.IUniform<number>;\n uResolve: THREE.IUniform<number>;\n uReduced: THREE.IUniform<number>;\n uPointer: THREE.IUniform<THREE.Vector3>;\n uPointerActive: THREE.IUniform<number>;\n uSize: THREE.IUniform<number>;\n uSizeScale: THREE.IUniform<number>;\n uDrift: THREE.IUniform<number>;\n uSparkle: THREE.IUniform<number>;\n uPixelRatio: THREE.IUniform<number>;\n uColorInk: THREE.IUniform<THREE.Color>;\n uColorAccent: THREE.IUniform<THREE.Color>;\n}\n\n/** GlyphPoints が解決済みで受け取る設定。 */\nexport interface GlyphPointsProps {\n keyframes: Keyframe[];\n count: number;\n colors: ResolvedColors;\n style: ResolvedStyle;\n cameraZ: number;\n cameraFov: number;\n pointer: boolean;\n drag: boolean;\n getProgress: () => number;\n /** 各キーフレームの正規化時刻(省略時は等間隔)。 */\n timing?: number[] | undefined;\n /** resolveToDom 用の実文字オーバーレイ要素。 */\n resolveRef?: RefObject<HTMLDivElement | null> | undefined;\n /**\n * resolveToDom の解決先が「ユーザーの実 DOM 要素」のときのセレクタ。\n * 指定時は自前オーバーレイを使わず、粒子がピクセル整列している\n * その実要素の不透明度を直接フェードする(整列が原理保証される)。\n */\n resolveDomSelector?: string | undefined;\n}\n\nconst DEFAULT_TEXT_FONT =\n \"700 140px system-ui, 'Hiragino Sans', 'Noto Sans JP', sans-serif\";\nconst DEFAULT_DENSE_FONT =\n \"900 260px 'Helvetica Neue', Helvetica, Arial, sans-serif\";\n\nfunction isMobile(): boolean {\n return (\n typeof window !== \"undefined\" &&\n window.matchMedia(\"(max-width: 768px)\").matches\n );\n}\n\nfunction smooth(a: number, b: number, x: number): number {\n const t = THREE.MathUtils.clamp((x - a) / (b - a), 0, 1);\n return t * t * (3 - 2 * t);\n}\n\n/** 中心 c で 1、左右の neighbor 時刻でほぼ 0 になる山。 */\nfunction bump(x: number, c: number, prev: number, next: number): number {\n const rise = c <= 0 ? 1 : smooth(prev, c, x);\n const fall = c >= 1 ? 1 : 1 - smooth(c, next, x);\n return rise * fall;\n}\n\n/** 飛散雲(ランダム球殻)を生成。 */\nfunction buildScatter(\n count: number,\n spread: number,\n random: Random,\n): Float32Array {\n const out = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n const r = (3.0 + Math.cbrt(random()) * 2.6) * spread;\n const theta = random() * Math.PI * 2;\n const phi = Math.acos(2 * random() - 1);\n out[i * 3] = r * Math.sin(phi) * Math.cos(theta);\n out[i * 3 + 1] = r * Math.sin(phi) * Math.sin(theta) * 0.8;\n out[i * 3 + 2] = r * Math.cos(phi) * 0.9;\n }\n return out;\n}\n\n/** 1 つのキーフレームの位置ターゲットを生成。 */\nfunction buildKeyframeTargets(\n kf: Keyframe,\n count: number,\n ctx: { visW: number; mobile: boolean; cameraFov: number; cameraZ: number },\n): Float32Array {\n if (kf.type === \"scatter\") {\n return buildScatter(count, kf.spread ?? 1, Math.random);\n }\n\n const lines = kf.text.split(\"\\n\");\n\n // 実 DOM 要素に重ねる(取得できればピクセル一致)。\n if (kf.domSelector) {\n const dom = buildGlyphFromDOM(count, lines, {\n selector: kf.domSelector,\n fovDeg: ctx.cameraFov,\n cameraZ: ctx.cameraZ,\n });\n if (dom) return dom;\n // 取れなければ通常サンプリングへフォールバック。\n }\n\n if (kf.dense) {\n return buildDenseTextTargets(count, lines, {\n font: kf.font ?? DEFAULT_DENSE_FONT,\n segments: kf.segments,\n worldW: kf.worldW ?? ctx.visW * (ctx.mobile ? 0.86 : 0.62),\n offsetX: kf.offsetX ?? 0,\n offsetY: kf.offsetY ?? 0,\n thickness: 0.06,\n cw: 1400,\n ch: 440,\n step: 1,\n });\n }\n\n return buildTextTargets(count, lines, {\n font: kf.font ?? DEFAULT_TEXT_FONT,\n segments: kf.segments,\n worldW: kf.worldW ?? ctx.visW * 0.7,\n lineHeight: 178,\n offsetX: kf.offsetX ?? 0,\n offsetY: kf.offsetY ?? 0,\n thickness: 0.16,\n cw: 1280,\n ch: 560,\n step: 2,\n });\n}\n\nexport function GlyphPoints(props: GlyphPointsProps) {\n const {\n keyframes,\n count,\n colors,\n style,\n cameraZ,\n cameraFov,\n pointer: pointerEnabled,\n drag: dragEnabled,\n getProgress,\n timing,\n resolveRef,\n resolveDomSelector,\n } = props;\n\n const pointsRef = useRef<THREE.Points>(null);\n // domSelector 解決先の実 DOM 要素をキャッシュ(毎フレーム querySelector を避ける)。\n const resolveDomElRef = useRef<HTMLElement | null>(null);\n const matRef = useRef<THREE.ShaderMaterial>(null);\n const { size, gl } = useThree();\n\n const pointer = useRef({ x: 0, y: 0, active: 0 });\n const rot = useRef({ x: 0, y: 0, vx: 0, vy: 0 });\n const dragState = useRef({ down: false, lx: 0, ly: 0 });\n const stage = useRef(0);\n // 「字形が読める度合い」を frame 間で共有(ドラッグの効き調整に使う)。\n const guardRef = useRef(0);\n\n const n = keyframes.length;\n\n // 各キーフレームの正規化時刻(補間境界)。\n // 既定: 最終キーフレームが text の場合は 0.85 で形成し切り、0.85→1.0 を「くっきり保持」区間にする\n //(最後の瞬間まで雲のままにせず、字形を読ませる/フィナーレ解決へ綺麗に受け渡すため)。\n const times = useMemo<number[]>(() => {\n if (timing && timing.length === n) return timing.slice();\n if (n <= 1) return [0];\n const lastIsText = keyframes[n - 1]?.type === \"text\";\n const end = lastIsText ? 0.85 : 1;\n return Array.from({ length: n }, (_, i) => (i / (n - 1)) * end);\n }, [timing, n, keyframes]);\n\n // タイムライン上の意味論(どこが text / scatter か、解決の有無)。\n const timeline = useMemo(() => {\n const isText = keyframes.map((k) => k.type === \"text\");\n const isScatter = keyframes.map((k) => k.type === \"scatter\");\n const last = keyframes[n - 1];\n const hasResolve =\n n >= 1 && last?.type === \"text\" && last.resolveToDom === true;\n const resolveText =\n last?.type === \"text\" ? last.text.replace(/\\n/g, \" \") : \"\";\n const swapAt = times[1] !== undefined ? times[1] * 0.15 : 0;\n return { isText, isScatter, hasResolve, resolveText, swapAt };\n }, [keyframes, n, times]);\n\n // geometry(aPos0..aPosN-1 + aSeed + aAccent)。\n const built = useMemo(() => {\n const geo = new THREE.BufferGeometry();\n const seed = new Float32Array(count);\n const accent = new Float32Array(count);\n for (let i = 0; i < count; i++) {\n seed[i] = Math.random();\n accent[i] = Math.random() < colors.accentRatio ? 1 : 0;\n }\n\n const mobile = isMobile();\n const vpW = typeof window !== \"undefined\" ? window.innerWidth : 1440;\n const vpH = typeof window !== \"undefined\" ? window.innerHeight : 900;\n const { worldW: visW } = viewSizeAtZ0(vpW, vpH, cameraFov, cameraZ);\n\n const buffers = keyframes.map((kf) =>\n buildKeyframeTargets(kf, count, {\n visW,\n mobile,\n cameraFov,\n cameraZ,\n }),\n );\n\n buffers.forEach((buf, i) => {\n geo.setAttribute(\n glyphPositionAttribute(i),\n new THREE.BufferAttribute(buf, 3),\n );\n });\n geo.setAttribute(\"aSeed\", new THREE.BufferAttribute(seed, 1));\n geo.setAttribute(\"aAccent\", new THREE.BufferAttribute(accent, 1));\n // position は shader で計算するが、bounding 用にダミー(最初のキーフレーム)。\n const first = buffers[0] ?? new Float32Array(count * 3);\n geo.setAttribute(\"position\", new THREE.BufferAttribute(first.slice(), 3));\n geo.computeBoundingSphere();\n\n return { geo, buffers, visW, vpW, vpH };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [keyframes, count, colors.accentRatio, cameraFov, cameraZ]);\n\n const vertexShader = useMemo(() => buildVertexShader(Math.max(n, 1)), [n]);\n\n const uniforms = useMemo(\n () => ({\n uTime: { value: 0 },\n uStage: { value: 0 },\n uTimes: { value: times.slice() },\n uForm: { value: 0 },\n uSettle: { value: 0 },\n uBurst: { value: 0 },\n uSwap: { value: 0 },\n uResolve: { value: 0 },\n uReduced: { value: 0 },\n uPointer: { value: new THREE.Vector3(0, 0, 0) },\n uPointerActive: { value: 0 },\n uSize: { value: 1 },\n uSizeScale: { value: style.size },\n uDrift: { value: style.drift },\n uSparkle: { value: style.sparkle },\n uPixelRatio: { value: 1 },\n uColorInk: { value: colors.ink.clone() },\n uColorAccent: { value: colors.accent.clone() },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [vertexShader],\n );\n\n // resolveToDom: 実文字オーバーレイを粒子グリフにピクセル整列させる。\n // 粒子グリフは最終キーフレームのフォント(既定 Helvetica Neue 900)でサンプリングされる。\n // クロスフェードで字形がズレないよう、実文字も同じフォントファミリ/ウェイトにし、\n // フォントサイズは「高さ基準」ではなく「粒子グリフの実幅にフィット」させる\n // (幅広ワードマークは高さ基準だと痩せて中央に縮こまるため)。\n const positionOverlay = () => {\n const el = resolveRef?.current;\n if (!el || !timeline.hasResolve) return;\n const finalBuf = built.buffers[n - 1];\n if (!finalBuf) return;\n const vpW = window.innerWidth;\n const vpH = window.innerHeight;\n const { worldW: visW } = viewSizeAtZ0(vpW, vpH, cameraFov, cameraZ);\n const rect = computeScreenRect(finalBuf, vpW, vpH, visW);\n if (!rect) return;\n\n // 最終キーフレームのフォント文字列から family / weight を取り出す\n // (例 \"900 260px 'Helvetica Neue', Helvetica, Arial, sans-serif\")。\n const finalKf = keyframes[n - 1];\n const fontStr =\n finalKf?.type === \"text\" && finalKf.font\n ? finalKf.font\n : DEFAULT_DENSE_FONT;\n const fontMatch = fontStr.match(/^\\s*(\\d+)\\s+[\\d.]+px\\s+(.+)$/);\n const fontWeight = fontMatch?.[1] ?? \"900\";\n const fontFamily = fontMatch?.[2] ?? \"sans-serif\";\n\n // 実文字を粒子グリフへ厳密整列させる。\n // 字送り幅(advance)ではなく「実際のインク範囲」をオフスクリーン canvas で\n // ピクセル走査し、インクの中心を粒子グリフ矩形の中心へ合わせる。\n // (L と O など左右ベアリングが非対称な語は advance 基準だと横にズレる。)\n const text = timeline.resolveText;\n const ctx = document.createElement(\"canvas\").getContext(\"2d\", {\n willReadFrequently: true,\n });\n\n let positioned = false;\n if (ctx && text) {\n // 1) 基準サイズで描いて塗りピクセルの bbox を実測。\n const baseSize = 200;\n ctx.font = `${fontWeight} ${baseSize}px ${fontFamily}`;\n const advBase = ctx.measureText(text).width;\n const pad = Math.ceil(baseSize * 0.6);\n const cw = Math.ceil(advBase + pad * 2);\n const ch = Math.ceil(baseSize * 1.8);\n const oc = document.createElement(\"canvas\");\n oc.width = cw;\n oc.height = ch;\n const octx = oc.getContext(\"2d\", { willReadFrequently: true });\n if (octx) {\n const drawX = pad;\n const drawY = Math.round(ch * 0.72);\n octx.font = `${fontWeight} ${baseSize}px ${fontFamily}`;\n octx.textAlign = \"left\";\n octx.textBaseline = \"alphabetic\";\n octx.fillStyle = \"#000\";\n octx.fillText(text, drawX, drawY);\n const data = octx.getImageData(0, 0, cw, ch).data;\n let minX = cw;\n let maxX = 0;\n let minY = ch;\n let maxY = 0;\n let found = 0;\n for (let y = 0; y < ch; y++) {\n for (let x = 0; x < cw; x++) {\n if (data[(y * cw + x) * 4 + 3]! > 20) {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n found++;\n }\n }\n }\n if (found > 0) {\n // 2) インク幅を粒子グリフ幅に合わせて fontSize を決定。\n const fontSize = baseSize * (rect.width / (maxX - minX));\n const scale = fontSize / baseSize;\n // 描画原点(text 先頭, baseline)基準のインク中心オフセット(fitted px)。\n const inkCenterXFromStart = ((minX + maxX) / 2 - drawX) * scale;\n const inkCenterYFromBaseline = ((minY + maxY) / 2 - drawY) * scale;\n // line-height:1 のときの「要素頂点 → ベースライン」距離。\n ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n const fm = ctx.measureText(text);\n const leading = fontSize - (fm.fontBoundingBoxAscent + fm.fontBoundingBoxDescent);\n const baselineFromTop = leading / 2 + fm.fontBoundingBoxAscent;\n // 3) インク中心 = 粒子グリフ矩形の中心 となるよう left/top を決める。\n const targetCx = rect.left + rect.width / 2;\n const targetCy = rect.top + rect.height / 2;\n el.style.display = \"block\";\n el.style.textAlign = \"left\";\n el.style.whiteSpace = \"nowrap\";\n el.style.width = \"auto\";\n el.style.height = \"auto\";\n el.style.fontFamily = fontFamily;\n el.style.fontWeight = fontWeight;\n el.style.fontSize = `${fontSize}px`;\n el.style.left = `${targetCx - inkCenterXFromStart}px`;\n el.style.top = `${targetCy - inkCenterYFromBaseline - baselineFromTop}px`;\n positioned = true;\n }\n }\n }\n\n // フォールバック(canvas 不可): 従来の矩形フィット。\n if (!positioned) {\n const measureSize = 100;\n let fontSize = rect.height * 0.92;\n if (ctx && text) {\n ctx.font = `${fontWeight} ${measureSize}px ${fontFamily}`;\n const w = ctx.measureText(text).width;\n if (w > 0) fontSize = measureSize * (rect.width / w);\n }\n el.style.left = `${rect.left}px`;\n el.style.top = `${rect.top}px`;\n el.style.width = `${rect.width}px`;\n el.style.height = `${rect.height}px`;\n el.style.fontFamily = fontFamily;\n el.style.fontWeight = fontWeight;\n el.style.fontSize = `${fontSize}px`;\n }\n };\n\n // 初回 / フォント読込 / リサイズで再サンプリング・再配置(DOM とピタリ重ねる)。\n const rebuildDomGlyphs = () => {\n keyframes.forEach((kf, i) => {\n if (kf.type !== \"text\" || !kf.domSelector) return;\n const next = buildGlyphFromDOM(count, kf.text.split(\"\\n\"), {\n selector: kf.domSelector,\n fovDeg: cameraFov,\n cameraZ,\n // 粒子がレンダリングされる canvas の実寸(CSS px)。\n // window.innerWidth だとスクロールバー分ずれるため size を使う。\n viewportW: size.width,\n viewportH: size.height,\n });\n if (!next) return;\n const attr = built.geo.getAttribute(glyphPositionAttribute(i)) as\n | THREE.BufferAttribute\n | undefined;\n if (!attr) return;\n (attr.array as Float32Array).set(next);\n attr.needsUpdate = true;\n });\n positionOverlay();\n };\n\n useEffect(() => {\n const raf = requestAnimationFrame(rebuildDomGlyphs);\n const t1 = window.setTimeout(rebuildDomGlyphs, 120);\n const t2 = window.setTimeout(rebuildDomGlyphs, 500);\n const fonts = (document as Document & { fonts?: FontFaceSet }).fonts;\n if (fonts && typeof fonts.ready?.then === \"function\") {\n fonts.ready.then(() => rebuildDomGlyphs()).catch(() => {});\n }\n const onResize = () => rebuildDomGlyphs();\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => {\n cancelAnimationFrame(raf);\n window.clearTimeout(t1);\n window.clearTimeout(t2);\n window.removeEventListener(\"resize\", onResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [built]);\n\n // ポインタ / ドラッグ。\n useEffect(() => {\n if (!pointerEnabled && !dragEnabled) return;\n const el = gl.domElement;\n const toNDC = (clientX: number, clientY: number) => {\n const r = el.getBoundingClientRect();\n return {\n x: ((clientX - r.left) / r.width) * 2 - 1,\n y: -(((clientY - r.top) / r.height) * 2 - 1),\n };\n };\n const onMove = (e: PointerEvent) => {\n if (pointerEnabled) {\n const ndc = toNDC(e.clientX, e.clientY);\n pointer.current.x = ndc.x;\n pointer.current.y = ndc.y;\n pointer.current.active = 1;\n }\n if (dragEnabled && dragState.current.down) {\n const dx = e.clientX - dragState.current.lx;\n const dy = e.clientY - dragState.current.ly;\n const grip = 1.0 - guardRef.current * 0.85;\n rot.current.vy += dx * 0.00035 * grip;\n rot.current.vx += dy * 0.00025 * grip;\n dragState.current.lx = e.clientX;\n dragState.current.ly = e.clientY;\n }\n };\n const onDown = (e: PointerEvent) => {\n dragState.current.down = true;\n dragState.current.lx = e.clientX;\n dragState.current.ly = e.clientY;\n };\n const onUp = () => {\n dragState.current.down = false;\n };\n const onLeave = () => {\n pointer.current.active = 0;\n dragState.current.down = false;\n };\n el.addEventListener(\"pointermove\", onMove, { passive: true });\n if (dragEnabled) el.addEventListener(\"pointerdown\", onDown, { passive: true });\n window.addEventListener(\"pointerup\", onUp, { passive: true });\n el.addEventListener(\"pointerleave\", onLeave, { passive: true });\n return () => {\n el.removeEventListener(\"pointermove\", onMove);\n el.removeEventListener(\"pointerdown\", onDown);\n window.removeEventListener(\"pointerup\", onUp);\n el.removeEventListener(\"pointerleave\", onLeave);\n };\n }, [gl, pointerEnabled, dragEnabled]);\n\n // 解像度に応じた点サイズ。マテリアル側 uniforms(クローン)を更新する。\n useEffect(() => {\n const mat = matRef.current;\n if (!mat) return;\n const u = mat.uniforms as unknown as GlyphUniforms;\n u.uPixelRatio.value = Math.min(window.devicePixelRatio || 1, 3);\n u.uSize.value = Math.min(size.height / 18, 26);\n }, [size]);\n\n // 質感(プリセット+上書き)をマテリアル uniforms / 合成モードへ反映。\n // uniforms メモは vertexShader にしか依存しないため、style 変化はここで同期する。\n useEffect(() => {\n const mat = matRef.current;\n if (!mat) return;\n const u = mat.uniforms as unknown as GlyphUniforms;\n u.uSizeScale.value = style.size;\n u.uDrift.value = style.drift;\n u.uSparkle.value = style.sparkle;\n mat.blending =\n style.blend === \"additive\"\n ? THREE.AdditiveBlending\n : THREE.NormalBlending;\n mat.needsUpdate = true;\n }, [style.size, style.drift, style.sparkle, style.blend]);\n\n useFrame((state, delta) => {\n const p = pointsRef.current;\n const mat = matRef.current;\n if (!p || !mat) return;\n const u = mat.uniforms as unknown as GlyphUniforms;\n const d = Math.min(delta, 0.05);\n\n const raw = THREE.MathUtils.clamp(getProgress(), 0, 1);\n // スクロール進捗を直接ステージに反映(lerp 追従は間延びの原因になる)。\n // 慣性は driver 側(Lenis 等)で付けるのが正しい役割分担。\n stage.current = raw;\n const s = stage.current;\n\n // --- 補間スカラ(CPU 側で意味論を解決し uniform へ) ---\n let settle = 0;\n let burst = 0;\n for (let i = 0; i < n; i++) {\n const c = times[i] ?? 0;\n const prev = times[i - 1] ?? 0;\n const next = times[i + 1] ?? 1;\n const b = bump(s, c, prev, next);\n if (timeline.isText[i]) settle = Math.max(settle, b);\n if (timeline.isScatter[i]) burst = Math.max(burst, b);\n }\n\n // form: 最終キーフレームが text のとき、その最終遷移の進捗。\n let form = 0;\n const lastIsText = timeline.isText[n - 1] === true;\n if (lastIsText && n >= 2) {\n form = smooth(times[n - 2] ?? 0, times[n - 1] ?? 1, s);\n }\n // 先頭キーフレームが text のとき: 冒頭は「字形が締まった」状態から始め、\n // 最初の遷移で解けていく。これがないと「実文字が消えてから粒子が湧く」空白が出る。\n const firstIsText = timeline.isText[0] === true;\n if (firstIsText && n >= 2) {\n const formStart = 1 - smooth(times[0] ?? 0, times[1] ?? 1, s);\n form = Math.max(form, formStart);\n }\n const guard = THREE.MathUtils.clamp(Math.max(settle, form), 0, 1);\n guardRef.current = guard;\n\n const swapped = raw >= timeline.swapAt ? 1 : 0;\n // 粒子の消失(フェードアウト)。\n const resolve = timeline.hasResolve ? smooth(0.9, 0.98, raw) : 0;\n // 実文字の出現(フェードイン)は粒子の消失より少し遅らせる。\n // 同じカーブだと粒子と実文字が同時に重なり二重像になるため、\n // 「粒子が消えてから文字が立つ」クリーンな受け渡しにする(0.92→1.0)。\n const textReveal = timeline.hasResolve ? smooth(0.92, 1.0, raw) : 0;\n\n u.uTime.value = state.clock.elapsedTime;\n u.uStage.value = s;\n u.uForm.value = form;\n u.uSettle.value = settle;\n u.uBurst.value = burst * (1 - form);\n u.uSwap.value = swapped;\n u.uResolve.value = resolve;\n\n u.uPointer.value.set(pointer.current.x * 3.2, pointer.current.y * 2.0, 0);\n u.uPointerActive.value = pointer.current.active * (1.0 - guard);\n\n // ドラッグ回転(慣性 + 飛散時の自転 + 字形整列で正面復帰)。\n rot.current.x += rot.current.vx;\n rot.current.y += rot.current.vy;\n rot.current.vx *= 0.92;\n rot.current.vy *= 0.92;\n rot.current.y += d * 0.05 * (1.0 - guard);\n const recenter = 0.02 + guard * 0.2;\n const wrappedY = Math.atan2(\n Math.sin(rot.current.y),\n Math.cos(rot.current.y),\n );\n rot.current.y = THREE.MathUtils.lerp(\n rot.current.y,\n rot.current.y - wrappedY,\n recenter,\n );\n rot.current.x = THREE.MathUtils.lerp(rot.current.x, 0, 0.04 + guard * 0.14);\n p.rotation.x = rot.current.x;\n p.rotation.y = rot.current.y;\n\n // resolveToDom: 解決先(自前オーバーレイ or 実 DOM 要素)の不透明度を\n // textReveal(少し遅らせた出現)に同期する。\n if (timeline.hasResolve) {\n let target: HTMLElement | null = resolveRef?.current ?? null;\n if (!target && resolveDomSelector) {\n if (!resolveDomElRef.current) {\n resolveDomElRef.current =\n document.querySelector<HTMLElement>(resolveDomSelector);\n }\n target = resolveDomElRef.current;\n }\n if (target) target.style.opacity = String(textReveal);\n }\n });\n\n return (\n <points ref={pointsRef} geometry={built.geo} frustumCulled={false}>\n <shaderMaterial\n ref={matRef}\n uniforms={uniforms}\n transparent\n depthWrite={false}\n blending={\n style.blend === \"additive\"\n ? THREE.AdditiveBlending\n : THREE.NormalBlending\n }\n vertexShader={vertexShader}\n fragmentShader={FRAGMENT_SHADER}\n />\n </points>\n );\n}\n","/**\n * GlyphDust.tsx — 公開コンポーネント。\n *\n * Canvas ラッパー + フォールバック判定 + ドライバ(scroll / manual)の結線。\n * reduced-motion / WebGL 不可時は `fallback` をそのまま描画(真っ白防止)。\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Canvas } from \"@react-three/fiber\";\nimport * as THREE from \"three\";\n\nimport { GlyphPoints, type ResolvedColors, type ResolvedStyle } from \"./GlyphPoints.js\";\nimport { DEFAULT_TRIGGER_HEIGHT, computeAutoplayProgress } from \"./drivers.js\";\nimport { useReducedMotion } from \"./useReducedMotion.js\";\nimport type { GlyphDustProps, GlyphPreset } from \"./types.js\";\n\nconst DEFAULT_INK = \"#1b2330\";\nconst DEFAULT_ACCENT = \"#0055ff\";\nconst DEFAULT_ACCENT_RATIO = 0.18;\nconst DEFAULT_COUNT_DESKTOP = 11000;\nconst DEFAULT_COUNT_MOBILE = 5200;\nconst DEFAULT_CAMERA_Z = 7;\nconst DEFAULT_CAMERA_FOV = 42;\nconst DEFAULT_DPR: [number, number] = [1, 1.75];\n\n/** 質感プリセット → 解決済みスタイル。`style` で部分上書きされる土台。 */\nconst PRESETS: Record<GlyphPreset, ResolvedStyle> = {\n default: { size: 1, blend: \"normal\", drift: 1, sparkle: 1 },\n minimal: { size: 0.92, blend: \"normal\", drift: 0.35, sparkle: 0 },\n lively: { size: 1.05, blend: \"normal\", drift: 1.4, sparkle: 1.4 },\n glow: { size: 1.1, blend: \"additive\", drift: 1.1, sparkle: 1.5 },\n};\n\nfunction clamp01(x: number): number {\n return x < 0 ? 0 : x > 1 ? 1 : x;\n}\n\nfunction isWebGLAvailable(): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n const canvas = document.createElement(\"canvas\");\n return Boolean(\n window.WebGLRenderingContext &&\n (canvas.getContext(\"webgl\") ||\n canvas.getContext(\"experimental-webgl\")),\n );\n } catch {\n return false;\n }\n}\n\nexport function GlyphDust(props: GlyphDustProps) {\n const {\n keyframes,\n driver = { type: \"scroll\" },\n preset = \"default\",\n style,\n colors,\n count,\n dpr = DEFAULT_DPR,\n interaction,\n camera,\n timing,\n fallback = null,\n className,\n } = props;\n\n const reduced = useReducedMotion();\n const [webgl, setWebgl] = useState(true);\n useEffect(() => {\n setWebgl(isWebGLAvailable());\n }, []);\n\n const [mobile, setMobile] = useState(false);\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n setMobile(window.matchMedia(\"(max-width: 768px)\").matches);\n }, []);\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const resolveRef = useRef<HTMLDivElement>(null);\n\n // 手動進捗は ref に保持(getProgress を安定させる)。\n const manualRef = useRef(0);\n if (driver.type === \"manual\") manualRef.current = clamp01(driver.progress);\n\n // autoplay 用: 再生中フラグと開始時刻(playOnView の場合は画面内で起動)。\n const autoplay = driver.type === \"autoplay\" ? driver : null;\n const playingRef = useRef(false);\n const startMsRef = useRef<number | null>(null);\n const lastAutoRef = useRef(0);\n\n // autoplay: playOnView が false なら即再生、true なら IntersectionObserver で起動。\n useEffect(() => {\n if (!autoplay) return;\n if (autoplay.playOnView === false) {\n playingRef.current = true;\n return;\n }\n const el = wrapperRef.current;\n if (el === null || typeof IntersectionObserver === \"undefined\") {\n playingRef.current = true; // 観測不可なら無条件再生(真っ白防止)。\n return;\n }\n const io = new IntersectionObserver(\n (entries) => {\n for (const e of entries) {\n if (e.isIntersecting && !playingRef.current) {\n playingRef.current = true;\n startMsRef.current = null; // 入った瞬間を開始点に。\n }\n }\n },\n { threshold: 0.25 },\n );\n io.observe(el);\n return () => io.disconnect();\n // duration/loop 等の変化では貼り直し不要(毎フレーム参照するため)。\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [autoplay?.playOnView]);\n\n const getProgress = useCallback(() => {\n if (driver.type === \"manual\") return manualRef.current;\n if (driver.type === \"autoplay\") {\n if (!playingRef.current || typeof performance === \"undefined\") {\n return lastAutoRef.current;\n }\n if (startMsRef.current === null) startMsRef.current = performance.now();\n const elapsed = (performance.now() - startMsRef.current) / 1000;\n lastAutoRef.current = computeAutoplayProgress(elapsed, driver);\n return lastAutoRef.current;\n }\n const el = wrapperRef.current;\n if (el === null || typeof window === \"undefined\") return 0;\n const rect = el.getBoundingClientRect();\n const total = rect.height - window.innerHeight;\n if (total <= 0) return 0;\n return clamp01(-rect.top / total);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [driver]);\n\n // プリセット+上書き: プリセットを土台に、style で指定された項目だけ上書き。\n const resolvedStyle = useMemo<ResolvedStyle>(() => {\n const base = PRESETS[preset] ?? PRESETS.default;\n return {\n size: style?.size ?? base.size,\n blend: style?.blend ?? base.blend,\n drift: style?.drift ?? base.drift,\n sparkle: style?.sparkle ?? base.sparkle,\n };\n }, [preset, style?.size, style?.blend, style?.drift, style?.sparkle]);\n\n const resolvedColors = useMemo<ResolvedColors>(\n () => ({\n ink: new THREE.Color(colors?.ink ?? DEFAULT_INK),\n accent: new THREE.Color(colors?.accent ?? DEFAULT_ACCENT),\n accentRatio: colors?.accentRatio ?? DEFAULT_ACCENT_RATIO,\n }),\n [colors?.ink, colors?.accent, colors?.accentRatio],\n );\n\n const particleCount = mobile\n ? (count?.mobile ?? DEFAULT_COUNT_MOBILE)\n : (count?.desktop ?? DEFAULT_COUNT_DESKTOP);\n\n const cameraZ = camera?.z ?? DEFAULT_CAMERA_Z;\n const cameraFov = camera?.fov ?? DEFAULT_CAMERA_FOV;\n const pointerEnabled = interaction?.pointer ?? true;\n const dragEnabled = interaction?.drag ?? true;\n\n const finalKf = keyframes[keyframes.length - 1];\n const hasResolve =\n finalKf?.type === \"text\" && finalKf.resolveToDom === true;\n // 最終キーフレームが domSelector を持つなら、その「実 DOM 要素」へ解決する。\n // 粒子はその要素にピクセル整列してサンプリングされる(最初の見出しと同じ仕組み)ため、\n // 別オーバーレイをフィットさせる必要がなく、整列が原理的に保証される。\n const resolveDomSelector =\n finalKf?.type === \"text\" && finalKf.resolveToDom === true && finalKf.domSelector\n ? finalKf.domSelector\n : undefined;\n // 自前オーバーレイを使うのは「resolveToDom かつ domSelector 無し」のときだけ。\n const useOwnOverlay = hasResolve && !resolveDomSelector;\n const resolveText =\n finalKf?.type === \"text\" ? finalKf.text.replace(/\\n/g, \" \") : \"\";\n\n // reduced-motion / WebGL 不可 → フォールバックを描画(真っ白防止)。\n if (reduced || !webgl) {\n return <>{fallback}</>;\n }\n\n const scene = (\n <>\n <Canvas\n dpr={dpr}\n camera={{ position: [0, 0, cameraZ], fov: cameraFov }}\n gl={{ antialias: true, alpha: true, powerPreference: \"high-performance\" }}\n frameloop=\"always\"\n style={{ width: \"100%\", height: \"100%\" }}\n >\n <GlyphPoints\n keyframes={keyframes}\n count={particleCount}\n colors={resolvedColors}\n style={resolvedStyle}\n cameraZ={cameraZ}\n cameraFov={cameraFov}\n pointer={pointerEnabled}\n drag={dragEnabled}\n getProgress={getProgress}\n timing={timing}\n resolveRef={useOwnOverlay ? resolveRef : undefined}\n resolveDomSelector={resolveDomSelector}\n />\n </Canvas>\n {useOwnOverlay ? (\n <div\n ref={resolveRef}\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n opacity: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n lineHeight: 1,\n whiteSpace: \"nowrap\",\n fontWeight: 900,\n color: colors?.ink ?? DEFAULT_INK,\n pointerEvents: \"none\",\n }}\n >\n {resolveText}\n </div>\n ) : null}\n </>\n );\n\n // manual / autoplay: 親要素にフィット(どんな箱にも置ける)。\n // scroll のみ背の高いラッパー + sticky 内枠でフルスクリーン演出。\n if (driver.type === \"manual\" || driver.type === \"autoplay\") {\n return (\n <div\n ref={wrapperRef}\n className={className}\n style={{ position: \"relative\", width: \"100%\", height: \"100%\" }}\n >\n {scene}\n </div>\n );\n }\n\n const triggerHeight = driver.triggerHeight ?? DEFAULT_TRIGGER_HEIGHT;\n return (\n <div\n ref={wrapperRef}\n className={className}\n style={{ position: \"relative\", height: `${triggerHeight * 100}vh` }}\n >\n <div\n style={{\n position: \"sticky\",\n top: 0,\n height: \"100vh\",\n width: \"100%\",\n overflow: \"hidden\",\n }}\n >\n {scene}\n </div>\n </div>\n );\n}\n","/**\n * glyphdust — scroll-driven text → particles → glyph → real-text resolve\n * for react-three-fiber.\n *\n * 公開 API はこのファイルから re-export する。\n */\n\n/** ライブラリのバージョン(package.json と一致させる)。 */\nexport const VERSION = \"0.3.0\";\n\n// 文字 → 粒子ターゲット生成(Task-002)\nexport {\n buildTextTargets,\n buildDenseTextTargets,\n type Random,\n type TextTargetOptions,\n type DenseTextTargetOptions,\n} from \"./sampling.js\";\n\n// GLSL シェーダ(Task-003)\nexport {\n buildVertexShader,\n FRAGMENT_SHADER,\n glyphPositionAttribute,\n GLYPH_POSITION_ATTRIBUTE_PREFIX,\n} from \"./shaders.js\";\n\n// DOM 重ね合わせ・幾何(Task-004)\nexport {\n viewSizeAtZ0,\n buildGlyphFromDOM,\n computeScreenRect,\n type ViewSize,\n type DomGlyphOptions,\n type GlyphScreenRect,\n} from \"./dom-overlay.js\";\n\n// 進捗ドライバ\nexport {\n createScrollProgress,\n useScrollProgress,\n computeAutoplayProgress,\n DEFAULT_TRIGGER_HEIGHT,\n type DriverConfig,\n type ScrollDriverConfig,\n type ManualDriverConfig,\n type AutoplayDriverConfig,\n} from \"./drivers.js\";\n\n// reduced-motion(Task-005)\nexport { useReducedMotion, prefersReducedMotion } from \"./useReducedMotion.js\";\n\n// 公開コンポーネント(Task-006)\nexport { GlyphDust } from \"./GlyphDust.js\";\n\n// 公開型(Task-006 / 007)\nexport type {\n Keyframe,\n TextKeyframe,\n TextSegment,\n ScatterKeyframe,\n GlyphColors,\n GlyphStyle,\n GlyphPreset,\n GlyphCount,\n GlyphCamera,\n GlyphInteraction,\n GlyphDustProps,\n} from \"./types.js\";\n"]}