@chengchenccc/tui 0.1.1-rc.3 → 0.2.0-rc.2

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 (57) hide show
  1. package/dist/components/ansi-console.d.ts +32 -0
  2. package/dist/components/ansi-console.d.ts.map +1 -0
  3. package/dist/components/ansi-console.js +75 -0
  4. package/dist/components/ansi-console.test.d.ts +2 -0
  5. package/dist/components/ansi-console.test.d.ts.map +1 -0
  6. package/dist/components/ansi-console.test.js +36 -0
  7. package/dist/components/loader.d.ts +21 -1
  8. package/dist/components/loader.d.ts.map +1 -1
  9. package/dist/components/loader.js +39 -15
  10. package/dist/components/markdown.d.ts +5 -0
  11. package/dist/components/markdown.d.ts.map +1 -1
  12. package/dist/components/markdown.js +47 -2
  13. package/dist/components/markdown.test.js +30 -1
  14. package/dist/components/select-list.d.ts +6 -0
  15. package/dist/components/select-list.d.ts.map +1 -1
  16. package/dist/components/select-list.js +18 -0
  17. package/dist/components/select-list.test.d.ts +2 -0
  18. package/dist/components/select-list.test.d.ts.map +1 -0
  19. package/dist/components/select-list.test.js +53 -0
  20. package/dist/index.d.ts +4 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +4 -2
  23. package/dist/keybindings.d.ts +5 -0
  24. package/dist/keybindings.d.ts.map +1 -1
  25. package/dist/keybindings.js +7 -0
  26. package/dist/loader-sweep.test.d.ts +2 -0
  27. package/dist/loader-sweep.test.d.ts.map +1 -0
  28. package/dist/loader-sweep.test.js +67 -0
  29. package/dist/stdin-buffer.d.ts +1 -0
  30. package/dist/stdin-buffer.d.ts.map +1 -1
  31. package/dist/stdin-buffer.js +19 -0
  32. package/dist/stdin-buffer.test.d.ts +2 -0
  33. package/dist/stdin-buffer.test.d.ts.map +1 -0
  34. package/dist/stdin-buffer.test.js +38 -0
  35. package/dist/terminal-reassert.test.d.ts +2 -0
  36. package/dist/terminal-reassert.test.d.ts.map +1 -0
  37. package/dist/terminal-reassert.test.js +18 -0
  38. package/dist/terminal.d.ts +14 -0
  39. package/dist/terminal.d.ts.map +1 -1
  40. package/dist/terminal.js +18 -0
  41. package/dist/text-sizing.d.ts +7 -0
  42. package/dist/text-sizing.d.ts.map +1 -0
  43. package/dist/text-sizing.js +34 -0
  44. package/dist/text-sizing.test.d.ts +2 -0
  45. package/dist/text-sizing.test.d.ts.map +1 -0
  46. package/dist/text-sizing.test.js +43 -0
  47. package/dist/tui-scrollback.test.js +36 -0
  48. package/dist/tui.d.ts +8 -0
  49. package/dist/tui.d.ts.map +1 -1
  50. package/dist/tui.js +73 -7
  51. package/dist/utils.d.ts +1 -3
  52. package/dist/utils.d.ts.map +1 -1
  53. package/dist/utils.js +28 -0
  54. package/dist/virtual-terminal.d.ts +1 -0
  55. package/dist/virtual-terminal.d.ts.map +1 -1
  56. package/dist/virtual-terminal.js +3 -0
  57. package/package.json +2 -2
package/dist/tui.js CHANGED
@@ -130,9 +130,17 @@ export class TUI extends Container {
130
130
  /** Global callback for debug key (Shift+Ctrl+D). Called before input is forwarded to focused component. */
131
131
  onDebug;
132
132
  renderRequested = false;
133
+ /** Duration of the previous frame (drives adaptive backpressure). */
134
+ lastFrameCostMs = 0;
133
135
  renderTimer;
134
136
  lastRenderAt = 0;
135
137
  static MIN_RENDER_INTERVAL_MS = 16;
138
+ /** Adaptive backpressure (omp #4145): the next frame starts no sooner than
139
+ * last_frame_start + 2 × last_frame_cost, targeting a ~50% render duty
140
+ * cycle so a heavy frame (long markdown tail) cannot saturate the loop and
141
+ * starve input/loader paints. Capped so a one-off spike cannot lock the
142
+ * UI. */
143
+ static MAX_ADAPTIVE_RENDER_MS = 200;
136
144
  cursorRow = 0; // Logical cursor row (end of rendered content)
137
145
  hardwareCursorRow = 0; // Actual terminal cursor row (may differ due to IME positioning)
138
146
  showHardwareCursor = process.env.PI_HARDWARE_CURSOR === "1";
@@ -552,7 +560,9 @@ export class TUI extends Container {
552
560
  }
553
561
  this.renderRequested = false;
554
562
  this.lastRenderAt = performance.now();
563
+ const frameStart = this.lastRenderAt;
555
564
  this.doRender();
565
+ this.lastFrameCostMs = performance.now() - frameStart;
556
566
  });
