momoi-explorer 0.8.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/ui.d.ts ADDED
@@ -0,0 +1,554 @@
1
+ import React from 'react';
2
+
3
+ /**
4
+ * ファイルシステムへのアクセスを抽象化するアダプタインターフェース。
5
+ * ユーザーはこのインターフェースを実装してcreateFileTreeに渡す。
6
+ * `readDir` のみ必須。その他のメソッドはオプションで、対応する機能が有効になる。
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { FileSystemAdapter } from 'momoi-explorer'
11
+ * import fs from 'node:fs/promises'
12
+ * import path from 'node:path'
13
+ *
14
+ * const adapter: FileSystemAdapter = {
15
+ * async readDir(dirPath) {
16
+ * const entries = await fs.readdir(dirPath, { withFileTypes: true })
17
+ * return entries.map(e => ({
18
+ * name: e.name,
19
+ * path: path.join(dirPath, e.name),
20
+ * isDirectory: e.isDirectory(),
21
+ * }))
22
+ * },
23
+ * async rename(oldPath, newPath) { await fs.rename(oldPath, newPath) },
24
+ * async delete(paths) { for (const p of paths) await fs.rm(p, { recursive: true }) },
25
+ * }
26
+ * ```
27
+ */
28
+ interface FileSystemAdapter {
29
+ /**
30
+ * ディレクトリの中身を読み取る。唯一の必須メソッド。
31
+ * @param path - 読み取るディレクトリの絶対パス
32
+ * @returns ディレクトリ内のFileEntryの配列
33
+ */
34
+ readDir(path: string): Promise<FileEntry[]>;
35
+ /**
36
+ * ファイルまたはフォルダをリネームする。
37
+ * 実装するとUI上でリネーム操作が可能になる。
38
+ * @param oldPath - リネーム前の絶対パス
39
+ * @param newPath - リネーム後の絶対パス
40
+ */
41
+ rename?(oldPath: string, newPath: string): Promise<void>;
42
+ /**
43
+ * ファイルまたはフォルダを削除する。
44
+ * 実装すると選択アイテムの削除操作が可能になる。
45
+ * @param paths - 削除対象の絶対パスの配列
46
+ */
47
+ delete?(paths: string[]): Promise<void>;
48
+ /**
49
+ * ファイルを新規作成する。
50
+ * 実装するとUI上でファイル作成操作が可能になる。
51
+ * @param parentPath - 作成先の親ディレクトリの絶対パス
52
+ * @param name - 新規ファイル名
53
+ */
54
+ createFile?(parentPath: string, name: string): Promise<void>;
55
+ /**
56
+ * フォルダを新規作成する。
57
+ * 実装するとUI上でフォルダ作成操作が可能になる。
58
+ * @param parentPath - 作成先の親ディレクトリの絶対パス
59
+ * @param name - 新規フォルダ名
60
+ */
61
+ createDir?(parentPath: string, name: string): Promise<void>;
62
+ /**
63
+ * ファイル変更監視を開始する。
64
+ * 生イベントを投げるだけでOK。デバウンス・合体・スロットリングはコアが行う。
65
+ * @param path - 監視するディレクトリの絶対パス
66
+ * @param callback - 生イベントを受け取るコールバック
67
+ * @returns 監視を停止するunwatch関数
68
+ */
69
+ watch?(path: string, callback: (events: RawWatchEvent[]) => void): () => void;
70
+ }
71
+ /**
72
+ * ファイルまたはフォルダを表すエントリ。
73
+ * `readDir` の戻り値として使用される基本データ型。
74
+ */
75
+ interface FileEntry {
76
+ /** ファイル名(拡張子含む) */
77
+ name: string;
78
+ /** 絶対パス */
79
+ path: string;
80
+ /** ディレクトリならtrue */
81
+ isDirectory: boolean;
82
+ /**
83
+ * ユーザー拡張用のメタデータ。
84
+ * gitStatus, iconHint 等、任意のデータを格納できる。
85
+ */
86
+ meta?: Record<string, unknown>;
87
+ }
88
+ /**
89
+ * コア内部で使用されるツリーノード。FileEntryにツリー構造の情報を追加したもの。
90
+ * flatList内のFlatNode.nodeとしても参照される。
91
+ */
92
+ interface TreeNode extends FileEntry {
93
+ /** ルートからの深さ(ルート直下 = 0) */
94
+ depth: number;
95
+ /** 子ノード。ディレクトリで未読み込みの場合はundefined */
96
+ children?: TreeNode[];
97
+ /** 子ノードが読み込み済みかどうか */
98
+ childrenLoaded: boolean;
99
+ }
100
+ /**
101
+ * 仮想スクロール用のフラットリスト要素。
102
+ * ツリーを展開状態に基づいて一次元配列に変換したもの。
103
+ */
104
+ interface FlatNode {
105
+ /** 対応するツリーノード */
106
+ node: TreeNode;
107
+ /** 表示上の深さ(インデント計算に使用) */
108
+ depth: number;
109
+ }
110
+ /** インライン新規作成の状態 */
111
+ interface CreatingState {
112
+ /** 新規アイテムを作成する親ディレクトリのパス */
113
+ parentPath: string;
114
+ /** ファイルかフォルダか */
115
+ isDirectory: boolean;
116
+ /** この位置の直後に入力行を表示する。未指定なら親の子の先頭(フォルダ選択時)or末尾(選択なし時) */
117
+ insertAfterPath?: string;
118
+ }
119
+ /**
120
+ * ツリー全体の現在状態。subscribeで購読可能。
121
+ * 不変(immutable)として扱い、変更時は新しいオブジェクトが生成される。
122
+ */
123
+ interface TreeState {
124
+ /** ルートディレクトリの絶対パス */
125
+ rootPath: string;
126
+ /** ルート直下のツリーノード配列 */
127
+ rootNodes: TreeNode[];
128
+ /** 現在展開中のディレクトリパスのセット */
129
+ expandedPaths: Set<string>;
130
+ /** 現在選択中のパスのセット */
131
+ selectedPaths: Set<string>;
132
+ /** 範囲選択の起点パス(Shift+Click用) */
133
+ anchorPath: string | null;
134
+ /** 現在リネーム中のパス。nullならリネームモードではない */
135
+ renamingPath: string | null;
136
+ /** インライン新規作成の状態。nullなら作成モードではない */
137
+ creatingState: CreatingState | null;
138
+ /** 現在の検索クエリ。nullなら検索なし */
139
+ searchQuery: string | null;
140
+ /** 仮想スクロール用のフラットリスト(展開・検索状態を反映) */
141
+ flatList: FlatNode[];
142
+ }
143
+ /**
144
+ * アダプタのwatchから来る生のファイル監視イベント。
145
+ * renameイベントはnewPathを持つ。コアが合体処理を行う。
146
+ */
147
+ interface RawWatchEvent {
148
+ /** イベント種別 */
149
+ type: 'create' | 'modify' | 'delete' | 'rename';
150
+ /** 対象パス(renameの場合はリネーム前のパス) */
151
+ path: string;
152
+ /** renameの場合のリネーム後パス */
153
+ newPath?: string;
154
+ /** 対象がディレクトリかどうか */
155
+ isDirectory: boolean;
156
+ }
157
+ /**
158
+ * コア内部で合体処理後のイベント。
159
+ * renameはdelete+createに分解され、同一パスのイベントは合体される。
160
+ */
161
+ interface WatchEvent {
162
+ /** イベント種別(renameは含まない) */
163
+ type: 'create' | 'modify' | 'delete';
164
+ /** 対象パス */
165
+ path: string;
166
+ /** 対象がディレクトリかどうか */
167
+ isDirectory: boolean;
168
+ }
169
+ /**
170
+ * ツリー操作や外部変更をUI層に通知するためのイベント型。
171
+ * `FileTreeOptions.onEvent` で購読できる。
172
+ *
173
+ * - `expand` / `collapse` - ディレクトリの展開/折りたたみ
174
+ * - `select` - 選択変更
175
+ * - `open` - ファイルを開く
176
+ * - `rename` - リネーム完了
177
+ * - `delete` - 削除完了
178
+ * - `create` - ファイル/フォルダ作成完了
179
+ * - `refresh` - ツリーのリフレッシュ
180
+ * - `external-change` - ファイル監視による外部変更検出
181
+ */
182
+ type TreeEvent = {
183
+ type: 'expand';
184
+ path: string;
185
+ } | {
186
+ type: 'collapse';
187
+ path: string;
188
+ } | {
189
+ type: 'select';
190
+ paths: string[];
191
+ } | {
192
+ type: 'open';
193
+ path: string;
194
+ } | {
195
+ type: 'rename';
196
+ oldPath: string;
197
+ newPath: string;
198
+ } | {
199
+ type: 'delete';
200
+ paths: string[];
201
+ } | {
202
+ type: 'create';
203
+ parentPath: string;
204
+ name: string;
205
+ isDirectory: boolean;
206
+ } | {
207
+ type: 'refresh';
208
+ path?: string;
209
+ } | {
210
+ type: 'external-change';
211
+ changes: WatchEvent[];
212
+ };
213
+ /**
214
+ * コンテキストメニューの項目定義。
215
+ * UI層でメニュー表示に使用する。
216
+ */
217
+ interface MenuItemDef {
218
+ /** メニュー項目の一意識別子 */
219
+ id: string;
220
+ /** 表示ラベル */
221
+ label: string;
222
+ /** キーボードショートカットの表示文字列(例: "Ctrl+C") */
223
+ shortcut?: string;
224
+ /** trueなら項目を無効化(グレーアウト) */
225
+ disabled?: boolean;
226
+ /** trueならこの項目の前にセパレータを表示 */
227
+ separator?: boolean;
228
+ /**
229
+ * メニュー選択時に実行されるアクション。
230
+ * @param targets - 右クリック対象のノード配列
231
+ */
232
+ action: (targets: TreeNode[]) => void;
233
+ }
234
+ /**
235
+ * ファイル監視の動作設定。
236
+ * createFileTreeのoptionsで指定する。
237
+ */
238
+ interface WatchOptions {
239
+ /** デバウンス時間(ms)。デフォルト: 75 (VSCode準拠) */
240
+ debounceMs?: number;
241
+ /** イベント合体を行うか。デフォルト: true */
242
+ coalesce?: boolean;
243
+ /** スロットリング設定。大量イベント発生時にチャンク分割する */
244
+ throttle?: {
245
+ /** 一度に処理するイベント上限。デフォルト: 500 */
246
+ maxChunkSize: number;
247
+ /** チャンク間の休止時間(ms)。デフォルト: 200 */
248
+ delayMs: number;
249
+ };
250
+ }
251
+ /**
252
+ * {@link createFileTree} の初期化オプション。
253
+ */
254
+ interface FileTreeOptions {
255
+ /** ファイルシステムアダプタ(必須) */
256
+ adapter: FileSystemAdapter;
257
+ /** ツリーのルートディレクトリの絶対パス */
258
+ rootPath: string;
259
+ /** カスタムソート関数。未指定時はフォルダ優先・名前昇順 */
260
+ sort?: (a: FileEntry, b: FileEntry) => number;
261
+ /** カスタムフィルタ関数。falseを返すエントリは非表示になる */
262
+ filter?: (entry: FileEntry) => boolean;
263
+ /** ファイル監視のオプション */
264
+ watchOptions?: WatchOptions;
265
+ /** ツリー操作イベントのコールバック */
266
+ onEvent?: (event: TreeEvent) => void;
267
+ }
268
+ /**
269
+ * ヘッドレスファイルツリーのメインコントローラ。
270
+ * {@link createFileTree} から返される。状態購読・ツリー操作・編集・検索などの全APIを提供する。
271
+ */
272
+ interface FileTreeController {
273
+ /**
274
+ * 現在のツリー状態を取得する。
275
+ * @returns 現在のTreeState
276
+ */
277
+ getState(): TreeState;
278
+ /**
279
+ * 状態変更を購読する。状態が変わるたびにlistenerが呼ばれる。
280
+ * @param listener - 状態変更時に呼ばれるコールバック
281
+ * @returns 購読解除関数
282
+ */
283
+ subscribe(listener: (state: TreeState) => void): () => void;
284
+ /**
285
+ * ルートディレクトリを読み込み、ツリーを初期化する。
286
+ * ファイル監視もここで開始される。最初に必ず呼ぶこと。
287
+ */
288
+ loadRoot(): Promise<void>;
289
+ /**
290
+ * 指定パスのディレクトリを展開する。未読み込みなら子を読み込む。
291
+ * @param path - 展開するディレクトリの絶対パス
292
+ */
293
+ expand(path: string): Promise<void>;
294
+ /**
295
+ * 指定パスのディレクトリを折りたたむ。
296
+ * @param path - 折りたたむディレクトリの絶対パス
297
+ */
298
+ collapse(path: string): void;
299
+ /**
300
+ * 展開/折りたたみをトグルする。
301
+ * @param path - 対象ディレクトリの絶対パス
302
+ */
303
+ toggleExpand(path: string): Promise<void>;
304
+ /**
305
+ * 指定パスまでの祖先ディレクトリをすべて展開する。
306
+ * ファイルを可視状態にしたい場合に使用する。
307
+ * @param path - 表示したいノードの絶対パス
308
+ */
309
+ expandTo(path: string): Promise<void>;
310
+ /**
311
+ * ノードを選択する。
312
+ * @param path - 選択するノードの絶対パス
313
+ * @param mode - 選択モード。'replace'=単一選択、'toggle'=Ctrl+Click、'range'=Shift+Click
314
+ */
315
+ select(path: string, mode?: 'replace' | 'toggle' | 'range'): void;
316
+ /** flatList内の全ノードを選択する */
317
+ selectAll(): void;
318
+ /** 選択をすべて解除する */
319
+ clearSelection(): void;
320
+ /**
321
+ * リネームモードを開始する。UIはこの状態を検知してインライン編集UIを表示する。
322
+ * @param path - リネーム対象の絶対パス
323
+ */
324
+ startRename(path: string): void;
325
+ /**
326
+ * リネームを確定する。adapter.renameが呼ばれ、親ディレクトリがリフレッシュされる。
327
+ * @param newName - 新しいファイル名(パスではなく名前のみ)
328
+ */
329
+ commitRename(newName: string): Promise<void>;
330
+ /** リネームをキャンセルする */
331
+ cancelRename(): void;
332
+ /**
333
+ * インライン新規作成モードを開始する。親ディレクトリを展開し、入力行を表示する。
334
+ * @param parentPath - 作成先の親ディレクトリの絶対パス
335
+ * @param isDirectory - フォルダを作成する場合はtrue
336
+ * @param insertAfterPath - この位置の直後に入力行を表示する
337
+ */
338
+ startCreate(parentPath: string, isDirectory: boolean, insertAfterPath?: string): Promise<void>;
339
+ /**
340
+ * インライン新規作成を確定する。adapter.createFile/createDirが呼ばれる。
341
+ * @param name - 新規ファイル/フォルダ名
342
+ */
343
+ commitCreate(name: string): Promise<void>;
344
+ /** インライン新規作成をキャンセルする */
345
+ cancelCreate(): void;
346
+ /**
347
+ * ファイルを新規作成する。adapter.createFileが呼ばれる。
348
+ * @param parentPath - 作成先の親ディレクトリの絶対パス
349
+ * @param name - 新規ファイル名
350
+ */
351
+ createFile(parentPath: string, name: string): Promise<void>;
352
+ /**
353
+ * フォルダを新規作成する。adapter.createDirが呼ばれる。
354
+ * @param parentPath - 作成先の親ディレクトリの絶対パス
355
+ * @param name - 新規フォルダ名
356
+ */
357
+ createDir(parentPath: string, name: string): Promise<void>;
358
+ /** 選択中のアイテムをすべて削除する。adapter.deleteが呼ばれる */
359
+ deleteSelected(): Promise<void>;
360
+ /**
361
+ * ツリーを再読み込みする。展開状態は保持される。
362
+ * @param path - リフレッシュ対象のディレクトリ。省略時はルート全体
363
+ */
364
+ refresh(path?: string): Promise<void>;
365
+ /**
366
+ * ファジー検索クエリを設定する。flatListがフィルタされマッチしたノードのみ表示される。
367
+ * @param query - 検索文字列。nullで検索解除
368
+ */
369
+ setSearchQuery(query: string | null): void;
370
+ /**
371
+ * ツリー配下の全ファイルを再帰的に収集する。
372
+ * fuzzyFind等で全ファイル検索を行う際の入力データとして使用する。
373
+ * @returns 全FileEntryの配列
374
+ */
375
+ collectAllFiles(): Promise<FileEntry[]>;
376
+ /**
377
+ * フィルタ関数を動的に変更する。既存ノードにも即座に適用される。
378
+ * @param fn - フィルタ関数。nullでフィルタ解除
379
+ */
380
+ setFilter(fn: ((entry: FileEntry) => boolean) | null): void;
381
+ /**
382
+ * ソート関数を動的に変更する。既存ノードにも即座に適用される。
383
+ * @param fn - ソート関数。nullでデフォルトソートに戻す
384
+ */
385
+ setSort(fn: ((a: FileEntry, b: FileEntry) => number) | null): void;
386
+ /** コントローラを破棄する。ファイル監視を停止し、購読をすべて解除する */
387
+ destroy(): void;
388
+ }
389
+
390
+ /**
391
+ * momoi-keybindのInputServiceの最小インターフェース。
392
+ * momoi-keybindに直接依存せず、duck typingで受け入れる。
393
+ */
394
+ interface InputServiceLike {
395
+ registerCommand(command: string, handler: (args?: unknown) => void): () => void;
396
+ setContext(key: string, value: unknown): void;
397
+ deleteContext(key: string): void;
398
+ }
399
+
400
+ /** {@link FileExplorer} に渡すprops */
401
+ interface FileExplorerProps {
402
+ /** ファイルシステム操作の実装 */
403
+ adapter: FileSystemAdapter;
404
+ /** ツリーのルートディレクトリパス */
405
+ rootPath: string;
406
+ /** ファイル/フォルダのソート関数 */
407
+ sort?: FileTreeOptions['sort'];
408
+ /** 表示対象を絞り込むフィルタ関数 */
409
+ filter?: FileTreeOptions['filter'];
410
+ /** ファイル監視の設定 */
411
+ watchOptions?: FileTreeOptions['watchOptions'];
412
+ /** ツリー操作イベント(展開・選択・リネーム等)のコールバック */
413
+ onEvent?: (event: TreeEvent) => void;
414
+ /** ファイルをダブルクリックで開いた際のコールバック */
415
+ onOpen?: (path: string) => void;
416
+ /** ノードアイコンのカスタムレンダラー */
417
+ renderIcon?: (node: TreeNode, isExpanded: boolean) => React.ReactNode;
418
+ /** ノード右端に表示するバッジのカスタムレンダラー */
419
+ renderBadge?: (node: TreeNode) => React.ReactNode;
420
+ /** 右クリックメニューの項目を返す関数。選択中ノード群が渡される */
421
+ contextMenuItems?: (nodes: TreeNode[]) => MenuItemDef[];
422
+ /** ツリーフィルタバーを表示するか */
423
+ showFilterBar?: boolean;
424
+ /** コントローラの参照を受け取るコールバック(QuickOpen等で使用) */
425
+ onControllerReady?: (controller: FileTreeController) => void;
426
+ /** momoi-keybindのInputServiceインスタンス。キーバインドを有効化する */
427
+ inputService?: InputServiceLike | null;
428
+ /** momoi-keybindを使わない場合のキーボードイベントハンドラ */
429
+ onKeyDown?: (e: React.KeyboardEvent) => void;
430
+ /** ルート要素に付与するCSSクラス */
431
+ className?: string;
432
+ /** ルート要素に付与するインラインスタイル */
433
+ style?: React.CSSProperties;
434
+ }
435
+ /**
436
+ * TreeProvider を内包するオールインワンのファイルエクスプローラーコンポーネント。
437
+ * これ単体でファイルツリーUIが動作する。仮想スクロール対応。
438
+ *
439
+ * @example
440
+ * ```tsx
441
+ * import { FileExplorer } from 'momoi-explorer/ui'
442
+ * import 'momoi-explorer/ui/style.css'
443
+ *
444
+ * <FileExplorer
445
+ * adapter={myAdapter}
446
+ * rootPath="/home/user/project"
447
+ * onOpen={(path) => openFile(path)}
448
+ * />
449
+ * ```
450
+ */
451
+ declare function FileExplorer({ adapter, rootPath, sort, filter, watchOptions, onEvent, onOpen, renderIcon, renderBadge, contextMenuItems, showFilterBar, onControllerReady, inputService, onKeyDown, className, style, }: FileExplorerProps): React.JSX.Element;
452
+
453
+ /** {@link TreeNodeRow} に渡すprops */
454
+ interface TreeNodeRowProps {
455
+ /** 表示対象のノード */
456
+ node: TreeNode;
457
+ /** ネスト深度(インデント量に使用) */
458
+ depth: number;
459
+ /** ディレクトリが展開されているか */
460
+ isExpanded: boolean;
461
+ /** 選択されているか */
462
+ isSelected: boolean;
463
+ /** リネーム中か */
464
+ isRenaming: boolean;
465
+ /** 行クリック時のハンドラ */
466
+ onClick(e: React.MouseEvent): void;
467
+ /** 行ダブルクリック時のハンドラ */
468
+ onDoubleClick(): void;
469
+ /** 右クリック時のハンドラ */
470
+ onContextMenu(e: React.MouseEvent): void;
471
+ /** 展開/折りたたみトグル */
472
+ onToggleExpand(): void;
473
+ /** リネーム確定時のハンドラ */
474
+ onCommitRename(newName: string): void;
475
+ /** リネームキャンセル時のハンドラ */
476
+ onCancelRename(): void;
477
+ /** ノードアイコンのカスタムレンダラー */
478
+ renderIcon?: (node: TreeNode, isExpanded: boolean) => React.ReactNode;
479
+ /** ノード右端に表示するバッジのカスタムレンダラー */
480
+ renderBadge?: (node: TreeNode) => React.ReactNode;
481
+ }
482
+ /**
483
+ * ツリーの1行を表すコンポーネント。
484
+ * インデント・展開矢印・アイコン・ファイル名・バッジ・インラインリネームを描画する。
485
+ */
486
+ declare const TreeNodeRow: React.NamedExoticComponent<TreeNodeRowProps>;
487
+
488
+ /** {@link ContextMenu} に渡すprops */
489
+ interface ContextMenuProps {
490
+ /** メニュー項目の定義リスト */
491
+ items: MenuItemDef[];
492
+ /** メニュー表示のX座標 */
493
+ x: number;
494
+ /** メニュー表示のY座標 */
495
+ y: number;
496
+ /** メニューを閉じる際のコールバック */
497
+ onClose(): void;
498
+ }
499
+ /**
500
+ * 右クリックコンテキストメニュー。
501
+ * 外側クリックまたは Esc キーで閉じる。画面端からはみ出さないよう自動調整する。
502
+ */
503
+ declare function ContextMenu({ items, x, y, onClose }: ContextMenuProps): React.JSX.Element;
504
+
505
+ /** {@link InlineRename} に渡すprops */
506
+ interface InlineRenameProps {
507
+ /** 現在のファイル/フォルダ名 */
508
+ currentName: string;
509
+ /** 新しい名前で確定する際のコールバック */
510
+ onCommit(newName: string): void;
511
+ /** リネームをキャンセルする際のコールバック */
512
+ onCancel(): void;
513
+ }
514
+ /**
515
+ * インライン名前変更用の入力コンポーネント。
516
+ * Enter で確定、Esc でキャンセル、blur 時も確定する。
517
+ * マウント時に自動フォーカスし、拡張子の前までを選択状態にする。
518
+ */
519
+ declare function InlineRename({ currentName, onCommit, onCancel }: InlineRenameProps): React.JSX.Element;
520
+
521
+ /** {@link TreeFilterBar} に渡すprops */
522
+ interface TreeFilterBarProps {
523
+ /** 入力欄のプレースホルダー。デフォルト: `"Filter files..."` */
524
+ placeholder?: string;
525
+ }
526
+ /**
527
+ * ファジー検索によるツリーフィルタバー。
528
+ * 入力に応じてツリー表示を絞り込む。Esc キーで入力をクリアする。
529
+ */
530
+ declare function TreeFilterBar({ placeholder, }: TreeFilterBarProps): React.JSX.Element;
531
+
532
+ /** {@link QuickOpen} に渡すprops */
533
+ interface QuickOpenProps {
534
+ /** ファイル一覧の収集に使用するコントローラ。FileExplorer の `onControllerReady` で取得可能 */
535
+ controller: FileTreeController;
536
+ /** ダイアログの表示/非表示 */
537
+ isOpen: boolean;
538
+ /** ダイアログを閉じる際のコールバック */
539
+ onClose(): void;
540
+ /** ファイル選択時のコールバック */
541
+ onSelect(entry: FileEntry): void;
542
+ /** 入力欄のプレースホルダー。デフォルト: `"Search files by name..."` */
543
+ placeholder?: string;
544
+ /** 検索結果の最大表示件数。デフォルト: `50` */
545
+ maxResults?: number;
546
+ }
547
+ /**
548
+ * VSCode風のクイックオープンダイアログ。
549
+ * ツリー内の全ファイルからファジー検索し、矢印キーで選択、Enter で確定する。
550
+ * Esc またはオーバーレイクリックで閉じる。
551
+ */
552
+ declare function QuickOpen({ controller, isOpen, onClose, onSelect, placeholder, maxResults, }: QuickOpenProps): React.JSX.Element | null;
553
+
554
+ export { ContextMenu, type ContextMenuProps, FileExplorer, type FileExplorerProps, InlineRename, type InlineRenameProps, QuickOpen, type QuickOpenProps, TreeFilterBar, type TreeFilterBarProps, TreeNodeRow, type TreeNodeRowProps };