@kingkoo1985/ink 6.6.6

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 (225) hide show
  1. package/build/colorize.d.ts +4 -0
  2. package/build/colorize.js +59 -0
  3. package/build/colorize.js.map +1 -0
  4. package/build/components/AccessibilityContext.d.ts +3 -0
  5. package/build/components/AccessibilityContext.js +5 -0
  6. package/build/components/AccessibilityContext.js.map +1 -0
  7. package/build/components/App.d.ts +68 -0
  8. package/build/components/App.js +290 -0
  9. package/build/components/App.js.map +1 -0
  10. package/build/components/AppContext.d.ts +52 -0
  11. package/build/components/AppContext.js +16 -0
  12. package/build/components/AppContext.js.map +1 -0
  13. package/build/components/BackgroundContext.d.ts +4 -0
  14. package/build/components/BackgroundContext.js +3 -0
  15. package/build/components/BackgroundContext.js.map +1 -0
  16. package/build/components/Box.d.ts +171 -0
  17. package/build/components/Box.js +40 -0
  18. package/build/components/Box.js.map +1 -0
  19. package/build/components/ErrorOverview.d.ts +6 -0
  20. package/build/components/ErrorOverview.js +84 -0
  21. package/build/components/ErrorOverview.js.map +1 -0
  22. package/build/components/FocusContext.d.ts +16 -0
  23. package/build/components/FocusContext.js +16 -0
  24. package/build/components/FocusContext.js.map +1 -0
  25. package/build/components/Newline.d.ts +13 -0
  26. package/build/components/Newline.js +8 -0
  27. package/build/components/Newline.js.map +1 -0
  28. package/build/components/Spacer.d.ts +7 -0
  29. package/build/components/Spacer.js +11 -0
  30. package/build/components/Spacer.js.map +1 -0
  31. package/build/components/Static.d.ts +24 -0
  32. package/build/components/Static.js +29 -0
  33. package/build/components/Static.js.map +1 -0
  34. package/build/components/StaticRender.d.ts +8 -0
  35. package/build/components/StaticRender.js +19 -0
  36. package/build/components/StaticRender.js.map +1 -0
  37. package/build/components/StderrContext.d.ts +15 -0
  38. package/build/components/StderrContext.js +12 -0
  39. package/build/components/StderrContext.js.map +1 -0
  40. package/build/components/StdinContext.d.ts +22 -0
  41. package/build/components/StdinContext.js +16 -0
  42. package/build/components/StdinContext.js.map +1 -0
  43. package/build/components/StdoutContext.d.ts +15 -0
  44. package/build/components/StdoutContext.js +12 -0
  45. package/build/components/StdoutContext.js.map +1 -0
  46. package/build/components/Text.d.ts +63 -0
  47. package/build/components/Text.js +50 -0
  48. package/build/components/Text.js.map +1 -0
  49. package/build/components/Transform.d.ts +16 -0
  50. package/build/components/Transform.js +15 -0
  51. package/build/components/Transform.js.map +1 -0
  52. package/build/data-limited-lru-map.d.ts +20 -0
  53. package/build/data-limited-lru-map.js +65 -0
  54. package/build/data-limited-lru-map.js.map +1 -0
  55. package/build/debug-log.d.ts +2 -0
  56. package/build/debug-log.js +44 -0
  57. package/build/debug-log.js.map +1 -0
  58. package/build/devtools-window-polyfill.d.ts +1 -0
  59. package/build/devtools-window-polyfill.js +65 -0
  60. package/build/devtools-window-polyfill.js.map +1 -0
  61. package/build/devtools.d.ts +1 -0
  62. package/build/devtools.js +8 -0
  63. package/build/devtools.js.map +1 -0
  64. package/build/dom.d.ts +114 -0
  65. package/build/dom.js +169 -0
  66. package/build/dom.js.map +1 -0
  67. package/build/get-max-width.d.ts +3 -0
  68. package/build/get-max-width.js +10 -0
  69. package/build/get-max-width.js.map +1 -0
  70. package/build/hooks/use-app.d.ts +5 -0
  71. package/build/hooks/use-app.js +8 -0
  72. package/build/hooks/use-app.js.map +1 -0
  73. package/build/hooks/use-focus-manager.d.ts +28 -0
  74. package/build/hooks/use-focus-manager.js +17 -0
  75. package/build/hooks/use-focus-manager.js.map +1 -0
  76. package/build/hooks/use-focus.d.ts +29 -0
  77. package/build/hooks/use-focus.js +42 -0
  78. package/build/hooks/use-focus.js.map +1 -0
  79. package/build/hooks/use-input.d.ts +93 -0
  80. package/build/hooks/use-input.js +92 -0
  81. package/build/hooks/use-input.js.map +1 -0
  82. package/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  83. package/build/hooks/use-is-screen-reader-enabled.js +11 -0
  84. package/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  85. package/build/hooks/use-stderr.d.ts +5 -0
  86. package/build/hooks/use-stderr.js +8 -0
  87. package/build/hooks/use-stderr.js.map +1 -0
  88. package/build/hooks/use-stdin.d.ts +5 -0
  89. package/build/hooks/use-stdin.js +8 -0
  90. package/build/hooks/use-stdin.js.map +1 -0
  91. package/build/hooks/use-stdout.d.ts +5 -0
  92. package/build/hooks/use-stdout.js +8 -0
  93. package/build/hooks/use-stdout.js.map +1 -0
  94. package/build/index.d.ts +38 -0
  95. package/build/index.js +27 -0
  96. package/build/index.js.map +1 -0
  97. package/build/ink.d.ts +110 -0
  98. package/build/ink.js +576 -0
  99. package/build/ink.js.map +1 -0
  100. package/build/instances.d.ts +3 -0
  101. package/build/instances.js +8 -0
  102. package/build/instances.js.map +1 -0
  103. package/build/layout.d.ts +18 -0
  104. package/build/layout.js +54 -0
  105. package/build/layout.js.map +1 -0
  106. package/build/log-update.d.ts +28 -0
  107. package/build/log-update.js +529 -0
  108. package/build/log-update.js.map +1 -0
  109. package/build/measure-element.d.ts +119 -0
  110. package/build/measure-element.js +825 -0
  111. package/build/measure-element.js.map +1 -0
  112. package/build/measure-text.d.ts +50 -0
  113. package/build/measure-text.js +237 -0
  114. package/build/measure-text.js.map +1 -0
  115. package/build/output.d.ts +242 -0
  116. package/build/output.js +607 -0
  117. package/build/output.js.map +1 -0
  118. package/build/parse-keypress.d.ts +14 -0
  119. package/build/parse-keypress.js +225 -0
  120. package/build/parse-keypress.js.map +1 -0
  121. package/build/reconciler.d.ts +4 -0
  122. package/build/reconciler.js +326 -0
  123. package/build/reconciler.js.map +1 -0
  124. package/build/render-background.d.ts +4 -0
  125. package/build/render-background.js +37 -0
  126. package/build/render-background.js.map +1 -0
  127. package/build/render-border.d.ts +4 -0
  128. package/build/render-border.js +81 -0
  129. package/build/render-border.js.map +1 -0
  130. package/build/render-cached.d.ts +18 -0
  131. package/build/render-cached.js +66 -0
  132. package/build/render-cached.js.map +1 -0
  133. package/build/render-container.d.ts +27 -0
  134. package/build/render-container.js +169 -0
  135. package/build/render-container.js.map +1 -0
  136. package/build/render-node-to-output.d.ts +32 -0
  137. package/build/render-node-to-output.js +177 -0
  138. package/build/render-node-to-output.js.map +1 -0
  139. package/build/render-screen-reader.d.ts +5 -0
  140. package/build/render-screen-reader.js +54 -0
  141. package/build/render-screen-reader.js.map +1 -0
  142. package/build/render-scrollbar.d.ts +23 -0
  143. package/build/render-scrollbar.js +70 -0
  144. package/build/render-scrollbar.js.map +1 -0
  145. package/build/render-sticky.d.ts +53 -0
  146. package/build/render-sticky.js +317 -0
  147. package/build/render-sticky.js.map +1 -0
  148. package/build/render-text-node.d.ts +20 -0
  149. package/build/render-text-node.js +155 -0
  150. package/build/render-text-node.js.map +1 -0
  151. package/build/render.d.ts +165 -0
  152. package/build/render.js +60 -0
  153. package/build/render.js.map +1 -0
  154. package/build/renderer.d.ts +24 -0
  155. package/build/renderer.js +292 -0
  156. package/build/renderer.js.map +1 -0
  157. package/build/replay.d.ts +59 -0
  158. package/build/replay.js +128 -0
  159. package/build/replay.js.map +1 -0
  160. package/build/resize-observer.d.ts +24 -0
  161. package/build/resize-observer.js +102 -0
  162. package/build/resize-observer.js.map +1 -0
  163. package/build/scroll.d.ts +11 -0
  164. package/build/scroll.js +123 -0
  165. package/build/scroll.js.map +1 -0
  166. package/build/selection.d.ts +52 -0
  167. package/build/selection.js +359 -0
  168. package/build/selection.js.map +1 -0
  169. package/build/serialization.d.ts +25 -0
  170. package/build/serialization.js +224 -0
  171. package/build/serialization.js.map +1 -0
  172. package/build/squash-text-nodes.d.ts +16 -0
  173. package/build/squash-text-nodes.js +58 -0
  174. package/build/squash-text-nodes.js.map +1 -0
  175. package/build/styled-line.d.ts +58 -0
  176. package/build/styled-line.js +629 -0
  177. package/build/styled-line.js.map +1 -0
  178. package/build/styles.d.ts +286 -0
  179. package/build/styles.js +257 -0
  180. package/build/styles.js.map +1 -0
  181. package/build/terminal-buffer.d.ts +57 -0
  182. package/build/terminal-buffer.js +507 -0
  183. package/build/terminal-buffer.js.map +1 -0
  184. package/build/text-wrap.d.ts +12 -0
  185. package/build/text-wrap.js +154 -0
  186. package/build/text-wrap.js.map +1 -0
  187. package/build/tokenize.d.ts +47 -0
  188. package/build/tokenize.js +419 -0
  189. package/build/tokenize.js.map +1 -0
  190. package/build/vertical-gap.d.ts +17 -0
  191. package/build/vertical-gap.js +20 -0
  192. package/build/vertical-gap.js.map +1 -0
  193. package/build/worker/animation-controller.d.ts +72 -0
  194. package/build/worker/animation-controller.js +128 -0
  195. package/build/worker/animation-controller.js.map +1 -0
  196. package/build/worker/ansi-utils.d.ts +16 -0
  197. package/build/worker/ansi-utils.js +40 -0
  198. package/build/worker/ansi-utils.js.map +1 -0
  199. package/build/worker/canvas.d.ts +49 -0
  200. package/build/worker/canvas.js +90 -0
  201. package/build/worker/canvas.js.map +1 -0
  202. package/build/worker/compositor.d.ts +33 -0
  203. package/build/worker/compositor.js +308 -0
  204. package/build/worker/compositor.js.map +1 -0
  205. package/build/worker/platform.d.ts +15 -0
  206. package/build/worker/platform.js +19 -0
  207. package/build/worker/platform.js.map +1 -0
  208. package/build/worker/render-worker.d.ts +112 -0
  209. package/build/worker/render-worker.js +944 -0
  210. package/build/worker/render-worker.js.map +1 -0
  211. package/build/worker/scene-manager.d.ts +26 -0
  212. package/build/worker/scene-manager.js +109 -0
  213. package/build/worker/scene-manager.js.map +1 -0
  214. package/build/worker/scroll-optimizer.d.ts +32 -0
  215. package/build/worker/scroll-optimizer.js +110 -0
  216. package/build/worker/scroll-optimizer.js.map +1 -0
  217. package/build/worker/terminal-writer.d.ts +116 -0
  218. package/build/worker/terminal-writer.js +708 -0
  219. package/build/worker/terminal-writer.js.map +1 -0
  220. package/build/worker/worker-entry.d.ts +6 -0
  221. package/build/worker/worker-entry.js +130 -0
  222. package/build/worker/worker-entry.js.map +1 -0
  223. package/license +9 -0
  224. package/package.json +208 -0
  225. package/readme.md +2353 -0
