@zakmandhro/bunti 0.1.4 → 0.2.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/AGENTS.md +65 -0
- package/README.md +145 -34
- package/dist/cli.d.ts +44 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +147 -0
- package/dist/cli.js.map +1 -0
- package/dist/colors.d.ts +144 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +426 -0
- package/dist/colors.js.map +1 -0
- package/dist/components/Box.d.ts +11 -0
- package/dist/components/Box.d.ts.map +1 -0
- package/dist/components/Box.js +9 -0
- package/dist/components/Box.js.map +1 -0
- package/dist/components/Button.d.ts +24 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +102 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Card.d.ts +33 -0
- package/dist/components/Card.d.ts.map +1 -0
- package/dist/components/Card.js +79 -0
- package/dist/components/Card.js.map +1 -0
- package/dist/components/Header.d.ts +23 -0
- package/dist/components/Header.d.ts.map +1 -0
- package/dist/components/Header.js +58 -0
- package/dist/components/Header.js.map +1 -0
- package/dist/components/Input.d.ts +25 -0
- package/dist/components/Input.d.ts.map +1 -0
- package/dist/components/Input.js +232 -0
- package/dist/components/Input.js.map +1 -0
- package/dist/components/Link.d.ts +21 -0
- package/dist/components/Link.d.ts.map +1 -0
- package/dist/components/Link.js +29 -0
- package/dist/components/Link.js.map +1 -0
- package/dist/components/Modal.d.ts +38 -0
- package/dist/components/Modal.d.ts.map +1 -0
- package/dist/components/Modal.js +87 -0
- package/dist/components/Modal.js.map +1 -0
- package/dist/components/Progress.d.ts +27 -0
- package/dist/components/Progress.d.ts.map +1 -0
- package/dist/components/Progress.js +39 -0
- package/dist/components/Progress.js.map +1 -0
- package/dist/components/Spinner.d.ts +19 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +27 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/index.d.ts +10 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +10 -0
- package/dist/components/index.js.map +1 -0
- package/dist/data/nf-glyphs.d.ts +11 -0
- package/dist/data/nf-glyphs.d.ts.map +1 -0
- package/dist/data/nf-glyphs.js +535 -0
- package/dist/data/nf-glyphs.js.map +1 -0
- package/dist/data/nf-names.d.ts +8 -0
- package/dist/data/nf-names.d.ts.map +1 -0
- package/dist/data/nf-names.js +2 -0
- package/dist/data/nf-names.js.map +1 -0
- package/dist/demo-registry.d.ts +27 -0
- package/dist/demo-registry.d.ts.map +1 -0
- package/dist/demo-registry.js +57 -0
- package/dist/demo-registry.js.map +1 -0
- package/dist/demos/2048.ts +743 -0
- package/dist/demos/animation.ts +246 -0
- package/dist/demos/demo-layout.ts +124 -0
- package/dist/demos/engine.ts +374 -0
- package/dist/demos/interaction.ts +91 -0
- package/dist/demos/login.ts +203 -0
- package/dist/demos/mission-control.ts +558 -0
- package/dist/demos/showcase.ts +224 -0
- package/dist/detect.d.ts +104 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +227 -0
- package/dist/detect.js.map +1 -0
- package/dist/diagnostics.d.ts +73 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +225 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/dsl/context.d.ts +11 -0
- package/dist/dsl/context.d.ts.map +1 -0
- package/dist/dsl/context.js +563 -0
- package/dist/dsl/context.js.map +1 -0
- package/dist/dsl/hooks.d.ts +12 -0
- package/dist/dsl/hooks.d.ts.map +1 -0
- package/dist/dsl/hooks.js +148 -0
- package/dist/dsl/hooks.js.map +1 -0
- package/dist/dsl/interaction.d.ts +16 -0
- package/dist/dsl/interaction.d.ts.map +1 -0
- package/dist/dsl/interaction.js +101 -0
- package/dist/dsl/interaction.js.map +1 -0
- package/dist/dsl/layers.d.ts +14 -0
- package/dist/dsl/layers.d.ts.map +1 -0
- package/dist/dsl/layers.js +87 -0
- package/dist/dsl/layers.js.map +1 -0
- package/dist/dsl/motion.d.ts +10 -0
- package/dist/dsl/motion.d.ts.map +1 -0
- package/dist/dsl/motion.js +150 -0
- package/dist/dsl/motion.js.map +1 -0
- package/dist/dsl/render.d.ts +22 -0
- package/dist/dsl/render.d.ts.map +1 -0
- package/dist/dsl/render.js +69 -0
- package/dist/dsl/render.js.map +1 -0
- package/dist/dsl/types.d.ts +510 -0
- package/dist/dsl/types.d.ts.map +1 -0
- package/dist/dsl/types.js +33 -0
- package/dist/dsl/types.js.map +1 -0
- package/dist/dsl.d.ts +18 -0
- package/dist/dsl.d.ts.map +1 -0
- package/dist/dsl.js +17 -0
- package/dist/dsl.js.map +1 -0
- package/dist/easing.d.ts +45 -0
- package/dist/easing.d.ts.map +1 -0
- package/dist/easing.js +121 -0
- package/dist/easing.js.map +1 -0
- package/dist/geometry.d.ts +77 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/geometry.js +130 -0
- package/dist/geometry.js.map +1 -0
- package/dist/icons-full.d.ts +5 -0
- package/dist/icons-full.d.ts.map +1 -0
- package/dist/icons-full.js +31 -0
- package/dist/icons-full.js.map +1 -0
- package/dist/icons.d.ts +442 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +314 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +228 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/input.d.ts +177 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +533 -0
- package/dist/input.js.map +1 -0
- package/dist/layout.d.ts +194 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +673 -0
- package/dist/layout.js.map +1 -0
- package/dist/render.d.ts +49 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +650 -0
- package/dist/render.js.map +1 -0
- package/dist/state.d.ts +226 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +130 -0
- package/dist/state.js.map +1 -0
- package/dist/theme.d.ts +129 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +167 -0
- package/dist/theme.js.map +1 -0
- package/dist/themes/catppuccin-mocha.d.ts +19 -0
- package/dist/themes/catppuccin-mocha.d.ts.map +1 -0
- package/dist/themes/catppuccin-mocha.js +36 -0
- package/dist/themes/catppuccin-mocha.js.map +1 -0
- package/dist/themes/dracula.d.ts +21 -0
- package/dist/themes/dracula.d.ts.map +1 -0
- package/dist/themes/dracula.js +37 -0
- package/dist/themes/dracula.js.map +1 -0
- package/dist/themes/github-light.d.ts +21 -0
- package/dist/themes/github-light.d.ts.map +1 -0
- package/dist/themes/github-light.js +36 -0
- package/dist/themes/github-light.js.map +1 -0
- package/dist/themes/index.d.ts +19 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +17 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/nord.d.ts +23 -0
- package/dist/themes/nord.d.ts.map +1 -0
- package/dist/themes/nord.js +38 -0
- package/dist/themes/nord.js.map +1 -0
- package/dist/themes/one-dark-pro.d.ts +21 -0
- package/dist/themes/one-dark-pro.d.ts.map +1 -0
- package/dist/themes/one-dark-pro.js +36 -0
- package/dist/themes/one-dark-pro.js.map +1 -0
- package/dist/themes/tokyo-night.d.ts +20 -0
- package/dist/themes/tokyo-night.d.ts.map +1 -0
- package/dist/themes/tokyo-night.js +37 -0
- package/dist/themes/tokyo-night.js.map +1 -0
- package/dist/utils.d.ts +28 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +158 -0
- package/dist/utils.js.map +1 -0
- package/dist/vendor/colors.d.ts +45 -0
- package/dist/vendor/colors.d.ts.map +1 -0
- package/dist/vendor/colors.js +72 -0
- package/dist/vendor/colors.js.map +1 -0
- package/llms.txt +79 -0
- package/package.json +52 -11
- package/src/colors.ts +0 -255
- package/src/components/Button.ts +0 -104
- package/src/components/Card.ts +0 -53
- package/src/components/Header.ts +0 -65
- package/src/components/Input.ts +0 -124
- package/src/components/index.ts +0 -4
- package/src/data/glyphs.ts +0 -30
- package/src/detect.ts +0 -60
- package/src/dsl.ts +0 -661
- package/src/icons.ts +0 -186
- package/src/index.ts +0 -72
- package/src/layout.ts +0 -640
- package/src/render.ts +0 -302
- package/src/state.ts +0 -148
- package/src/utils.ts +0 -165
package/dist/render.js
ADDED
|
@@ -0,0 +1,650 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bunti Functional Rendering & Diffing
|
|
3
|
+
*/
|
|
4
|
+
import { hintKeyboardStdinNotTTY } from './diagnostics';
|
|
5
|
+
import { createKeyEvent, HeldKeyTracker, InputTokenizer, } from './input';
|
|
6
|
+
import { ANSI, resizeScreen } from './state';
|
|
7
|
+
/**
|
|
8
|
+
* Crash safety: every screen with an active render loop is tracked here so
|
|
9
|
+
* that process-level failure handlers can restore the terminal no matter how
|
|
10
|
+
* the process goes down (throw, unhandled rejection, exit, SIGHUP).
|
|
11
|
+
*/
|
|
12
|
+
const activeScreens = new Set();
|
|
13
|
+
/**
|
|
14
|
+
* Emits the restorative ANSI sequence for a screen (mouse/focus tracking off,
|
|
15
|
+
* reset, clear, back to main buffer, cursor visible) and disables raw mode.
|
|
16
|
+
* Idempotent: safe to call any number of times per loop session.
|
|
17
|
+
*/
|
|
18
|
+
export function restoreTerminal(state) {
|
|
19
|
+
if (state.isRestored)
|
|
20
|
+
return;
|
|
21
|
+
state.isRestored = true;
|
|
22
|
+
const options = state.options;
|
|
23
|
+
let cmd = '';
|
|
24
|
+
if (state.pointerShape === 'pointer') {
|
|
25
|
+
cmd += OSC_POINTER_DEFAULT;
|
|
26
|
+
state.pointerShape = 'default';
|
|
27
|
+
}
|
|
28
|
+
if (options.mouse)
|
|
29
|
+
cmd += ANSI.mouseDisable;
|
|
30
|
+
if (options.focus)
|
|
31
|
+
cmd += ANSI.focusDisable;
|
|
32
|
+
cmd += ANSI.reset + ANSI.clear + ANSI.home;
|
|
33
|
+
if (options.alternateBuffer)
|
|
34
|
+
cmd += ANSI.mainBuffer;
|
|
35
|
+
cmd += ANSI.showCursor;
|
|
36
|
+
cmd += ANSI.reset;
|
|
37
|
+
try {
|
|
38
|
+
process.stdout.write(cmd);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// stdout may already be gone (e.g. terminal closed on SIGHUP)
|
|
42
|
+
}
|
|
43
|
+
if (process.stdin.isTTY) {
|
|
44
|
+
try {
|
|
45
|
+
process.stdin.setRawMode(false);
|
|
46
|
+
process.stdin.pause();
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// stdin may already be destroyed
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function restoreAllScreens() {
|
|
54
|
+
for (const screen of activeScreens)
|
|
55
|
+
restoreTerminal(screen);
|
|
56
|
+
}
|
|
57
|
+
function formatError(err) {
|
|
58
|
+
if (err instanceof Error)
|
|
59
|
+
return err.stack ?? `${err.name}: ${err.message}`;
|
|
60
|
+
return String(err);
|
|
61
|
+
}
|
|
62
|
+
/** Restore first, then report on the main screen, then die like the runtime would. */
|
|
63
|
+
const onUncaughtException = (err) => {
|
|
64
|
+
restoreAllScreens();
|
|
65
|
+
process.stderr.write(`${formatError(err)}\n`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
};
|
|
68
|
+
const onUnhandledRejection = (reason) => {
|
|
69
|
+
restoreAllScreens();
|
|
70
|
+
process.stderr.write(`${formatError(reason)}\n`);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
};
|
|
73
|
+
/** 'exit' must stay synchronous: restore only, never exit() or async work. */
|
|
74
|
+
const onProcessExit = () => {
|
|
75
|
+
restoreAllScreens();
|
|
76
|
+
};
|
|
77
|
+
const onSighup = () => {
|
|
78
|
+
restoreAllScreens();
|
|
79
|
+
process.exit(129); // 128 + SIGHUP(1), matching default signal death
|
|
80
|
+
};
|
|
81
|
+
let crashHandlersInstalled = false;
|
|
82
|
+
function installCrashHandlers() {
|
|
83
|
+
if (crashHandlersInstalled)
|
|
84
|
+
return;
|
|
85
|
+
crashHandlersInstalled = true;
|
|
86
|
+
process.on('uncaughtException', onUncaughtException);
|
|
87
|
+
process.on('unhandledRejection', onUnhandledRejection);
|
|
88
|
+
process.on('exit', onProcessExit);
|
|
89
|
+
process.on('SIGHUP', onSighup);
|
|
90
|
+
}
|
|
91
|
+
function removeCrashHandlers() {
|
|
92
|
+
if (!crashHandlersInstalled)
|
|
93
|
+
return;
|
|
94
|
+
crashHandlersInstalled = false;
|
|
95
|
+
process.removeListener('uncaughtException', onUncaughtException);
|
|
96
|
+
process.removeListener('unhandledRejection', onUnhandledRejection);
|
|
97
|
+
process.removeListener('exit', onProcessExit);
|
|
98
|
+
process.removeListener('SIGHUP', onSighup);
|
|
99
|
+
}
|
|
100
|
+
export function syncScreenSize(state) {
|
|
101
|
+
const width = process.stdout.columns || 80;
|
|
102
|
+
const height = process.stdout.rows || 24;
|
|
103
|
+
if (state.width !== width || state.height !== height) {
|
|
104
|
+
resizeScreen(state);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
export function isResizeSettled(state, now = Date.now()) {
|
|
110
|
+
return !state.isResizing || now >= (state.resizeSettlesAt ?? 0);
|
|
111
|
+
}
|
|
112
|
+
export function clearTerminalForResize(state) {
|
|
113
|
+
const sync = state.syncOutput !== false;
|
|
114
|
+
process.stdout.write((sync ? ANSI.syncStart : '') +
|
|
115
|
+
ANSI.clear +
|
|
116
|
+
ANSI.home +
|
|
117
|
+
(sync ? ANSI.syncEnd : ''));
|
|
118
|
+
state.needsFullRedraw = true;
|
|
119
|
+
}
|
|
120
|
+
/** Copies a back-buffer cell's fields onto its front-buffer counterpart. */
|
|
121
|
+
function syncFrontCell(front, cell) {
|
|
122
|
+
front.char = cell.char;
|
|
123
|
+
front.fg = cell.fg;
|
|
124
|
+
front.bg = cell.bg;
|
|
125
|
+
front.fgCode = cell.fgCode;
|
|
126
|
+
front.bgCode = cell.bgCode;
|
|
127
|
+
front.bold = cell.bold;
|
|
128
|
+
front.italic = cell.italic;
|
|
129
|
+
front.underline = cell.underline;
|
|
130
|
+
front.dim = cell.dim;
|
|
131
|
+
front.strike = cell.strike;
|
|
132
|
+
front.skip = cell.skip;
|
|
133
|
+
}
|
|
134
|
+
/** OSC 22 mouse-cursor shapes (xterm pointer-shape protocol). */
|
|
135
|
+
const OSC_POINTER = '\x1b]22;pointer\x1b\\';
|
|
136
|
+
const OSC_POINTER_DEFAULT = '\x1b]22;default\x1b\\';
|
|
137
|
+
/**
|
|
138
|
+
* OSC 22 pointer cursor: emits the 'pointer' shape when any hitbox
|
|
139
|
+
* registered this frame is under the mouse, and resets to 'default' on the
|
|
140
|
+
* hover-off edge. Emission is edge-triggered (once per state change, never
|
|
141
|
+
* per frame). Gated off for Apple Terminal, which does not understand
|
|
142
|
+
* OSC 22; everywhere else an unsupported sequence is harmlessly ignored.
|
|
143
|
+
*/
|
|
144
|
+
export function updatePointerShape(state) {
|
|
145
|
+
if (!state.options.mouse)
|
|
146
|
+
return;
|
|
147
|
+
if (state.terminal?.app === 'apple-terminal')
|
|
148
|
+
return;
|
|
149
|
+
let hovered = false;
|
|
150
|
+
for (const box of state.hitboxes.values()) {
|
|
151
|
+
if (state.mouseX >= box.x &&
|
|
152
|
+
state.mouseX < box.x + box.width &&
|
|
153
|
+
state.mouseY >= box.y &&
|
|
154
|
+
state.mouseY < box.y + box.height) {
|
|
155
|
+
hovered = true;
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const shape = hovered ? 'pointer' : 'default';
|
|
160
|
+
if (shape === (state.pointerShape ?? 'default'))
|
|
161
|
+
return;
|
|
162
|
+
state.pointerShape = shape;
|
|
163
|
+
try {
|
|
164
|
+
process.stdout.write(hovered ? OSC_POINTER : OSC_POINTER_DEFAULT);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// stdout may already be gone during teardown
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Diffs back and front buffers and assembles the ANSI update string.
|
|
172
|
+
* Mutates the front buffer and the state's SGR trackers exactly like a real
|
|
173
|
+
* flush, but performs no I/O — flush() writes the result, tests assert on it.
|
|
174
|
+
*/
|
|
175
|
+
export function renderFrame(state) {
|
|
176
|
+
let renderString = state.needsFullRedraw ? ANSI.clear + ANSI.home : '';
|
|
177
|
+
let lastFg = state.lastFg;
|
|
178
|
+
let lastBg = state.lastBg;
|
|
179
|
+
let lastBold = state.lastBold ?? false;
|
|
180
|
+
let lastItalic = state.lastItalic ?? false;
|
|
181
|
+
let lastUnderline = state.lastUnderline ?? false;
|
|
182
|
+
let lastDim = state.lastDim ?? false;
|
|
183
|
+
let lastStrike = state.lastStrike ?? false;
|
|
184
|
+
const width = state.width;
|
|
185
|
+
const height = state.height;
|
|
186
|
+
for (let y = 0; y < height; y++) {
|
|
187
|
+
let firstDirty = -1;
|
|
188
|
+
let lastDirty = -1;
|
|
189
|
+
const rowOffset = y * width;
|
|
190
|
+
for (let x = 0; x < width; x++) {
|
|
191
|
+
const idx = rowOffset + x;
|
|
192
|
+
const b = state.backBuffer[idx];
|
|
193
|
+
const f = state.frontBuffer[idx];
|
|
194
|
+
if (b.char !== f.char ||
|
|
195
|
+
b.fg !== f.fg ||
|
|
196
|
+
b.bg !== f.bg ||
|
|
197
|
+
!!b.bold !== !!f.bold ||
|
|
198
|
+
!!b.italic !== !!f.italic ||
|
|
199
|
+
!!b.underline !== !!f.underline ||
|
|
200
|
+
!!b.dim !== !!f.dim ||
|
|
201
|
+
!!b.strike !== !!f.strike ||
|
|
202
|
+
!!b.skip !== !!f.skip) {
|
|
203
|
+
if (firstDirty === -1)
|
|
204
|
+
firstDirty = x;
|
|
205
|
+
lastDirty = x;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (firstDirty !== -1) {
|
|
209
|
+
renderString += `\x1b[${y + 1};${firstDirty + 1}H`;
|
|
210
|
+
for (let x = firstDirty; x <= lastDirty; x++) {
|
|
211
|
+
const idx = rowOffset + x;
|
|
212
|
+
const cell = state.backBuffer[idx];
|
|
213
|
+
const front = state.frontBuffer[idx];
|
|
214
|
+
if (cell.skip || cell.char === '') {
|
|
215
|
+
syncFrontCell(front, cell);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
const fg = cell.fgCode;
|
|
219
|
+
const bg = cell.bgCode;
|
|
220
|
+
const bold = !!cell.bold;
|
|
221
|
+
const dim = !!cell.dim;
|
|
222
|
+
const italic = !!cell.italic;
|
|
223
|
+
const underline = !!cell.underline;
|
|
224
|
+
const strike = !!cell.strike;
|
|
225
|
+
if (bold !== lastBold || dim !== lastDim) {
|
|
226
|
+
// SGR 22 clears BOTH bold and dim, so they are emitted jointly:
|
|
227
|
+
// if either must turn off, emit 22 and re-assert the survivor.
|
|
228
|
+
if ((lastBold && !bold) || (lastDim && !dim)) {
|
|
229
|
+
renderString += '\x1b[22m';
|
|
230
|
+
if (bold)
|
|
231
|
+
renderString += '\x1b[1m';
|
|
232
|
+
if (dim)
|
|
233
|
+
renderString += '\x1b[2m';
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
if (bold && !lastBold)
|
|
237
|
+
renderString += '\x1b[1m';
|
|
238
|
+
if (dim && !lastDim)
|
|
239
|
+
renderString += '\x1b[2m';
|
|
240
|
+
}
|
|
241
|
+
lastBold = bold;
|
|
242
|
+
lastDim = dim;
|
|
243
|
+
}
|
|
244
|
+
if (italic !== lastItalic) {
|
|
245
|
+
renderString += italic ? '\x1b[3m' : '\x1b[23m';
|
|
246
|
+
lastItalic = italic;
|
|
247
|
+
}
|
|
248
|
+
if (underline !== lastUnderline) {
|
|
249
|
+
renderString += underline ? '\x1b[4m' : '\x1b[24m';
|
|
250
|
+
lastUnderline = underline;
|
|
251
|
+
}
|
|
252
|
+
if (strike !== lastStrike) {
|
|
253
|
+
renderString += strike ? '\x1b[9m' : '\x1b[29m';
|
|
254
|
+
lastStrike = strike;
|
|
255
|
+
}
|
|
256
|
+
if (fg !== lastFg || bg !== lastBg) {
|
|
257
|
+
if (fg === undefined && bg === undefined) {
|
|
258
|
+
renderString += '\x1b[0m';
|
|
259
|
+
// SGR 0 wipes every attribute; re-assert the active ones.
|
|
260
|
+
if (lastBold)
|
|
261
|
+
renderString += '\x1b[1m';
|
|
262
|
+
if (lastDim)
|
|
263
|
+
renderString += '\x1b[2m';
|
|
264
|
+
if (lastItalic)
|
|
265
|
+
renderString += '\x1b[3m';
|
|
266
|
+
if (lastUnderline)
|
|
267
|
+
renderString += '\x1b[4m';
|
|
268
|
+
if (lastStrike)
|
|
269
|
+
renderString += '\x1b[9m';
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
// Foreground
|
|
273
|
+
if (fg !== lastFg) {
|
|
274
|
+
if (fg === undefined) {
|
|
275
|
+
renderString += '\x1b[39m';
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
const fgStr = String(fg);
|
|
279
|
+
if (fgStr.startsWith('2;')) {
|
|
280
|
+
renderString += `\x1b[38;${fgStr}m`;
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
renderString += `\x1b[38;5;${fgStr}m`;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Background
|
|
288
|
+
if (bg !== lastBg) {
|
|
289
|
+
if (bg === undefined) {
|
|
290
|
+
renderString += '\x1b[49m';
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
const bgStr = String(bg);
|
|
294
|
+
if (bgStr.startsWith('2;')) {
|
|
295
|
+
renderString += `\x1b[48;${bgStr}m`;
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
renderString += `\x1b[48;5;${bgStr}m`;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
lastFg = fg;
|
|
304
|
+
lastBg = bg;
|
|
305
|
+
}
|
|
306
|
+
renderString += cell.char;
|
|
307
|
+
syncFrontCell(front, cell);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
state.needsFullRedraw = false;
|
|
312
|
+
state.lastFg = lastFg;
|
|
313
|
+
state.lastBg = lastBg;
|
|
314
|
+
state.lastBold = lastBold;
|
|
315
|
+
state.lastItalic = lastItalic;
|
|
316
|
+
state.lastUnderline = lastUnderline;
|
|
317
|
+
state.lastDim = lastDim;
|
|
318
|
+
state.lastStrike = lastStrike;
|
|
319
|
+
return renderString;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Diffs back and front buffers surgically and writes the update to stdout.
|
|
323
|
+
*/
|
|
324
|
+
export function flush(state) {
|
|
325
|
+
const renderString = renderFrame(state);
|
|
326
|
+
if (renderString) {
|
|
327
|
+
const writer = Bun.stdout.writer();
|
|
328
|
+
// Synchronized-output wrap (mode 2026) is gated on the detected profile:
|
|
329
|
+
// emitted unless the terminal was positively identified as lacking it
|
|
330
|
+
// (state.syncOutput === false). Absent/unknown profiles keep the wrap.
|
|
331
|
+
const sync = state.syncOutput !== false;
|
|
332
|
+
writer.write((sync ? ANSI.syncStart : '') +
|
|
333
|
+
(state.options.hideCursor ? ANSI.hideCursor : '') +
|
|
334
|
+
renderString +
|
|
335
|
+
(sync ? ANSI.syncEnd : ''));
|
|
336
|
+
writer.flush();
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Starts the render loop for a given screen state.
|
|
341
|
+
*/
|
|
342
|
+
export function loop(state, renderCallback) {
|
|
343
|
+
if (activeScreens.size > 0) {
|
|
344
|
+
throw new Error('A Bunti render loop is already active in this process. ' +
|
|
345
|
+
'Stop it first (requestStop or Ctrl+C) before calling render() again.');
|
|
346
|
+
}
|
|
347
|
+
const options = state.options;
|
|
348
|
+
// Dev hint: keyboard input silently does nothing on piped stdin.
|
|
349
|
+
hintKeyboardStdinNotTTY(options.keyboard === true, process.stdin.isTTY === true);
|
|
350
|
+
state.isRestored = false;
|
|
351
|
+
activeScreens.add(state);
|
|
352
|
+
installCrashHandlers();
|
|
353
|
+
if (options.alternateBuffer)
|
|
354
|
+
process.stdout.write(ANSI.alternateBuffer);
|
|
355
|
+
if (options.hideCursor)
|
|
356
|
+
process.stdout.write(ANSI.hideCursor);
|
|
357
|
+
return new Promise((resolve, reject) => {
|
|
358
|
+
let stopped = false;
|
|
359
|
+
let interval = null;
|
|
360
|
+
const setupInput = () => {
|
|
361
|
+
let cmd = '';
|
|
362
|
+
if (options.mouse)
|
|
363
|
+
cmd += ANSI.mouseEnable;
|
|
364
|
+
if (options.focus)
|
|
365
|
+
cmd += ANSI.focusEnable;
|
|
366
|
+
if (cmd)
|
|
367
|
+
process.stdout.write(cmd);
|
|
368
|
+
if (process.stdin.isTTY) {
|
|
369
|
+
process.stdin.setRawMode(true);
|
|
370
|
+
process.stdin.resume();
|
|
371
|
+
process.stdin.on('data', inputHandler);
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
const inputHandler = (data) => applyInputToState(state, data, stop);
|
|
375
|
+
/**
|
|
376
|
+
* Tears the loop down exactly once: clears the interval, removes every
|
|
377
|
+
* listener this loop registered, restores the terminal, then settles the
|
|
378
|
+
* promise (rejecting with `failure.error` when a frame crashed).
|
|
379
|
+
*/
|
|
380
|
+
const finish = (failure) => {
|
|
381
|
+
if (stopped)
|
|
382
|
+
return;
|
|
383
|
+
stopped = true;
|
|
384
|
+
state.isStopped = true;
|
|
385
|
+
if (interval)
|
|
386
|
+
clearInterval(interval);
|
|
387
|
+
// 1. Remove Listeners
|
|
388
|
+
state.inputTokenizer?.dispose();
|
|
389
|
+
process.stdin.removeListener('data', inputHandler);
|
|
390
|
+
process.removeListener('SIGWINCH', resizeHandler);
|
|
391
|
+
process.removeListener('SIGINT', stop);
|
|
392
|
+
process.removeListener('SIGTERM', stop);
|
|
393
|
+
activeScreens.delete(state);
|
|
394
|
+
if (activeScreens.size === 0)
|
|
395
|
+
removeCrashHandlers();
|
|
396
|
+
// 2. Restore Terminal Modes + Emit Restorative ANSI Sequence
|
|
397
|
+
restoreTerminal(state);
|
|
398
|
+
if (failure) {
|
|
399
|
+
reject(failure.error);
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
resolve();
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
const stop = () => finish(null);
|
|
406
|
+
const resizeHandler = () => {
|
|
407
|
+
resizeScreen(state);
|
|
408
|
+
clearTerminalForResize(state);
|
|
409
|
+
requestTick();
|
|
410
|
+
};
|
|
411
|
+
let ticking = false;
|
|
412
|
+
let tickAgain = false;
|
|
413
|
+
const tick = () => {
|
|
414
|
+
if (ticking) {
|
|
415
|
+
tickAgain = true;
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
ticking = true;
|
|
419
|
+
try {
|
|
420
|
+
do {
|
|
421
|
+
tickAgain = false;
|
|
422
|
+
const resized = syncScreenSize(state);
|
|
423
|
+
if (resized) {
|
|
424
|
+
clearTerminalForResize(state);
|
|
425
|
+
}
|
|
426
|
+
if (!isResizeSettled(state)) {
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
state.isResizing = false;
|
|
430
|
+
if (stopped || state.isStopped)
|
|
431
|
+
return;
|
|
432
|
+
drainFrameInput(state);
|
|
433
|
+
// Frame timing: loop() owns the clock. dt is clamped so a
|
|
434
|
+
// suspended process doesn't produce a giant catch-up step.
|
|
435
|
+
const now = Date.now();
|
|
436
|
+
state.dt =
|
|
437
|
+
state.lastFrameAt === undefined
|
|
438
|
+
? 0
|
|
439
|
+
: Math.min(100, now - state.lastFrameAt);
|
|
440
|
+
state.lastFrameAt = now;
|
|
441
|
+
state.frameCount = (state.frameCount ?? 0) + 1;
|
|
442
|
+
renderCallback(state);
|
|
443
|
+
if (stopped || state.isStopped)
|
|
444
|
+
return;
|
|
445
|
+
flush(state);
|
|
446
|
+
// OSC 22 mouse-cursor shape reacts to this frame's hitboxes.
|
|
447
|
+
updatePointerShape(state);
|
|
448
|
+
} while (tickAgain);
|
|
449
|
+
}
|
|
450
|
+
catch (err) {
|
|
451
|
+
// Never write errors into the alt screen and never keep looping over
|
|
452
|
+
// a broken frame. Either the app opts into continuing via onError,
|
|
453
|
+
// or we tear down (restoring the terminal) and reject the loop
|
|
454
|
+
// promise so the error surfaces once, on the main screen.
|
|
455
|
+
let shouldContinue = false;
|
|
456
|
+
if (options.onError) {
|
|
457
|
+
try {
|
|
458
|
+
shouldContinue = options.onError(err) === 'continue';
|
|
459
|
+
}
|
|
460
|
+
catch {
|
|
461
|
+
shouldContinue = false; // a broken error handler never saves the loop
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
if (!shouldContinue) {
|
|
465
|
+
finish({ error: err });
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
finally {
|
|
469
|
+
ticking = false;
|
|
470
|
+
}
|
|
471
|
+
};
|
|
472
|
+
const requestTick = () => {
|
|
473
|
+
if (ticking) {
|
|
474
|
+
tickAgain = true;
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
tick();
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
const restartLoop = () => {
|
|
481
|
+
if (interval)
|
|
482
|
+
clearInterval(interval);
|
|
483
|
+
const fps = state.hasFocus ? options.fps || 60 : 5;
|
|
484
|
+
interval = setInterval(tick, 1000 / fps);
|
|
485
|
+
requestTick();
|
|
486
|
+
};
|
|
487
|
+
if (options.mouse || options.focus || options.keyboard)
|
|
488
|
+
setupInput();
|
|
489
|
+
process.on('SIGWINCH', resizeHandler);
|
|
490
|
+
process.on('SIGINT', stop);
|
|
491
|
+
process.on('SIGTERM', stop);
|
|
492
|
+
state.restartLoop = restartLoop;
|
|
493
|
+
state.requestTick = requestTick;
|
|
494
|
+
state.requestStop = stop;
|
|
495
|
+
restartLoop();
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
function requestTick(state) {
|
|
499
|
+
state.requestTick?.();
|
|
500
|
+
}
|
|
501
|
+
function heldTracker(state) {
|
|
502
|
+
state.heldKeys ??= new HeldKeyTracker({
|
|
503
|
+
holdWindowMs: state.options.holdWindowMs,
|
|
504
|
+
});
|
|
505
|
+
return state.heldKeys;
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Classifies a key event (press vs repeat), enqueues it, and mirrors the
|
|
509
|
+
* legacy `state.lastKey` slot. Ctrl+C keeps its stop/SIGINT behavior and
|
|
510
|
+
* never enters the queue.
|
|
511
|
+
*/
|
|
512
|
+
function enqueueKeyEvent(state, event, stop) {
|
|
513
|
+
if (event.ctrl && event.key === 'c') {
|
|
514
|
+
stop?.(); // Ctrl+C
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
const classified = heldTracker(state).record(event);
|
|
518
|
+
state.keyQueue.push(classified);
|
|
519
|
+
// Back-compat: lastKey only ever carries unmodified key names, so ctrl
|
|
520
|
+
// bytes no longer leak into text consumers like Input.
|
|
521
|
+
if (!classified.ctrl && !classified.alt && classified.kind !== 'release') {
|
|
522
|
+
state.lastKey = classified.key;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* SGR mouse semantics:
|
|
527
|
+
* - wheel (bit 64): wheel_up / wheel_down key events, no press state
|
|
528
|
+
* - motion (bit 32): coordinates only (drags keep the pressed button)
|
|
529
|
+
* - press 'M': records the press origin; no click yet
|
|
530
|
+
* - release 'm': emits 'click' ONCE at the press-origin coordinates
|
|
531
|
+
*/
|
|
532
|
+
function dispatchMouse(state, token, stop) {
|
|
533
|
+
const button = token.button;
|
|
534
|
+
state.mouseX = token.x - 1;
|
|
535
|
+
state.mouseY = token.y - 1;
|
|
536
|
+
if (button & 64) {
|
|
537
|
+
// Wheel
|
|
538
|
+
state.mouseButton = button;
|
|
539
|
+
if (token.action === 'press') {
|
|
540
|
+
if (button === 64) {
|
|
541
|
+
enqueueKeyEvent(state, createKeyEvent('wheel_up', token.raw), stop);
|
|
542
|
+
}
|
|
543
|
+
else if (button === 65) {
|
|
544
|
+
enqueueKeyEvent(state, createKeyEvent('wheel_down', token.raw), stop);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
else if (button & 32) {
|
|
549
|
+
// Motion. Base 3 = no buttons held (pure move): keep press state as-is.
|
|
550
|
+
const base = button & 3;
|
|
551
|
+
if (base !== 3)
|
|
552
|
+
state.mouseButton = base;
|
|
553
|
+
}
|
|
554
|
+
else if (token.action === 'press') {
|
|
555
|
+
state.mouseButton = button;
|
|
556
|
+
state.isMouseDown = true;
|
|
557
|
+
if ((button & 3) === 0) {
|
|
558
|
+
state.mouseDownX = state.mouseX;
|
|
559
|
+
state.mouseDownY = state.mouseY;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
state.mouseButton = button;
|
|
564
|
+
state.isMouseDown = false;
|
|
565
|
+
if ((button & 3) === 0 &&
|
|
566
|
+
state.mouseDownX !== undefined &&
|
|
567
|
+
state.mouseDownY !== undefined) {
|
|
568
|
+
state.clickX = state.mouseDownX;
|
|
569
|
+
state.clickY = state.mouseDownY;
|
|
570
|
+
enqueueKeyEvent(state, createKeyEvent('click', token.raw), stop);
|
|
571
|
+
}
|
|
572
|
+
state.mouseDownX = undefined;
|
|
573
|
+
state.mouseDownY = undefined;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
function dispatchInputTokens(state, tokens, stop) {
|
|
577
|
+
for (const token of tokens) {
|
|
578
|
+
switch (token.type) {
|
|
579
|
+
case 'focus': {
|
|
580
|
+
state.hasFocus = token.focused;
|
|
581
|
+
state.restartLoop?.();
|
|
582
|
+
continue; // restartLoop already forces a tick
|
|
583
|
+
}
|
|
584
|
+
case 'response': {
|
|
585
|
+
state.terminalResponses.push(token.response);
|
|
586
|
+
// Bounded: consumers drain; a probe-less app must not leak.
|
|
587
|
+
if (state.terminalResponses.length > 64) {
|
|
588
|
+
state.terminalResponses.shift();
|
|
589
|
+
}
|
|
590
|
+
break;
|
|
591
|
+
}
|
|
592
|
+
case 'mouse': {
|
|
593
|
+
dispatchMouse(state, token, stop);
|
|
594
|
+
break;
|
|
595
|
+
}
|
|
596
|
+
case 'key': {
|
|
597
|
+
enqueueKeyEvent(state, token.event, stop);
|
|
598
|
+
break;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
requestTick(state);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Feeds a raw stdin chunk through the screen's stateful tokenizer and
|
|
606
|
+
* dispatches the resulting tokens. Partial escape sequences are carried
|
|
607
|
+
* across calls; a bare ESC flushes as 'escape' via the tokenizer timer.
|
|
608
|
+
*/
|
|
609
|
+
export function applyInputToState(state, data, stop) {
|
|
610
|
+
const input = data instanceof Buffer ? data.toString() : String(data);
|
|
611
|
+
state.inputTokenizer ??= new InputTokenizer({
|
|
612
|
+
escTimeoutMs: state.options.escTimeoutMs,
|
|
613
|
+
});
|
|
614
|
+
const tokenizer = state.inputTokenizer;
|
|
615
|
+
// Rebind each call so timer flushes see the latest stop handler.
|
|
616
|
+
tokenizer.onFlush = (tokens) => dispatchInputTokens(state, tokens, stop);
|
|
617
|
+
dispatchInputTokens(state, tokenizer.push(input), stop);
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Moves queued KeyEvents into this frame's `state.keys`, appends synthetic
|
|
621
|
+
* held-key releases, and recomputes the legacy `state.lastKey` slot (first
|
|
622
|
+
* unmodified press/repeat of the frame). Runs once per render tick, before
|
|
623
|
+
* the render callback.
|
|
624
|
+
*/
|
|
625
|
+
export function drainFrameInput(state) {
|
|
626
|
+
const frame = state.keyQueue.length > 0 ? state.keyQueue.splice(0) : [];
|
|
627
|
+
if (state.heldKeys) {
|
|
628
|
+
const releases = state.heldKeys.collectReleases();
|
|
629
|
+
if (releases.length > 0)
|
|
630
|
+
frame.push(...releases);
|
|
631
|
+
}
|
|
632
|
+
state.keys = frame;
|
|
633
|
+
let lastKey;
|
|
634
|
+
let hasClick = false;
|
|
635
|
+
for (const event of frame) {
|
|
636
|
+
if (event.kind === 'release')
|
|
637
|
+
continue;
|
|
638
|
+
if (event.key === 'click')
|
|
639
|
+
hasClick = true;
|
|
640
|
+
if (lastKey === undefined && !event.ctrl && !event.alt) {
|
|
641
|
+
lastKey = event.key;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
state.lastKey = lastKey;
|
|
645
|
+
if (!hasClick) {
|
|
646
|
+
state.clickX = undefined;
|
|
647
|
+
state.clickY = undefined;
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|