557
567
  return;
558
568
  }
@@ -566,7 +576,10 @@ export class TUI extends Container {
566
576
  return;
567
577
  }
568
578
  const elapsed = performance.now() - this.lastRenderAt;
569
- const delay = Math.max(0, TUI.MIN_RENDER_INTERVAL_MS - elapsed);
579
+ const cadenceDelay = Math.max(0, TUI.MIN_RENDER_INTERVAL_MS - elapsed);
580
+ const adaptiveFloor = Math.min(TUI.MAX_ADAPTIVE_RENDER_MS, this.lastFrameCostMs * 2);
581
+ const adaptiveDelay = Math.max(0, adaptiveFloor - elapsed);
582
+ const delay = Math.max(cadenceDelay, adaptiveDelay);
570
583
  this.renderTimer = setTimeout(() => {
571
584
  this.renderTimer = undefined;
572
585
  if (this.stopped || !this.renderRequested) {
@@ -574,7 +587,9 @@ export class TUI extends Container {
574
587
  }
575
588
  this.renderRequested = false;
576
589
  this.lastRenderAt = performance.now();
590
+ const frameStart = this.lastRenderAt;
577
591
  this.doRender();
592
+ this.lastFrameCostMs = performance.now() - frameStart;
578
593
  if (this.renderRequested) {
579
594
  this.scheduleRender();
580
595
  }
@@ -1070,8 +1085,26 @@ export class TUI extends Container {
1070
1085
  let buffer = "\x1b[?2026h";
1071
1086
  if (destructiveReset)
1072
1087
  buffer += "\x1b[H\x1b[3J\x1b[2J";
1088
+ // Frame advance = history rows appended this frame. After those appends
1089
+ // the screen content that sits under new viewport slot i is the OLD
1090
+ // window's row (i + advance) — both when the appends scrolled the
1091
+ // terminal (full-height frames) and when the window slid down over the
1092
+ // scrollback (short frames). Rows equal under that mapping are already
1093
+ // correct on screen and are skipped.
1094
+ // Sound minimal differential: only frames WITHOUT history appends and
1095
+ // with an unchanged window origin may skip byte-identical rows. Scroll
1096
+ // frames (history pushes shift screen content by an amount the provider
1097
+ // may disagree with — its commit granularity differs from the slice)
1098
+ // stay on the full sequential write; generalizing the skip to detected
1099
+ // shifts corrupted the scrollback interplay (H-rows landing in V-slots)
1100
+ // and was reverted.
1101
+ const differential = !destructiveReset &&
1102
+ historyRows.length === 0 &&
1103
+ this.providerWindow.length === rows &&
1104
+ rows > 0 &&
1105
+ newTop === this.providerViewportTop;
1073
1106
  const pushed = Math.max(0, startTop + historyRows.length + rows - height);
1074
- if (pushed > this.providerViewportTop && this.providerWindow.length > 0) {
1107
+ if (!differential && pushed > this.providerViewportTop && this.providerWindow.length > 0) {
1075
1108
  buffer += `\x1b[${this.providerViewportTop + 1};1H\x1b[J`;
1076
1109
  }
1077
1110
  buffer += `\x1b[${startTop + 1};1H`;
@@ -1082,11 +1115,44 @@ export class TUI extends Container {
1082
1115
  buffer += `\x1b[2K${line}`;
1083
1116
  screenRow++;
1084
1117
  }
1085
- for (let index = 0; index < rows; index++) {
1086
- if (index > 0 || screenRow > startTop)
1087
- buffer += "\r\n";
1088
- buffer += `\x1b[2K${viewport[index] ?? ""}`;
1089
- screenRow++;
1118
+ // Differential viewport write: frames without history appends and with
1119
+ // an unchanged window origin rewrite ONLY the rows whose bytes changed.
1120
+ // Terminals without synchronized-output support (tmux 3.3a ignores
1121
+ // DECSET 2026) would otherwise blank-and-rewrite every row on every
1122
+ // spinner tick — visible as constant transcript flicker. Frames that
1123
+ // scroll (history pushes shift screen content) fall back to the full
1124
+ // sequential write; the byte-identical skip is unsound there.
1125
+ if (differential) {
1126
+ let runStart = -1;
1127
+ const flushRun = (endExclusive) => {
1128
+ if (runStart < 0)
1129
+ return;
1130
+ buffer += `\x1b[${newTop + runStart + 1};1H`;
1131
+ for (let k = runStart; k < endExclusive; k++) {
1132
+ if (k > runStart)
1133
+ buffer += "\r\n";
1134
+ buffer += `\x1b[2K${viewport[k] ?? ""}`;
1135
+ }
1136
+ runStart = -1;
1137
+ };
1138
+ for (let index = 0; index < rows; index++) {
1139
+ if (this.providerWindow[index] !== viewport[index]) {
1140
+ if (runStart < 0)
1141
+ runStart = index;
1142
+ }
1143
+ else {
1144
+ flushRun(index);
1145
+ }
1146
+ }
1147
+ flushRun(rows);
1148
+ }
1149
+ else {
1150
+ for (let index = 0; index < rows; index++) {
1151
+ if (index > 0 || screenRow > startTop)
1152
+ buffer += "\r\n";
1153
+ buffer += `\x1b[2K${viewport[index] ?? ""}`;
1154
+ screenRow++;
1155
+ }
1090
1156
  }
1091
1157
  if (newTop + rows < height)
1092
1158
  buffer += `\x1b[${newTop + rows + 1};1H\x1b[J`;
package/dist/utils.d.ts CHANGED
@@ -7,9 +7,7 @@ export declare function getGraphemeSegmenter(): Intl.Segmenter;
7
7
  */
8
8
  export declare function getWordSegmenter(): Intl.Segmenter;
9
9
  export declare const cjkBreakRegex: RegExp;
10
- /**
11
- * Calculate the visible width of a string in terminal columns.
12
- */
10
+ export declare function encodeTextSized(text: string, scale: number): string;
13
11
  export declare function visibleWidth(str: string): number;
14
12
  export declare function normalizeTerminalOutput(str: string): string;
15
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAAC,SAAS,CAErD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAAC,SAAS,CAEjD;AA+BD,eAAO,MAAM,aAAa,QAC4H,CAAC;AAoKvJ;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAuDhD;AAWD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwCjG;AAmWD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBtE;AAmFD,eAAO,MAAM,iBAAiB,QAAyC,CAAC;AAExE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAuED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7B,MAAM,CAcR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAc,EACxB,GAAG,GAAE,OAAe,GACnB,MAAM,CAiJR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,UAAQ,GACb,MAAM,CAER;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,UAAQ,GACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAwCjC;AAKD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,UAAQ,GAClB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAiE5E"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAAC,SAAS,CAErD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAAC,SAAS,CAEjD;AA+BD,eAAO,MAAM,aAAa,QAC4H,CAAC;AA+KvJ,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnE;AAgBD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAyDhD;AAWD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwCjG;AAmWD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBtE;AAmFD,eAAO,MAAM,iBAAiB,QAAyC,CAAC;AAExE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAuED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7B,MAAM,CAcR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAc,EACxB,GAAG,GAAE,OAAe,GACnB,MAAM,CAiJR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,UAAQ,GACb,MAAM,CAER;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,UAAQ,GACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAwCjC;AAKD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,UAAQ,GAClB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAiE5E"}
package/dist/utils.js CHANGED
@@ -179,6 +179,32 @@ function graphemeWidth(segment) {
179
179
  /**
180
180
  * Calculate the visible width of a string in terminal columns.
181
181
  */
182
+ /** OSC 66 text-sizing spans: `\x1b]66;<meta>;<payload>` (BEL or ST). The
183
+ * payload is visible and scales by its `s=` factor, but the escape stripper
184
+ * drops the whole span — so the width is added back at scale, or the frame's
185
+ * padding math would treat a sized heading as a zero-width line. */
186
+ const OSC66_SPAN = /\x1b\]66;([^;]*);([\s\S]*?)(?:\x07|\x1b\\)/g;
187
+ /** Sequencing/control bytes are illegal inside an OSC 66 payload. */
188
+ const OSC66_UNSAFE = /[\x00-\x1f\x7f]/g;
189
+ export function encodeTextSized(text, scale) {
190
+ if (scale <= 1)
191
+ return text;
192
+ return `\x1b]66;s=${scale};${text.replace(OSC66_UNSAFE, " ")}\x1b\\`;
193
+ }
194
+ function textSizingSpansWidth(text) {
195
+ let total = 0;
196
+ for (const match of text.matchAll(OSC66_SPAN)) {
197
+ const scale = Number(/s=(\d+)/.exec(match[1] ?? "")?.[1] ?? "1");
198
+ if (!Number.isFinite(scale) || scale <= 1)
199
+ continue;
200
+ let payloadWidth = 0;
201
+ for (const { segment } of graphemeSegmenter.segment(match[2] ?? "")) {
202
+ payloadWidth += graphemeWidth(segment);
203
+ }
204
+ total += scale * payloadWidth;
205
+ }
206
+ return total;
207
+ }
182
208
  export function visibleWidth(str) {
183
209
  if (str.length === 0) {
184
210
  return 0;
@@ -219,6 +245,8 @@ export function visibleWidth(str) {
219
245
  for (const { segment } of graphemeSegmenter.segment(clean)) {
220
246
  width += graphemeWidth(segment);
221
247
  }
248
+ // A sized span survives the strip as nothing; add it back at its scale.
249
+ width += textSizingSpansWidth(str);
222
250
  // Cache result
223
251
  if (widthCache.size >= WIDTH_CACHE_SIZE) {
224
252
  const firstKey = widthCache.keys().next().value;
@@ -18,6 +18,7 @@ export declare class VirtualTerminal implements Terminal {
18
18
  get rows(): number;
19
19
  get kittyProtocolActive(): boolean;
20
20
  moveBy(lines: number): void;
21
+ reassertTerminalState(): void;
21
22
  hideCursor(): void;
22
23
  showCursor(): void;
23
24
  clearLine(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"virtual-terminal.d.ts","sourceRoot":"","sources":["../src/virtual-terminal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,WAAW,EAAiC,MAAM,iBAAiB,CAAC;AAE/F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAK9C;;GAEG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,YAAY,CAAC,CAAyB;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,SAAK,EAAE,IAAI,SAAK;IAcnC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAO5D,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlE,IAAI,IAAI,IAAI;IAOZ,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzB,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,mBAAmB,IAAI,OAAO,CAGjC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAW3B,UAAU,IAAI,IAAI;IAIlB,UAAU,IAAI,IAAI;IAIlB,SAAS,IAAI,IAAI;IAIjB,eAAe,IAAI,IAAI;IAIvB,WAAW,IAAI,IAAI;IAInB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM7B;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAS3C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK9C;;;OAGG;IACH,WAAW,IAAI,MAAM,EAAE;IAiBvB;;OAEG;IACH;;;OAGG;IACH,eAAe,IAAI,MAAM,EAAE;IAa3B,0DAA0D;IAC1D,mBAAmB,IAAI,MAAM,EAAE;IAU/B,eAAe,IAAI,MAAM,EAAE;IAiB3B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,iBAAiB,IAAI;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAQ7C,0DAA0D;IACpD,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAKrC;AAoCD,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAyBpD"}
1
+ {"version":3,"file":"virtual-terminal.d.ts","sourceRoot":"","sources":["../src/virtual-terminal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,WAAW,EAAiC,MAAM,iBAAiB,CAAC;AAE/F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAK9C;;GAEG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,YAAY,CAAC,CAAyB;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,SAAK,EAAE,IAAI,SAAK;IAcnC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAO5D,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlE,IAAI,IAAI,IAAI;IAOZ,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzB,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,mBAAmB,IAAI,OAAO,CAGjC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAW3B,qBAAqB,IAAI,IAAI;IAI7B,UAAU,IAAI,IAAI;IAIlB,UAAU,IAAI,IAAI;IAIlB,SAAS,IAAI,IAAI;IAIjB,eAAe,IAAI,IAAI;IAIvB,WAAW,IAAI,IAAI;IAInB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM7B;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAS3C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK9C;;;OAGG;IACH,WAAW,IAAI,MAAM,EAAE;IAiBvB;;OAEG;IACH;;;OAGG;IACH,eAAe,IAAI,MAAM,EAAE;IAa3B,0DAA0D;IAC1D,mBAAmB,IAAI,MAAM,EAAE;IAU/B,eAAe,IAAI,MAAM,EAAE;IAiB3B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,iBAAiB,IAAI;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAQ7C,0DAA0D;IACpD,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAKrC;AAoCD,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAyBpD"}
@@ -61,6 +61,9 @@ export class VirtualTerminal {
61
61
  }
62
62
  // lines === 0: no movement
63
63
  }
64
+ reassertTerminalState() {
65
+ // Virtual terminal: no host modes to repair.
66
+ }
64
67
  hideCursor() {
65
68
  this.xterm.write("\x1b[?25l");
66
69
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chengchenccc/tui",
3
- "version": "0.1.1-rc.3",
3
+ "version": "0.2.0-rc.2",
4
4
  "description": "Terminal UI library with differential rendering (vendored from @earendil-works/pi-tui, MIT)",
5
5
  "type": "module",
6
6
  "exports": {
@@ -20,7 +20,7 @@
20
20
  "scripts": {
21
21
  "build": "tsc -p tsconfig.json",
22
22
  "lint": "biome check . && eslint .",
23
- "test": "bun test --pass-with-no-tests",
23
+ "test": "bun test src --pass-with-no-tests",
24
24
  "typecheck": "tsc -p tsconfig.test.json --noEmit"
25
25
  },
26
26
  "dependencies": {