glyphdust 0.1.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/LICENSE +21 -0
- package/README.md +180 -0
- package/dist/index.cjs +966 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +382 -0
- package/dist/index.d.ts +382 -0
- package/dist/index.js +929 -0
- package/dist/index.js.map +1 -0
- package/package.json +74 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { RefObject, ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* sampling.ts — 文字 → 粒子ターゲット座標の生成。
|
|
6
|
+
*
|
|
7
|
+
* オフスクリーン Canvas にテキストを描画し、塗りピクセルをサンプリングして
|
|
8
|
+
* 各粒子のワールド座標ターゲット(Float32Array, xyz × count)を作る。
|
|
9
|
+
* フォント非依存・任意文字対応(CJK 含む)。
|
|
10
|
+
*
|
|
11
|
+
* 2 つの戦略:
|
|
12
|
+
* - {@link buildTextTargets} … 通常密度。読める字形をフォールバック付きで生成。
|
|
13
|
+
* - {@link buildDenseTextTargets} … 高密度・均一カバレッジ。穴の目立たないワードマーク向け。
|
|
14
|
+
*
|
|
15
|
+
* いずれも SSR セーフ(`document` 不在時は原点クラスタ or 空配列を返し、例外を投げない)。
|
|
16
|
+
*/
|
|
17
|
+
/** 0..1 を返す乱数生成器。テスト時に決定論的な関数を注入できる。 */
|
|
18
|
+
type Random = () => number;
|
|
19
|
+
/** {@link buildTextTargets} のオプション。 */
|
|
20
|
+
interface TextTargetOptions {
|
|
21
|
+
/** Canvas2D の `font` 文字列(例 `"600 64px 'Noto Sans JP', sans-serif"`)。 */
|
|
22
|
+
font: string;
|
|
23
|
+
/** 字形を収める可視ワールド幅。canvas 幅 `cw` 全体がこの幅にマップされる。 */
|
|
24
|
+
worldW: number;
|
|
25
|
+
/** 行送り(px, canvas 座標)。複数行のとき行間に使う。 */
|
|
26
|
+
lineHeight: number;
|
|
27
|
+
/** ワールド y オフセット(上が +)。既定 0。 */
|
|
28
|
+
offsetY?: number;
|
|
29
|
+
/** ワールド x オフセット(右が +)。既定 0。 */
|
|
30
|
+
offsetX?: number;
|
|
31
|
+
/** z 方向の厚み。既定 0.18。 */
|
|
32
|
+
thickness?: number;
|
|
33
|
+
/** ピクセル走査間隔。大きいほど粗く高速。既定 2。 */
|
|
34
|
+
step?: number;
|
|
35
|
+
/** オフスクリーン canvas 幅。既定 1280。 */
|
|
36
|
+
cw?: number;
|
|
37
|
+
/** オフスクリーン canvas 高さ。既定 480。 */
|
|
38
|
+
ch?: number;
|
|
39
|
+
/** テキスト寄せ。DOM 見出しと重ねるときは `"left"`。既定 `"center"`。 */
|
|
40
|
+
align?: "center" | "left";
|
|
41
|
+
/** 乱数生成器(ジッタ・フォールバック用)。既定 `Math.random`。 */
|
|
42
|
+
random?: Random;
|
|
43
|
+
}
|
|
44
|
+
/** {@link buildDenseTextTargets} のオプション。 */
|
|
45
|
+
interface DenseTextTargetOptions {
|
|
46
|
+
/** Canvas2D の `font` 文字列。 */
|
|
47
|
+
font: string;
|
|
48
|
+
/** 字形を収める可視ワールド幅。 */
|
|
49
|
+
worldW: number;
|
|
50
|
+
/** ワールド y オフセット(上が +)。既定 0。 */
|
|
51
|
+
offsetY?: number;
|
|
52
|
+
/** ワールド x オフセット(右が +)。既定 0。 */
|
|
53
|
+
offsetX?: number;
|
|
54
|
+
/** z 方向の厚み。既定 0.08(字形塗りにきっちり乗せる)。 */
|
|
55
|
+
thickness?: number;
|
|
56
|
+
/** ピクセル走査間隔。密に拾うため既定 1。 */
|
|
57
|
+
step?: number;
|
|
58
|
+
/** オフスクリーン canvas 幅。既定 1280。 */
|
|
59
|
+
cw?: number;
|
|
60
|
+
/** オフスクリーン canvas 高さ。既定 400。 */
|
|
61
|
+
ch?: number;
|
|
62
|
+
/** 行送りを `ch` 比で指定。既定 0.46。 */
|
|
63
|
+
lineHeightRatio?: number;
|
|
64
|
+
/** 乱数生成器。既定 `Math.random`。 */
|
|
65
|
+
random?: Random;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* テキスト行をオフスクリーン canvas に描画し、塗りピクセルをワールド座標ターゲットへ変換する。
|
|
69
|
+
*
|
|
70
|
+
* 割り当ては「連番ベース + 乗算ハッシュ散らし」で、塗りピクセルを均しく巡回カバーする。
|
|
71
|
+
* 塗りが 0 のときは {@link fillScatterCluster} へフォールバック。
|
|
72
|
+
*
|
|
73
|
+
* @param count 粒子数(戻り値は `count * 3` の Float32Array)
|
|
74
|
+
* @param lines 描画する行(文言は呼び出し側が決める。本関数は文言非依存)
|
|
75
|
+
*/
|
|
76
|
+
declare function buildTextTargets(count: number, lines: string[], opts: TextTargetOptions): Float32Array;
|
|
77
|
+
/**
|
|
78
|
+
* 高密度・均一カバレッジで字形をサンプリングする(穴の目立たないワードマーク用)。
|
|
79
|
+
*
|
|
80
|
+
* 細かい step で塗りピクセルを収集 → 一度だけ Fisher–Yates シャッフル → 粒子へ巡回割当。
|
|
81
|
+
* 各塗りピクセルに `floor/ceil(count / filled)` 個がほぼ均等に乗り、粗密ムラ・穴を防ぐ。
|
|
82
|
+
* ジッタ・z 厚みは小さめにして字形塗りにきっちり乗せる。
|
|
83
|
+
*/
|
|
84
|
+
declare function buildDenseTextTargets(count: number, lines: string[], opts: DenseTextTargetOptions): Float32Array;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* shaders.ts — THREE.Points 用の GLSL(頂点 / フラグメント)。
|
|
88
|
+
*
|
|
89
|
+
* 位置補間は「キーフレーム数」に依存するため、頂点シェーダは
|
|
90
|
+
* {@link buildVertexShader} で動的生成する(GLSL は属性の動的添字を許さないので
|
|
91
|
+
* 隣接キーフレーム間の `mix` 連鎖をアンロールして埋め込む)。
|
|
92
|
+
*
|
|
93
|
+
* 演出スカラ(burst / drift / settle / form / swap / resolve)は
|
|
94
|
+
* 「どのキーフレームが scatter か text か」を知る CPU 側(GlyphPoints, useFrame)が
|
|
95
|
+
* 毎フレーム算出して uniform で渡す。これでシェーダはキーフレーム数だけに依存し、
|
|
96
|
+
* 意味論を持たない。
|
|
97
|
+
*
|
|
98
|
+
* 属性(GlyphPoints が設定):
|
|
99
|
+
* - `aPos0 .. aPos{N-1}` … 各キーフレームのターゲット座標(vec3)
|
|
100
|
+
* - `aSeed` … 0..1 個体差シード(ドリフト位相・サイズ・きらめき)
|
|
101
|
+
* - `aAccent` … 0/1 アクセント色フラグ
|
|
102
|
+
*
|
|
103
|
+
* uniform(頂点):
|
|
104
|
+
* - `uTimes[N]` … 各キーフレームの正規化時刻 0..1(補間区間の境界)
|
|
105
|
+
* - `uStage` … 進捗 0..1(位置補間に使う。CPU 側で easing 済みでも可)
|
|
106
|
+
* - `uTime` … アイドル漂い用の時計(秒)
|
|
107
|
+
* - `uForm` … 0..1 字形に締まった度合い(サイズ均一化・ドリフト停止)
|
|
108
|
+
* - `uSettle` … 0..1 整列ホールド度合い(ドリフト減衰・エッジ締め)
|
|
109
|
+
* - `uBurst` … 0..1 外向き飛散量(飛散区間中で上げる)
|
|
110
|
+
* - `uSwap` … 0..1 可視ゲート(最初のスワップ点まで 0)
|
|
111
|
+
* - `uResolve` … 0..1 フィナーレで実 DOM 文字へ受け渡す減衰
|
|
112
|
+
* - `uReduced` … 0/1 reduced-motion
|
|
113
|
+
* - `uPointer` … vec3 ワールド空間のポインタ位置
|
|
114
|
+
* - `uPointerActive`… 0/1 ポインタ反発の有効化
|
|
115
|
+
* - `uSize` … 基準点サイズ
|
|
116
|
+
* - `uPixelRatio` … dpr
|
|
117
|
+
*
|
|
118
|
+
* uniform(フラグメント):
|
|
119
|
+
* - `uColorInk` / `uColorAccent` … 配色
|
|
120
|
+
*/
|
|
121
|
+
/** 位置ターゲット属性の接頭辞。`aPos0`, `aPos1`, ... */
|
|
122
|
+
declare const GLYPH_POSITION_ATTRIBUTE_PREFIX = "aPos";
|
|
123
|
+
/** キーフレーム番号 i に対応する位置属性名を返す。 */
|
|
124
|
+
declare function glyphPositionAttribute(index: number): string;
|
|
125
|
+
/**
|
|
126
|
+
* キーフレーム数 N に対応する頂点シェーダ文字列を生成する。
|
|
127
|
+
*
|
|
128
|
+
* 隣接キーフレーム間を `smoothRange(uTimes[k], uTimes[k+1], uStage)` で補間し、
|
|
129
|
+
* `mix` 連鎖でつなぐ。各区間の t は順次 0→1 になるため、uStage が区間 k にあるとき
|
|
130
|
+
* 先行区間は t=1(次キーフレームへ到達済み)・後続は t=0 となり、正しく k→k+1 を補間する。
|
|
131
|
+
*
|
|
132
|
+
* @param keyframeCount キーフレーム数(>= 1)
|
|
133
|
+
* @throws keyframeCount < 1 のとき
|
|
134
|
+
*/
|
|
135
|
+
declare function buildVertexShader(keyframeCount: number): string;
|
|
136
|
+
/**
|
|
137
|
+
* フラグメントシェーダ。キーフレーム数に依存しないため定数。
|
|
138
|
+
* 円形ソフト点 + アクセント色 + きらめき + 奥行き濃淡。
|
|
139
|
+
*/
|
|
140
|
+
declare const FRAGMENT_SHADER = "\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 // \u5186\u5F62\u306E\u30BD\u30D5\u30C8\u306A\u70B9\u3002\u4E2D\u5FC3\u3067 1\u3001\u7E01\u3067 0\uFF08smoothstep \u306F edge0<edge1 \u5FC5\u9808\u306A\u306E\u3067\u53CD\u8EE2\u3057\u3066\u4F7F\u3046\uFF09\u3002\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 // \u4E3B\u4F53\u306F\u30A4\u30F3\u30AF\u3001\u4E00\u90E8\u306E\u7C92\u3060\u3051\u30A2\u30AF\u30BB\u30F3\u30C8\u8272\u3002\u5B57\u5F62\u53CE\u675F\u6642\u306F\u3084\u3084\u63A7\u3048\u3081\u306B\u3002\n float accentAmt = vAccent * mix(0.85, 0.55, vForm);\n vec3 col = mix(uColorInk, uColorAccent, accentAmt);\n\n // \u4E00\u90E8\u306E\u7C92\u306B\u660E\u308B\u3044\u304D\u3089\u3081\u304D\uFF08\u98DB\u6563\u6642\u306B\u6620\u3048\u308B\uFF09\u3002\u6574\u5217\u6642\u306F\u63A7\u3048\u3081\u3002\n float spark = step(0.94, vSeed);\n col = mix(col, uColorAccent, spark * mix(0.45, 0.15, vSettle));\n\n // \u5965\u884C\u304D\u3067\u6FC3\u6DE1\uFF08\u660E\u80CC\u666F\u3067\u306E\u8996\u8A8D\u6027\u78BA\u4FDD\u306E\u305F\u3081\u4E0B\u9650\u3092\u6301\u305F\u305B\u308B\uFF09\u3002\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 // \u6574\u5217\u6642\u306F\u4E0D\u900F\u660E\u5BC4\u308A\u306B\u3057\u3066\u30A8\u30C3\u30B8\u3092\u7DE0\u3081\u308B\u3002\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";
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* dom-overlay.ts — 実 DOM 文字との重ね合わせ/受け渡しのための幾何ユーティリティ。
|
|
144
|
+
*
|
|
145
|
+
* - {@link viewSizeAtZ0} … カメラから z=0 平面の可視ワールド幅・高さを求める(screen↔world 変換の素)。
|
|
146
|
+
* - {@link buildGlyphFromDOM} … 指定セレクタの DOM 要素の矩形・フォントから粒子ターゲットを生成。
|
|
147
|
+
* 粒子字形が実 DOM 文字とピクセル単位で重なる(クロスフェードで文字が動かない)。
|
|
148
|
+
* - {@link computeScreenRect} … 粒子ターゲット群の world 範囲を screen(px) 矩形へ変換。
|
|
149
|
+
* フィナーレで実 DOM 文字を同位置・同サイズに合わせるのに使う。
|
|
150
|
+
*
|
|
151
|
+
* いずれも SSR セーフ(`document` / `window` 不在時は null を返す)。
|
|
152
|
+
* グローバル変数や固定イベント名には依存しない(配信方法は呼び出し側が決める)。
|
|
153
|
+
*/
|
|
154
|
+
|
|
155
|
+
/** z=0 平面における可視ワールド寸法。 */
|
|
156
|
+
interface ViewSize {
|
|
157
|
+
worldW: number;
|
|
158
|
+
worldH: number;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* カメラ(縦 fov / z=cameraZ)から、z=0 平面の可視ワールド幅・高さを返す。
|
|
162
|
+
* screen(px) → world 変換のスケール算出に使う(等方: `worldW/viewportW === worldH/viewportH`)。
|
|
163
|
+
*/
|
|
164
|
+
declare function viewSizeAtZ0(viewportW: number, viewportH: number, fovDeg: number, cameraZ: number): ViewSize;
|
|
165
|
+
/** {@link buildGlyphFromDOM} のオプション。 */
|
|
166
|
+
interface DomGlyphOptions {
|
|
167
|
+
/** 対象 DOM 要素のセレクタ(`document.querySelector`)。 */
|
|
168
|
+
selector: string;
|
|
169
|
+
/** カメラ縦 fov(度)。canvas が viewport 全面の sticky 前提。 */
|
|
170
|
+
fovDeg: number;
|
|
171
|
+
/** カメラ z 位置。 */
|
|
172
|
+
cameraZ: number;
|
|
173
|
+
/** CSS px に対する描画倍率(文字を太く拾うため高め)。既定 2。 */
|
|
174
|
+
resolution?: number;
|
|
175
|
+
/** ピクセル走査間隔。既定 2。 */
|
|
176
|
+
step?: number;
|
|
177
|
+
/** z 方向の厚み。既定 0.14。 */
|
|
178
|
+
thickness?: number;
|
|
179
|
+
/** ベースライン近似に使うアセント比(fontSize に対する)。既定 0.82。 */
|
|
180
|
+
ascentRatio?: number;
|
|
181
|
+
/** 乱数生成器(ジッタ用)。既定 `Math.random`。 */
|
|
182
|
+
random?: Random;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 指定セレクタの DOM 要素の画面矩形・computed フォントから粒子ターゲットを生成する。
|
|
186
|
+
* - 要素の rect / computed font をそのまま使い、同サイズのオフスクリーン Canvas に行を描画。
|
|
187
|
+
* - 各塗りピクセルを「画面座標(px)」→「ワールド座標(z=0平面)」へ変換。
|
|
188
|
+
* → 粒子字形が DOM 要素とピタリ重なり、クロスフェード中に文字が動かない。
|
|
189
|
+
* - 要素が無い / 小さすぎる / 塗りが 0 のときは null(呼び出し側でフォールバック)。
|
|
190
|
+
*
|
|
191
|
+
* @param count 粒子数(戻り値は `count * 3` の Float32Array)
|
|
192
|
+
* @param lines 描画する行(要素のテキストを行分割したもの。文言は呼び出し側が決める)
|
|
193
|
+
*/
|
|
194
|
+
declare function buildGlyphFromDOM(count: number, lines: string[], opts: DomGlyphOptions): Float32Array | null;
|
|
195
|
+
/** 画面座標(px・左上原点)での字形矩形。実 DOM 文字を重ねるのに使う。 */
|
|
196
|
+
interface GlyphScreenRect {
|
|
197
|
+
left: number;
|
|
198
|
+
top: number;
|
|
199
|
+
width: number;
|
|
200
|
+
height: number;
|
|
201
|
+
/** 中心 x。 */
|
|
202
|
+
cx: number;
|
|
203
|
+
/** 中心 y。 */
|
|
204
|
+
cy: number;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* 粒子ターゲット群(world 座標)の範囲を screen(px) 矩形へ変換する。
|
|
208
|
+
* z=0 / 無回転前提(フィナーレは正面復帰している前提で成立)。
|
|
209
|
+
*
|
|
210
|
+
* @param targets `[x,y,z, ...]` の Float32Array(build*Targets の戻り値)
|
|
211
|
+
* @param viewportW / viewportH 画面ピクセル寸法
|
|
212
|
+
* @param visibleWorldW z=0 平面の可視ワールド幅({@link viewSizeAtZ0} の `worldW`)
|
|
213
|
+
* @returns 字形矩形。targets が空などで算出不能なら null。
|
|
214
|
+
*/
|
|
215
|
+
declare function computeScreenRect(targets: Float32Array, viewportW: number, viewportH: number, visibleWorldW: number): GlyphScreenRect | null;
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* drivers.ts — 進捗 0→1 の供給源。
|
|
219
|
+
*
|
|
220
|
+
* - scroll … sticky トリガー領域のスクロール量から進捗を算出(標準)。
|
|
221
|
+
* - manual … 呼び出し側が `progress` を注入(時間・GSAP・任意)。
|
|
222
|
+
*
|
|
223
|
+
* 進捗ゲッターは「毎フレーム呼ばれる純粋な関数」として表現する(useFrame から polling)。
|
|
224
|
+
* SSR セーフ(`window` 不在時は 0 を返す)。
|
|
225
|
+
*/
|
|
226
|
+
|
|
227
|
+
/** sticky トリガー領域の既定高さ(×100vh)。 */
|
|
228
|
+
declare const DEFAULT_TRIGGER_HEIGHT = 2;
|
|
229
|
+
/** スクロール連動ドライバ設定。 */
|
|
230
|
+
interface ScrollDriverConfig {
|
|
231
|
+
type: "scroll";
|
|
232
|
+
/**
|
|
233
|
+
* sticky トリガー領域の高さ(×100vh)。大きいほど演出がゆっくり進む。既定 {@link DEFAULT_TRIGGER_HEIGHT}。
|
|
234
|
+
* (ラッパー要素の高さ生成に使う。進捗式自体は要素実寸から算出するため値に依存しない。)
|
|
235
|
+
*/
|
|
236
|
+
triggerHeight?: number;
|
|
237
|
+
}
|
|
238
|
+
/** 手動ドライバ設定(progress を外部制御)。 */
|
|
239
|
+
interface ManualDriverConfig {
|
|
240
|
+
type: "manual";
|
|
241
|
+
/** 0..1 の進捗。 */
|
|
242
|
+
progress: number;
|
|
243
|
+
}
|
|
244
|
+
/** ドライバ設定の合併型。 */
|
|
245
|
+
type DriverConfig = ScrollDriverConfig | ManualDriverConfig;
|
|
246
|
+
/**
|
|
247
|
+
* 要素の sticky スクロール進捗 0→1 を返すゲッターを作る。
|
|
248
|
+
* 進捗 = `-rect.top / (rect.height - innerHeight)`(要素上端が viewport 上端を通過し切るまでで 0→1)。
|
|
249
|
+
* SSR / 要素 null 時は 0。
|
|
250
|
+
*/
|
|
251
|
+
declare function createScrollProgress(element: HTMLElement | null): () => number;
|
|
252
|
+
/**
|
|
253
|
+
* sticky トリガー要素の ref からスクロール進捗ゲッターを返す React フック。
|
|
254
|
+
* 返り値は ref を遅延参照する安定した関数(useFrame からそのまま polling できる)。
|
|
255
|
+
*/
|
|
256
|
+
declare function useScrollProgress(ref: RefObject<HTMLElement | null>): () => number;
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* useReducedMotion.ts — `prefers-reduced-motion: reduce` の購読。
|
|
260
|
+
*
|
|
261
|
+
* 演出を無効化(静的フォールバック表示)すべきかの判定に使う。
|
|
262
|
+
* SSR では false から始め、マウント後にメディアクエリへ同期する(ハイドレーション不一致回避)。
|
|
263
|
+
*/
|
|
264
|
+
/** 現在 reduced-motion かを同期的に返す(イベント購読なし。imperative 用)。 */
|
|
265
|
+
declare function prefersReducedMotion(): boolean;
|
|
266
|
+
/**
|
|
267
|
+
* `prefers-reduced-motion: reduce` を購読する React フック。
|
|
268
|
+
* 変更にも追随する。SSR セーフ(初期 false → マウント後に同期)。
|
|
269
|
+
*/
|
|
270
|
+
declare function useReducedMotion(): boolean;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* types.ts — glyphdust の公開型。
|
|
274
|
+
*/
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* テキストキーフレーム。文字を粒子字形にする。
|
|
278
|
+
* 改行は `\n` で明示する(`"次のユーザーは、\n人じゃない。"`)。
|
|
279
|
+
*/
|
|
280
|
+
interface TextKeyframe {
|
|
281
|
+
type: "text";
|
|
282
|
+
/** 描画テキスト。`\n` で行分割。 */
|
|
283
|
+
text: string;
|
|
284
|
+
/** Canvas2D の `font` 文字列。未指定なら密度に応じた既定。 */
|
|
285
|
+
font?: string;
|
|
286
|
+
/** 字形を収める可視ワールド幅。未指定なら可視幅からの既定比率。 */
|
|
287
|
+
worldW?: number;
|
|
288
|
+
/** ワールド x オフセット(右が +)。 */
|
|
289
|
+
offsetX?: number;
|
|
290
|
+
/** ワールド y オフセット(上が +)。 */
|
|
291
|
+
offsetY?: number;
|
|
292
|
+
/**
|
|
293
|
+
* 実 DOM 要素のセレクタ。指定すると、その要素の矩形・フォントに
|
|
294
|
+
* ピクセル単位で重なる字形を生成する(クロスフェード中に文字が動かない)。
|
|
295
|
+
*/
|
|
296
|
+
domSelector?: string;
|
|
297
|
+
/**
|
|
298
|
+
* フィナーレでこの字形を実 DOM 文字へ解決(粒子を消し実テキストへクロスフェード)。
|
|
299
|
+
* 通常は最終キーフレームに付ける。
|
|
300
|
+
*/
|
|
301
|
+
resolveToDom?: boolean;
|
|
302
|
+
/** 高密度・均一サンプリング(穴の目立たないワードマーク向け)。 */
|
|
303
|
+
dense?: boolean;
|
|
304
|
+
}
|
|
305
|
+
/** 飛散キーフレーム。粒子をランダム雲へ拡散する。 */
|
|
306
|
+
interface ScatterKeyframe {
|
|
307
|
+
type: "scatter";
|
|
308
|
+
/** 拡散半径の倍率。既定 1。 */
|
|
309
|
+
spread?: number;
|
|
310
|
+
}
|
|
311
|
+
/** キーフレーム(テキスト or 飛散)。 */
|
|
312
|
+
type Keyframe = TextKeyframe | ScatterKeyframe;
|
|
313
|
+
/** 配色。 */
|
|
314
|
+
interface GlyphColors {
|
|
315
|
+
/** 主体色(多数の粒)。既定 `#1b2330`。 */
|
|
316
|
+
ink?: string;
|
|
317
|
+
/** アクセント色(少数の粒)。既定 `#0055ff`。 */
|
|
318
|
+
accent?: string;
|
|
319
|
+
/** アクセント色になる粒の割合 0..1。既定 0.18。 */
|
|
320
|
+
accentRatio?: number;
|
|
321
|
+
}
|
|
322
|
+
/** デバイス別の粒子数。 */
|
|
323
|
+
interface GlyphCount {
|
|
324
|
+
/** デスクトップの粒子数。既定 11000。 */
|
|
325
|
+
desktop?: number;
|
|
326
|
+
/** モバイル(<=768px)の粒子数。既定 5200。 */
|
|
327
|
+
mobile?: number;
|
|
328
|
+
}
|
|
329
|
+
/** カメラ設定。 */
|
|
330
|
+
interface GlyphCamera {
|
|
331
|
+
/** z 位置。既定 7。 */
|
|
332
|
+
z?: number;
|
|
333
|
+
/** 縦 fov(度)。既定 42。 */
|
|
334
|
+
fov?: number;
|
|
335
|
+
}
|
|
336
|
+
/** インタラクション設定。 */
|
|
337
|
+
interface GlyphInteraction {
|
|
338
|
+
/** ポインタ追従(近傍反発)。既定 true。 */
|
|
339
|
+
pointer?: boolean;
|
|
340
|
+
/** ドラッグ回転(慣性つき)。既定 true。 */
|
|
341
|
+
drag?: boolean;
|
|
342
|
+
}
|
|
343
|
+
/** {@link GlyphDust} の props。 */
|
|
344
|
+
interface GlyphDustProps {
|
|
345
|
+
/** キーフレーム列(最低 1、通常 text → scatter → text)。 */
|
|
346
|
+
keyframes: Keyframe[];
|
|
347
|
+
/** 進捗ドライバ。既定 `{ type: "scroll" }`。 */
|
|
348
|
+
driver?: DriverConfig;
|
|
349
|
+
/** 配色。 */
|
|
350
|
+
colors?: GlyphColors;
|
|
351
|
+
/** デバイス別粒子数。 */
|
|
352
|
+
count?: GlyphCount;
|
|
353
|
+
/** r3f Canvas の dpr 範囲。既定 `[1, 1.75]`。 */
|
|
354
|
+
dpr?: [number, number];
|
|
355
|
+
/** インタラクション設定。 */
|
|
356
|
+
interaction?: GlyphInteraction;
|
|
357
|
+
/** カメラ設定。 */
|
|
358
|
+
camera?: GlyphCamera;
|
|
359
|
+
/**
|
|
360
|
+
* 各キーフレームの正規化時刻 0..1(補間境界)。
|
|
361
|
+
* 未指定なら等間隔。長さは keyframes と一致させる。
|
|
362
|
+
*/
|
|
363
|
+
timing?: number[];
|
|
364
|
+
/** reduced-motion / WebGL 不可時に描画するフォールバック(真っ白防止)。 */
|
|
365
|
+
fallback?: ReactNode;
|
|
366
|
+
/** ラッパーに付けるクラス名。 */
|
|
367
|
+
className?: string;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
declare function GlyphDust(props: GlyphDustProps): react.JSX.Element;
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* glyphdust — scroll-driven text → particles → glyph → real-text resolve
|
|
374
|
+
* for react-three-fiber.
|
|
375
|
+
*
|
|
376
|
+
* 公開 API はこのファイルから re-export する(Task-007)。
|
|
377
|
+
* 雛形段階のプレースホルダ。実装は Phase 1 (Task-002〜) で追加する。
|
|
378
|
+
*/
|
|
379
|
+
/** ライブラリのバージョン(package.json と一致させる)。 */
|
|
380
|
+
declare const VERSION = "0.1.0";
|
|
381
|
+
|
|
382
|
+
export { DEFAULT_TRIGGER_HEIGHT, type DenseTextTargetOptions, type DomGlyphOptions, type DriverConfig, FRAGMENT_SHADER, GLYPH_POSITION_ATTRIBUTE_PREFIX, type GlyphCamera, type GlyphColors, type GlyphCount, GlyphDust, type GlyphDustProps, type GlyphInteraction, type GlyphScreenRect, type Keyframe, type ManualDriverConfig, type Random, type ScatterKeyframe, type ScrollDriverConfig, type TextKeyframe, type TextTargetOptions, VERSION, type ViewSize, buildDenseTextTargets, buildGlyphFromDOM, buildTextTargets, buildVertexShader, computeScreenRect, createScrollProgress, glyphPositionAttribute, prefersReducedMotion, useReducedMotion, useScrollProgress, viewSizeAtZ0 };
|