glyphdust 0.1.0 → 0.2.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.
- package/dist/index.cjs +120 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +120 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -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 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);\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 float s = uSize * sizeVar;\n gl_PointSize = s * uPixelRatio * (1.0 / -mvPosition.z);\n gl_PointSize = clamp(gl_PointSize, 1.0, mix(7.0, 9.0, uForm) * uPixelRatio);\n gl_PointSize = 10.0; // DEBUG4\n }\n`;\n}\n\n/**\n * フラグメントシェーダ。キーフレーム数に依存しないため定数。\n * 円形ソフト点 + アクセント色 + きらめき + 奥行き濃淡。\n */\nexport const FRAGMENT_SHADER = /* glsl */ `\n uniform vec3 uColorInk;\n uniform vec3 uColorAccent;\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));\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 /** 乱数生成器(ジッタ用)。既定 `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 // CSS の行ボックスは中央寄せなので、ベースライン ≈ 行頂点 + (lineHeight - fontSize)/2 + ascent。\n const ascent = fontSize * (opts.ascentRatio ?? 0.82);\n lines.forEach((line, i) => {\n const lineTop = i * lineHeight;\n ctx.fillText(line, 0, lineTop + (lineHeight - fontSize) / 2 + ascent);\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 const vpW = window.innerWidth;\n const vpH = 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/** ドライバ設定の合併型。 */\nexport type DriverConfig = ScrollDriverConfig | ManualDriverConfig;\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/**\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 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 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\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 cameraZ,\n cameraFov,\n pointer: pointerEnabled,\n drag: dragEnabled,\n getProgress,\n timing,\n resolveRef,\n } = props;\n\n const pointsRef = useRef<THREE.Points>(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 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 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 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.fontSize = `${rect.height * 0.92}px`;\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 });\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, 2);\n u.uSize.value = Math.min(size.height / 18, 26);\n }, [size]);\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 stage.current = THREE.MathUtils.lerp(stage.current, raw, 0.1);\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 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 const resolve = timeline.hasResolve ? smooth(0.9, 0.98, 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: 実文字オーバーレイの不透明度を resolve に同期。\n const overlay = resolveRef?.current;\n if (overlay && timeline.hasResolve) overlay.style.opacity = String(resolve);\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={THREE.NormalBlending}\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 } from \"./GlyphPoints.js\";\nimport { DEFAULT_TRIGGER_HEIGHT } from \"./drivers.js\";\nimport { useReducedMotion } from \"./useReducedMotion.js\";\nimport type { GlyphDustProps } 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\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 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 const getProgress = useCallback(() => {\n if (driver.type === \"manual\") return manualRef.current;\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 }, [driver.type]);\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 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 cameraZ={cameraZ}\n cameraFov={cameraFov}\n pointer={pointerEnabled}\n drag={dragEnabled}\n getProgress={getProgress}\n timing={timing}\n resolveRef={hasResolve ? resolveRef : undefined}\n />\n </Canvas>\n {hasResolve ? (\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: 親要素にフィット。scroll: 背の高いラッパー + sticky 内枠。\n if (driver.type === \"manual\") {\n return (\n <div\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 する(Task-007)。\n * 雛形段階のプレースホルダ。実装は Phase 1 (Task-002〜) で追加する。\n */\n\n/** ライブラリのバージョン(package.json と一致させる)。 */\nexport const VERSION = \"0.1.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// 進捗ドライバ(Task-005)\nexport {\n createScrollProgress,\n useScrollProgress,\n DEFAULT_TRIGGER_HEIGHT,\n type DriverConfig,\n type ScrollDriverConfig,\n type ManualDriverConfig,\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 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\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 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);\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 float s = uSize * sizeVar;\n gl_PointSize = s * uPixelRatio * (1.0 / -mvPosition.z);\n gl_PointSize = clamp(gl_PointSize, 1.0, mix(7.0, 9.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\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));\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/** ドライバ設定の合併型。 */\nexport type DriverConfig = ScrollDriverConfig | ManualDriverConfig;\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/**\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 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 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 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 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, 2);\n u.uSize.value = Math.min(size.height / 18, 26);\n }, [size]);\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 stage.current = THREE.MathUtils.lerp(stage.current, raw, 0.1);\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 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={THREE.NormalBlending}\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 } from \"./GlyphPoints.js\";\nimport { DEFAULT_TRIGGER_HEIGHT } from \"./drivers.js\";\nimport { useReducedMotion } from \"./useReducedMotion.js\";\nimport type { GlyphDustProps } 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\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 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 const getProgress = useCallback(() => {\n if (driver.type === \"manual\") return manualRef.current;\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 }, [driver.type]);\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 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: 親要素にフィット。scroll: 背の高いラッパー + sticky 内枠。\n if (driver.type === \"manual\") {\n return (\n <div\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 する(Task-007)。\n * 雛形段階のプレースホルダ。実装は Phase 1 (Task-002〜) で追加する。\n */\n\n/** ライブラリのバージョン(package.json と一致させる)。 */\nexport const VERSION = \"0.1.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// 進捗ドライバ(Task-005)\nexport {\n createScrollProgress,\n useScrollProgress,\n DEFAULT_TRIGGER_HEIGHT,\n type DriverConfig,\n type ScrollDriverConfig,\n type ManualDriverConfig,\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 GlyphCount,\n GlyphCamera,\n GlyphInteraction,\n GlyphDustProps,\n} from \"./types.js\";\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -178,6 +178,13 @@ interface DomGlyphOptions {
|
|
|
178
178
|
thickness?: number;
|
|
179
179
|
/** ベースライン近似に使うアセント比(fontSize に対する)。既定 0.82。 */
|
|
180
180
|
ascentRatio?: number;
|
|
181
|
+
/**
|
|
182
|
+
* 実際の canvas 表示サイズ(CSS px)。省略時は window.innerWidth/Height。
|
|
183
|
+
* 縦スクロールバーがあると innerWidth と canvas 幅が数 px ずれ、
|
|
184
|
+
* 画面→ワールド変換が狂って粒子字形が横にずれる。整列には canvas 実寸を渡す。
|
|
185
|
+
*/
|
|
186
|
+
viewportW?: number;
|
|
187
|
+
viewportH?: number;
|
|
181
188
|
/** 乱数生成器(ジッタ用)。既定 `Math.random`。 */
|
|
182
189
|
random?: Random;
|
|
183
190
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -178,6 +178,13 @@ interface DomGlyphOptions {
|
|
|
178
178
|
thickness?: number;
|
|
179
179
|
/** ベースライン近似に使うアセント比(fontSize に対する)。既定 0.82。 */
|
|
180
180
|
ascentRatio?: number;
|
|
181
|
+
/**
|
|
182
|
+
* 実際の canvas 表示サイズ(CSS px)。省略時は window.innerWidth/Height。
|
|
183
|
+
* 縦スクロールバーがあると innerWidth と canvas 幅が数 px ずれ、
|
|
184
|
+
* 画面→ワールド変換が狂って粒子字形が横にずれる。整列には canvas 実寸を渡す。
|
|
185
|
+
*/
|
|
186
|
+
viewportW?: number;
|
|
187
|
+
viewportH?: number;
|
|
181
188
|
/** 乱数生成器(ジッタ用)。既定 `Math.random`。 */
|
|
182
189
|
random?: Random;
|
|
183
190
|
}
|