@@ -0,0 +1,308 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { calculateScrollbarThumb } from '../measure-element.js';
7
+ import { renderScrollbar } from '../render-scrollbar.js';
8
+ import { getBackgroundColorEscape } from '../colorize.js';
9
+ /**
10
+ * Handles rendering of various UI elements onto a Canvas.
11
+ */
12
+ export class Compositor {
13
+ options;
14
+ static lastBackgroundColor;
15
+ static lastBackgroundStyles;
16
+ constructor(options) {
17
+ this.options = options;
18
+ }
19
+ drawContent(canvas, region, absX, absY, clip) {
20
+ const scrollTop = region.scrollTop ?? 0;
21
+ const scrollLeft = region.scrollLeft ?? 0;
22
+ const isOpaque = Boolean(region.opaque) || Boolean(region.backgroundColor);
23
+ for (let sy = clip.y; sy < clip.y + clip.h; sy++) {
24
+ if (sy < 0 || sy >= canvas.height) {
25
+ continue;
26
+ }
27
+ const dy = sy - absY;
28
+ const contentY = Math.round(scrollTop + dy);
29
+ const line = region.lines[contentY];
30
+ if (!line) {
31
+ continue;
32
+ }
33
+ const startSx = Math.round(clip.x);
34
+ const endSx = Math.round(clip.x + clip.w);
35
+ for (let sx = startSx; sx < endSx; sx++) {
36
+ if (sx < 0 || sx >= canvas.width) {
37
+ continue;
38
+ }
39
+ const dx = sx - absX;
40
+ const contentX = scrollLeft + dx;
41
+ if (contentX < line.length) {
42
+ const val = line.getValue(contentX);
43
+ const isEmpty = val === ' ' && !line.hasStyles(contentX);
44
+ if (isEmpty) {
45
+ if (!isOpaque) {
46
+ continue;
47
+ }
48
+ if (region.backgroundColor) {
49
+ const bgColor = this.getBackgroundStyles(region.backgroundColor);
50
+ if (bgColor) {
51
+ canvas.setChar(sx, sy, val, line.getFormatFlags(contentX), line.getFgColor(contentX), bgColor, line.getLink(contentX));
52
+ continue;
53
+ }
54
+ }
55
+ }
56
+ canvas.setChar(sx, sy, val, line.getFormatFlags(contentX), line.getFgColor(contentX), line.getBgColor(contentX), line.getLink(contentX));
57
+ }
58
+ }
59
+ }
60
+ }
61
+ drawStickyHeaders(canvas, region, absX, absY, clip) {
62
+ if (this.options.skipStickyHeaders) {
63
+ return;
64
+ }
65
+ const scrollTop = region.scrollTop ?? 0;
66
+ for (const header of region.stickyHeaders) {
67
+ const useStuckPosition = this.isHeaderStuck(header, absY, scrollTop, region);
68
+ // ONLY draw if stuck. Natural versions are already in the background buffer.
69
+ if (!useStuckPosition) {
70
+ continue;
71
+ }
72
+ const linesToRender = header.stuckLines ?? header.lines;
73
+ let headerY = absY + header.y;
74
+ const headerH = linesToRender.length;
75
+ if (this.options.stickyHeadersInBackbuffer &&
76
+ region.overflowToBackbuffer) {
77
+ if (header.type === 'top') {
78
+ if (headerY < 0 && absY + region.height > 0) {
79
+ headerY = 0;
80
+ }
81
+ }
82
+ else if (header.type === 'bottom') {
83
+ const stuckPos = this.options.canvasHeight -
84
+ (header.stuckLines ?? header.lines).length;
85
+ if (headerY > stuckPos && absY < stuckPos + headerH) {
86
+ headerY = stuckPos;
87
+ }
88
+ }
89
+ }
90
+ // Clamp to maxStuckY / minStuckY
91
+ if (header.type === 'top' && header.maxStuckY !== undefined) {
92
+ const absoluteMaxStuckY = absY + header.maxStuckY;
93
+ if (headerY > absoluteMaxStuckY) {
94
+ headerY = absoluteMaxStuckY;
95
+ }
96
+ }
97
+ else if (header.type === 'bottom' && header.minStuckY !== undefined) {
98
+ const absoluteMinStuckY = absY + header.minStuckY;
99
+ if (headerY < absoluteMinStuckY) {
100
+ headerY = absoluteMinStuckY;
101
+ }
102
+ }
103
+ for (let i = 0; i < headerH; i++) {
104
+ const sy = Math.round(headerY + i);
105
+ // If header is within the region's clip (standard behavior)
106
+ const withinRegionClip = sy >= clip.y && sy < clip.y + clip.h;
107
+ // If header is above/below the region and we want sticky headers there
108
+ const aboveRegionAndStickyEnabled = header.type === 'top' &&
109
+ absY < 0 &&
110
+ this.options.stickyHeadersInBackbuffer &&
111
+ region.overflowToBackbuffer &&
112
+ sy >= 0 &&
113
+ sy < Math.min(canvas.height, absY + region.height);
114
+ const belowRegionAndStickyEnabled = header.type === 'bottom' &&
115
+ absY + region.height > this.options.canvasHeight &&
116
+ this.options.stickyHeadersInBackbuffer &&
117
+ region.overflowToBackbuffer &&
118
+ sy >= Math.max(0, absY) &&
119
+ sy < this.options.canvasHeight;
120
+ if (!withinRegionClip &&
121
+ !aboveRegionAndStickyEnabled &&
122
+ !belowRegionAndStickyEnabled) {
123
+ continue;
124
+ }
125
+ if (sy < 0 || sy >= canvas.height) {
126
+ continue;
127
+ }
128
+ const line = linesToRender[i];
129
+ if (!line) {
130
+ continue;
131
+ }
132
+ const headerX = Math.round(header.x + absX);
133
+ const headerW = Math.round(line.length);
134
+ const hx1 = Math.max(headerX, clip.x);
135
+ const hx2 = Math.min(headerX + headerW, clip.x + clip.w);
136
+ for (let sx = hx1; sx < hx2; sx++) {
137
+ const cx = sx - headerX;
138
+ if (cx < line.length) {
139
+ canvas.setChar(sx, sy, line.getValue(cx), line.getFormatFlags(cx), line.getFgColor(cx), line.getBgColor(cx), line.getLink(cx));
140
+ }
141
+ }
142
+ }
143
+ }
144
+ }
145
+ drawScrollbars(canvas, region, absX, absY, clip) {
146
+ if (Boolean(this.options.skipScrollbars && region.overflowToBackbuffer) ||
147
+ !region.isScrollable ||
148
+ region.scrollbarVisible === false) {
149
+ return;
150
+ }
151
+ const scrollTop = region.scrollTop ?? 0;
152
+ const scrollLeft = region.scrollLeft ?? 0;
153
+ const scrollHeight = region.scrollHeight ?? 0;
154
+ const scrollWidth = region.scrollWidth ?? 0;
155
+ const isVerticalScrollbarVisible = (region.isVerticallyScrollable ?? false) && scrollHeight > region.height;
156
+ const isHorizontalScrollbarVisible = (region.isHorizontallyScrollable ?? false) && scrollWidth > region.width;
157
+ if (isVerticalScrollbarVisible) {
158
+ let scrollPosition = scrollTop;
159
+ const targetScrollTop = this.options.targetScrollTops.get(region.id);
160
+ if (this.options.animatedScroll &&
161
+ targetScrollTop !== undefined &&
162
+ targetScrollTop !== scrollTop) {
163
+ const wasAtEnd = this.options.regionWasAtEnd.get(region.id);
164
+ const isTargetAtEnd = targetScrollTop >= scrollHeight - region.height;
165
+ if (wasAtEnd && isTargetAtEnd) {
166
+ scrollPosition = targetScrollTop;
167
+ }
168
+ }
169
+ const { startIndex, endIndex, thumbStartHalf, thumbEndHalf } = calculateScrollbarThumb({
170
+ scrollbarDimension: region.height,
171
+ clientDimension: region.height,
172
+ scrollDimension: scrollHeight,
173
+ scrollPosition,
174
+ axis: 'vertical',
175
+ });
176
+ const barX = absX + region.width - 1 - (region.marginRight ?? 0);
177
+ renderScrollbar({
178
+ layout: {
179
+ x: barX,
180
+ y: absY,
181
+ width: 1,
182
+ height: region.height,
183
+ thumb: {
184
+ x: barX,
185
+ y: absY + startIndex,
186
+ width: 1,
187
+ height: endIndex - startIndex,
188
+ start: startIndex,
189
+ end: endIndex,
190
+ startHalf: thumbStartHalf,
191
+ endHalf: thumbEndHalf,
192
+ },
193
+ },
194
+ clip,
195
+ axis: 'vertical',
196
+ color: region.scrollbarThumbColor,
197
+ setChar(x, y, value, formatFlags, fgColor, bgColor, link) {
198
+ canvas.setChar(x, y, value, formatFlags, fgColor, bgColor, link);
199
+ },
200
+ getExistingChar(x, y) {
201
+ return canvas.getChar(x, y);
202
+ },
203
+ });
204
+ }
205
+ if (isHorizontalScrollbarVisible) {
206
+ const scrollbarWidth = region.width - (isVerticalScrollbarVisible ? 1 : 0);
207
+ const { startIndex, endIndex, thumbStartHalf, thumbEndHalf } = calculateScrollbarThumb({
208
+ scrollbarDimension: scrollbarWidth,
209
+ clientDimension: region.width,
210
+ scrollDimension: scrollWidth,
211
+ scrollPosition: scrollLeft,
212
+ axis: 'horizontal',
213
+ });
214
+ const barY = absY + region.height - 1 - (region.marginBottom ?? 0);
215
+ renderScrollbar({
216
+ layout: {
217
+ x: absX,
218
+ y: barY,
219
+ width: scrollbarWidth,
220
+ height: 1,
221
+ thumb: {
222
+ x: absX + startIndex,
223
+ y: barY,
224
+ width: endIndex - startIndex,
225
+ height: 1,
226
+ start: startIndex,
227
+ end: endIndex,
228
+ startHalf: thumbStartHalf,
229
+ endHalf: thumbEndHalf,
230
+ },
231
+ },
232
+ clip,
233
+ axis: 'horizontal',
234
+ color: region.scrollbarThumbColor,
235
+ setChar(x, y, value, formatFlags, fgColor, bgColor, link) {
236
+ canvas.setChar(x, y, value, formatFlags, fgColor, bgColor, link);
237
+ },
238
+ getExistingChar(x, y) {
239
+ return canvas.getChar(x, y);
240
+ },
241
+ });
242
+ }
243
+ }
244
+ isHeaderStuck(header, absY, scrollTop, region) {
245
+ const isStuckState = header.type === 'bottom'
246
+ ? Math.round(header.naturalRow - scrollTop + header.lines.length) >=
247
+ Math.round(header.y + (header.stuckLines ?? header.lines).length)
248
+ : Math.round(header.naturalRow - scrollTop) <= Math.round(header.y);
249
+ if (!isStuckState) {
250
+ return false;
251
+ }
252
+ if (header.type === 'top') {
253
+ if (region.overflowToBackbuffer &&
254
+ absY + header.y <= 0 &&
255
+ !(this.options.stickyHeadersInBackbuffer ?? false)) {
256
+ return false;
257
+ }
258
+ return true;
259
+ }
260
+ return true;
261
+ }
262
+ calculateActualStuckTopHeight(region, absY, scrollTop) {
263
+ let stuckHeight = 0;
264
+ const topHeaders = [...region.stickyHeaders]
265
+ .filter(h => h.type === 'top')
266
+ .sort((a, b) => a.y - b.y);
267
+ for (const header of topHeaders) {
268
+ if (this.isHeaderStuck(header, absY, scrollTop, region) &&
269
+ Math.abs(Math.round(header.y) - stuckHeight) < 0.5) {
270
+ const linesToRender = header.stuckLines ?? header.lines;
271
+ stuckHeight += linesToRender.length;
272
+ }
273
+ else if (this.isHeaderStuck(header, absY, scrollTop, region)) {
274
+ break;
275
+ }
276
+ }
277
+ return stuckHeight;
278
+ }
279
+ calculateActualStuckBottomHeight(region, absY, scrollTop) {
280
+ let stuckHeight = 0;
281
+ const bottomHeaders = [...region.stickyHeaders]
282
+ .filter(h => h.type === 'bottom')
283
+ .sort((a, b) => b.y - a.y);
284
+ for (const header of bottomHeaders) {
285
+ if (this.isHeaderStuck(header, absY, scrollTop, region)) {
286
+ const linesToRender = header.stuckLines ?? header.lines;
287
+ const footerRowInRegion = region.height - linesToRender.length - stuckHeight;
288
+ if (Math.round(header.y) === Math.round(footerRowInRegion)) {
289
+ stuckHeight += linesToRender.length;
290
+ }
291
+ else {
292
+ break;
293
+ }
294
+ }
295
+ }
296
+ return stuckHeight;
297
+ }
298
+ getBackgroundStyles(color) {
299
+ if (color === Compositor.lastBackgroundColor) {
300
+ return Compositor.lastBackgroundStyles;
301
+ }
302
+ const styles = getBackgroundColorEscape(color);
303
+ Compositor.lastBackgroundColor = color;
304
+ Compositor.lastBackgroundStyles = styles;
305
+ return styles;
306
+ }
307
+ }
308
+ //# sourceMappingURL=compositor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compositor.js","sourceRoot":"","sources":["../../src/worker/compositor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Handles platform-specific terminal quirks.
8
+ */
9
+ export declare const platform: {
10
+ /**
11
+ * Terminal.app doesn't respect scroll regions starting at line 0 for scroll
12
+ * escape sequences. We need to use a workaround for this terminal.
13
+ */
14
+ isAppleTerminal(): boolean;
15
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import process from 'node:process';
7
+ /**
8
+ * Handles platform-specific terminal quirks.
9
+ */
10
+ export const platform = {
11
+ /**
12
+ * Terminal.app doesn't respect scroll regions starting at line 0 for scroll
13
+ * escape sequences. We need to use a workaround for this terminal.
14
+ */
15
+ isAppleTerminal() {
16
+ return process.env['TERM_PROGRAM'] === 'Apple_Terminal';
17
+ },
18
+ };
19
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/worker/platform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACvB;;;OAGG;IACH,eAAe;QACd,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,gBAAgB,CAAC;IACzD,CAAC;CACD,CAAC"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { type RegionNode, type RegionUpdate } from '../output.js';
7
+ import { type InkOptions } from '../components/AppContext.js';
8
+ import { type ReplayFrame } from '../replay.js';
9
+ import { type RenderLine } from './terminal-writer.js';
10
+ import { SceneManager } from './scene-manager.js';
11
+ export declare const debugWorker = false;
12
+ /**
13
+ * Core renderer that composes together scrollable blocks of styled content.
14
+ */
15
+ export declare class TerminalBufferWorker {
16
+ columns: number;
17
+ rows: number;
18
+ frameIndex: number;
19
+ debugRainbowEnabled: boolean;
20
+ isAlternateBufferEnabled: boolean;
21
+ stickyHeadersInBackbuffer: boolean;
22
+ animatedScroll: boolean;
23
+ animationInterval: number;
24
+ backbufferUpdateDelay: number;
25
+ maxScrollbackLength: number;
26
+ forceScrollToBottomOnBackbufferRefresh: boolean;
27
+ resized: boolean;
28
+ cursorPosition?: {
29
+ row: number;
30
+ col: number;
31
+ };
32
+ forceNextRender: boolean;
33
+ isRecording: boolean;
34
+ recordingFilename: string;
35
+ recordedFrames: ReplayFrame[];
36
+ recordingStartTime: number;
37
+ screen: RenderLine[];
38
+ backbuffer: RenderLine[];
39
+ private renderPromise?;
40
+ private readonly sceneManager;
41
+ private readonly animationController;
42
+ private readonly scrollOptimizer;
43
+ private readonly primaryTerminalWriter;
44
+ private readonly alternateTerminalWriter;
45
+ private get terminalWriter();
46
+ get backbufferDirty(): boolean;
47
+ set backbufferDirty(value: boolean);
48
+ get backbufferDirtyCurrentFrame(): boolean;
49
+ set backbufferDirtyCurrentFrame(value: boolean);
50
+ constructor(columns: number, rows: number, options?: {
51
+ debugRainbowEnabled?: boolean;
52
+ stdout?: NodeJS.WriteStream;
53
+ isAlternateBufferEnabled?: boolean;
54
+ stickyHeadersInBackbuffer?: boolean;
55
+ animatedScroll?: boolean;
56
+ animationInterval?: number;
57
+ backbufferUpdateDelay?: number;
58
+ maxScrollbackLength?: number;
59
+ forceScrollToBottomOnBackbufferRefresh?: boolean;
60
+ });
61
+ waitForIdle(): Promise<void>;
62
+ getExpectedState(): {
63
+ backbuffer: RenderLine[];
64
+ screen: RenderLine[];
65
+ cursorX: number;
66
+ cursorY: number;
67
+ };
68
+ getSceneManager(): SceneManager;
69
+ startRecording(filename: string): void;
70
+ stopRecording(): void;
71
+ dumpCurrentFrame(filename: string): void;
72
+ updateOptions(options: InkOptions): void;
73
+ update(tree: RegionNode, updates: RegionUpdate[], cursorPosition?: {
74
+ row: number;
75
+ col: number;
76
+ }): boolean;
77
+ resize(columns: number, rows: number): void;
78
+ fullRender(): Promise<void>;
79
+ render(): Promise<void>;
80
+ flushPendingRender(): Promise<void>;
81
+ done(): void;
82
+ getLinesUpdated(): number;
83
+ resetLinesUpdated(): void;
84
+ clear(): void;
85
+ private serializeCurrentRegions;
86
+ private _render;
87
+ private tickAnimation;
88
+ private composeScene;
89
+ /**
90
+ * Recursively composites a region and its children onto the provided canvas.
91
+ *
92
+ * @param node The hierarchical node to compose.
93
+ * @param canvas The target canvas to draw upon.
94
+ * @param layout Layout and clipping options for the current composition pass.
95
+ * @param layout.clip Optional bounding box to clip rendering.
96
+ * @param layout.offsetY The cumulative Y offset (used for scrolling/camera adjustments).
97
+ * @param layout.offsetX The cumulative X offset (used for scrolling/camera adjustments).
98
+ * @param layout.overrideHeight Optional height to force for the current region, typically used when composing to the backbuffer to capture content that has scrolled out of view.
99
+ * @param layout.isExpanded If true, forces the region to render at its full scroll height rather than its constrained layout height. When composing the backbuffer, this flag is passed down to the specific scrollable descendant that has `overflowToBackbuffer` enabled (typically only one such region should exist), allowing its complete content to be captured instead of just the visible viewport.
100
+ * @param options Additional composition flags.
101
+ * @param options.skipStickyHeaders If true, sticky headers will not be drawn.
102
+ * @param options.skipScrollbars If true, scrollbars will not be drawn.
103
+ */
104
+ private composeNode;
105
+ private createCompositor;
106
+ private getCameraY;
107
+ private syncCursor;
108
+ private appendToBackbuffer;
109
+ private updateTrackingMaps;
110
+ private findNodeForRegion;
111
+ private logScene;
112
+ }