@jrichman/ink 6.4.10 → 6.4.12

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 (108) hide show
  1. package/build/components/App.d.ts +6 -0
  2. package/build/components/App.js +5 -0
  3. package/build/components/App.js.map +1 -1
  4. package/build/components/AppContext.d.ts +36 -1
  5. package/build/components/AppContext.js +7 -2
  6. package/build/components/AppContext.js.map +1 -1
  7. package/build/components/Box.d.ts +26 -2
  8. package/build/components/Box.js +3 -2
  9. package/build/components/Box.js.map +1 -1
  10. package/build/components/StaticRender.d.ts +8 -0
  11. package/build/components/StaticRender.js +11 -0
  12. package/build/components/StaticRender.js.map +1 -0
  13. package/build/debug-log.d.ts +2 -0
  14. package/build/debug-log.js +44 -0
  15. package/build/debug-log.js.map +1 -0
  16. package/build/dom.d.ts +37 -3
  17. package/build/dom.js +19 -3
  18. package/build/dom.js.map +1 -1
  19. package/build/index.d.ts +4 -1
  20. package/build/index.js +3 -1
  21. package/build/index.js.map +1 -1
  22. package/build/ink.d.ts +38 -2
  23. package/build/ink.js +223 -97
  24. package/build/ink.js.map +1 -1
  25. package/build/measure-element.d.ts +20 -1
  26. package/build/measure-element.js +201 -51
  27. package/build/measure-element.js.map +1 -1
  28. package/build/output.d.ts +195 -10
  29. package/build/output.js +494 -160
  30. package/build/output.js.map +1 -1
  31. package/build/reconciler.js +19 -3
  32. package/build/reconciler.js.map +1 -1
  33. package/build/render-background.js +1 -1
  34. package/build/render-background.js.map +1 -1
  35. package/build/render-cached.d.ts +17 -0
  36. package/build/render-cached.js +62 -0
  37. package/build/render-cached.js.map +1 -0
  38. package/build/render-container.d.ts +24 -0
  39. package/build/render-container.js +169 -0
  40. package/build/render-container.js.map +1 -0
  41. package/build/render-node-to-output.d.ts +15 -7
  42. package/build/render-node-to-output.js +123 -485
  43. package/build/render-node-to-output.js.map +1 -1
  44. package/build/render-screen-reader.d.ts +5 -0
  45. package/build/render-screen-reader.js +54 -0
  46. package/build/render-screen-reader.js.map +1 -0
  47. package/build/render-scrollbar.d.ts +22 -0
  48. package/build/render-scrollbar.js +77 -0
  49. package/build/render-scrollbar.js.map +1 -0
  50. package/build/render-sticky.d.ts +56 -0
  51. package/build/render-sticky.js +314 -0
  52. package/build/render-sticky.js.map +1 -0
  53. package/build/render-text-node.d.ts +24 -0
  54. package/build/render-text-node.js +133 -0
  55. package/build/render-text-node.js.map +1 -0
  56. package/build/render.d.ts +39 -0
  57. package/build/render.js +5 -0
  58. package/build/render.js.map +1 -1
  59. package/build/renderer.d.ts +10 -2
  60. package/build/renderer.js +103 -7
  61. package/build/renderer.js.map +1 -1
  62. package/build/replay.d.ts +60 -0
  63. package/build/replay.js +138 -0
  64. package/build/replay.js.map +1 -0
  65. package/build/scroll.js +20 -1
  66. package/build/scroll.js.map +1 -1
  67. package/build/selection.d.ts +9 -0
  68. package/build/selection.js +47 -0
  69. package/build/selection.js.map +1 -1
  70. package/build/serialization.d.ts +28 -0
  71. package/build/serialization.js +267 -0
  72. package/build/serialization.js.map +1 -0
  73. package/build/styles.d.ts +18 -0
  74. package/build/styles.js.map +1 -1
  75. package/build/terminal-buffer.d.ts +53 -0
  76. package/build/terminal-buffer.js +441 -0
  77. package/build/terminal-buffer.js.map +1 -0
  78. package/build/worker/animation-controller.d.ts +72 -0
  79. package/build/worker/animation-controller.js +128 -0
  80. package/build/worker/animation-controller.js.map +1 -0
  81. package/build/worker/ansi-utils.d.ts +16 -0
  82. package/build/worker/ansi-utils.js +40 -0
  83. package/build/worker/ansi-utils.js.map +1 -0
  84. package/build/worker/canvas.d.ts +47 -0
  85. package/build/worker/canvas.js +94 -0
  86. package/build/worker/canvas.js.map +1 -0
  87. package/build/worker/compositor.d.ts +33 -0
  88. package/build/worker/compositor.js +314 -0
  89. package/build/worker/compositor.js.map +1 -0
  90. package/build/worker/platform.d.ts +15 -0
  91. package/build/worker/platform.js +19 -0
  92. package/build/worker/platform.js.map +1 -0
  93. package/build/worker/render-worker.d.ts +112 -0
  94. package/build/worker/render-worker.js +936 -0
  95. package/build/worker/render-worker.js.map +1 -0
  96. package/build/worker/scene-manager.d.ts +26 -0
  97. package/build/worker/scene-manager.js +99 -0
  98. package/build/worker/scene-manager.js.map +1 -0
  99. package/build/worker/scroll-optimizer.d.ts +32 -0
  100. package/build/worker/scroll-optimizer.js +110 -0
  101. package/build/worker/scroll-optimizer.js.map +1 -0
  102. package/build/worker/terminal-writer.d.ts +116 -0
  103. package/build/worker/terminal-writer.js +722 -0
  104. package/build/worker/terminal-writer.js.map +1 -0
  105. package/build/worker/worker-entry.d.ts +6 -0
  106. package/build/worker/worker-entry.js +130 -0
  107. package/build/worker/worker-entry.js.map +1 -0
  108. package/package.json +3 -1
