@flyingrobots/bijou-tui 0.5.1 → 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/README.md +49 -7
- package/dist/browsable-list.d.ts +87 -0
- package/dist/browsable-list.d.ts.map +1 -0
- package/dist/browsable-list.js +143 -0
- package/dist/browsable-list.js.map +1 -0
- package/dist/command-palette.d.ts +101 -0
- package/dist/command-palette.d.ts.map +1 -0
- package/dist/command-palette.js +212 -0
- package/dist/command-palette.js.map +1 -0
- package/dist/file-picker.d.ts +91 -0
- package/dist/file-picker.d.ts.map +1 -0
- package/dist/file-picker.js +210 -0
- package/dist/file-picker.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/layout.d.ts +14 -0
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +71 -0
- package/dist/layout.js.map +1 -1
- package/dist/navigable-table.d.ts +79 -0
- package/dist/navigable-table.d.ts.map +1 -0
- package/dist/navigable-table.js +145 -0
- package/dist/navigable-table.js.map +1 -0
- package/dist/overlay.d.ts +28 -0
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +89 -1
- package/dist/overlay.js.map +1 -1
- package/dist/status-bar.d.ts +17 -0
- package/dist/status-bar.d.ts.map +1 -0
- package/dist/status-bar.js +106 -0
- package/dist/status-bar.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File picker building block — a directory browser with focus navigation.
|
|
3
|
+
*
|
|
4
|
+
* Uses `IOPort.readDir()` to list directory contents and `IOPort.joinPath()`
|
|
5
|
+
* to navigate between directories. Follows the same state + pure transformers
|
|
6
|
+
* + sync render + convenience keymap pattern as pager and accordion.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* // In TEA init:
|
|
10
|
+
* const fpState = createFilePickerState({ cwd: '/project', io });
|
|
11
|
+
*
|
|
12
|
+
* // In TEA view:
|
|
13
|
+
* const output = filePicker(model.fpState);
|
|
14
|
+
*
|
|
15
|
+
* // In TEA update:
|
|
16
|
+
* case 'focus-next':
|
|
17
|
+
* return [{ ...model, fpState: fpFocusNext(model.fpState) }, []];
|
|
18
|
+
* case 'enter':
|
|
19
|
+
* return [{ ...model, fpState: fpEnter(model.fpState, io) }, []];
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import type { IOPort } from '@flyingrobots/bijou';
|
|
23
|
+
import { type KeyMap } from './keybindings.js';
|
|
24
|
+
export interface FileEntry {
|
|
25
|
+
name: string;
|
|
26
|
+
isDirectory: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface FilePickerState {
|
|
29
|
+
readonly cwd: string;
|
|
30
|
+
readonly entries: readonly FileEntry[];
|
|
31
|
+
readonly focusIndex: number;
|
|
32
|
+
readonly scrollY: number;
|
|
33
|
+
readonly height: number;
|
|
34
|
+
readonly filter?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface FilePickerOptions {
|
|
37
|
+
readonly cwd: string;
|
|
38
|
+
readonly io: IOPort;
|
|
39
|
+
readonly height?: number;
|
|
40
|
+
readonly filter?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface FilePickerRenderOptions {
|
|
43
|
+
readonly focusIndicator?: string;
|
|
44
|
+
readonly dirIndicator?: string;
|
|
45
|
+
readonly fileIndicator?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create initial file picker state for the given directory.
|
|
49
|
+
*
|
|
50
|
+
* Reads directory contents via `io.readDir()` and parses entries into
|
|
51
|
+
* directories (trailing `/`) and files. Directories are sorted first,
|
|
52
|
+
* then files, both alphabetically.
|
|
53
|
+
*/
|
|
54
|
+
export declare function createFilePickerState(options: FilePickerOptions): FilePickerState;
|
|
55
|
+
/** Move focus to the next entry (wraps around). */
|
|
56
|
+
export declare function fpFocusNext(state: FilePickerState): FilePickerState;
|
|
57
|
+
/** Move focus to the previous entry (wraps around). */
|
|
58
|
+
export declare function fpFocusPrev(state: FilePickerState): FilePickerState;
|
|
59
|
+
/** Enter the focused directory, refreshing the entry list. No-op on files. */
|
|
60
|
+
export declare function fpEnter(state: FilePickerState, io: IOPort): FilePickerState;
|
|
61
|
+
/** Navigate to the parent directory. No-op at filesystem root. */
|
|
62
|
+
export declare function fpBack(state: FilePickerState, io: IOPort): FilePickerState;
|
|
63
|
+
/**
|
|
64
|
+
* Render the file picker — cwd header followed by the visible entry list.
|
|
65
|
+
*
|
|
66
|
+
* Each entry is prefixed with a focus indicator and a type indicator
|
|
67
|
+
* (directory or file). Directories are suffixed with `/`.
|
|
68
|
+
*/
|
|
69
|
+
export declare function filePicker(state: FilePickerState, options?: FilePickerRenderOptions): string;
|
|
70
|
+
/**
|
|
71
|
+
* Create a preconfigured KeyMap for file picker navigation.
|
|
72
|
+
*
|
|
73
|
+
* The caller provides their own message types for each action:
|
|
74
|
+
* ```ts
|
|
75
|
+
* const keys = filePickerKeyMap({
|
|
76
|
+
* focusNext: { type: 'next' },
|
|
77
|
+
* focusPrev: { type: 'prev' },
|
|
78
|
+
* enter: { type: 'enter' },
|
|
79
|
+
* back: { type: 'back' },
|
|
80
|
+
* quit: { type: 'quit' },
|
|
81
|
+
* });
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export declare function filePickerKeyMap<Msg>(actions: {
|
|
85
|
+
focusNext: Msg;
|
|
86
|
+
focusPrev: Msg;
|
|
87
|
+
enter: Msg;
|
|
88
|
+
back: Msg;
|
|
89
|
+
quit: Msg;
|
|
90
|
+
}): KeyMap<Msg>;
|
|
91
|
+
//# sourceMappingURL=file-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-picker.d.ts","sourceRoot":"","sources":["../src/file-picker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM7D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAkDD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,eAAe,CAYjF;AAMD,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,eAAe,CAInE;AAED,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,eAAe,CAInE;AAED,8EAA8E;AAC9E,wBAAgB,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,CAe3E;AAED,kEAAkE;AAClE,wBAAgB,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,CAa1E;AAqBD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,MAAM,CA0B5F;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE;IAC7C,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,EAAE,GAAG,CAAC;IACf,KAAK,EAAE,GAAG,CAAC;IACX,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,GAAG,CAAC;CACX,GAAG,MAAM,CAAC,GAAG,CAAC,CAed"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File picker building block — a directory browser with focus navigation.
|
|
3
|
+
*
|
|
4
|
+
* Uses `IOPort.readDir()` to list directory contents and `IOPort.joinPath()`
|
|
5
|
+
* to navigate between directories. Follows the same state + pure transformers
|
|
6
|
+
* + sync render + convenience keymap pattern as pager and accordion.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* // In TEA init:
|
|
10
|
+
* const fpState = createFilePickerState({ cwd: '/project', io });
|
|
11
|
+
*
|
|
12
|
+
* // In TEA view:
|
|
13
|
+
* const output = filePicker(model.fpState);
|
|
14
|
+
*
|
|
15
|
+
* // In TEA update:
|
|
16
|
+
* case 'focus-next':
|
|
17
|
+
* return [{ ...model, fpState: fpFocusNext(model.fpState) }, []];
|
|
18
|
+
* case 'enter':
|
|
19
|
+
* return [{ ...model, fpState: fpEnter(model.fpState, io) }, []];
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import { createKeyMap } from './keybindings.js';
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Helpers
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
/**
|
|
27
|
+
* Safely read and parse directory entries. Returns `[]` if the directory
|
|
28
|
+
* is unreadable (permissions, missing, etc.) instead of throwing.
|
|
29
|
+
*/
|
|
30
|
+
function safeReadEntries(io, cwd, filter) {
|
|
31
|
+
try {
|
|
32
|
+
return parseEntries(io.readDir(cwd), filter);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Parse raw directory listing into sorted `FileEntry[]`.
|
|
40
|
+
*
|
|
41
|
+
* @param names - Names returned by `IOPort.readDir()` (dirs have trailing `/`).
|
|
42
|
+
* @param filter - Optional extension suffix (e.g. `".ts"`) — only files whose
|
|
43
|
+
* name ends with this suffix are included. Directories are
|
|
44
|
+
* always included regardless of the filter.
|
|
45
|
+
*/
|
|
46
|
+
function parseEntries(names, filter) {
|
|
47
|
+
const dirs = [];
|
|
48
|
+
const files = [];
|
|
49
|
+
for (const name of names) {
|
|
50
|
+
if (name.endsWith('/')) {
|
|
51
|
+
dirs.push({ name: name.slice(0, -1), isDirectory: true });
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
if (filter && !name.endsWith(filter))
|
|
55
|
+
continue;
|
|
56
|
+
files.push({ name, isDirectory: false });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Sort dirs first, then files, both alphabetically
|
|
60
|
+
dirs.sort((a, b) => a.name.localeCompare(b.name));
|
|
61
|
+
files.sort((a, b) => a.name.localeCompare(b.name));
|
|
62
|
+
return [...dirs, ...files];
|
|
63
|
+
}
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
// State creation
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
/**
|
|
68
|
+
* Create initial file picker state for the given directory.
|
|
69
|
+
*
|
|
70
|
+
* Reads directory contents via `io.readDir()` and parses entries into
|
|
71
|
+
* directories (trailing `/`) and files. Directories are sorted first,
|
|
72
|
+
* then files, both alphabetically.
|
|
73
|
+
*/
|
|
74
|
+
export function createFilePickerState(options) {
|
|
75
|
+
const height = Math.max(1, options.height ?? 10);
|
|
76
|
+
const entries = safeReadEntries(options.io, options.cwd, options.filter);
|
|
77
|
+
return {
|
|
78
|
+
cwd: options.cwd,
|
|
79
|
+
entries,
|
|
80
|
+
focusIndex: 0,
|
|
81
|
+
scrollY: 0,
|
|
82
|
+
height,
|
|
83
|
+
filter: options.filter,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// State transformers
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
/** Move focus to the next entry (wraps around). */
|
|
90
|
+
export function fpFocusNext(state) {
|
|
91
|
+
if (state.entries.length === 0)
|
|
92
|
+
return state;
|
|
93
|
+
const focusIndex = (state.focusIndex + 1) % state.entries.length;
|
|
94
|
+
return { ...state, focusIndex, scrollY: adjustScroll(focusIndex, state.scrollY, state.height, state.entries.length) };
|
|
95
|
+
}
|
|
96
|
+
/** Move focus to the previous entry (wraps around). */
|
|
97
|
+
export function fpFocusPrev(state) {
|
|
98
|
+
if (state.entries.length === 0)
|
|
99
|
+
return state;
|
|
100
|
+
const focusIndex = (state.focusIndex - 1 + state.entries.length) % state.entries.length;
|
|
101
|
+
return { ...state, focusIndex, scrollY: adjustScroll(focusIndex, state.scrollY, state.height, state.entries.length) };
|
|
102
|
+
}
|
|
103
|
+
/** Enter the focused directory, refreshing the entry list. No-op on files. */
|
|
104
|
+
export function fpEnter(state, io) {
|
|
105
|
+
if (state.entries.length === 0)
|
|
106
|
+
return state;
|
|
107
|
+
const entry = state.entries[state.focusIndex];
|
|
108
|
+
if (!entry || !entry.isDirectory)
|
|
109
|
+
return state;
|
|
110
|
+
const newCwd = io.joinPath(state.cwd, entry.name);
|
|
111
|
+
const entries = safeReadEntries(io, newCwd, state.filter);
|
|
112
|
+
return {
|
|
113
|
+
...state,
|
|
114
|
+
cwd: newCwd,
|
|
115
|
+
entries,
|
|
116
|
+
focusIndex: 0,
|
|
117
|
+
scrollY: 0,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/** Navigate to the parent directory. No-op at filesystem root. */
|
|
121
|
+
export function fpBack(state, io) {
|
|
122
|
+
const newCwd = io.joinPath(state.cwd, '..');
|
|
123
|
+
if (newCwd === state.cwd)
|
|
124
|
+
return state;
|
|
125
|
+
const entries = safeReadEntries(io, newCwd, state.filter);
|
|
126
|
+
return {
|
|
127
|
+
...state,
|
|
128
|
+
cwd: newCwd,
|
|
129
|
+
entries,
|
|
130
|
+
focusIndex: 0,
|
|
131
|
+
scrollY: 0,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// Scroll helper
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
function adjustScroll(focusIndex, scrollY, height, totalItems) {
|
|
138
|
+
let newScrollY = scrollY;
|
|
139
|
+
if (focusIndex < newScrollY) {
|
|
140
|
+
newScrollY = focusIndex;
|
|
141
|
+
}
|
|
142
|
+
else if (focusIndex >= newScrollY + height) {
|
|
143
|
+
newScrollY = focusIndex - height + 1;
|
|
144
|
+
}
|
|
145
|
+
const maxScroll = Math.max(0, totalItems - height);
|
|
146
|
+
return Math.min(newScrollY, maxScroll);
|
|
147
|
+
}
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// Render
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
/**
|
|
152
|
+
* Render the file picker — cwd header followed by the visible entry list.
|
|
153
|
+
*
|
|
154
|
+
* Each entry is prefixed with a focus indicator and a type indicator
|
|
155
|
+
* (directory or file). Directories are suffixed with `/`.
|
|
156
|
+
*/
|
|
157
|
+
export function filePicker(state, options) {
|
|
158
|
+
const indicator = options?.focusIndicator ?? '\u25b8';
|
|
159
|
+
const dirIcon = options?.dirIndicator ?? 'd';
|
|
160
|
+
const fileIcon = options?.fileIndicator ?? '-';
|
|
161
|
+
const pad = ' '.repeat(indicator.length);
|
|
162
|
+
const lines = [];
|
|
163
|
+
lines.push(state.cwd);
|
|
164
|
+
if (state.entries.length === 0) {
|
|
165
|
+
lines.push(' (empty)');
|
|
166
|
+
return lines.join('\n');
|
|
167
|
+
}
|
|
168
|
+
const visibleEntries = state.entries.slice(state.scrollY, state.scrollY + state.height);
|
|
169
|
+
for (let i = 0; i < visibleEntries.length; i++) {
|
|
170
|
+
const entry = visibleEntries[i];
|
|
171
|
+
const globalIndex = state.scrollY + i;
|
|
172
|
+
const prefix = globalIndex === state.focusIndex ? indicator : pad;
|
|
173
|
+
const icon = entry.isDirectory ? dirIcon : fileIcon;
|
|
174
|
+
const suffix = entry.isDirectory ? '/' : '';
|
|
175
|
+
lines.push(`${prefix} ${icon} ${entry.name}${suffix}`);
|
|
176
|
+
}
|
|
177
|
+
return lines.join('\n');
|
|
178
|
+
}
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
// Convenience keymap
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
/**
|
|
183
|
+
* Create a preconfigured KeyMap for file picker navigation.
|
|
184
|
+
*
|
|
185
|
+
* The caller provides their own message types for each action:
|
|
186
|
+
* ```ts
|
|
187
|
+
* const keys = filePickerKeyMap({
|
|
188
|
+
* focusNext: { type: 'next' },
|
|
189
|
+
* focusPrev: { type: 'prev' },
|
|
190
|
+
* enter: { type: 'enter' },
|
|
191
|
+
* back: { type: 'back' },
|
|
192
|
+
* quit: { type: 'quit' },
|
|
193
|
+
* });
|
|
194
|
+
* ```
|
|
195
|
+
*/
|
|
196
|
+
export function filePickerKeyMap(actions) {
|
|
197
|
+
return createKeyMap()
|
|
198
|
+
.group('Navigation', (g) => g
|
|
199
|
+
.bind('j', 'Next entry', actions.focusNext)
|
|
200
|
+
.bind('down', 'Next entry', actions.focusNext)
|
|
201
|
+
.bind('k', 'Previous entry', actions.focusPrev)
|
|
202
|
+
.bind('up', 'Previous entry', actions.focusPrev))
|
|
203
|
+
.group('Actions', (g) => g
|
|
204
|
+
.bind('enter', 'Enter directory / select file', actions.enter)
|
|
205
|
+
.bind('backspace', 'Parent directory', actions.back)
|
|
206
|
+
.bind('left', 'Parent directory', actions.back))
|
|
207
|
+
.bind('q', 'Quit', actions.quit)
|
|
208
|
+
.bind('ctrl+c', 'Quit', actions.quit);
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=file-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-picker.js","sourceRoot":"","sources":["../src/file-picker.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,10 @@ export { enterScreen, exitScreen, clearAndHome, renderFrame, ENTER_ALT_SCREEN, E
|
|
|
5
5
|
export { quit, tick, batch } from './commands.js';
|
|
6
6
|
export { run } from './runtime.js';
|
|
7
7
|
export { type BusMsg, type EventBus, createEventBus, } from './eventbus.js';
|
|
8
|
-
export { vstack, hstack } from './layout.js';
|
|
8
|
+
export { vstack, hstack, place } from './layout.js';
|
|
9
|
+
export type { HAlign, VAlign, PlaceOptions } from './layout.js';
|
|
10
|
+
export { statusBar } from './status-bar.js';
|
|
11
|
+
export type { StatusBarOptions } from './status-bar.js';
|
|
9
12
|
export { type SpringConfig, type SpringPreset, type SpringState, SPRING_PRESETS, springStep, createSpringState, resolveSpringConfig, type EasingFn, EASINGS, type TweenConfig, type TweenState, tweenStep, createTweenState, resolveTweenConfig, } from './spring.js';
|
|
10
13
|
export { type SpringAnimateOptions, type TweenAnimateOptions, type AnimateOptions, animate, sequence, } from './animate.js';
|
|
11
14
|
export { type ViewportOptions, type ScrollState, viewport, createScrollState, scrollBy, scrollTo, scrollToTop, scrollToBottom, pageDown, pageUp, stripAnsi, visibleLength, clipToWidth, sliceAnsi, scrollByX, scrollToX, } from './viewport.js';
|
|
@@ -16,6 +19,10 @@ export { type BindingSource, type HelpOptions, helpView, helpShort, helpFor, } f
|
|
|
16
19
|
export { type InputHandler, type LayerOptions, type LayerInfo, type InputStack, createInputStack, } from './inputstack.js';
|
|
17
20
|
export { type PagerState, type PagerOptions, type PagerRenderOptions, createPagerState, pager, pagerScrollBy, pagerScrollTo, pagerScrollToTop, pagerScrollToBottom, pagerPageDown, pagerPageUp, pagerSetContent, pagerKeyMap, } from './pager.js';
|
|
18
21
|
export { type PanelDef, type PanelGroupOptions, type PanelGroup, createPanelGroup, } from './panels.js';
|
|
19
|
-
export { type Overlay, type CompositeOptions, type ModalOptions, type ToastVariant, type ToastAnchor, type ToastOptions, composite, modal, toast, } from './overlay.js';
|
|
22
|
+
export { type Overlay, type CompositeOptions, type ModalOptions, type ToastVariant, type ToastAnchor, type ToastOptions, type DrawerAnchor, type DrawerOptions, type TooltipDirection, type TooltipOptions, composite, modal, toast, drawer, tooltip, } from './overlay.js';
|
|
20
23
|
export { type AccordionState, type InteractiveAccordionOptions, createAccordionState, interactiveAccordion, focusNext, focusPrev, toggleFocused, expandAll, collapseAll, accordionKeyMap, } from './accordion.js';
|
|
24
|
+
export { type NavigableTableState, type NavigableTableOptions, type NavTableRenderOptions, createNavigableTableState, navigableTable, navTableFocusNext, navTableFocusPrev, navTablePageDown, navTablePageUp, navTableKeyMap, } from './navigable-table.js';
|
|
25
|
+
export { type BrowsableListItem, type BrowsableListState, type BrowsableListOptions, type BrowsableListRenderOptions, createBrowsableListState, browsableList, listFocusNext, listFocusPrev, listPageDown, listPageUp, browsableListKeyMap, } from './browsable-list.js';
|
|
26
|
+
export { type FileEntry, type FilePickerState, type FilePickerOptions, type FilePickerRenderOptions, createFilePickerState, filePicker, fpFocusNext, fpFocusPrev, fpEnter, fpBack, filePickerKeyMap, } from './file-picker.js';
|
|
27
|
+
export { type CommandPaletteItem, type CommandPaletteState, type CommandPaletteOptions, createCommandPaletteState, cpFilter, cpFocusNext, cpFocusPrev, cpPageDown, cpPageUp, cpSelectedItem, commandPalette, commandPaletteKeyMap, } from './command-palette.js';
|
|
21
28
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGlC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,EACL,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,IAAI,GACL,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGnC,OAAO,EACL,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,cAAc,GACf,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGlC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,EACL,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,IAAI,GACL,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGnC,OAAO,EACL,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,cAAc,GACf,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,QAAQ,EACb,OAAO,EACP,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,SAAS,EACT,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,OAAO,EACP,QAAQ,GACT,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,cAAc,EACd,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACT,SAAS,GACV,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,QAAQ,GACT,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,IAAI,GACL,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,QAAQ,EACR,SAAS,EACT,OAAO,GACR,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,gBAAgB,EAChB,KAAK,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,eAAe,EACf,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,SAAS,EACT,KAAK,EACL,KAAK,EACL,MAAM,EACN,OAAO,GACR,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,2BAA2B,EAChC,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,EACT,SAAS,EACT,aAAa,EACb,SAAS,EACT,WAAW,EACX,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,yBAAyB,EACzB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,wBAAwB,EACxB,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,UAAU,EACV,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,qBAAqB,EACrB,UAAU,EACV,WAAW,EACX,WAAW,EACX,OAAO,EACP,MAAM,EACN,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,yBAAyB,EACzB,QAAQ,EACR,WAAW,EACX,WAAW,EACX,UAAU,EACV,QAAQ,EACR,cAAc,EACd,cAAc,EACd,oBAAoB,GACrB,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,9 @@ export { run } from './runtime.js';
|
|
|
10
10
|
// Event bus
|
|
11
11
|
export { createEventBus, } from './eventbus.js';
|
|
12
12
|
// Layout
|
|
13
|
-
export { vstack, hstack } from './layout.js';
|
|
13
|
+
export { vstack, hstack, place } from './layout.js';
|
|
14
|
+
// Status bar
|
|
15
|
+
export { statusBar } from './status-bar.js';
|
|
14
16
|
// Animation — spring physics & tweens
|
|
15
17
|
export { SPRING_PRESETS, springStep, createSpringState, resolveSpringConfig, EASINGS, tweenStep, createTweenState, resolveTweenConfig, } from './spring.js';
|
|
16
18
|
export { animate, sequence, } from './animate.js';
|
|
@@ -31,7 +33,15 @@ export { createPagerState, pager, pagerScrollBy, pagerScrollTo, pagerScrollToTop
|
|
|
31
33
|
// Panel group — multi-pane focus management
|
|
32
34
|
export { createPanelGroup, } from './panels.js';
|
|
33
35
|
// Overlay compositing
|
|
34
|
-
export { composite, modal, toast, } from './overlay.js';
|
|
36
|
+
export { composite, modal, toast, drawer, tooltip, } from './overlay.js';
|
|
35
37
|
// Interactive accordion
|
|
36
38
|
export { createAccordionState, interactiveAccordion, focusNext, focusPrev, toggleFocused, expandAll, collapseAll, accordionKeyMap, } from './accordion.js';
|
|
39
|
+
// Navigable table
|
|
40
|
+
export { createNavigableTableState, navigableTable, navTableFocusNext, navTableFocusPrev, navTablePageDown, navTablePageUp, navTableKeyMap, } from './navigable-table.js';
|
|
41
|
+
// Browsable list
|
|
42
|
+
export { createBrowsableListState, browsableList, listFocusNext, listFocusPrev, listPageDown, listPageUp, browsableListKeyMap, } from './browsable-list.js';
|
|
43
|
+
// File picker
|
|
44
|
+
export { createFilePickerState, filePicker, fpFocusNext, fpFocusPrev, fpEnter, fpBack, filePickerKeyMap, } from './file-picker.js';
|
|
45
|
+
// Command palette
|
|
46
|
+
export { createCommandPaletteState, cpFilter, cpFocusNext, cpFocusPrev, cpPageDown, cpPageUp, cpSelectedItem, commandPalette, commandPaletteKeyMap, } from './command-palette.js';
|
|
37
47
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,cAAc;AACd,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,iBAAiB;AACjB,OAAO,EACL,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,IAAI,GACL,MAAM,aAAa,CAAC;AAErB,WAAW;AACX,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAElD,UAAU;AACV,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,YAAY;AACZ,OAAO,EAGL,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/layout.d.ts
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
export type HAlign = 'left' | 'center' | 'right';
|
|
2
|
+
export type VAlign = 'top' | 'middle' | 'bottom';
|
|
3
|
+
export interface PlaceOptions {
|
|
4
|
+
readonly width: number;
|
|
5
|
+
readonly height: number;
|
|
6
|
+
readonly hAlign?: HAlign;
|
|
7
|
+
readonly vAlign?: VAlign;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Place content within a fixed-size rectangle, aligned horizontally and
|
|
11
|
+
* vertically. Lines are padded/clipped to exactly `width` visible characters
|
|
12
|
+
* and the output is exactly `height` lines tall.
|
|
13
|
+
*/
|
|
14
|
+
export declare function place(content: string, options: PlaceOptions): string;
|
|
1
15
|
/**
|
|
2
16
|
* Vertical stack — join blocks with newlines.
|
|
3
17
|
*/
|
package/dist/layout.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AACjD,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAqEpE;AAMD;;GAEG;AACH,wBAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAwB/D"}
|
package/dist/layout.js
CHANGED
|
@@ -1,3 +1,74 @@
|
|
|
1
|
+
import { visibleLength, clipToWidth } from './viewport.js';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// place()
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* Place content within a fixed-size rectangle, aligned horizontally and
|
|
7
|
+
* vertically. Lines are padded/clipped to exactly `width` visible characters
|
|
8
|
+
* and the output is exactly `height` lines tall.
|
|
9
|
+
*/
|
|
10
|
+
export function place(content, options) {
|
|
11
|
+
const { width, height, hAlign = 'left', vAlign = 'top' } = options;
|
|
12
|
+
if (height <= 0 || width <= 0)
|
|
13
|
+
return '';
|
|
14
|
+
const emptyLine = ' '.repeat(width);
|
|
15
|
+
// Split content into lines, handle empty content
|
|
16
|
+
let lines = content === '' ? [] : content.split('\n');
|
|
17
|
+
// Truncate to height if too tall
|
|
18
|
+
if (lines.length > height) {
|
|
19
|
+
lines = lines.slice(0, height);
|
|
20
|
+
}
|
|
21
|
+
// Horizontal alignment: pad/clip each line to exactly `width`
|
|
22
|
+
const aligned = lines.map((line) => {
|
|
23
|
+
const vis = visibleLength(line);
|
|
24
|
+
if (vis > width) {
|
|
25
|
+
// Clip to width
|
|
26
|
+
return clipToWidth(line, width);
|
|
27
|
+
}
|
|
28
|
+
const pad = width - vis;
|
|
29
|
+
switch (hAlign) {
|
|
30
|
+
case 'right':
|
|
31
|
+
return ' '.repeat(pad) + line;
|
|
32
|
+
case 'center': {
|
|
33
|
+
const leftPad = Math.floor(pad / 2);
|
|
34
|
+
const rightPad = pad - leftPad;
|
|
35
|
+
return ' '.repeat(leftPad) + line + ' '.repeat(rightPad);
|
|
36
|
+
}
|
|
37
|
+
case 'left':
|
|
38
|
+
default:
|
|
39
|
+
return line + ' '.repeat(pad);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
// Vertical alignment: pad with empty lines to reach height
|
|
43
|
+
const vPad = height - aligned.length;
|
|
44
|
+
if (vPad <= 0) {
|
|
45
|
+
return aligned.join('\n');
|
|
46
|
+
}
|
|
47
|
+
let topPad;
|
|
48
|
+
switch (vAlign) {
|
|
49
|
+
case 'bottom':
|
|
50
|
+
topPad = vPad;
|
|
51
|
+
break;
|
|
52
|
+
case 'middle':
|
|
53
|
+
topPad = Math.floor(vPad / 2);
|
|
54
|
+
break;
|
|
55
|
+
case 'top':
|
|
56
|
+
default:
|
|
57
|
+
topPad = 0;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
const bottomPad = vPad - topPad;
|
|
61
|
+
const result = [];
|
|
62
|
+
for (let i = 0; i < topPad; i++)
|
|
63
|
+
result.push(emptyLine);
|
|
64
|
+
result.push(...aligned);
|
|
65
|
+
for (let i = 0; i < bottomPad; i++)
|
|
66
|
+
result.push(emptyLine);
|
|
67
|
+
return result.join('\n');
|
|
68
|
+
}
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
// vstack / hstack
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
1
72
|
/**
|
|
2
73
|
* Vertical stack — join blocks with newlines.
|
|
3
74
|
*/
|
package/dist/layout.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,GAAG,MAAgB;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,GAAG,MAAgB;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAE,CAAC;IAE3C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAE5C,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChC,yCAAyC;YACzC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,oDAAoD;AACpD,SAAS,WAAW,CAAC,CAAS;IAC5B,8BAA8B;IAC9B,4CAA4C;IAC5C,OAAO,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AACjD,CAAC"}
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Navigable table building block.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the static `table()` from bijou core with focus management,
|
|
5
|
+
* keyboard navigation, and vertical scrolling.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* // In TEA init:
|
|
9
|
+
* const tableState = createNavigableTableState({ columns, rows, height: 10 });
|
|
10
|
+
*
|
|
11
|
+
* // In TEA view:
|
|
12
|
+
* const output = navigableTable(model.tableState, { ctx });
|
|
13
|
+
*
|
|
14
|
+
* // In TEA update:
|
|
15
|
+
* case 'focus-next':
|
|
16
|
+
* return [{ ...model, tableState: navTableFocusNext(model.tableState) }, []];
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import { type TableColumn, type BijouContext } from '@flyingrobots/bijou';
|
|
20
|
+
import { type KeyMap } from './keybindings.js';
|
|
21
|
+
export interface NavigableTableState {
|
|
22
|
+
readonly columns: TableColumn[];
|
|
23
|
+
readonly rows: readonly (readonly string[])[];
|
|
24
|
+
readonly focusRow: number;
|
|
25
|
+
readonly scrollY: number;
|
|
26
|
+
readonly height: number;
|
|
27
|
+
}
|
|
28
|
+
export interface NavigableTableOptions {
|
|
29
|
+
readonly columns: TableColumn[];
|
|
30
|
+
readonly rows: readonly (readonly string[])[];
|
|
31
|
+
readonly height?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface NavTableRenderOptions {
|
|
34
|
+
readonly focusIndicator?: string;
|
|
35
|
+
readonly ctx?: BijouContext;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create initial navigable table state.
|
|
39
|
+
*
|
|
40
|
+
* `height` defaults to 10 rows when not provided.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createNavigableTableState(options: NavigableTableOptions): NavigableTableState;
|
|
43
|
+
/** Move focus to the next row (wraps around). */
|
|
44
|
+
export declare function navTableFocusNext(state: NavigableTableState): NavigableTableState;
|
|
45
|
+
/** Move focus to the previous row (wraps around). */
|
|
46
|
+
export declare function navTableFocusPrev(state: NavigableTableState): NavigableTableState;
|
|
47
|
+
/** Move focus down by one page (clamps to last row). */
|
|
48
|
+
export declare function navTablePageDown(state: NavigableTableState): NavigableTableState;
|
|
49
|
+
/** Move focus up by one page (clamps to first row). */
|
|
50
|
+
export declare function navTablePageUp(state: NavigableTableState): NavigableTableState;
|
|
51
|
+
/**
|
|
52
|
+
* Render the navigable table with a focus indicator on the focused row.
|
|
53
|
+
*
|
|
54
|
+
* Slices visible rows based on `scrollY` and `height`, prepends a focus
|
|
55
|
+
* indicator to the first column, then delegates to core `table()`.
|
|
56
|
+
*/
|
|
57
|
+
export declare function navigableTable(state: NavigableTableState, options?: NavTableRenderOptions): string;
|
|
58
|
+
/**
|
|
59
|
+
* Create a preconfigured KeyMap for navigable table navigation.
|
|
60
|
+
*
|
|
61
|
+
* The caller provides their own message types for each action:
|
|
62
|
+
* ```ts
|
|
63
|
+
* const keys = navTableKeyMap({
|
|
64
|
+
* focusNext: { type: 'next-row' },
|
|
65
|
+
* focusPrev: { type: 'prev-row' },
|
|
66
|
+
* pageDown: { type: 'page-down' },
|
|
67
|
+
* pageUp: { type: 'page-up' },
|
|
68
|
+
* quit: { type: 'quit' },
|
|
69
|
+
* });
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export declare function navTableKeyMap<Msg>(actions: {
|
|
73
|
+
focusNext: Msg;
|
|
74
|
+
focusPrev: Msg;
|
|
75
|
+
pageDown: Msg;
|
|
76
|
+
pageUp: Msg;
|
|
77
|
+
quit: Msg;
|
|
78
|
+
}): KeyMap<Msg>;
|
|
79
|
+
//# sourceMappingURL=navigable-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigable-table.d.ts","sourceRoot":"","sources":["../src/navigable-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC;CAC7B;AAMD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,qBAAqB,GAAG,mBAAmB,CAS7F;AAMD,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAIjF;AAED,qDAAqD;AACrD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAIjF;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAIhF;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAI9E;AAqBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAwBlG;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE;IAC3C,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,EAAE,GAAG,CAAC;IACf,QAAQ,EAAE,GAAG,CAAC;IACd,MAAM,EAAE,GAAG,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC;CACX,GAAG,MAAM,CAAC,GAAG,CAAC,CAcd"}
|