@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 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
@@ -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":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAYL,KAAK,GAAG,EAGR,KAAK,UAAU,EAIf,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,qBAAqB;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,iEAAiE;AACjE,MAAM,WAAW,qBAAqB;IACpC,qBAAqB;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wBAAwB;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,gFAAgF;IAChF,QAAQ,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;IACpC,wDAAwD;IACxD,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACrC,2DAA2D;IAC3D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC;IACvC,iEAAiE;IACjE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IACxC,iEAAiE;IACjE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,UAAU,CAAC;IAC1C,uDAAuD;IACvD,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IACrC,yDAAyD;IACzD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IACxC,8DAA8D;IAC9D,QAAQ,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;IACpC,6DAA6D;IAC7D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC;IACvC,kEAAkE;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC;CACpC;AAED,8DAA8D;AAC9D,MAAM,WAAW,2BAA2B;IAC1C,iDAAiD;IACjD,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,qDAAqD;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,wDAAwD;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,qBAAqB,KAAK,MAAM,CAAC,CAAC;IAC3E,sCAAsC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAC3C,wEAAwE;IACxE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;CAC3C;AAED,6CAA6C;AAC7C,UAAU,iBAAiB;IACzB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAYD,+CAA+C;AAC/C,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAW/C;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,2BAA2B,GACnC,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC,CA2DjD"}
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
+ }