package/build/output.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { type StyledChar } from '@alcalzone/ansi-tokenize';
2
2
  import { type OutputTransformer } from './render-node-to-output.js';
3
+ import { type CursorPosition } from './log-update.js';
4
+ import { type StickyHeader, type DOMElement } from './dom.js';
3
5
  /**
4
6
  "Virtual" output class
5
7
 
@@ -7,9 +9,12 @@ Handles the positioning and saving of the output of each node in the tree. Also
7
9
 
8
10
  Used to generate the final output of all nodes before writing it to actual output stream (e.g. stdout)
9
11
  */
12
+ export declare function clampCursorColumn(line: StyledChar[], col: number): number;
10
13
  type Options = {
11
14
  width: number;
12
15
  height: number;
16
+ node?: DOMElement;
17
+ id?: string | number;
13
18
  };
14
19
  type Clip = {
15
20
  x1: number | undefined;
@@ -17,34 +22,214 @@ type Clip = {
17
22
  y1: number | undefined;
18
23
  y2: number | undefined;
19
24
  };
25
+ export type Rect = {
26
+ x: number;
27
+ y: number;
28
+ w: number;
29
+ h: number;
30
+ };
31
+ export declare function intersectRect(a: Rect, b: Rect): Rect | undefined;
32
+ export declare function isRectIntersectingClip(rect: {
33
+ x1: number;
34
+ y1: number;
35
+ x2: number;
36
+ y2: number;
37
+ }, clip: {
38
+ x1?: number;
39
+ y1?: number;
40
+ x2?: number;
41
+ y2?: number;
42
+ }): boolean;
43
+ /**
44
+ * Represents a rendered rectangular area in the terminal.
45
+ * You can think of it a bit like a `<div>` element rendered in a web browser.
46
+ * Regions can be nested to support complex layouts, including scrollable areas,
47
+ * clipped views, and floating elements (like sticky headers).
48
+ * Each region contains its own localized buffer of rendered lines and maintains
49
+ * its own coordinates, dimensions, scroll state, borders, background colors, and children.
50
+ */
51
+ export type Region = {
52
+ id: number | string;
53
+ x: number;
54
+ y: number;
55
+ width: number;
56
+ height: number;
57
+ lines: StyledChar[][];
58
+ styledOutput: StyledChar[][];
59
+ isScrollable: boolean;
60
+ isVerticallyScrollable?: boolean;
61
+ isHorizontallyScrollable?: boolean;
62
+ scrollTop?: number;
63
+ scrollLeft?: number;
64
+ scrollHeight?: number;
65
+ scrollWidth?: number;
66
+ scrollbarVisible?: boolean;
67
+ overflowToBackbuffer?: boolean;
68
+ marginRight?: number;
69
+ marginBottom?: number;
70
+ scrollbarThumbColor?: string;
71
+ backgroundColor?: string;
72
+ opaque?: boolean;
73
+ borderTop?: number;
74
+ borderBottom?: number;
75
+ stickyHeaders: StickyHeader[];
76
+ cachedStickyHeaders?: StickyHeader[];
77
+ children: Region[];
78
+ cursorPosition?: CursorPosition;
79
+ stableScrollback?: boolean;
80
+ nodeId?: number;
81
+ node?: DOMElement;
82
+ selectableText?: string;
83
+ selectableSpans: Array<{
84
+ y: number;
85
+ startX: number;
86
+ endX: number;
87
+ text: string;
88
+ }>;
89
+ };
90
+ export type RegionNode = {
91
+ id: string | number;
92
+ children: RegionNode[];
93
+ };
94
+ export type RegionUpdate = {
95
+ id: string | number;
96
+ x?: number;
97
+ y?: number;
98
+ width?: number;
99
+ height?: number;
100
+ scrollTop?: number;
101
+ scrollLeft?: number;
102
+ scrollHeight?: number;
103
+ scrollWidth?: number;
104
+ isScrollable?: boolean;
105
+ isVerticallyScrollable?: boolean;
106
+ isHorizontallyScrollable?: boolean;
107
+ scrollbarVisible?: boolean;
108
+ overflowToBackbuffer?: boolean;
109
+ marginRight?: number;
110
+ marginBottom?: number;
111
+ scrollbarThumbColor?: string;
112
+ backgroundColor?: string;
113
+ opaque?: boolean;
114
+ borderTop?: number;
115
+ borderBottom?: number;
116
+ stickyHeaders?: StickyHeader[];
117
+ lines?: {
118
+ updates: Array<{
119
+ start: number;
120
+ end: number;
121
+ data: Uint8Array;
122
+ source?: Uint8Array;
123
+ }>;
124
+ totalLength: number;
125
+ };
126
+ };
127
+ export declare const regionLayoutProperties: readonly ["x", "y", "width", "height", "scrollTop", "scrollLeft", "scrollHeight", "scrollWidth", "isScrollable", "isVerticallyScrollable", "isHorizontallyScrollable", "scrollbarVisible", "overflowToBackbuffer", "marginRight", "marginBottom", "scrollbarThumbColor", "backgroundColor", "opaque", "borderTop", "borderBottom"];
128
+ export type RegionLayoutProps = {
129
+ x?: number;
130
+ y?: number;
131
+ width?: number;
132
+ height?: number;
133
+ scrollTop?: number;
134
+ scrollLeft?: number;
135
+ scrollHeight?: number;
136
+ scrollWidth?: number;
137
+ isScrollable?: boolean;
138
+ isVerticallyScrollable?: boolean;
139
+ isHorizontallyScrollable?: boolean;
140
+ scrollbarVisible?: boolean;
141
+ overflowToBackbuffer?: boolean;
142
+ marginRight?: number;
143
+ marginBottom?: number;
144
+ scrollbarThumbColor?: string;
145
+ backgroundColor?: string;
146
+ opaque?: boolean;
147
+ borderTop?: number;
148
+ borderBottom?: number;
149
+ };
150
+ export declare function copyRegionProperty<K extends (typeof regionLayoutProperties)[number]>(target: RegionLayoutProps, source: RegionLayoutProps, key: K): void;
20
151
  export default class Output {
21
152
  width: number;
22
153
  height: number;
23
- private readonly operations;
24
- private cursorFocusInfo;
154
+ root: Region;
155
+ private readonly activeRegionStack;
25
156
  private readonly clips;
26
157
  constructor(options: Options);
27
158
  getCurrentClip(): Clip | undefined;
159
+ getActiveRegion(): Region;
160
+ getRegionAbsoluteOffset(): {
161
+ x: number;
162
+ y: number;
163
+ };
164
+ startChildRegion(options: {
165
+ id: number | string;
166
+ x: number;
167
+ y: number;
168
+ width: number;
169
+ height: number;
170
+ isScrollable: boolean;
171
+ isVerticallyScrollable?: boolean;
172
+ isHorizontallyScrollable?: boolean;
173
+ scrollState?: {
174
+ scrollTop: number;
175
+ scrollLeft: number;
176
+ scrollHeight: number;
177
+ scrollWidth: number;
178
+ };
179
+ scrollbarVisible?: boolean;
180
+ overflowToBackbuffer?: boolean;
181
+ marginRight?: number;
182
+ marginBottom?: number;
183
+ scrollbarThumbColor?: string;
184
+ backgroundColor?: string;
185
+ opaque?: boolean;
186
+ nodeId?: number;
187
+ stableScrollback?: boolean;
188
+ borderTop?: number;
189
+ borderBottom?: number;
190
+ }): void;
191
+ endChildRegion(): void;
192
+ addStickyHeader(header: StickyHeader): void;
28
193
  write(x: number, y: number, items: string | StyledChar[], options: {
29
194
  transformers: OutputTransformer[];
30
195
  lineIndex?: number;
31
196
  preserveBackgroundColor?: boolean;
32
197
  isTerminalCursorFocused?: boolean;
33
198
  terminalCursorPosition?: number;
199
+ isSelectable?: boolean;
34
200
  }): void;
35
201
  clip(clip: Clip): void;
36
202
  unclip(): void;
37
- get(): {
38
- output: string;
39
- height: number;
40
- styledOutput: StyledChar[][];
203
+ get(): Region;
204
+ addRegionTree(region: Region, x: number, y: number): void;
205
+ private cloneRegion;
206
+ private trimRegionLines;
207
+ private clampCursorPosition;
208
+ private initLines;
209
+ private applyWrite;
210
+ private clearRange;
211
+ private clipChars;
212
+ }
213
+ /**
214
+ * Flattens a hierarchy of nested regions into a single 2D array of styled characters
215
+ * that represents the final visual output to be written to the terminal.
216
+ * This effectively renders the nested region tree (much like compositing layers
217
+ * in a web browser) into a single screen buffer.
218
+ */
219
+ export declare function flattenRegion(root: Region, options?: {
220
+ context?: {
41
221
  cursorPosition?: {
42
222
  row: number;
43
223
  col: number;
44
224
  };
45
225
  };
46
- private clearRange;
47
- private applyWriteOperation;
48
- private clipChars;
49
- }
226
+ skipScrollbars?: boolean;
227
+ skipStickyHeaders?: boolean;
228
+ }): StyledChar[][];
229
+ export declare const extractSelectableText: (spans: Array<{
230
+ y: number;
231
+ startX: number;
232
+ endX: number;
233
+ text: string;
234
+ }>) => string;
50
235
  export {};