@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.
Files changed (203) hide show
  1. package/AGENTS.md +65 -0
  2. package/README.md +145 -34
  3. package/dist/cli.d.ts +44 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +147 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/colors.d.ts +144 -0
  8. package/dist/colors.d.ts.map +1 -0
  9. package/dist/colors.js +426 -0
  10. package/dist/colors.js.map +1 -0
  11. package/dist/components/Box.d.ts +11 -0
  12. package/dist/components/Box.d.ts.map +1 -0
  13. package/dist/components/Box.js +9 -0
  14. package/dist/components/Box.js.map +1 -0
  15. package/dist/components/Button.d.ts +24 -0
  16. package/dist/components/Button.d.ts.map +1 -0
  17. package/dist/components/Button.js +102 -0
  18. package/dist/components/Button.js.map +1 -0
  19. package/dist/components/Card.d.ts +33 -0
  20. package/dist/components/Card.d.ts.map +1 -0
  21. package/dist/components/Card.js +79 -0
  22. package/dist/components/Card.js.map +1 -0
  23. package/dist/components/Header.d.ts +23 -0
  24. package/dist/components/Header.d.ts.map +1 -0
  25. package/dist/components/Header.js +58 -0
  26. package/dist/components/Header.js.map +1 -0
  27. package/dist/components/Input.d.ts +25 -0
  28. package/dist/components/Input.d.ts.map +1 -0
  29. package/dist/components/Input.js +232 -0
  30. package/dist/components/Input.js.map +1 -0
  31. package/dist/components/Link.d.ts +21 -0
  32. package/dist/components/Link.d.ts.map +1 -0
  33. package/dist/components/Link.js +29 -0
  34. package/dist/components/Link.js.map +1 -0
  35. package/dist/components/Modal.d.ts +38 -0
  36. package/dist/components/Modal.d.ts.map +1 -0
  37. package/dist/components/Modal.js +87 -0
  38. package/dist/components/Modal.js.map +1 -0
  39. package/dist/components/Progress.d.ts +27 -0
  40. package/dist/components/Progress.d.ts.map +1 -0
  41. package/dist/components/Progress.js +39 -0
  42. package/dist/components/Progress.js.map +1 -0
  43. package/dist/components/Spinner.d.ts +19 -0
  44. package/dist/components/Spinner.d.ts.map +1 -0
  45. package/dist/components/Spinner.js +27 -0
  46. package/dist/components/Spinner.js.map +1 -0
  47. package/dist/components/index.d.ts +10 -0
  48. package/dist/components/index.d.ts.map +1 -0
  49. package/dist/components/index.js +10 -0
  50. package/dist/components/index.js.map +1 -0
  51. package/dist/data/nf-glyphs.d.ts +11 -0
  52. package/dist/data/nf-glyphs.d.ts.map +1 -0
  53. package/dist/data/nf-glyphs.js +535 -0
  54. package/dist/data/nf-glyphs.js.map +1 -0
  55. package/dist/data/nf-names.d.ts +8 -0
  56. package/dist/data/nf-names.d.ts.map +1 -0
  57. package/dist/data/nf-names.js +2 -0
  58. package/dist/data/nf-names.js.map +1 -0
  59. package/dist/demo-registry.d.ts +27 -0
  60. package/dist/demo-registry.d.ts.map +1 -0
  61. package/dist/demo-registry.js +57 -0
  62. package/dist/demo-registry.js.map +1 -0
  63. package/dist/demos/2048.ts +743 -0
  64. package/dist/demos/animation.ts +246 -0
  65. package/dist/demos/demo-layout.ts +124 -0
  66. package/dist/demos/engine.ts +374 -0
  67. package/dist/demos/interaction.ts +91 -0
  68. package/dist/demos/login.ts +203 -0
  69. package/dist/demos/mission-control.ts +558 -0
  70. package/dist/demos/showcase.ts +224 -0
  71. package/dist/detect.d.ts +104 -0
  72. package/dist/detect.d.ts.map +1 -0
  73. package/dist/detect.js +227 -0
  74. package/dist/detect.js.map +1 -0
  75. package/dist/diagnostics.d.ts +73 -0
  76. package/dist/diagnostics.d.ts.map +1 -0
  77. package/dist/diagnostics.js +225 -0
  78. package/dist/diagnostics.js.map +1 -0
  79. package/dist/dsl/context.d.ts +11 -0
  80. package/dist/dsl/context.d.ts.map +1 -0
  81. package/dist/dsl/context.js +563 -0
  82. package/dist/dsl/context.js.map +1 -0
  83. package/dist/dsl/hooks.d.ts +12 -0
  84. package/dist/dsl/hooks.d.ts.map +1 -0
  85. package/dist/dsl/hooks.js +148 -0
  86. package/dist/dsl/hooks.js.map +1 -0
  87. package/dist/dsl/interaction.d.ts +16 -0
  88. package/dist/dsl/interaction.d.ts.map +1 -0
  89. package/dist/dsl/interaction.js +101 -0
  90. package/dist/dsl/interaction.js.map +1 -0
  91. package/dist/dsl/layers.d.ts +14 -0
  92. package/dist/dsl/layers.d.ts.map +1 -0
  93. package/dist/dsl/layers.js +87 -0
  94. package/dist/dsl/layers.js.map +1 -0
  95. package/dist/dsl/motion.d.ts +10 -0
  96. package/dist/dsl/motion.d.ts.map +1 -0
  97. package/dist/dsl/motion.js +150 -0
  98. package/dist/dsl/motion.js.map +1 -0
  99. package/dist/dsl/render.d.ts +22 -0
  100. package/dist/dsl/render.d.ts.map +1 -0
  101. package/dist/dsl/render.js +69 -0
  102. package/dist/dsl/render.js.map +1 -0
  103. package/dist/dsl/types.d.ts +510 -0
  104. package/dist/dsl/types.d.ts.map +1 -0
  105. package/dist/dsl/types.js +33 -0
  106. package/dist/dsl/types.js.map +1 -0
  107. package/dist/dsl.d.ts +18 -0
  108. package/dist/dsl.d.ts.map +1 -0
  109. package/dist/dsl.js +17 -0
  110. package/dist/dsl.js.map +1 -0
  111. package/dist/easing.d.ts +45 -0
  112. package/dist/easing.d.ts.map +1 -0
  113. package/dist/easing.js +121 -0
  114. package/dist/easing.js.map +1 -0
  115. package/dist/geometry.d.ts +77 -0
  116. package/dist/geometry.d.ts.map +1 -0
  117. package/dist/geometry.js +130 -0
  118. package/dist/geometry.js.map +1 -0
  119. package/dist/icons-full.d.ts +5 -0
  120. package/dist/icons-full.d.ts.map +1 -0
  121. package/dist/icons-full.js +31 -0
  122. package/dist/icons-full.js.map +1 -0
  123. package/dist/icons.d.ts +442 -0
  124. package/dist/icons.d.ts.map +1 -0
  125. package/dist/icons.js +314 -0
  126. package/dist/icons.js.map +1 -0
  127. package/dist/index.d.ts +228 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +46 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/input.d.ts +177 -0
  132. package/dist/input.d.ts.map +1 -0
  133. package/dist/input.js +533 -0
  134. package/dist/input.js.map +1 -0
  135. package/dist/layout.d.ts +194 -0
  136. package/dist/layout.d.ts.map +1 -0
  137. package/dist/layout.js +673 -0
  138. package/dist/layout.js.map +1 -0
  139. package/dist/render.d.ts +49 -0
  140. package/dist/render.d.ts.map +1 -0
  141. package/dist/render.js +650 -0
  142. package/dist/render.js.map +1 -0
  143. package/dist/state.d.ts +226 -0
  144. package/dist/state.d.ts.map +1 -0
  145. package/dist/state.js +130 -0
  146. package/dist/state.js.map +1 -0
  147. package/dist/theme.d.ts +129 -0
  148. package/dist/theme.d.ts.map +1 -0
  149. package/dist/theme.js +167 -0
  150. package/dist/theme.js.map +1 -0
  151. package/dist/themes/catppuccin-mocha.d.ts +19 -0
  152. package/dist/themes/catppuccin-mocha.d.ts.map +1 -0
  153. package/dist/themes/catppuccin-mocha.js +36 -0
  154. package/dist/themes/catppuccin-mocha.js.map +1 -0
  155. package/dist/themes/dracula.d.ts +21 -0
  156. package/dist/themes/dracula.d.ts.map +1 -0
  157. package/dist/themes/dracula.js +37 -0
  158. package/dist/themes/dracula.js.map +1 -0
  159. package/dist/themes/github-light.d.ts +21 -0
  160. package/dist/themes/github-light.d.ts.map +1 -0
  161. package/dist/themes/github-light.js +36 -0
  162. package/dist/themes/github-light.js.map +1 -0
  163. package/dist/themes/index.d.ts +19 -0
  164. package/dist/themes/index.d.ts.map +1 -0
  165. package/dist/themes/index.js +17 -0
  166. package/dist/themes/index.js.map +1 -0
  167. package/dist/themes/nord.d.ts +23 -0
  168. package/dist/themes/nord.d.ts.map +1 -0
  169. package/dist/themes/nord.js +38 -0
  170. package/dist/themes/nord.js.map +1 -0
  171. package/dist/themes/one-dark-pro.d.ts +21 -0
  172. package/dist/themes/one-dark-pro.d.ts.map +1 -0
  173. package/dist/themes/one-dark-pro.js +36 -0
  174. package/dist/themes/one-dark-pro.js.map +1 -0
  175. package/dist/themes/tokyo-night.d.ts +20 -0
  176. package/dist/themes/tokyo-night.d.ts.map +1 -0
  177. package/dist/themes/tokyo-night.js +37 -0
  178. package/dist/themes/tokyo-night.js.map +1 -0
  179. package/dist/utils.d.ts +28 -0
  180. package/dist/utils.d.ts.map +1 -0
  181. package/dist/utils.js +158 -0
  182. package/dist/utils.js.map +1 -0
  183. package/dist/vendor/colors.d.ts +45 -0
  184. package/dist/vendor/colors.d.ts.map +1 -0
  185. package/dist/vendor/colors.js +72 -0
  186. package/dist/vendor/colors.js.map +1 -0
  187. package/llms.txt +79 -0
  188. package/package.json +52 -11
  189. package/src/colors.ts +0 -255
  190. package/src/components/Button.ts +0 -104
  191. package/src/components/Card.ts +0 -53
  192. package/src/components/Header.ts +0 -65
  193. package/src/components/Input.ts +0 -124
  194. package/src/components/index.ts +0 -4
  195. package/src/data/glyphs.ts +0 -30
  196. package/src/detect.ts +0 -60
  197. package/src/dsl.ts +0 -661
  198. package/src/icons.ts +0 -186
  199. package/src/index.ts +0 -72
  200. package/src/layout.ts +0 -640
  201. package/src/render.ts +0 -302
  202. package/src/state.ts +0 -148
  203. 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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"}