@flyingrobots/bijou-tui 3.0.0 → 4.0.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 +159 -21
- package/README.md +181 -32
- package/dist/app-frame-actions.d.ts +1 -5
- package/dist/app-frame-actions.d.ts.map +1 -1
- package/dist/app-frame-actions.js +23 -20
- package/dist/app-frame-actions.js.map +1 -1
- package/dist/app-frame-render.d.ts +17 -11
- package/dist/app-frame-render.d.ts.map +1 -1
- package/dist/app-frame-render.js +106 -100
- package/dist/app-frame-render.js.map +1 -1
- package/dist/app-frame-types.d.ts +10 -1
- package/dist/app-frame-types.d.ts.map +1 -1
- package/dist/app-frame-types.js.map +1 -1
- package/dist/app-frame.d.ts +39 -2
- package/dist/app-frame.d.ts.map +1 -1
- package/dist/app-frame.js +222 -78
- package/dist/app-frame.js.map +1 -1
- package/dist/browsable-list.d.ts +20 -1
- package/dist/browsable-list.d.ts.map +1 -1
- package/dist/browsable-list.js +38 -10
- package/dist/browsable-list.js.map +1 -1
- package/dist/command-palette.d.ts +17 -1
- package/dist/command-palette.d.ts.map +1 -1
- package/dist/command-palette.js +45 -20
- package/dist/command-palette.js.map +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +11 -3
- package/dist/commands.js.map +1 -1
- package/dist/css/text-style.d.ts +2 -1
- package/dist/css/text-style.d.ts.map +1 -1
- package/dist/css/text-style.js +33 -0
- package/dist/css/text-style.js.map +1 -1
- package/dist/design-language.d.ts +49 -0
- package/dist/design-language.d.ts.map +1 -0
- package/dist/design-language.js +70 -0
- package/dist/design-language.js.map +1 -0
- package/dist/driver.d.ts +10 -6
- package/dist/driver.d.ts.map +1 -1
- package/dist/driver.js +18 -17
- package/dist/driver.js.map +1 -1
- package/dist/eventbus.d.ts +5 -0
- package/dist/eventbus.d.ts.map +1 -1
- package/dist/eventbus.js +44 -7
- package/dist/eventbus.js.map +1 -1
- package/dist/file-picker.d.ts +19 -1
- package/dist/file-picker.d.ts.map +1 -1
- package/dist/file-picker.js +47 -20
- package/dist/file-picker.js.map +1 -1
- package/dist/flex.d.ts +35 -1
- package/dist/flex.d.ts.map +1 -1
- package/dist/flex.js +127 -1
- package/dist/flex.js.map +1 -1
- package/dist/focus-area.d.ts +13 -1
- package/dist/focus-area.d.ts.map +1 -1
- package/dist/focus-area.js +89 -12
- package/dist/focus-area.js.map +1 -1
- package/dist/grid.d.ts +10 -0
- package/dist/grid.d.ts.map +1 -1
- package/dist/grid.js +25 -0
- package/dist/grid.js.map +1 -1
- package/dist/help.d.ts +41 -0
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +50 -0
- package/dist/help.js.map +1 -1
- package/dist/index.d.ts +19 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -14
- package/dist/index.js.map +1 -1
- package/dist/layout-node-surface.d.ts +9 -0
- package/dist/layout-node-surface.d.ts.map +1 -0
- package/dist/layout-node-surface.js +42 -0
- package/dist/layout-node-surface.js.map +1 -0
- package/dist/navigable-table.d.ts +16 -1
- package/dist/navigable-table.d.ts.map +1 -1
- package/dist/navigable-table.js +32 -1
- package/dist/navigable-table.js.map +1 -1
- package/dist/notification.d.ts +89 -0
- package/dist/notification.d.ts.map +1 -0
- package/dist/notification.js +821 -0
- package/dist/notification.js.map +1 -0
- package/dist/overlay.d.ts +24 -9
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +236 -138
- package/dist/overlay.js.map +1 -1
- package/dist/pager.d.ts +16 -0
- package/dist/pager.d.ts.map +1 -1
- package/dist/pager.js +61 -1
- package/dist/pager.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +79 -68
- package/dist/runtime.js.map +1 -1
- package/dist/split-pane.d.ts +12 -1
- package/dist/split-pane.d.ts.map +1 -1
- package/dist/split-pane.js +31 -1
- package/dist/split-pane.js.map +1 -1
- package/dist/status-bar.d.ts +12 -0
- package/dist/status-bar.d.ts.map +1 -1
- package/dist/status-bar.js +45 -16
- package/dist/status-bar.js.map +1 -1
- package/dist/surface-layout.d.ts +19 -0
- package/dist/surface-layout.d.ts.map +1 -0
- package/dist/surface-layout.js +87 -0
- package/dist/surface-layout.js.map +1 -0
- package/dist/transition-shaders.d.ts +10 -8
- package/dist/transition-shaders.d.ts.map +1 -1
- package/dist/transition-shaders.js +65 -19
- package/dist/transition-shaders.js.map +1 -1
- package/dist/types.d.ts +32 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/view-output.d.ts +4 -4
- package/dist/view-output.d.ts.map +1 -1
- package/dist/view-output.js +24 -26
- package/dist/view-output.js.map +1 -1
- package/dist/viewport.d.ts +30 -1
- package/dist/viewport.d.ts.map +1 -1
- package/dist/viewport.js +77 -1
- package/dist/viewport.js.map +1 -1
- package/package.json +4 -4
- package/dist/layout-v3.d.ts +0 -10
- package/dist/layout-v3.d.ts.map +0 -1
- package/dist/layout-v3.js +0 -35
- package/dist/layout-v3.js.map +0 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared design-language defaults for terminal-first layout and overlays.
|
|
3
|
+
*
|
|
4
|
+
* These values are intentionally small and cell-based. They are not meant to
|
|
5
|
+
* replace component-specific options, but to keep the default spacing and
|
|
6
|
+
* overlay behavior consistent across the TUI layer.
|
|
7
|
+
*/
|
|
8
|
+
/** Shared spacing and inset defaults for the TUI layer. */
|
|
9
|
+
export const TUI_SPACING = {
|
|
10
|
+
/** Smallest layout unit in a character grid. */
|
|
11
|
+
cell: 1,
|
|
12
|
+
/** Preferred structural rhythm for sections and outer spacing. */
|
|
13
|
+
rhythm: 2,
|
|
14
|
+
/** Tight inline gap used inside compact controls. */
|
|
15
|
+
inlineGap: 1,
|
|
16
|
+
/** Preferred edge inset for roomy overlays. */
|
|
17
|
+
overlayMargin: 2,
|
|
18
|
+
/** Minimum edge inset for compact viewports. */
|
|
19
|
+
compactOverlayMargin: 1,
|
|
20
|
+
/** Default gap between stacked transient notifications. */
|
|
21
|
+
notificationGap: 1,
|
|
22
|
+
};
|
|
23
|
+
/** Width below which the viewport should be treated as compact. */
|
|
24
|
+
export const COMPACT_VIEWPORT_WIDTH = 52;
|
|
25
|
+
/** Height below which the viewport should be treated as compact. */
|
|
26
|
+
export const COMPACT_VIEWPORT_HEIGHT = 16;
|
|
27
|
+
function normalizeNonNegativeInt(value, fallback) {
|
|
28
|
+
if (value == null || !Number.isFinite(value))
|
|
29
|
+
return fallback;
|
|
30
|
+
return Math.max(0, Math.floor(value));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Decide whether a viewport should use compact overlay/layout defaults.
|
|
34
|
+
*/
|
|
35
|
+
export function isCompactViewport(width, height) {
|
|
36
|
+
return Math.floor(width) < COMPACT_VIEWPORT_WIDTH
|
|
37
|
+
|| Math.floor(height) < COMPACT_VIEWPORT_HEIGHT;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Resolve the default edge inset for overlays and overlay-like UI.
|
|
41
|
+
*
|
|
42
|
+
* Explicit user values always win. Otherwise Bijou prefers a 2-cell margin on
|
|
43
|
+
* roomy screens and falls back to 1 cell on compact terminals/split panes.
|
|
44
|
+
*/
|
|
45
|
+
export function resolveOverlayMargin(width, height, margin) {
|
|
46
|
+
return normalizeNonNegativeInt(margin, isCompactViewport(width, height)
|
|
47
|
+
? TUI_SPACING.compactOverlayMargin
|
|
48
|
+
: TUI_SPACING.overlayMargin);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Resolve the default stack gap for transient notifications.
|
|
52
|
+
*/
|
|
53
|
+
export function resolveNotificationGap(gap) {
|
|
54
|
+
return normalizeNonNegativeInt(gap, TUI_SPACING.notificationGap);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Center an item while respecting a preferred outer inset when possible.
|
|
58
|
+
*
|
|
59
|
+
* If the viewport is too small to preserve the preferred inset on both sides,
|
|
60
|
+
* this falls back to ordinary clamped centering.
|
|
61
|
+
*/
|
|
62
|
+
export function clampCenteredPosition(totalSize, itemSize, preferredInset) {
|
|
63
|
+
const centered = Math.floor((totalSize - itemSize) / 2);
|
|
64
|
+
const max = Math.max(0, totalSize - itemSize);
|
|
65
|
+
if (max >= preferredInset * 2) {
|
|
66
|
+
return Math.min(max - preferredInset, Math.max(preferredInset, centered));
|
|
67
|
+
}
|
|
68
|
+
return Math.max(0, Math.min(max, centered));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=design-language.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-language.js","sourceRoot":"","sources":["../src/design-language.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2DAA2D;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,gDAAgD;IAChD,IAAI,EAAE,CAAC;IACP,kEAAkE;IAClE,MAAM,EAAE,CAAC;IACT,qDAAqD;IACrD,SAAS,EAAE,CAAC;IACZ,+CAA+C;IAC/C,aAAa,EAAE,CAAC;IAChB,gDAAgD;IAChD,oBAAoB,EAAE,CAAC;IACvB,2DAA2D;IAC3D,eAAe,EAAE,CAAC;CACV,CAAC;AAEX,mEAAmE;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,oEAAoE;AACpE,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C,SAAS,uBAAuB,CAAC,KAAyB,EAAE,QAAgB;IAC1E,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,MAAc;IAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,sBAAsB;WAC5C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,uBAAuB,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAa,EACb,MAAc,EACd,MAAe;IAEf,OAAO,uBAAuB,CAC5B,MAAM,EACN,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC;QAC9B,CAAC,CAAC,WAAW,CAAC,oBAAoB;QAClC,CAAC,CAAC,WAAW,CAAC,aAAa,CAC9B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,OAAO,uBAAuB,CAAC,GAAG,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,QAAgB,EAChB,cAAsB;IAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;IAE9C,IAAI,GAAG,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
package/dist/driver.d.ts
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* console.log(result.frames); // all rendered frames
|
|
16
16
|
* ```
|
|
17
17
|
*/
|
|
18
|
-
import type { App, RunOptions } from './types.js';
|
|
18
|
+
import type { App, RunOptions, MouseMsg } from './types.js';
|
|
19
19
|
import { type Surface } from '@flyingrobots/bijou';
|
|
20
20
|
/** A single step in a scripted interaction sequence. */
|
|
21
21
|
export type ScriptStep<M = never> = {
|
|
@@ -38,6 +38,11 @@ export type ScriptStep<M = never> = {
|
|
|
38
38
|
};
|
|
39
39
|
/** Milliseconds to wait before sending this step. Default: 0. */
|
|
40
40
|
delay?: number;
|
|
41
|
+
} | {
|
|
42
|
+
/** Mouse event to emit. */
|
|
43
|
+
mouse: MouseMsg;
|
|
44
|
+
/** Milliseconds to wait before sending this step. Default: 0. */
|
|
45
|
+
delay?: number;
|
|
41
46
|
} | {
|
|
42
47
|
/** Custom message to emit directly onto the bus. */
|
|
43
48
|
msg: M;
|
|
@@ -48,6 +53,8 @@ export type ScriptStep<M = never> = {
|
|
|
48
53
|
export interface RunScriptOptions extends RunOptions {
|
|
49
54
|
/** Capture each rendered frame. */
|
|
50
55
|
onFrame?: (frame: Surface, index: number) => void;
|
|
56
|
+
/** Pulse frequency used to drive animation commands. Set to `false` to disable. */
|
|
57
|
+
pulseFps?: number | false;
|
|
51
58
|
}
|
|
52
59
|
/**
|
|
53
60
|
* Result returned by {@link runScript} after all steps have been processed.
|
|
@@ -73,11 +80,8 @@ export interface RunScriptResult<Model> {
|
|
|
73
80
|
* - A command returns QUIT
|
|
74
81
|
* - All script steps are exhausted (auto-quits)
|
|
75
82
|
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* Commands that use `setTimeout`, real I/O, or other macrotask-based async
|
|
79
|
-
* may not have completed before the next key is dispatched. Use `delay`
|
|
80
|
-
* on subsequent steps to allow time for macrotask-based commands.
|
|
83
|
+
* Between steps the driver waits for the event bus to go idle, so command
|
|
84
|
+
* chains settle deterministically without relying on microtask-only yields.
|
|
81
85
|
*
|
|
82
86
|
* @template Model - The application model type.
|
|
83
87
|
* @template M - The message (action) type for the TEA update cycle.
|
package/dist/driver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAa,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIvE,OAAO,EAAE,KAAK,OAAO,EAAuB,MAAM,qBAAqB,CAAC;AAQxE,wDAAwD;AACxD,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,KAAK,IAC5B;IACA,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACC;IACA,4BAA4B;IAC5B,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACC;IACA,2BAA2B;IAC3B,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACtB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACC;IACA,2BAA2B;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACC;IACA,oDAAoD;IACpD,GAAG,EAAE,CAAC,CAAC;IACP,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEJ,4EAA4E;AAC5E,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,mCAAmC;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,yCAAyC;IACzC,KAAK,EAAE,KAAK,CAAC;IACb,oCAAoC;IACpC,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,CAAC,EACtC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAClB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EACtB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CA6GjC"}
|
package/dist/driver.js
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
import { isResizeMsg } from './types.js';
|
|
19
19
|
import { createEventBus } from './eventbus.js';
|
|
20
20
|
import { parseKey } from './keys.js';
|
|
21
|
+
import { resolveClock, sleep } from '@flyingrobots/bijou';
|
|
21
22
|
import { installBCSSResolver } from './css/install.js';
|
|
22
23
|
import { normalizeViewOutput } from './view-output.js';
|
|
23
24
|
// ---------------------------------------------------------------------------
|
|
@@ -34,11 +35,8 @@ import { normalizeViewOutput } from './view-output.js';
|
|
|
34
35
|
* - A command returns QUIT
|
|
35
36
|
* - All script steps are exhausted (auto-quits)
|
|
36
37
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* Commands that use `setTimeout`, real I/O, or other macrotask-based async
|
|
40
|
-
* may not have completed before the next key is dispatched. Use `delay`
|
|
41
|
-
* on subsequent steps to allow time for macrotask-based commands.
|
|
38
|
+
* Between steps the driver waits for the event bus to go idle, so command
|
|
39
|
+
* chains settle deterministically without relying on microtask-only yields.
|
|
42
40
|
*
|
|
43
41
|
* @template Model - The application model type.
|
|
44
42
|
* @template M - The message (action) type for the TEA update cycle.
|
|
@@ -48,9 +46,10 @@ import { normalizeViewOutput } from './view-output.js';
|
|
|
48
46
|
* @returns The final model, all rendered frames, and elapsed time.
|
|
49
47
|
*/
|
|
50
48
|
export async function runScript(app, steps, options) {
|
|
51
|
-
const
|
|
49
|
+
const clock = resolveClock(options?.ctx);
|
|
50
|
+
const start = clock.now();
|
|
52
51
|
const frames = [];
|
|
53
|
-
const bus = createEventBus();
|
|
52
|
+
const bus = createEventBus({ clock });
|
|
54
53
|
const ctx = options?.ctx;
|
|
55
54
|
if (ctx != null) {
|
|
56
55
|
installBCSSResolver(ctx, options?.css);
|
|
@@ -62,8 +61,10 @@ export async function runScript(app, steps, options) {
|
|
|
62
61
|
width: Math.max(0, Math.floor(ctx?.runtime.columns || 80)),
|
|
63
62
|
height: Math.max(0, Math.floor(ctx?.runtime.rows || 24)),
|
|
64
63
|
};
|
|
65
|
-
// Start heartbeat for animations
|
|
66
|
-
|
|
64
|
+
// Start heartbeat for animations when enabled.
|
|
65
|
+
if (options?.pulseFps !== false) {
|
|
66
|
+
bus.startPulse(options?.pulseFps ?? ctx?.runtime.refreshRate ?? 60);
|
|
67
|
+
}
|
|
67
68
|
/** Stop the scripted driver event loop. */
|
|
68
69
|
function shutdown() {
|
|
69
70
|
running = false;
|
|
@@ -96,14 +97,13 @@ export async function runScript(app, steps, options) {
|
|
|
96
97
|
for (const cmd of initCmds) {
|
|
97
98
|
bus.runCmd(cmd);
|
|
98
99
|
}
|
|
99
|
-
|
|
100
|
-
await new Promise((r) => queueMicrotask(r));
|
|
100
|
+
await bus.drain();
|
|
101
101
|
// Feed script steps
|
|
102
102
|
for (const step of steps) {
|
|
103
103
|
if (!running)
|
|
104
104
|
break;
|
|
105
105
|
if (step.delay && step.delay > 0) {
|
|
106
|
-
await
|
|
106
|
+
await sleep(clock, step.delay);
|
|
107
107
|
}
|
|
108
108
|
if (!running)
|
|
109
109
|
break;
|
|
@@ -122,6 +122,9 @@ export async function runScript(app, steps, options) {
|
|
|
122
122
|
};
|
|
123
123
|
bus.emit(resizeMsg);
|
|
124
124
|
}
|
|
125
|
+
else if ('mouse' in step) {
|
|
126
|
+
bus.emit(step.mouse);
|
|
127
|
+
}
|
|
125
128
|
else if ('msg' in step) {
|
|
126
129
|
bus.emit(step.msg);
|
|
127
130
|
}
|
|
@@ -129,11 +132,9 @@ export async function runScript(app, steps, options) {
|
|
|
129
132
|
const _exhaustive = step;
|
|
130
133
|
throw new Error(`runScript: unhandled script step variant: ${JSON.stringify(_exhaustive)}`);
|
|
131
134
|
}
|
|
132
|
-
|
|
133
|
-
await new Promise((r) => queueMicrotask(r));
|
|
135
|
+
await bus.drain();
|
|
134
136
|
}
|
|
135
|
-
|
|
136
|
-
await new Promise((r) => queueMicrotask(r));
|
|
137
|
+
await bus.drain();
|
|
137
138
|
}
|
|
138
139
|
finally {
|
|
139
140
|
bus.stopPulse();
|
|
@@ -142,7 +143,7 @@ export async function runScript(app, steps, options) {
|
|
|
142
143
|
return {
|
|
143
144
|
model,
|
|
144
145
|
frames,
|
|
145
|
-
elapsed:
|
|
146
|
+
elapsed: clock.now() - start,
|
|
146
147
|
};
|
|
147
148
|
}
|
|
148
149
|
//# sourceMappingURL=driver.js.map
|
package/dist/driver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"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"}
|
package/dist/eventbus.d.ts
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
* ```
|
|
26
26
|
*/
|
|
27
27
|
import type { IOPort } from '@flyingrobots/bijou';
|
|
28
|
+
import { type ClockPort } from '@flyingrobots/bijou';
|
|
28
29
|
import type { Cmd, KeyMsg, MouseMsg, PulseMsg, ResizeMsg } from './types.js';
|
|
29
30
|
/**
|
|
30
31
|
* Union of all message types the bus can carry — built-in key, resize,
|
|
@@ -121,6 +122,8 @@ export interface EventBus<M> {
|
|
|
121
122
|
* @returns A disposable that removes this middleware.
|
|
122
123
|
*/
|
|
123
124
|
use(middleware: Middleware<M>): Disposable;
|
|
125
|
+
/** Resolve once all in-flight commands have settled. */
|
|
126
|
+
drain(): Promise<void>;
|
|
124
127
|
/** Disconnect all sources and remove all subscribers. */
|
|
125
128
|
dispose(): void;
|
|
126
129
|
}
|
|
@@ -130,6 +133,8 @@ export interface CreateEventBusOptions {
|
|
|
130
133
|
onCommandRejected?: (error: unknown) => void;
|
|
131
134
|
/** Called to surface error messages (replaces direct `console.error` usage). */
|
|
132
135
|
onError?: (message: string, error: unknown) => void;
|
|
136
|
+
/** Clock/scheduler override for deterministic command and pulse timing. */
|
|
137
|
+
clock?: ClockPort;
|
|
133
138
|
}
|
|
134
139
|
/** Handle for unsubscribing or disconnecting a resource. */
|
|
135
140
|
interface Disposable {
|
package/dist/eventbus.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventbus.d.ts","sourceRoot":"","sources":["../src/eventbus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQ7E;;;;;GAKG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC;AAErF;;;;;GAKG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB;;;;;;OAMG;IACH,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,UAAU,CAAC;IAElD;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE3B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,UAAU,CAAC;IAEjE;;;;;;;;;;OAUG;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE1B;;;;;;;OAOG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,UAAU,CAAC;IAExC;;;;;OAKG;IACH,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B,2CAA2C;IAC3C,SAAS,IAAI,IAAI,CAAC;IAElB;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,UAAU,CAAC;IAEnD;;;;;;;OAOG;IACH,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;IAE3C,yDAAyD;IACzD,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,qDAAqD;AACrD,MAAM,WAAW,qBAAqB;IACpC,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,gFAAgF;IAChF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"eventbus.d.ts","sourceRoot":"","sources":["../src/eventbus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQ7E;;;;;GAKG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC;AAErF;;;;;GAKG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB;;;;;;OAMG;IACH,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,UAAU,CAAC;IAElD;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE3B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,UAAU,CAAC;IAEjE;;;;;;;;;;OAUG;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE1B;;;;;;;OAOG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,UAAU,CAAC;IAExC;;;;;OAKG;IACH,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B,2CAA2C;IAC3C,SAAS,IAAI,IAAI,CAAC;IAElB;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,UAAU,CAAC;IAEnD;;;;;;;OAOG;IACH,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;IAE3C,wDAAwD;IACxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,yDAAyD;IACzD,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,qDAAqD;AACrD,MAAM,WAAW,qBAAqB;IACpC,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,gFAAgF;IAChF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACpD,2EAA2E;IAC3E,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,4DAA4D;AAC5D,UAAU,UAAU;IAClB,0DAA0D;IAC1D,OAAO,IAAI,IAAI,CAAC;CACjB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,qBAAqB,GAAG,QAAQ,CAAC,CAAC,CAAC,CAkQjF"}
|
package/dist/eventbus.js
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
* bus.emit({ type: 'key', key: 'a', ctrl: false, alt: false, shift: false });
|
|
25
25
|
* ```
|
|
26
26
|
*/
|
|
27
|
+
import { defer, resolveClock, sleep } from '@flyingrobots/bijou';
|
|
27
28
|
import { QUIT } from './types.js';
|
|
28
29
|
import { parseKey, parseMouse } from './keys.js';
|
|
29
30
|
// ---------------------------------------------------------------------------
|
|
@@ -42,6 +43,7 @@ import { parseKey, parseMouse } from './keys.js';
|
|
|
42
43
|
* @returns A new event bus instance.
|
|
43
44
|
*/
|
|
44
45
|
export function createEventBus(busOptions) {
|
|
46
|
+
const clock = resolveClock(busOptions?.clock);
|
|
45
47
|
const subscribers = new Set();
|
|
46
48
|
const quitHandlers = new Set();
|
|
47
49
|
const pulseHandlers = new Set();
|
|
@@ -49,6 +51,8 @@ export function createEventBus(busOptions) {
|
|
|
49
51
|
const disposables = [];
|
|
50
52
|
let disposed = false;
|
|
51
53
|
let pulseTimer = null;
|
|
54
|
+
let pendingCommands = 0;
|
|
55
|
+
const idleResolvers = new Set();
|
|
52
56
|
/** Report an error without risking an unhandled rejection. */
|
|
53
57
|
function safeReport(message, error) {
|
|
54
58
|
try {
|
|
@@ -89,6 +93,14 @@ export function createEventBus(busOptions) {
|
|
|
89
93
|
};
|
|
90
94
|
dispatch(msg);
|
|
91
95
|
}
|
|
96
|
+
function resolveIdleIfNeeded() {
|
|
97
|
+
if (!disposed && pendingCommands !== 0)
|
|
98
|
+
return;
|
|
99
|
+
for (const resolve of idleResolvers) {
|
|
100
|
+
resolve();
|
|
101
|
+
}
|
|
102
|
+
idleResolvers.clear();
|
|
103
|
+
}
|
|
92
104
|
return {
|
|
93
105
|
on(handler) {
|
|
94
106
|
subscribers.add(handler);
|
|
@@ -144,10 +156,21 @@ export function createEventBus(busOptions) {
|
|
|
144
156
|
runCmd(cmd) {
|
|
145
157
|
if (disposed)
|
|
146
158
|
return;
|
|
159
|
+
pendingCommands++;
|
|
147
160
|
const caps = {
|
|
148
161
|
onPulse: (h) => this.onPulse(h),
|
|
162
|
+
sleep: (ms) => sleep(clock, ms),
|
|
163
|
+
defer: () => defer(clock),
|
|
164
|
+
now: () => clock.now(),
|
|
149
165
|
};
|
|
150
|
-
|
|
166
|
+
let commandPromise;
|
|
167
|
+
try {
|
|
168
|
+
commandPromise = Promise.resolve(cmd(emit, caps));
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
commandPromise = Promise.reject(err);
|
|
172
|
+
}
|
|
173
|
+
commandPromise.then((result) => {
|
|
151
174
|
if (disposed)
|
|
152
175
|
return;
|
|
153
176
|
if (result === QUIT) {
|
|
@@ -177,6 +200,11 @@ export function createEventBus(busOptions) {
|
|
|
177
200
|
: '[EventBus] onError handler threw while reporting a command rejection:', reportErr);
|
|
178
201
|
safeReport('[EventBus] Original command rejection:', err);
|
|
179
202
|
}
|
|
203
|
+
}).finally(() => {
|
|
204
|
+
pendingCommands = Math.max(0, pendingCommands - 1);
|
|
205
|
+
if (!disposed) {
|
|
206
|
+
resolveIdleIfNeeded();
|
|
207
|
+
}
|
|
180
208
|
});
|
|
181
209
|
},
|
|
182
210
|
onQuit(handler) {
|
|
@@ -191,14 +219,14 @@ export function createEventBus(busOptions) {
|
|
|
191
219
|
if (disposed || pulseTimer)
|
|
192
220
|
return;
|
|
193
221
|
const intervalMs = Math.round(1000 / fps);
|
|
194
|
-
let lastMs =
|
|
195
|
-
pulseTimer = setInterval(() => {
|
|
222
|
+
let lastMs = clock.now();
|
|
223
|
+
pulseTimer = clock.setInterval(() => {
|
|
196
224
|
if (disposed) {
|
|
197
|
-
|
|
225
|
+
pulseTimer?.dispose();
|
|
198
226
|
pulseTimer = null;
|
|
199
227
|
return;
|
|
200
228
|
}
|
|
201
|
-
const nowMs =
|
|
229
|
+
const nowMs = clock.now();
|
|
202
230
|
const dt = Math.max(0, (nowMs - lastMs) / 1000);
|
|
203
231
|
lastMs = nowMs;
|
|
204
232
|
// Notify pulse listeners first (for batching local state updates)
|
|
@@ -211,7 +239,7 @@ export function createEventBus(busOptions) {
|
|
|
211
239
|
},
|
|
212
240
|
stopPulse() {
|
|
213
241
|
if (pulseTimer) {
|
|
214
|
-
|
|
242
|
+
pulseTimer.dispose();
|
|
215
243
|
pulseTimer = null;
|
|
216
244
|
}
|
|
217
245
|
},
|
|
@@ -233,12 +261,21 @@ export function createEventBus(busOptions) {
|
|
|
233
261
|
},
|
|
234
262
|
};
|
|
235
263
|
},
|
|
264
|
+
drain() {
|
|
265
|
+
if (disposed || pendingCommands === 0) {
|
|
266
|
+
return Promise.resolve();
|
|
267
|
+
}
|
|
268
|
+
return new Promise((resolve) => {
|
|
269
|
+
idleResolvers.add(resolve);
|
|
270
|
+
});
|
|
271
|
+
},
|
|
236
272
|
dispose() {
|
|
237
273
|
disposed = true;
|
|
238
274
|
if (pulseTimer) {
|
|
239
|
-
|
|
275
|
+
pulseTimer.dispose();
|
|
240
276
|
pulseTimer = null;
|
|
241
277
|
}
|
|
278
|
+
resolveIdleIfNeeded();
|
|
242
279
|
for (const d of disposables) {
|
|
243
280
|
d.dispose();
|
|
244
281
|
}
|
package/dist/eventbus.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventbus.js","sourceRoot":"","sources":["../src/eventbus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;
|
|
1
|
+
{"version":3,"file":"eventbus.js","sourceRoot":"","sources":["../src/eventbus.ts"],"names":[],"mappings":"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"}
|
package/dist/file-picker.d.ts
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* return [{ ...model, fpState: fpEnter(model.fpState, io) }, []];
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
22
|
-
import type
|
|
22
|
+
import { type IOPort, type Surface } from '@flyingrobots/bijou';
|
|
23
23
|
import { type KeyMap } from './keybindings.js';
|
|
24
24
|
/** A single entry (file or directory) in the file picker listing. */
|
|
25
25
|
export interface FileEntry {
|
|
@@ -63,6 +63,13 @@ export interface FilePickerRenderOptions {
|
|
|
63
63
|
/** Character(s) shown before file names (default: `"-"`). */
|
|
64
64
|
readonly fileIndicator?: string;
|
|
65
65
|
}
|
|
66
|
+
/** Options for rendering the file picker into a `Surface`. */
|
|
67
|
+
export interface FilePickerSurfaceOptions extends FilePickerRenderOptions {
|
|
68
|
+
/** Fixed viewport width. Defaults to the widest rendered row or cwd header. */
|
|
69
|
+
readonly width?: number;
|
|
70
|
+
/** Show a scrollbar track on the right edge. Default: false. */
|
|
71
|
+
readonly showScrollbar?: boolean;
|
|
72
|
+
}
|
|
66
73
|
/**
|
|
67
74
|
* Create initial file picker state for the given directory.
|
|
68
75
|
*
|
|
@@ -115,6 +122,17 @@ export declare function fpBack(state: FilePickerState, io: IOPort): FilePickerSt
|
|
|
115
122
|
* @returns Rendered file picker string with cwd header and entry list.
|
|
116
123
|
*/
|
|
117
124
|
export declare function filePicker(state: FilePickerState, options?: FilePickerRenderOptions): string;
|
|
125
|
+
/**
|
|
126
|
+
* Render the file picker into a viewport-backed `Surface`.
|
|
127
|
+
*
|
|
128
|
+
* The cwd header remains fixed while the entry list uses the shared
|
|
129
|
+
* `viewportSurface()` masking primitive for scrolling.
|
|
130
|
+
*
|
|
131
|
+
* @param state - Current file picker state.
|
|
132
|
+
* @param options - Rendering options plus optional fixed width.
|
|
133
|
+
* @returns Surface containing the cwd header and scrollable entry list.
|
|
134
|
+
*/
|
|
135
|
+
export declare function filePickerSurface(state: FilePickerState, options?: FilePickerSurfaceOptions): Surface;
|
|
118
136
|
/**
|
|
119
137
|
* Create a preconfigured KeyMap for file picker navigation.
|
|
120
138
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-picker.d.ts","sourceRoot":"","sources":["../src/file-picker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"file-picker.d.ts","sourceRoot":"","sources":["../src/file-picker.ts"],"names":[],"mappings":"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"}
|
package/dist/file-picker.js
CHANGED
|
@@ -19,7 +19,10 @@
|
|
|
19
19
|
* return [{ ...model, fpState: fpEnter(model.fpState, io) }, []];
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
22
|
+
import { createSurface, parseAnsiToSurface } from '@flyingrobots/bijou';
|
|
22
23
|
import { createKeyMap } from './keybindings.js';
|
|
24
|
+
import { vstackSurface } from './surface-layout.js';
|
|
25
|
+
import { viewportSurface, visibleLength } from './viewport.js';
|
|
23
26
|
// ---------------------------------------------------------------------------
|
|
24
27
|
// Helpers
|
|
25
28
|
// ---------------------------------------------------------------------------
|
|
@@ -185,6 +188,20 @@ function adjustScroll(focusIndex, scrollY, height, totalItems) {
|
|
|
185
188
|
const maxScroll = Math.max(0, totalItems - height);
|
|
186
189
|
return Math.min(newScrollY, maxScroll);
|
|
187
190
|
}
|
|
191
|
+
function renderFilePickerEntryLines(state, options) {
|
|
192
|
+
const indicator = options?.focusIndicator ?? '\u25b8';
|
|
193
|
+
const dirIcon = options?.dirIndicator ?? 'd';
|
|
194
|
+
const fileIcon = options?.fileIndicator ?? '-';
|
|
195
|
+
const pad = ' '.repeat(indicator.length);
|
|
196
|
+
if (state.entries.length === 0)
|
|
197
|
+
return [' (empty)'];
|
|
198
|
+
return state.entries.map((entry, index) => {
|
|
199
|
+
const prefix = index === state.focusIndex ? indicator : pad;
|
|
200
|
+
const icon = entry.isDirectory ? dirIcon : fileIcon;
|
|
201
|
+
const suffix = entry.isDirectory ? '/' : '';
|
|
202
|
+
return `${prefix} ${icon} ${entry.name}${suffix}`;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
188
205
|
// ---------------------------------------------------------------------------
|
|
189
206
|
// Render
|
|
190
207
|
// ---------------------------------------------------------------------------
|
|
@@ -199,26 +216,36 @@ function adjustScroll(focusIndex, scrollY, height, totalItems) {
|
|
|
199
216
|
* @returns Rendered file picker string with cwd header and entry list.
|
|
200
217
|
*/
|
|
201
218
|
export function filePicker(state, options) {
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
219
|
+
const entryLines = renderFilePickerEntryLines(state, options);
|
|
220
|
+
return [
|
|
221
|
+
state.cwd,
|
|
222
|
+
...entryLines.slice(state.scrollY, state.scrollY + state.height),
|
|
223
|
+
].join('\n');
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Render the file picker into a viewport-backed `Surface`.
|
|
227
|
+
*
|
|
228
|
+
* The cwd header remains fixed while the entry list uses the shared
|
|
229
|
+
* `viewportSurface()` masking primitive for scrolling.
|
|
230
|
+
*
|
|
231
|
+
* @param state - Current file picker state.
|
|
232
|
+
* @param options - Rendering options plus optional fixed width.
|
|
233
|
+
* @returns Surface containing the cwd header and scrollable entry list.
|
|
234
|
+
*/
|
|
235
|
+
export function filePickerSurface(state, options) {
|
|
236
|
+
const entryLines = renderFilePickerEntryLines(state, options);
|
|
237
|
+
const width = Math.max(1, options?.width ?? 0, visibleLength(state.cwd), ...entryLines.map((line) => visibleLength(line)));
|
|
238
|
+
const headerSurface = parseAnsiToSurface(state.cwd, width, 1);
|
|
239
|
+
const listSurface = entryLines.length === 0
|
|
240
|
+
? createSurface(width, Math.max(1, state.height))
|
|
241
|
+
: viewportSurface({
|
|
242
|
+
width,
|
|
243
|
+
height: Math.max(1, state.height),
|
|
244
|
+
content: entryLines.join('\n'),
|
|
245
|
+
scrollY: state.scrollY,
|
|
246
|
+
showScrollbar: options?.showScrollbar ?? false,
|
|
247
|
+
});
|
|
248
|
+
return vstackSurface(headerSurface, listSurface);
|
|
222
249
|
}
|
|
223
250
|
// ---------------------------------------------------------------------------
|
|
224
251
|
// Convenience keymap
|
package/dist/file-picker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-picker.js","sourceRoot":"","sources":["../src/file-picker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"file-picker.js","sourceRoot":"","sources":["../src/file-picker.ts"],"names":[],"mappings":"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"}
|