@flyingrobots/bijou-tui 1.2.0 → 1.4.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 +117 -4
- package/dist/animate.d.ts.map +1 -1
- package/dist/animate.js +13 -2
- package/dist/animate.js.map +1 -1
- package/dist/app-frame.d.ts +176 -0
- package/dist/app-frame.d.ts.map +1 -0
- package/dist/app-frame.js +937 -0
- package/dist/app-frame.js.map +1 -0
- package/dist/command-palette.js +1 -1
- package/dist/command-palette.js.map +1 -1
- package/dist/driver.d.ts +18 -5
- package/dist/driver.d.ts.map +1 -1
- package/dist/driver.js +19 -2
- package/dist/driver.js.map +1 -1
- package/dist/eventbus.d.ts +7 -2
- package/dist/eventbus.d.ts.map +1 -1
- package/dist/eventbus.js +17 -4
- package/dist/eventbus.js.map +1 -1
- package/dist/focus-area.d.ts.map +1 -1
- package/dist/focus-area.js +10 -7
- package/dist/focus-area.js.map +1 -1
- package/dist/grid.d.ts +42 -0
- package/dist/grid.d.ts.map +1 -0
- package/dist/grid.js +182 -0
- package/dist/grid.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +4 -0
- package/dist/keys.js.map +1 -1
- package/dist/layout-rect.d.ts +14 -0
- package/dist/layout-rect.d.ts.map +1 -0
- package/dist/layout-rect.js +2 -0
- package/dist/layout-rect.js.map +1 -0
- package/dist/layout-utils.d.ts +2 -0
- package/dist/layout-utils.d.ts.map +1 -0
- package/dist/layout-utils.js +15 -0
- package/dist/layout-utils.js.map +1 -0
- package/dist/overlay.d.ts +29 -7
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +83 -12
- package/dist/overlay.js.map +1 -1
- package/dist/panels.d.ts.map +1 -1
- package/dist/panels.js +2 -3
- package/dist/panels.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +30 -1
- package/dist/runtime.js.map +1 -1
- package/dist/split-pane.d.ts +89 -0
- package/dist/split-pane.d.ts.map +1 -0
- package/dist/split-pane.js +178 -0
- package/dist/split-pane.js.map +1 -0
- package/dist/transition-shaders.d.ts +43 -0
- package/dist/transition-shaders.d.ts.map +1 -0
- package/dist/transition-shaders.js +66 -0
- package/dist/transition-shaders.js.map +1 -0
- package/dist/viewport.d.ts +9 -0
- package/dist/viewport.d.ts.map +1 -1
- package/dist/viewport.js +57 -0
- package/dist/viewport.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -4,14 +4,24 @@ TEA runtime for terminal UIs — model/update/view with physics-based animation,
|
|
|
4
4
|
|
|
5
5
|
Inspired by [Bubble Tea](https://github.com/charmbracelet/bubbletea) (Go) and [GSAP](https://gsap.com/) animation.
|
|
6
6
|
|
|
7
|
-
## What's New
|
|
7
|
+
## What's New (v1.3.0 Snapshot)?
|
|
8
8
|
|
|
9
|
-
- **`
|
|
10
|
-
- **`
|
|
11
|
-
- **`
|
|
9
|
+
- **`splitPane()`** — ratio-based split layout with pure reducers and deterministic rect introspection.
|
|
10
|
+
- **`grid()`** — fixed + fractional track solver with named areas and stable layout geometry.
|
|
11
|
+
- **`createFramedApp()`** — shell scaffolding for tabs, pane focus/scroll isolation, help, overlays, and command palette.
|
|
12
|
+
- **`drawer()` upgrades** — supports `left`/`right`/`top`/`bottom` anchors and optional panel `region` mounting.
|
|
13
|
+
- **`runScript()` upgrades** — scripted driver now supports key, resize, and custom-message steps for richer integration harnesses.
|
|
12
14
|
|
|
13
15
|
See the [CHANGELOG](https://github.com/flyingrobots/bijou/blob/main/docs/CHANGELOG.md) for the full release history.
|
|
14
16
|
|
|
17
|
+
## Documentation Status
|
|
18
|
+
|
|
19
|
+
This npm README is a quick overview and may lag behind the repository.
|
|
20
|
+
|
|
21
|
+
- Canonical API details and behavior notes live in [`GUIDE.md`](./GUIDE.md)
|
|
22
|
+
- End-to-end examples live in [`/examples`](https://github.com/flyingrobots/bijou/tree/main/examples)
|
|
23
|
+
- Release-level changes live in the [CHANGELOG](https://github.com/flyingrobots/bijou/blob/main/docs/CHANGELOG.md)
|
|
24
|
+
|
|
15
25
|
## Install
|
|
16
26
|
|
|
17
27
|
```bash
|
|
@@ -46,6 +56,25 @@ const app: App<Model> = {
|
|
|
46
56
|
run(app);
|
|
47
57
|
```
|
|
48
58
|
|
|
59
|
+
## Runtime Behavior Note
|
|
60
|
+
|
|
61
|
+
`run()` behaves differently by output mode:
|
|
62
|
+
|
|
63
|
+
- `interactive`: full TEA loop (event bus, key/resize/mouse handling, command-driven updates).
|
|
64
|
+
- `pipe` / `static` / `accessible`: render `view(initModel)` once and return immediately.
|
|
65
|
+
|
|
66
|
+
In non-interactive modes, there is no normal interactive event loop.
|
|
67
|
+
|
|
68
|
+
## Features Breakdown
|
|
69
|
+
|
|
70
|
+
- **TEA runtime core**: deterministic model/update/view loop with command-driven side effects.
|
|
71
|
+
- **Motion system**: spring physics, tweens, and timeline sequencing for orchestrated terminal animation.
|
|
72
|
+
- **Layout engine**: flexbox helpers, stacks, split panes, named-area grids, viewport scrolling, and resize-aware rendering.
|
|
73
|
+
- **Input architecture**: keymaps, grouped bindings, generated help views, and layered input stack for modal flows.
|
|
74
|
+
- **Overlay composition**: modal, toast, drawer, tooltip, and painter-style compositing primitives (including panel-scoped drawers).
|
|
75
|
+
- **App shell**: `createFramedApp()` for tabs/help/chrome/pane-focus boilerplate with optional command palette.
|
|
76
|
+
- **Stateful building blocks**: navigable table, browsable list, file picker, focus area, and DAG pane with vim-friendly keymaps.
|
|
77
|
+
|
|
49
78
|
## Animation
|
|
50
79
|
|
|
51
80
|
### Spring Physics
|
|
@@ -151,6 +180,56 @@ vstack(header, content, footer); // vertical stack
|
|
|
151
180
|
hstack(2, leftPanel, rightPanel); // side-by-side with gap
|
|
152
181
|
```
|
|
153
182
|
|
|
183
|
+
### Split Pane
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
import {
|
|
187
|
+
createSplitPaneState, splitPane, splitPaneResizeBy, splitPaneFocusNext,
|
|
188
|
+
} from '@flyingrobots/bijou-tui';
|
|
189
|
+
|
|
190
|
+
let state = createSplitPaneState({ ratio: 0.35 });
|
|
191
|
+
|
|
192
|
+
// in update:
|
|
193
|
+
state = splitPaneResizeBy(state, 2, { total: cols, minA: 16, minB: 16 });
|
|
194
|
+
state = splitPaneFocusNext(state);
|
|
195
|
+
|
|
196
|
+
// in view:
|
|
197
|
+
const output = splitPane(state, {
|
|
198
|
+
direction: 'row',
|
|
199
|
+
width: cols,
|
|
200
|
+
height: rows,
|
|
201
|
+
minA: 16,
|
|
202
|
+
minB: 16,
|
|
203
|
+
paneA: (w, h) => renderSidebar(w, h),
|
|
204
|
+
paneB: (w, h) => renderMain(w, h),
|
|
205
|
+
});
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Grid
|
|
209
|
+
|
|
210
|
+
```typescript
|
|
211
|
+
import { grid } from '@flyingrobots/bijou-tui';
|
|
212
|
+
|
|
213
|
+
const output = grid({
|
|
214
|
+
width: cols,
|
|
215
|
+
height: rows,
|
|
216
|
+
columns: [24, '1fr'],
|
|
217
|
+
rows: [3, '1fr', 8],
|
|
218
|
+
areas: [
|
|
219
|
+
'header header',
|
|
220
|
+
'nav main',
|
|
221
|
+
'logs main',
|
|
222
|
+
],
|
|
223
|
+
gap: 1,
|
|
224
|
+
cells: {
|
|
225
|
+
header: (w, h) => renderHeader(w, h),
|
|
226
|
+
nav: (w, h) => renderNav(w, h),
|
|
227
|
+
logs: (w, h) => renderLogs(w, h),
|
|
228
|
+
main: (w, h) => renderMain(w, h),
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
154
233
|
## Resize Handling
|
|
155
234
|
|
|
156
235
|
Terminal resize events are dispatched automatically as `ResizeMsg`:
|
|
@@ -283,6 +362,19 @@ const output = composite(backgroundView, [dialog, notification], { dim: true });
|
|
|
283
362
|
|
|
284
363
|
Each overlay is a `{ content, row, col }` object. `composite()` splices them onto the background using painter's algorithm (last overlay wins on overlap). The `dim` option fades the background with ANSI dim.
|
|
285
364
|
|
|
365
|
+
`drawer()` now supports `left`/`right`/`top`/`bottom` anchors and optional `region` mounting for panel-scoped overlays.
|
|
366
|
+
|
|
367
|
+
## App Frame
|
|
368
|
+
|
|
369
|
+
`createFramedApp()` wraps page-level TEA logic in a shared shell:
|
|
370
|
+
|
|
371
|
+
- tabs + page switching
|
|
372
|
+
- pane focus and per-pane scroll isolation
|
|
373
|
+
- frame help (`?`) and optional command palette (`ctrl+p` / `:`)
|
|
374
|
+
- overlay factory with pane rects for panel-scoped drawers/modals
|
|
375
|
+
|
|
376
|
+
See `examples/release-workbench/main.ts` for the canonical shell demo and `examples/app-frame/main.ts` for a compact focused example.
|
|
377
|
+
|
|
286
378
|
## Building Blocks
|
|
287
379
|
|
|
288
380
|
Reusable stateful components that follow the TEA state + pure transformers + sync render + convenience keymap pattern:
|
|
@@ -361,3 +453,24 @@ All building blocks include `*KeyMap()` factories for preconfigured vim-style ke
|
|
|
361
453
|
## License
|
|
362
454
|
|
|
363
455
|
MIT
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
<p align="center">
|
|
460
|
+
Built with 💎 by <a href="https://github.com/flyingrobots">FLYING ROBOTS</a>
|
|
461
|
+
</p>
|
|
462
|
+
|
|
463
|
+
```rust
|
|
464
|
+
.-:::::'::: .-:. ::-.::::::. :::. .,-:::::/
|
|
465
|
+
;;;'''' ;;; ';;. ;;;;';;;`;;;;, `;;;,;;-'````'
|
|
466
|
+
[[[,,== [[[ '[[,[[[' [[[ [[[[[. '[[[[[ [[[[[[/
|
|
467
|
+
`$$$"`` $$' c$$" $$$ $$$ "Y$c$$"$$c. "$$
|
|
468
|
+
888 o88oo,.__ ,8P"` 888 888 Y88 `Y8bo,,,o88o
|
|
469
|
+
"MM, """"YUMMMmM" MMM MMM YM `'YMUP"YMM
|
|
470
|
+
:::::::.. ... :::::::. ... :::::::::::: .::::::.
|
|
471
|
+
;;;;``;;;; .;;;;;;;. ;;;'';;' .;;;;;;;.;;;;;;;;'''';;;` `
|
|
472
|
+
[[[,/[[[' ,[[ \[[, [[[__[[\.,[[ \[[, [[ '[==/[[[[,
|
|
473
|
+
$$$$$$c $$$, $$$ $$""""Y$$$$$, $$$ $$ ''' $
|
|
474
|
+
888b "88bo,"888,_ _,88P_88o,,od8P"888,_ _,88P 88, 88b dP
|
|
475
|
+
MMMM "W" "YMMMMMP" ""YUMMMP" "YMMMMMP" MMM "YMmMY"
|
|
476
|
+
```
|
package/dist/animate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animate.d.ts","sourceRoot":"","sources":["../src/animate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,EAQd,MAAM,aAAa,CAAC;AAMrB;;;;GAIG;AACH,UAAU,WAAW,CAAC,CAAC;IACrB,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC;IACvC,qEAAqE;IACrE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;IAC7D,kFAAkF;IAClF,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACzB,oDAAoD;IACpD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;CACxD;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;IAC5D,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,gCAAgC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAMjF;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAiB7D;
|
|
1
|
+
{"version":3,"file":"animate.d.ts","sourceRoot":"","sources":["../src/animate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,EAQd,MAAM,aAAa,CAAC;AAMrB;;;;GAIG;AACH,UAAU,WAAW,CAAC,CAAC;IACrB,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC;IACvC,qEAAqE;IACrE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;IAC7D,kFAAkF;IAClF,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACzB,oDAAoD;IACpD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;CACxD;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;IAC5D,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,gCAAgC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAMjF;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAiB7D;AA4GD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAMrD"}
|
package/dist/animate.js
CHANGED
|
@@ -64,9 +64,12 @@ export function animate(options) {
|
|
|
64
64
|
function createSpringCmd(from, to, config, fps, onFrame, onComplete) {
|
|
65
65
|
return (emit) => new Promise((resolve) => {
|
|
66
66
|
let state = createSpringState(from);
|
|
67
|
-
const dt = 1 / fps;
|
|
68
67
|
const intervalMs = Math.round(1000 / fps);
|
|
68
|
+
let lastMs = Date.now();
|
|
69
69
|
const id = setInterval(() => {
|
|
70
|
+
const nowMs = Date.now();
|
|
71
|
+
const dt = Math.max(0, (nowMs - lastMs) / 1000);
|
|
72
|
+
lastMs = nowMs;
|
|
70
73
|
state = springStep(state, to, config, dt);
|
|
71
74
|
emit(onFrame(state.value));
|
|
72
75
|
if (state.done) {
|
|
@@ -84,6 +87,10 @@ function createSpringCmd(from, to, config, fps, onFrame, onComplete) {
|
|
|
84
87
|
/**
|
|
85
88
|
* Build a TEA command that runs a tween animation via `setInterval`.
|
|
86
89
|
*
|
|
90
|
+
* Uses wall-clock time (`Date.now()`) to compute actual elapsed time
|
|
91
|
+
* per frame, so animations run at the correct speed regardless of
|
|
92
|
+
* timer jitter or system load.
|
|
93
|
+
*
|
|
87
94
|
* @template M - The message type emitted into the TEA update cycle.
|
|
88
95
|
* @param from - Starting value.
|
|
89
96
|
* @param to - Target value.
|
|
@@ -99,8 +106,12 @@ function createTweenCmd(from, to, duration, ease, fps, onFrame, onComplete) {
|
|
|
99
106
|
return (emit) => new Promise((resolve) => {
|
|
100
107
|
let state = createTweenState(from);
|
|
101
108
|
const intervalMs = Math.round(1000 / fps);
|
|
109
|
+
let lastMs = Date.now();
|
|
102
110
|
const id = setInterval(() => {
|
|
103
|
-
|
|
111
|
+
const nowMs = Date.now();
|
|
112
|
+
const dtMs = Math.max(0, nowMs - lastMs);
|
|
113
|
+
lastMs = nowMs;
|
|
114
|
+
state = tweenStep(state, config, dtMs);
|
|
104
115
|
emit(onFrame(state.value));
|
|
105
116
|
if (state.done) {
|
|
106
117
|
clearInterval(id);
|
package/dist/animate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animate.js","sourceRoot":"","sources":["../src/animate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAIL,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,OAAO,GACR,MAAM,aAAa,CAAC;AA2DrB,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,OAAO,CAAI,OAA0B;IACnD,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,SAAS,GAAG,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/E,4CAA4C;IAC5C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE;YACpB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAClB,IAAI,UAAU;gBAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACpH,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,eAAe,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AACrE,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,SAAS,eAAe,CACtB,IAAY,EACZ,EAAU,EACV,MAAoB,EACpB,GAAW,EACX,OAA6B,EAC7B,UAAoB;IAEpB,OAAO,CAAC,IAAI,EAAE,EAAE,CACd,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5B,IAAI,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,
|
|
1
|
+
{"version":3,"file":"animate.js","sourceRoot":"","sources":["../src/animate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `appFrame()` — high-level TEA app shell.
|
|
3
|
+
*
|
|
4
|
+
* Provides tabs, pane focus/scroll isolation, shell key handling, help,
|
|
5
|
+
* panel-scoped overlay context, and optional frame-level command palette.
|
|
6
|
+
*/
|
|
7
|
+
import { type BindingSource } from './help.js';
|
|
8
|
+
import { type KeyMap } from './keybindings.js';
|
|
9
|
+
import type { App, Cmd } from './types.js';
|
|
10
|
+
import type { Overlay } from './overlay.js';
|
|
11
|
+
import type { TransitionShaderFn } from './transition-shaders.js';
|
|
12
|
+
import { type BuiltinTransition } from './transition-shaders.js';
|
|
13
|
+
import type { CommandPaletteItem, CommandPaletteState } from './command-palette.js';
|
|
14
|
+
import type { GridTrack } from './grid.js';
|
|
15
|
+
import { type OverflowX } from './focus-area.js';
|
|
16
|
+
import { type SplitPaneDirection, type SplitPaneState } from './split-pane.js';
|
|
17
|
+
import type { LayoutRect } from './layout-rect.js';
|
|
18
|
+
import { type Timeline, type TimelineState } from './timeline.js';
|
|
19
|
+
/** Page declaration consumed by {@link createFramedApp}. */
|
|
20
|
+
export interface FramePage<PageModel, Msg> {
|
|
21
|
+
/** Stable page id. */
|
|
22
|
+
readonly id: string;
|
|
23
|
+
/** Tab title. */
|
|
24
|
+
readonly title: string;
|
|
25
|
+
/** Page-level initializer. */
|
|
26
|
+
init(): [PageModel, Cmd<Msg>[]];
|
|
27
|
+
/** Page-level updater (custom messages only). */
|
|
28
|
+
update(msg: Msg, model: PageModel): [PageModel, Cmd<Msg>[]];
|
|
29
|
+
/** Page layout tree. */
|
|
30
|
+
layout(model: PageModel): FrameLayoutNode;
|
|
31
|
+
/** Optional page keymap. */
|
|
32
|
+
keyMap?: KeyMap<Msg>;
|
|
33
|
+
/** Optional help source override. */
|
|
34
|
+
helpSource?: BindingSource;
|
|
35
|
+
/** Optional page-scoped command items for command palette listing/execution. */
|
|
36
|
+
commandItems?: (model: PageModel) => readonly FrameCommandItem<Msg>[];
|
|
37
|
+
}
|
|
38
|
+
/** Custom command-palette item with optional message dispatch action. */
|
|
39
|
+
export interface FrameCommandItem<Msg> extends CommandPaletteItem {
|
|
40
|
+
/** Message dispatched when this item is selected. */
|
|
41
|
+
readonly action?: Msg;
|
|
42
|
+
}
|
|
43
|
+
/** Declarative frame layout node. */
|
|
44
|
+
export type FrameLayoutNode = {
|
|
45
|
+
readonly kind: 'pane';
|
|
46
|
+
readonly paneId: string;
|
|
47
|
+
readonly render: (width: number, height: number) => string;
|
|
48
|
+
readonly overflowX?: OverflowX;
|
|
49
|
+
} | {
|
|
50
|
+
readonly kind: 'split';
|
|
51
|
+
readonly splitId: string;
|
|
52
|
+
readonly direction?: SplitPaneDirection;
|
|
53
|
+
readonly state: SplitPaneState;
|
|
54
|
+
readonly minA?: number;
|
|
55
|
+
readonly minB?: number;
|
|
56
|
+
readonly paneA: FrameLayoutNode;
|
|
57
|
+
readonly paneB: FrameLayoutNode;
|
|
58
|
+
readonly dividerChar?: string;
|
|
59
|
+
} | {
|
|
60
|
+
readonly kind: 'grid';
|
|
61
|
+
readonly gridId: string;
|
|
62
|
+
readonly columns: readonly GridTrack[];
|
|
63
|
+
readonly rows: readonly GridTrack[];
|
|
64
|
+
readonly areas: readonly string[];
|
|
65
|
+
readonly gap?: number;
|
|
66
|
+
readonly cells: Readonly<Record<string, FrameLayoutNode>>;
|
|
67
|
+
};
|
|
68
|
+
/** Context passed to overlay factory. */
|
|
69
|
+
export interface FrameOverlayContext<PageModel> {
|
|
70
|
+
/** Active page id. */
|
|
71
|
+
readonly activePageId: string;
|
|
72
|
+
/** Active page model. */
|
|
73
|
+
readonly pageModel: PageModel;
|
|
74
|
+
/** Absolute pane rectangles for the active page. */
|
|
75
|
+
readonly paneRects: ReadonlyMap<string, LayoutRect>;
|
|
76
|
+
/** Full-screen bounds. */
|
|
77
|
+
readonly screenRect: LayoutRect;
|
|
78
|
+
}
|
|
79
|
+
/** Page transition styles — a built-in name or a custom shader function. */
|
|
80
|
+
export type PageTransition = BuiltinTransition | TransitionShaderFn;
|
|
81
|
+
/** `createFramedApp()` options. */
|
|
82
|
+
export interface CreateFramedAppOptions<PageModel, Msg> {
|
|
83
|
+
/** Registered pages. */
|
|
84
|
+
readonly pages: readonly FramePage<PageModel, Msg>[];
|
|
85
|
+
/** Optional default page id (falls back to first page). */
|
|
86
|
+
readonly defaultPageId?: string;
|
|
87
|
+
/** Optional frame title. */
|
|
88
|
+
readonly title?: string;
|
|
89
|
+
/** Initial terminal width before runtime resize events. Default: 80. */
|
|
90
|
+
readonly initialColumns?: number;
|
|
91
|
+
/** Initial terminal height before runtime resize events. Default: 24. */
|
|
92
|
+
readonly initialRows?: number;
|
|
93
|
+
/** Optional global keymap layered above page keymap. */
|
|
94
|
+
readonly globalKeys?: KeyMap<Msg>;
|
|
95
|
+
/** Enable frame-level command palette (`ctrl+p` / `:`). */
|
|
96
|
+
readonly enableCommandPalette?: boolean;
|
|
97
|
+
/** Optional overlay provider (receives pane rects for panel scoping). */
|
|
98
|
+
readonly overlayFactory?: (ctx: FrameOverlayContext<PageModel>) => readonly Overlay[];
|
|
99
|
+
/** Optional page transition style. Default: 'none'. */
|
|
100
|
+
readonly transition?: PageTransition;
|
|
101
|
+
/** Transition duration in milliseconds. Default: 300. */
|
|
102
|
+
readonly transitionDuration?: number;
|
|
103
|
+
/** Optional function to determine the transition style dynamically. */
|
|
104
|
+
readonly transitionOverride?: (model: PageModel) => PageTransition;
|
|
105
|
+
/**
|
|
106
|
+
* Optional compiled timeline that drives the transition animation.
|
|
107
|
+
*
|
|
108
|
+
* Must contain a `'progress'` track that tweens from 0 to 1.
|
|
109
|
+
* When provided, replaces the default ease/duration with whatever
|
|
110
|
+
* the timeline defines — springs, multi-track orchestration, etc.
|
|
111
|
+
*
|
|
112
|
+
* ```ts
|
|
113
|
+
* import { timeline, EASINGS } from '@flyingrobots/bijou-tui';
|
|
114
|
+
*
|
|
115
|
+
* createFramedApp({
|
|
116
|
+
* transition: 'melt',
|
|
117
|
+
* transitionTimeline: timeline()
|
|
118
|
+
* .add('progress', {
|
|
119
|
+
* type: 'tween',
|
|
120
|
+
* from: 0, to: 1,
|
|
121
|
+
* duration: 600,
|
|
122
|
+
* ease: EASINGS.easeInOutCubic,
|
|
123
|
+
* })
|
|
124
|
+
* .build(),
|
|
125
|
+
* });
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
readonly transitionTimeline?: Timeline;
|
|
129
|
+
}
|
|
130
|
+
/** Stored pane scroll coordinates. */
|
|
131
|
+
export interface FramePaneScroll {
|
|
132
|
+
/** Horizontal offset. */
|
|
133
|
+
readonly x: number;
|
|
134
|
+
/** Vertical offset. */
|
|
135
|
+
readonly y: number;
|
|
136
|
+
}
|
|
137
|
+
/** Runtime model owned by the frame. */
|
|
138
|
+
export interface FrameModel<PageModel> {
|
|
139
|
+
/** Current active page id. */
|
|
140
|
+
readonly activePageId: string;
|
|
141
|
+
/** Stable page order. */
|
|
142
|
+
readonly pageOrder: readonly string[];
|
|
143
|
+
/** Current model per page id. */
|
|
144
|
+
readonly pageModels: Readonly<Record<string, PageModel>>;
|
|
145
|
+
/** Focused pane id per page (if any). */
|
|
146
|
+
readonly focusedPaneByPage: Readonly<Record<string, string | undefined>>;
|
|
147
|
+
/** Per-page/per-pane scroll positions. */
|
|
148
|
+
readonly scrollByPage: Readonly<Record<string, Readonly<Record<string, FramePaneScroll>>>>;
|
|
149
|
+
/** Current terminal width. */
|
|
150
|
+
readonly columns: number;
|
|
151
|
+
/** Current terminal height. */
|
|
152
|
+
readonly rows: number;
|
|
153
|
+
/** Help visibility flag. */
|
|
154
|
+
readonly helpOpen: boolean;
|
|
155
|
+
/** Command palette state (undefined when closed). */
|
|
156
|
+
readonly commandPalette?: CommandPaletteState;
|
|
157
|
+
/** ID of the page we are transitioning away from. */
|
|
158
|
+
readonly previousPageId?: string;
|
|
159
|
+
/** Transition progress (0 to 1). */
|
|
160
|
+
readonly transitionProgress: number;
|
|
161
|
+
/** Monotonic counter to discard stale transition ticks. */
|
|
162
|
+
readonly transitionGeneration: number;
|
|
163
|
+
/** Currently active transition style. */
|
|
164
|
+
readonly activeTransition?: PageTransition;
|
|
165
|
+
/** Wall-clock start time of the active transition (ms since epoch). */
|
|
166
|
+
readonly transitionStartMs?: number;
|
|
167
|
+
/** Compiled timeline driving the active transition. */
|
|
168
|
+
readonly transitionTimeline?: Timeline;
|
|
169
|
+
/** Timeline state for the active transition. */
|
|
170
|
+
readonly transitionTimelineState?: TimelineState;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Create a fully framed TEA app shell.
|
|
174
|
+
*/
|
|
175
|
+
export declare function createFramedApp<PageModel, Msg>(options: CreateFramedAppOptions<PageModel, Msg>): App<FrameModel<PageModel>, Msg>;
|
|
176
|
+
//# sourceMappingURL=app-frame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-frame.d.ts","sourceRoot":"","sources":["../src/app-frame.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAIL,KAAK,MAAM,EACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAU,MAAM,YAAY,CAAC;AAEnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,KAAK,iBAAiB,EAAsB,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAYpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAWL,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAA8B,KAAK,kBAAkB,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC3G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,EAAY,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAE5E,4DAA4D;AAC5D,MAAM,WAAW,SAAS,CAAC,SAAS,EAAE,GAAG;IACvC,sBAAsB;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,iDAAiD;IACjD,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5D,wBAAwB;IACxB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,eAAe,CAAC;IAC1C,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,qCAAqC;IACrC,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gFAAgF;IAChF,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,SAAS,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;CACvE;AAED,yEAAyE;AACzE,MAAM,WAAW,gBAAgB,CAAC,GAAG,CAAE,SAAQ,kBAAkB;IAC/D,qDAAqD;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC;CACvB;AAED,qCAAqC;AACrC,MAAM,MAAM,eAAe,GACvB;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;CAC3D,CAAC;AAEJ,yCAAyC;AACzC,MAAM,WAAW,mBAAmB,CAAC,SAAS;IAC5C,sBAAsB;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,yBAAyB;IACzB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpD,0BAA0B;IAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAED,4EAA4E;AAC5E,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAEpE,mCAAmC;AACnC,MAAM,WAAW,sBAAsB,CAAC,SAAS,EAAE,GAAG;IACpD,wBAAwB;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;IACrD,2DAA2D;IAC3D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,yEAAyE;IACzE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,CAAC,SAAS,CAAC,KAAK,SAAS,OAAO,EAAE,CAAC;IACtF,uDAAuD;IACvD,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC;IACrC,yDAAyD;IACzD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,uEAAuE;IACvE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,cAAc,CAAC;IACnE;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,QAAQ,CAAC;CACxC;AAED,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wCAAwC;AACxC,MAAM,WAAW,UAAU,CAAC,SAAS;IACnC,8BAA8B;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,yBAAyB;IACzB,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,iCAAiC;IACjC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACzD,yCAAyC;IACzC,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACzE,0CAA0C;IAC1C,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,qDAAqD;IACrD,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IAC9C,qDAAqD;IACrD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,oCAAoC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,2DAA2D;IAC3D,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,yCAAyC;IACzC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAC3C,uEAAuE;IACvE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,uDAAuD;IACvD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,QAAQ,CAAC;IACvC,gDAAgD;IAChD,QAAQ,CAAC,uBAAuB,CAAC,EAAE,aAAa,CAAC;CAClD;AAmED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,GAAG,EAC5C,OAAO,EAAE,sBAAsB,CAAC,SAAS,EAAE,GAAG,CAAC,GAC9C,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAoPjC"}
|