@flyingrobots/bijou-tui-app 1.3.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 +62 -0
- package/dist/index.d.ts +103 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +380 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
package/README.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# `@flyingrobots/bijou-tui-app`
|
|
2
|
+
|
|
3
|
+
Batteries-included TUI app skeleton built on `createFramedApp()`.
|
|
4
|
+
|
|
5
|
+
It ships a ready-to-run shell with sane defaults:
|
|
6
|
+
- full-screen framed app shell
|
|
7
|
+
- top tab bar (`|` separators, active/inactive tab backgrounds)
|
|
8
|
+
- animated physics drawer on the first tab (`o` toggles)
|
|
9
|
+
- page switching via `[` and `]`
|
|
10
|
+
- quit confirmation modal on `q` and `ctrl+c`
|
|
11
|
+
- two-line footer: status line above controls line
|
|
12
|
+
- full-width `\` separator row above the footer
|
|
13
|
+
- default two tabs:
|
|
14
|
+
- tab 1: empty pane + drawer
|
|
15
|
+
- tab 2: horizontal split (1/3 + 2/3)
|
|
16
|
+
|
|
17
|
+
## Quick Scaffold
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
npm create bijou-tui-app@latest my-app
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Install
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
npm install @flyingrobots/bijou @flyingrobots/bijou-node @flyingrobots/bijou-tui @flyingrobots/bijou-tui-app
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { initDefaultContext } from '@flyingrobots/bijou-node';
|
|
33
|
+
import { run } from '@flyingrobots/bijou-tui';
|
|
34
|
+
import { createTuiAppSkeleton } from '@flyingrobots/bijou-tui-app';
|
|
35
|
+
|
|
36
|
+
const ctx = initDefaultContext();
|
|
37
|
+
|
|
38
|
+
await run(
|
|
39
|
+
createTuiAppSkeleton({
|
|
40
|
+
ctx,
|
|
41
|
+
title: 'FlyingRobots Console',
|
|
42
|
+
statusMessage: ({ activeTabTitle }) => `${activeTabTitle} ready`,
|
|
43
|
+
}),
|
|
44
|
+
);
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## API
|
|
48
|
+
|
|
49
|
+
- `createTuiAppSkeleton(options)`
|
|
50
|
+
- `ctx` (required): `BijouContext`
|
|
51
|
+
- `tabs` (optional): custom `{ id, title }[]`; defaults to `Home` + `Split`
|
|
52
|
+
- `defaultTabId`: initial active tab
|
|
53
|
+
- `title`: header title
|
|
54
|
+
- `keyLegend`: footer controls-line legend
|
|
55
|
+
- `statusMessage`: footer status-line content (string or function by active tab)
|
|
56
|
+
- `themeTokens`: override header/tab/footer/separator/drawer/modal tokens
|
|
57
|
+
- `globalKeys`: additional key bindings merged with defaults
|
|
58
|
+
|
|
59
|
+
### Built-in defaults
|
|
60
|
+
|
|
61
|
+
- Frame keys: `[` / `]` tab switch, `tab` pane next, `shift+tab` pane prev, `ctrl+p` command palette, `?` help
|
|
62
|
+
- Skeleton keys: `o` drawer toggle, `q`/`ctrl+c` quit confirm, `y`/`enter` confirm quit, `n`/`escape` cancel quit
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { BijouContext, TokenValue } from '@flyingrobots/bijou';
|
|
2
|
+
import { type App, type FrameModel, type KeyMap } from '@flyingrobots/bijou-tui';
|
|
3
|
+
/** Single top-level tab in the app skeleton. */
|
|
4
|
+
export interface SkeletonTab {
|
|
5
|
+
/** Stable tab id. */
|
|
6
|
+
readonly id: string;
|
|
7
|
+
/** Visible tab label. */
|
|
8
|
+
readonly title: string;
|
|
9
|
+
}
|
|
10
|
+
/** Resolved active-tab metadata for dynamic status rendering. */
|
|
11
|
+
export interface SkeletonStatusContext {
|
|
12
|
+
/** Active tab id. */
|
|
13
|
+
readonly activeTabId: string;
|
|
14
|
+
/** Active tab title. */
|
|
15
|
+
readonly activeTabTitle: string;
|
|
16
|
+
}
|
|
17
|
+
/** Optional token overrides for shell chrome regions. */
|
|
18
|
+
export interface SkeletonThemeTokens {
|
|
19
|
+
/** Header background token for non-tab space. Defaults to `surface.primary`. */
|
|
20
|
+
readonly headerBgToken?: TokenValue;
|
|
21
|
+
/** Active tab token. Defaults to `surface.elevated`. */
|
|
22
|
+
readonly activeTabToken?: TokenValue;
|
|
23
|
+
/** Inactive tab token. Defaults to `surface.secondary`. */
|
|
24
|
+
readonly inactiveTabToken?: TokenValue;
|
|
25
|
+
/** Footer status-line token. Defaults to `surface.secondary`. */
|
|
26
|
+
readonly footerStatusToken?: TokenValue;
|
|
27
|
+
/** Footer controls-line token. Defaults to `surface.primary`. */
|
|
28
|
+
readonly footerControlsToken?: TokenValue;
|
|
29
|
+
/** Separator row token. Defaults to `border.muted`. */
|
|
30
|
+
readonly separatorToken?: TokenValue;
|
|
31
|
+
/** Drawer border token. Defaults to `border.primary`. */
|
|
32
|
+
readonly drawerBorderToken?: TokenValue;
|
|
33
|
+
/** Drawer background token. Defaults to `surface.overlay`. */
|
|
34
|
+
readonly drawerBgToken?: TokenValue;
|
|
35
|
+
/** Quit modal border token. Defaults to `border.warning`. */
|
|
36
|
+
readonly modalBorderToken?: TokenValue;
|
|
37
|
+
/** Quit modal background token. Defaults to `surface.overlay`. */
|
|
38
|
+
readonly modalBgToken?: TokenValue;
|
|
39
|
+
}
|
|
40
|
+
/** Options for creating a batteries-included app skeleton. */
|
|
41
|
+
export interface CreateTuiAppSkeletonOptions {
|
|
42
|
+
/** Bijou context for theme + style rendering. */
|
|
43
|
+
readonly ctx: BijouContext;
|
|
44
|
+
/** App title shown in the header line below tabs. */
|
|
45
|
+
readonly title?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Tabs shown on the top row.
|
|
48
|
+
*
|
|
49
|
+
* Defaults to two tabs:
|
|
50
|
+
* 1. drawer page (empty main pane + animated drawer)
|
|
51
|
+
* 2. split page (1/3 + 2/3)
|
|
52
|
+
*/
|
|
53
|
+
readonly tabs?: readonly SkeletonTab[];
|
|
54
|
+
/** Optional default tab id. Falls back to first tab. */
|
|
55
|
+
readonly defaultTabId?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Footer key legend for controls row.
|
|
58
|
+
*
|
|
59
|
+
* Defaults to:
|
|
60
|
+
* `[ ] pages | o drawer | tab panes | ctrl+p commands | q quit`
|
|
61
|
+
*/
|
|
62
|
+
readonly keyLegend?: string;
|
|
63
|
+
/** Footer status message (static or dynamic by active tab). */
|
|
64
|
+
readonly statusMessage?: string | ((ctx: SkeletonStatusContext) => string);
|
|
65
|
+
/** Optional shell token overrides. */
|
|
66
|
+
readonly themeTokens?: SkeletonThemeTokens;
|
|
67
|
+
/** Optional extra global key bindings merged into skeleton defaults. */
|
|
68
|
+
readonly globalKeys?: KeyMap<SkeletonMsg>;
|
|
69
|
+
}
|
|
70
|
+
/** Internal page model used for defaults. */
|
|
71
|
+
interface SkeletonPageModel {
|
|
72
|
+
readonly ready: true;
|
|
73
|
+
readonly drawerOpen: boolean;
|
|
74
|
+
readonly drawerProgress: number;
|
|
75
|
+
readonly quitConfirmOpen: boolean;
|
|
76
|
+
}
|
|
77
|
+
/** Messages used by the skeleton app shell. */
|
|
78
|
+
export type SkeletonMsg = {
|
|
79
|
+
type: 'request-quit';
|
|
80
|
+
} | {
|
|
81
|
+
type: 'confirm-quit';
|
|
82
|
+
} | {
|
|
83
|
+
type: 'cancel-quit';
|
|
84
|
+
} | {
|
|
85
|
+
type: 'toggle-drawer';
|
|
86
|
+
} | {
|
|
87
|
+
type: 'drawer-progress';
|
|
88
|
+
value: number;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Create a full-screen framed app skeleton with:
|
|
92
|
+
* - tabbed top bar (`|` separators, active/inactive surface tokens)
|
|
93
|
+
* - header line
|
|
94
|
+
* - animated physics drawer on tab 1 (`o` to toggle)
|
|
95
|
+
* - tab switching with `[` and `]` (frame defaults)
|
|
96
|
+
* - quit confirmation modal (`q` / `ctrl+c`)
|
|
97
|
+
* - two-line footer (status line + controls line)
|
|
98
|
+
* - full-width `\\` separator row above footer
|
|
99
|
+
* - default 2-tab setup (drawer page + 1/3:2/3 split page)
|
|
100
|
+
*/
|
|
101
|
+
export declare function createTuiAppSkeleton(options: CreateTuiAppSkeletonOptions): App<FrameModel<SkeletonPageModel>, SkeletonMsg>;
|
|
102
|
+
export {};
|
|
103
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import { animate, clipToWidth, createFramedApp, createKeyMap, createSplitPaneState, drawer, formatKeyCombo, modal, quit, statusBar, visibleLength, } from '@flyingrobots/bijou-tui';
|
|
2
|
+
const DEFAULT_TABS = [
|
|
3
|
+
{ id: 'home', title: 'Home' },
|
|
4
|
+
{ id: 'split', title: 'Split' },
|
|
5
|
+
];
|
|
6
|
+
const DEFAULT_KEY_LEGEND = '[ ] pages | o drawer | tab panes | ctrl+p commands | q quit';
|
|
7
|
+
const DEFAULT_SPLIT_STATE = createSplitPaneState({ ratio: 1 / 3 });
|
|
8
|
+
/**
|
|
9
|
+
* Create a full-screen framed app skeleton with:
|
|
10
|
+
* - tabbed top bar (`|` separators, active/inactive surface tokens)
|
|
11
|
+
* - header line
|
|
12
|
+
* - animated physics drawer on tab 1 (`o` to toggle)
|
|
13
|
+
* - tab switching with `[` and `]` (frame defaults)
|
|
14
|
+
* - quit confirmation modal (`q` / `ctrl+c`)
|
|
15
|
+
* - two-line footer (status line + controls line)
|
|
16
|
+
* - full-width `\\` separator row above footer
|
|
17
|
+
* - default 2-tab setup (drawer page + 1/3:2/3 split page)
|
|
18
|
+
*/
|
|
19
|
+
export function createTuiAppSkeleton(options) {
|
|
20
|
+
const tabs = options.tabs ?? DEFAULT_TABS;
|
|
21
|
+
if (tabs.length === 0) {
|
|
22
|
+
throw new Error('createTuiAppSkeleton: "tabs" must contain at least one tab');
|
|
23
|
+
}
|
|
24
|
+
const tabsById = new Map(tabs.map((tab) => [tab.id, tab]));
|
|
25
|
+
const pageSpecs = buildPageSpecs(tabs);
|
|
26
|
+
const pageConfigs = new Map(pageSpecs.map((spec) => [spec.tab.id, pageConfigFor(spec)]));
|
|
27
|
+
const pages = pageSpecs.map((spec) => {
|
|
28
|
+
const config = pageConfigFor(spec);
|
|
29
|
+
return {
|
|
30
|
+
id: spec.tab.id,
|
|
31
|
+
title: spec.tab.title,
|
|
32
|
+
init: () => [createInitialPageModel(config), []],
|
|
33
|
+
update(msg, model) {
|
|
34
|
+
return updateSkeletonPage(msg, model, config);
|
|
35
|
+
},
|
|
36
|
+
layout: () => layoutFor(spec),
|
|
37
|
+
keyMap: config.hasDrawer
|
|
38
|
+
? createKeyMap().group('Page', (group) => group
|
|
39
|
+
.bind('o', 'Toggle drawer', { type: 'toggle-drawer' }))
|
|
40
|
+
: undefined,
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
const defaultGlobalKeys = createKeyMap()
|
|
44
|
+
.group('Global', (group) => group
|
|
45
|
+
.bind('q', 'Quit (confirm)', { type: 'request-quit' })
|
|
46
|
+
.bind('ctrl+c', 'Quit (confirm)', { type: 'request-quit' })
|
|
47
|
+
.bind('y', 'Confirm quit', { type: 'confirm-quit' })
|
|
48
|
+
.bind('enter', 'Confirm quit', { type: 'confirm-quit' })
|
|
49
|
+
.bind('n', 'Cancel quit', { type: 'cancel-quit' })
|
|
50
|
+
.bind('escape', 'Cancel quit', { type: 'cancel-quit' }));
|
|
51
|
+
const mergedGlobalKeys = mergeKeyMaps(defaultGlobalKeys, options.globalKeys);
|
|
52
|
+
return createFramedApp({
|
|
53
|
+
title: options.title ?? 'App',
|
|
54
|
+
pages,
|
|
55
|
+
defaultPageId: options.defaultTabId ?? tabs[0].id,
|
|
56
|
+
globalKeys: mergedGlobalKeys,
|
|
57
|
+
enableCommandPalette: true,
|
|
58
|
+
overlayFactory: (frame) => buildSkeletonOverlays({
|
|
59
|
+
frame,
|
|
60
|
+
tabsById,
|
|
61
|
+
allTabs: tabs,
|
|
62
|
+
pageConfigs,
|
|
63
|
+
title: options.title ?? 'App',
|
|
64
|
+
keyLegend: options.keyLegend ?? DEFAULT_KEY_LEGEND,
|
|
65
|
+
statusMessage: options.statusMessage,
|
|
66
|
+
tokens: options.themeTokens,
|
|
67
|
+
ctx: options.ctx,
|
|
68
|
+
}),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function buildSkeletonOverlays(options) {
|
|
72
|
+
const width = Math.max(0, options.frame.screenRect.width);
|
|
73
|
+
const height = Math.max(0, options.frame.screenRect.height);
|
|
74
|
+
if (width <= 0 || height <= 0)
|
|
75
|
+
return [];
|
|
76
|
+
const activeTab = options.tabsById.get(options.frame.activePageId) ?? options.allTabs[0];
|
|
77
|
+
const pageConfig = options.pageConfigs.get(activeTab.id) ?? { hasDrawer: false };
|
|
78
|
+
const resolvedStatus = typeof options.statusMessage === 'function'
|
|
79
|
+
? options.statusMessage({ activeTabId: activeTab.id, activeTabTitle: activeTab.title })
|
|
80
|
+
: (options.statusMessage ?? `${activeTab.title} ready`);
|
|
81
|
+
const overlays = [];
|
|
82
|
+
overlays.push({
|
|
83
|
+
row: 0,
|
|
84
|
+
col: 0,
|
|
85
|
+
content: renderTabRow(width, options.allTabs, activeTab.id, options.tokens, options.ctx),
|
|
86
|
+
});
|
|
87
|
+
if (height >= 5) {
|
|
88
|
+
overlays.push({
|
|
89
|
+
row: 1,
|
|
90
|
+
col: 0,
|
|
91
|
+
content: renderHeaderRow(width, options.title, activeTab.title, options.tokens, options.ctx),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const drawerOverlay = maybeRenderDrawerOverlay(options.frame, pageConfig, width, height, options.tokens, options.ctx);
|
|
95
|
+
if (drawerOverlay != null)
|
|
96
|
+
overlays.push(drawerOverlay);
|
|
97
|
+
if (height >= 3) {
|
|
98
|
+
if (height >= 4) {
|
|
99
|
+
overlays.push({
|
|
100
|
+
row: height - 3,
|
|
101
|
+
col: 0,
|
|
102
|
+
content: renderSeparatorRow(width, options.tokens, options.ctx),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
overlays.push({
|
|
106
|
+
row: height - 2,
|
|
107
|
+
col: 0,
|
|
108
|
+
content: renderFooterStatusRow(width, resolvedStatus, activeTab.title, options.tokens, options.ctx),
|
|
109
|
+
});
|
|
110
|
+
overlays.push({
|
|
111
|
+
row: height - 1,
|
|
112
|
+
col: 0,
|
|
113
|
+
content: renderFooterControlsRow(width, options.keyLegend, options.tokens, options.ctx),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
else if (height === 2) {
|
|
117
|
+
overlays.push({
|
|
118
|
+
row: 1,
|
|
119
|
+
col: 0,
|
|
120
|
+
content: renderFooterControlsRow(width, options.keyLegend, options.tokens, options.ctx),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (options.frame.pageModel.quitConfirmOpen) {
|
|
124
|
+
overlays.push(modal({
|
|
125
|
+
title: 'Quit App?',
|
|
126
|
+
body: 'Exit this TUI session now?',
|
|
127
|
+
hint: 'Y / Enter confirm • N / Esc cancel',
|
|
128
|
+
width: Math.min(56, Math.max(34, width - 4)),
|
|
129
|
+
screenWidth: width,
|
|
130
|
+
screenHeight: height,
|
|
131
|
+
borderToken: options.tokens?.modalBorderToken ?? options.ctx.theme.theme.border.warning,
|
|
132
|
+
bgToken: options.tokens?.modalBgToken ?? options.ctx.theme.theme.surface.overlay,
|
|
133
|
+
ctx: options.ctx,
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
return overlays;
|
|
137
|
+
}
|
|
138
|
+
function renderTabRow(width, tabs, activeTabId, tokens, ctx) {
|
|
139
|
+
const headerBg = tokens?.headerBgToken ?? ctx.theme.theme.surface.primary;
|
|
140
|
+
const activeToken = tokens?.activeTabToken ?? ctx.theme.theme.surface.elevated;
|
|
141
|
+
const inactiveToken = tokens?.inactiveTabToken ?? ctx.theme.theme.surface.secondary;
|
|
142
|
+
const separator = style(' | ', headerBg, ctx);
|
|
143
|
+
const tabsRaw = tabs
|
|
144
|
+
.map((tab) => style(` ${tab.title} `, tab.id === activeTabId ? activeToken : inactiveToken, ctx))
|
|
145
|
+
.join(separator);
|
|
146
|
+
return fillToWidth(tabsRaw, width, headerBg, ctx);
|
|
147
|
+
}
|
|
148
|
+
function renderHeaderRow(width, title, activeTabTitle, tokens, ctx) {
|
|
149
|
+
const headerBg = tokens?.headerBgToken ?? ctx.theme.theme.surface.primary;
|
|
150
|
+
const line = statusBar({
|
|
151
|
+
left: ` ${title}`,
|
|
152
|
+
right: activeTabTitle,
|
|
153
|
+
width,
|
|
154
|
+
});
|
|
155
|
+
return style(line, headerBg, ctx);
|
|
156
|
+
}
|
|
157
|
+
function renderSeparatorRow(width, tokens, ctx) {
|
|
158
|
+
const separatorToken = tokens?.separatorToken ?? ctx.theme.theme.border.muted;
|
|
159
|
+
return style('\\'.repeat(width), separatorToken, ctx);
|
|
160
|
+
}
|
|
161
|
+
function renderFooterStatusRow(width, status, activeTabTitle, tokens, ctx) {
|
|
162
|
+
const footerToken = tokens?.footerStatusToken ?? ctx.theme.theme.surface.secondary;
|
|
163
|
+
const line = statusBar({
|
|
164
|
+
left: ` ${status}`,
|
|
165
|
+
right: activeTabTitle,
|
|
166
|
+
width,
|
|
167
|
+
});
|
|
168
|
+
return style(line, footerToken, ctx);
|
|
169
|
+
}
|
|
170
|
+
function renderFooterControlsRow(width, keyLegend, tokens, ctx) {
|
|
171
|
+
const controlsToken = tokens?.footerControlsToken ?? ctx.theme.theme.surface.primary;
|
|
172
|
+
const line = statusBar({
|
|
173
|
+
left: ` ${keyLegend}`,
|
|
174
|
+
right: '',
|
|
175
|
+
width,
|
|
176
|
+
});
|
|
177
|
+
return style(line, controlsToken, ctx);
|
|
178
|
+
}
|
|
179
|
+
function maybeRenderDrawerOverlay(frame, pageConfig, width, height, tokens, ctx) {
|
|
180
|
+
if (!pageConfig.hasDrawer)
|
|
181
|
+
return null;
|
|
182
|
+
const progress = clamp01(frame.pageModel.drawerProgress);
|
|
183
|
+
if (progress <= 0.01)
|
|
184
|
+
return null;
|
|
185
|
+
const region = pageConfig.drawerPaneId != null
|
|
186
|
+
? (frame.paneRects.get(pageConfig.drawerPaneId) ?? frame.screenRect)
|
|
187
|
+
: frame.screenRect;
|
|
188
|
+
if (region.width <= 0 || region.height <= 0)
|
|
189
|
+
return null;
|
|
190
|
+
const idealOpenWidth = Math.max(22, Math.floor(region.width * 0.38));
|
|
191
|
+
const openWidth = clampInt(idealOpenWidth, 0, region.width);
|
|
192
|
+
const animatedWidth = clampInt(Math.round(openWidth * progress), 0, region.width);
|
|
193
|
+
if (animatedWidth < 6)
|
|
194
|
+
return null;
|
|
195
|
+
return drawer({
|
|
196
|
+
anchor: 'right',
|
|
197
|
+
title: 'Drawer',
|
|
198
|
+
content: renderDrawerContent(frame.pageModel),
|
|
199
|
+
width: animatedWidth,
|
|
200
|
+
screenWidth: width,
|
|
201
|
+
screenHeight: height,
|
|
202
|
+
region,
|
|
203
|
+
borderToken: tokens?.drawerBorderToken ?? ctx.theme.theme.border.primary,
|
|
204
|
+
bgToken: tokens?.drawerBgToken ?? ctx.theme.theme.surface.overlay,
|
|
205
|
+
ctx,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
function renderDrawerContent(model) {
|
|
209
|
+
const pct = Math.round(clamp01(model.drawerProgress) * 100);
|
|
210
|
+
return [
|
|
211
|
+
'Panel drawer',
|
|
212
|
+
'',
|
|
213
|
+
`Open: ${model.drawerOpen ? 'yes' : 'no'}`,
|
|
214
|
+
`Width: ${pct}%`,
|
|
215
|
+
'',
|
|
216
|
+
'o toggle drawer',
|
|
217
|
+
'[ / ] switch pages',
|
|
218
|
+
'q quit (confirm)',
|
|
219
|
+
].join('\n');
|
|
220
|
+
}
|
|
221
|
+
function buildPageSpecs(tabs) {
|
|
222
|
+
return tabs.map((tab, index) => ({
|
|
223
|
+
tab,
|
|
224
|
+
kind: index === 0 ? 'drawer' : (index === 1 ? 'split' : 'empty'),
|
|
225
|
+
}));
|
|
226
|
+
}
|
|
227
|
+
function pageConfigFor(spec) {
|
|
228
|
+
if (spec.kind === 'drawer') {
|
|
229
|
+
return {
|
|
230
|
+
hasDrawer: true,
|
|
231
|
+
drawerPaneId: drawerPaneId(spec.tab.id),
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
return { hasDrawer: false };
|
|
235
|
+
}
|
|
236
|
+
function createInitialPageModel(config) {
|
|
237
|
+
return {
|
|
238
|
+
ready: true,
|
|
239
|
+
drawerOpen: config.hasDrawer,
|
|
240
|
+
drawerProgress: config.hasDrawer ? 1 : 0,
|
|
241
|
+
quitConfirmOpen: false,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function updateSkeletonPage(msg, model, config) {
|
|
245
|
+
switch (msg.type) {
|
|
246
|
+
case 'request-quit':
|
|
247
|
+
if (model.quitConfirmOpen)
|
|
248
|
+
return [model, []];
|
|
249
|
+
return [{ ...model, quitConfirmOpen: true }, []];
|
|
250
|
+
case 'cancel-quit':
|
|
251
|
+
if (!model.quitConfirmOpen)
|
|
252
|
+
return [model, []];
|
|
253
|
+
return [{ ...model, quitConfirmOpen: false }, []];
|
|
254
|
+
case 'confirm-quit':
|
|
255
|
+
if (!model.quitConfirmOpen)
|
|
256
|
+
return [model, []];
|
|
257
|
+
return [{ ...model, quitConfirmOpen: false }, [quit()]];
|
|
258
|
+
case 'toggle-drawer': {
|
|
259
|
+
if (!config.hasDrawer)
|
|
260
|
+
return [model, []];
|
|
261
|
+
const drawerOpen = !model.drawerOpen;
|
|
262
|
+
const target = drawerOpen ? 1 : 0;
|
|
263
|
+
return [{ ...model, drawerOpen }, [
|
|
264
|
+
animate({
|
|
265
|
+
from: model.drawerProgress,
|
|
266
|
+
to: target,
|
|
267
|
+
spring: 'default',
|
|
268
|
+
onFrame: (value) => ({ type: 'drawer-progress', value }),
|
|
269
|
+
}),
|
|
270
|
+
]];
|
|
271
|
+
}
|
|
272
|
+
case 'drawer-progress':
|
|
273
|
+
if (!config.hasDrawer)
|
|
274
|
+
return [model, []];
|
|
275
|
+
return [{ ...model, drawerProgress: clamp01(msg.value) }, []];
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
function layoutFor(spec) {
|
|
279
|
+
switch (spec.kind) {
|
|
280
|
+
case 'drawer':
|
|
281
|
+
return {
|
|
282
|
+
kind: 'pane',
|
|
283
|
+
paneId: drawerPaneId(spec.tab.id),
|
|
284
|
+
render: () => '',
|
|
285
|
+
};
|
|
286
|
+
case 'split':
|
|
287
|
+
return {
|
|
288
|
+
kind: 'split',
|
|
289
|
+
splitId: `${spec.tab.id}-split`,
|
|
290
|
+
direction: 'row',
|
|
291
|
+
state: DEFAULT_SPLIT_STATE,
|
|
292
|
+
paneA: {
|
|
293
|
+
kind: 'pane',
|
|
294
|
+
paneId: `${spec.tab.id}-left`,
|
|
295
|
+
render: (width, height) => renderSplitPaneLabel('Left pane (1/3)', width, height),
|
|
296
|
+
},
|
|
297
|
+
paneB: {
|
|
298
|
+
kind: 'pane',
|
|
299
|
+
paneId: `${spec.tab.id}-right`,
|
|
300
|
+
render: (width, height) => renderSplitPaneLabel('Right pane (2/3)', width, height),
|
|
301
|
+
},
|
|
302
|
+
};
|
|
303
|
+
case 'empty':
|
|
304
|
+
return {
|
|
305
|
+
kind: 'pane',
|
|
306
|
+
paneId: `${spec.tab.id}-main`,
|
|
307
|
+
render: () => '',
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
function renderSplitPaneLabel(label, width, height) {
|
|
312
|
+
if (width <= 0 || height <= 0)
|
|
313
|
+
return '';
|
|
314
|
+
const first = clipToWidth(` ${label}`, width);
|
|
315
|
+
const lines = [first];
|
|
316
|
+
while (lines.length < height)
|
|
317
|
+
lines.push('');
|
|
318
|
+
return lines.join('\n');
|
|
319
|
+
}
|
|
320
|
+
function drawerPaneId(tabId) {
|
|
321
|
+
return `${tabId}-main`;
|
|
322
|
+
}
|
|
323
|
+
function fillToWidth(content, width, token, ctx) {
|
|
324
|
+
const clipped = clipToWidth(content, width);
|
|
325
|
+
const visible = visibleLength(clipped);
|
|
326
|
+
if (visible >= width)
|
|
327
|
+
return clipped;
|
|
328
|
+
return clipped + style(' '.repeat(width - visible), token, ctx);
|
|
329
|
+
}
|
|
330
|
+
function style(text, token, ctx) {
|
|
331
|
+
if (text.length === 0)
|
|
332
|
+
return '';
|
|
333
|
+
return ctx.style.styled(token, text);
|
|
334
|
+
}
|
|
335
|
+
function mergeKeyMaps(base, extra) {
|
|
336
|
+
if (extra == null)
|
|
337
|
+
return base;
|
|
338
|
+
const merged = createKeyMap();
|
|
339
|
+
bindMapInto(merged, base);
|
|
340
|
+
bindMapInto(merged, extra);
|
|
341
|
+
return merged;
|
|
342
|
+
}
|
|
343
|
+
function bindMapInto(target, source) {
|
|
344
|
+
for (const binding of source.bindings()) {
|
|
345
|
+
if (!binding.enabled)
|
|
346
|
+
continue;
|
|
347
|
+
const action = source.handle(comboToMsg(binding.combo));
|
|
348
|
+
if (action === undefined)
|
|
349
|
+
continue;
|
|
350
|
+
if (binding.group !== '') {
|
|
351
|
+
target.group(binding.group, (group) => group.bind(formatKeyCombo(binding.combo), binding.description, action));
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
target.bind(formatKeyCombo(binding.combo), binding.description, action);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
function comboToMsg(combo) {
|
|
359
|
+
return {
|
|
360
|
+
type: 'key',
|
|
361
|
+
key: combo.key,
|
|
362
|
+
ctrl: combo.ctrl,
|
|
363
|
+
alt: combo.alt,
|
|
364
|
+
shift: combo.shift,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
function clamp01(value) {
|
|
368
|
+
if (!Number.isFinite(value))
|
|
369
|
+
return 0;
|
|
370
|
+
if (value < 0)
|
|
371
|
+
return 0;
|
|
372
|
+
if (value > 1)
|
|
373
|
+
return 1;
|
|
374
|
+
return value;
|
|
375
|
+
}
|
|
376
|
+
function clampInt(value, min, max) {
|
|
377
|
+
const floored = Math.floor(value);
|
|
378
|
+
return Math.max(min, Math.min(max, floored));
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flyingrobots/bijou-tui-app",
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"description": "Batteries-included TUI app skeleton built on bijou-tui createFramedApp().",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./package.json": "./package.json"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc -b",
|
|
23
|
+
"prepack": "tsc -b",
|
|
24
|
+
"lint": "tsc --noEmit"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@flyingrobots/bijou": "1.3.0",
|
|
28
|
+
"@flyingrobots/bijou-tui": "1.3.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^22.0.0",
|
|
32
|
+
"typescript": "^5.9.3",
|
|
33
|
+
"vitest": "^4.0.18"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"cli",
|
|
37
|
+
"terminal",
|
|
38
|
+
"tui",
|
|
39
|
+
"bijou",
|
|
40
|
+
"app-shell",
|
|
41
|
+
"skeleton"
|
|
42
|
+
],
|
|
43
|
+
"author": "James Ross <james@flyingrobots.dev>",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "git+https://github.com/flyingrobots/bijou.git",
|
|
48
|
+
"directory": "packages/bijou-tui-app"
|
|
49
|
+
},
|
|
50
|
+
"homepage": "https://github.com/flyingrobots/bijou",
|
|
51
|
+
"bugs": "https://github.com/flyingrobots/bijou/issues",
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=20"
|
|
54
|
+
},
|
|
55
|
+
"publishConfig": {
|
|
56
|
+
"access": "public",
|
|
57
|
+
"provenance": true
|
|
58
|
+
}
|
|
59
|
+
}
|