@profullstack/hqtui 0.1.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 (98) hide show
  1. package/README.md +144 -0
  2. package/dist/ansi.d.ts +42 -0
  3. package/dist/ansi.d.ts.map +1 -0
  4. package/dist/ansi.js +66 -0
  5. package/dist/ansi.js.map +1 -0
  6. package/dist/app.d.ts +128 -0
  7. package/dist/app.d.ts.map +1 -0
  8. package/dist/app.js +296 -0
  9. package/dist/app.js.map +1 -0
  10. package/dist/buffer.d.ts +50 -0
  11. package/dist/buffer.d.ts.map +1 -0
  12. package/dist/buffer.js +184 -0
  13. package/dist/buffer.js.map +1 -0
  14. package/dist/capabilities.d.ts +36 -0
  15. package/dist/capabilities.d.ts.map +1 -0
  16. package/dist/capabilities.js +93 -0
  17. package/dist/capabilities.js.map +1 -0
  18. package/dist/color.d.ts +47 -0
  19. package/dist/color.d.ts.map +1 -0
  20. package/dist/color.js +176 -0
  21. package/dist/color.js.map +1 -0
  22. package/dist/diff.d.ts +39 -0
  23. package/dist/diff.d.ts.map +1 -0
  24. package/dist/diff.js +203 -0
  25. package/dist/diff.js.map +1 -0
  26. package/dist/graphics/blocks.d.ts +26 -0
  27. package/dist/graphics/blocks.d.ts.map +1 -0
  28. package/dist/graphics/blocks.js +49 -0
  29. package/dist/graphics/blocks.js.map +1 -0
  30. package/dist/graphics/braille.d.ts +33 -0
  31. package/dist/graphics/braille.d.ts.map +1 -0
  32. package/dist/graphics/braille.js +166 -0
  33. package/dist/graphics/braille.js.map +1 -0
  34. package/dist/graphics/index.d.ts +4 -0
  35. package/dist/graphics/index.d.ts.map +1 -0
  36. package/dist/graphics/index.js +4 -0
  37. package/dist/graphics/index.js.map +1 -0
  38. package/dist/graphics/plot.d.ts +91 -0
  39. package/dist/graphics/plot.d.ts.map +1 -0
  40. package/dist/graphics/plot.js +291 -0
  41. package/dist/graphics/plot.js.map +1 -0
  42. package/dist/index.d.ts +34 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +42 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/input.d.ts +62 -0
  47. package/dist/input.d.ts.map +1 -0
  48. package/dist/input.js +245 -0
  49. package/dist/input.js.map +1 -0
  50. package/dist/layout.d.ts +51 -0
  51. package/dist/layout.d.ts.map +1 -0
  52. package/dist/layout.js +163 -0
  53. package/dist/layout.js.map +1 -0
  54. package/dist/surface.d.ts +81 -0
  55. package/dist/surface.d.ts.map +1 -0
  56. package/dist/surface.js +181 -0
  57. package/dist/surface.js.map +1 -0
  58. package/dist/terminal.d.ts +63 -0
  59. package/dist/terminal.d.ts.map +1 -0
  60. package/dist/terminal.js +189 -0
  61. package/dist/terminal.js.map +1 -0
  62. package/dist/testing.d.ts +71 -0
  63. package/dist/testing.d.ts.map +1 -0
  64. package/dist/testing.js +171 -0
  65. package/dist/testing.js.map +1 -0
  66. package/dist/theme.d.ts +58 -0
  67. package/dist/theme.d.ts.map +1 -0
  68. package/dist/theme.js +238 -0
  69. package/dist/theme.js.map +1 -0
  70. package/dist/ui.d.ts +194 -0
  71. package/dist/ui.d.ts.map +1 -0
  72. package/dist/ui.js +439 -0
  73. package/dist/ui.js.map +1 -0
  74. package/dist/unicode.d.ts +36 -0
  75. package/dist/unicode.d.ts.map +1 -0
  76. package/dist/unicode.js +221 -0
  77. package/dist/unicode.js.map +1 -0
  78. package/dist/widgets/controls.d.ts +95 -0
  79. package/dist/widgets/controls.d.ts.map +1 -0
  80. package/dist/widgets/controls.js +231 -0
  81. package/dist/widgets/controls.js.map +1 -0
  82. package/dist/widgets/index.d.ts +5 -0
  83. package/dist/widgets/index.d.ts.map +1 -0
  84. package/dist/widgets/index.js +5 -0
  85. package/dist/widgets/index.js.map +1 -0
  86. package/dist/widgets/meters.d.ts +100 -0
  87. package/dist/widgets/meters.d.ts.map +1 -0
  88. package/dist/widgets/meters.js +209 -0
  89. package/dist/widgets/meters.js.map +1 -0
  90. package/dist/widgets/table.d.ts +92 -0
  91. package/dist/widgets/table.d.ts.map +1 -0
  92. package/dist/widgets/table.js +228 -0
  93. package/dist/widgets/table.js.map +1 -0
  94. package/dist/widgets/text.d.ts +64 -0
  95. package/dist/widgets/text.d.ts.map +1 -0
  96. package/dist/widgets/text.js +123 -0
  97. package/dist/widgets/text.js.map +1 -0
  98. package/package.json +56 -0
@@ -0,0 +1,181 @@
1
+ import { FrameBuffer } from "./buffer.js";
2
+ import { DEFAULT_COLOR } from "./color.js";
3
+ import { inset, intersect, isEmpty } from "./layout.js";
4
+ import { graphemes, stringWidth, truncate, fit } from "./unicode.js";
5
+ export const BORDERS = {
6
+ rounded: { tl: "╭", tr: "╮", bl: "╰", br: "╯", h: "─", v: "│", ml: "├", mr: "┤", mt: "┬", mb: "┴", cross: "┼" },
7
+ single: { tl: "┌", tr: "┐", bl: "└", br: "┘", h: "─", v: "│", ml: "├", mr: "┤", mt: "┬", mb: "┴", cross: "┼" },
8
+ double: { tl: "╔", tr: "╗", bl: "╚", br: "╝", h: "═", v: "║", ml: "╠", mr: "╣", mt: "╦", mb: "╩", cross: "╬" },
9
+ thick: { tl: "┏", tr: "┓", bl: "┗", br: "┛", h: "━", v: "┃", ml: "┣", mr: "┫", mt: "┳", mb: "┻", cross: "╋" },
10
+ dashed: { tl: "╭", tr: "╮", bl: "╰", br: "╯", h: "╌", v: "╎", ml: "├", mr: "┤", mt: "┬", mb: "┴", cross: "┼" },
11
+ ascii: { tl: "+", tr: "+", bl: "+", br: "+", h: "-", v: "|", ml: "+", mr: "+", mt: "+", mb: "+", cross: "+" },
12
+ };
13
+ /**
14
+ * A clipped, translated view onto the framebuffer. Widgets only ever see a
15
+ * Surface, so nothing can draw outside the rectangle it was given.
16
+ */
17
+ export class Surface {
18
+ buffer;
19
+ rect;
20
+ clip;
21
+ theme;
22
+ constructor(buffer, rect, theme, clip) {
23
+ this.buffer = buffer;
24
+ this.rect = rect;
25
+ this.theme = theme;
26
+ this.clip = clip ? intersect(rect, clip) : rect;
27
+ }
28
+ get width() {
29
+ return this.rect.width;
30
+ }
31
+ get height() {
32
+ return this.rect.height;
33
+ }
34
+ get empty() {
35
+ return isEmpty(this.rect);
36
+ }
37
+ /** A child surface in local coordinates, clipped to this one. */
38
+ sub(x, y, width, height) {
39
+ const abs = { x: this.rect.x + x, y: this.rect.y + y, width, height };
40
+ return new Surface(this.buffer, abs, this.theme, this.clip);
41
+ }
42
+ /** A child surface from an absolute rect (as produced by the layout solver). */
43
+ region(rect, clipToParent = true) {
44
+ return new Surface(this.buffer, rect, this.theme, clipToParent ? this.clip : undefined);
45
+ }
46
+ inset(padding) {
47
+ return this.region(inset(this.rect, padding));
48
+ }
49
+ visible(absX, absY) {
50
+ const c = this.clip;
51
+ return absX >= c.x && absY >= c.y && absX < c.x + c.width && absY < c.y + c.height;
52
+ }
53
+ char(x, y, value, style) {
54
+ const ax = this.rect.x + x;
55
+ const ay = this.rect.y + y;
56
+ if (!this.visible(ax, ay))
57
+ return;
58
+ const v = typeof value === "string" ? (value.codePointAt(0) ?? 32) : value;
59
+ this.buffer.setCell(ax, ay, v, style);
60
+ }
61
+ /** Draw text at local (x, y). Returns columns written. */
62
+ text(x, y, text, options = {}) {
63
+ const ay = this.rect.y + y;
64
+ const c = this.clip;
65
+ if (ay < c.y || ay >= c.y + c.height)
66
+ return 0;
67
+ const limit = Math.min(options.maxWidth ?? this.width - x, this.width - x);
68
+ if (limit <= 0)
69
+ return 0;
70
+ let content = text;
71
+ if (options.ellipsis !== false && stringWidth(content) > limit) {
72
+ content = truncate(content, limit);
73
+ }
74
+ if (options.align && options.align !== "left") {
75
+ content = fit(content, limit, options.align);
76
+ }
77
+ const style = { fg: options.fg, bg: options.bg, attrs: options.attrs };
78
+ let cx = this.rect.x + x;
79
+ let written = 0;
80
+ for (const g of graphemes(content)) {
81
+ if (written + g.width > limit)
82
+ break;
83
+ if (cx >= c.x && cx + g.width <= c.x + c.width) {
84
+ this.buffer.setCell(cx, ay, g.value, style);
85
+ }
86
+ cx += g.width;
87
+ written += g.width;
88
+ }
89
+ return written;
90
+ }
91
+ /** Text positioned within the full surface width. */
92
+ textAligned(y, text, align, options = {}) {
93
+ this.text(0, y, fit(truncate(text, this.width), this.width, align), { ...options, align: "left" });
94
+ }
95
+ fill(style, ch = 32) {
96
+ this.fillRect(0, 0, this.width, this.height, style, ch);
97
+ }
98
+ fillRect(x, y, w, h, style, ch = 32) {
99
+ const abs = intersect({ x: this.rect.x + x, y: this.rect.y + y, width: w, height: h }, this.clip);
100
+ if (isEmpty(abs))
101
+ return;
102
+ this.buffer.fillRect(abs.x, abs.y, abs.width, abs.height, ch, style);
103
+ }
104
+ styleRect(x, y, w, h, style) {
105
+ const abs = intersect({ x: this.rect.x + x, y: this.rect.y + y, width: w, height: h }, this.clip);
106
+ if (isEmpty(abs))
107
+ return;
108
+ this.buffer.styleRect(abs.x, abs.y, abs.width, abs.height, style);
109
+ }
110
+ hline(x, y, length, ch = "─", style) {
111
+ for (let i = 0; i < length; i++)
112
+ this.char(x + i, y, ch, style);
113
+ }
114
+ vline(x, y, length, ch = "│", style) {
115
+ for (let i = 0; i < length; i++)
116
+ this.char(x, y + i, ch, style);
117
+ }
118
+ /**
119
+ * Draw a bordered box with an optional title, and return the interior surface.
120
+ * This is the workhorse behind every panel in the library.
121
+ */
122
+ box(options = {}) {
123
+ const style = options.border ?? "rounded";
124
+ const fg = options.borderColor ?? this.theme.border;
125
+ const bg = options.bg;
126
+ if (options.fill !== false && bg !== undefined) {
127
+ this.fill({ bg });
128
+ }
129
+ if (style === "none" || this.width < 2 || this.height < 1) {
130
+ return this.inset(style === "none" ? 0 : 1);
131
+ }
132
+ const b = BORDERS[style];
133
+ const w = this.width;
134
+ const h = this.height;
135
+ const borderStyle = { fg, bg };
136
+ this.char(0, 0, b.tl, borderStyle);
137
+ this.char(w - 1, 0, b.tr, borderStyle);
138
+ this.hline(1, 0, w - 2, b.h, borderStyle);
139
+ if (h > 1) {
140
+ this.char(0, h - 1, b.bl, borderStyle);
141
+ this.char(w - 1, h - 1, b.br, borderStyle);
142
+ this.hline(1, h - 1, w - 2, b.h, borderStyle);
143
+ this.vline(0, 1, h - 2, b.v, borderStyle);
144
+ this.vline(w - 1, 1, h - 2, b.v, borderStyle);
145
+ }
146
+ if (options.title) {
147
+ const titleColor = options.titleColor ?? this.theme.title;
148
+ const label = ` ${options.title} `;
149
+ const maxLabel = Math.max(0, w - 4);
150
+ const shown = truncate(label, maxLabel);
151
+ const tw = stringWidth(shown);
152
+ const align = options.titleAlign ?? "left";
153
+ const tx = align === "left" ? 2 : align === "right" ? Math.max(2, w - 2 - tw) : Math.max(2, Math.floor((w - tw) / 2));
154
+ this.text(tx, 0, shown, { fg: titleColor, bg, attrs: 1 /* bold */ });
155
+ }
156
+ if (options.subtitle) {
157
+ const sub = ` ${options.subtitle} `;
158
+ const sw = stringWidth(sub);
159
+ if (sw + 4 < w) {
160
+ this.text(w - 2 - sw, 0, sub, { fg: options.subtitleColor ?? this.theme.muted, bg });
161
+ }
162
+ }
163
+ if (options.footer && h > 2) {
164
+ const foot = ` ${options.footer} `;
165
+ const fw = stringWidth(foot);
166
+ if (fw + 4 < w) {
167
+ this.text(2, h - 1, foot, { fg: options.footerColor ?? this.theme.muted, bg });
168
+ }
169
+ }
170
+ return this.sub(1, 1, Math.max(0, w - 2), Math.max(0, h - 2));
171
+ }
172
+ /** Absolute rect of this surface, for hit-testing mouse events. */
173
+ hitRect() {
174
+ return { ...this.rect };
175
+ }
176
+ }
177
+ export function createSurface(buffer, theme, rect) {
178
+ return new Surface(buffer, rect ?? { x: 0, y: 0, width: buffer.width, height: buffer.height }, theme);
179
+ }
180
+ export { DEFAULT_COLOR };
181
+ //# sourceMappingURL=surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.js","sourceRoot":"","sources":["../src/surface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { type Capabilities, type CapabilityOverrides } from "./capabilities.ts";
2
+ import { type InputEvent } from "./input.ts";
3
+ export interface TerminalOptions {
4
+ input?: NodeJS.ReadStream;
5
+ output?: NodeJS.WriteStream;
6
+ /** Use the alternate screen so the user's scrollback survives. Default true. */
7
+ alternateScreen?: boolean;
8
+ mouse?: boolean;
9
+ hideCursor?: boolean;
10
+ bracketedPaste?: boolean;
11
+ focusEvents?: boolean;
12
+ title?: string;
13
+ capabilities?: CapabilityOverrides;
14
+ /** Restore the terminal on SIGINT/SIGTERM/uncaught errors. Default true. */
15
+ installExitHandlers?: boolean;
16
+ /** How long to wait before a lone ESC counts as the Escape key. Default 30ms. */
17
+ escapeTimeout?: number;
18
+ }
19
+ export interface TerminalSize {
20
+ columns: number;
21
+ rows: number;
22
+ }
23
+ type Listener<T> = (value: T) => void;
24
+ /**
25
+ * Owns the TTY: raw mode, alternate screen, mouse reporting, and — above all —
26
+ * putting everything back. A crashed app must never leave an unusable shell.
27
+ */
28
+ export declare class Terminal {
29
+ readonly input: NodeJS.ReadStream;
30
+ readonly output: NodeJS.WriteStream;
31
+ readonly capabilities: Capabilities;
32
+ private options;
33
+ private parser;
34
+ private entered;
35
+ /** Milliseconds to wait before deciding a lone ESC was the Escape key. */
36
+ readonly escapeTimeout: number;
37
+ private rawWasSet;
38
+ private inputListeners;
39
+ private resizeListeners;
40
+ private cleanupHandlers;
41
+ private escapeTimer;
42
+ private onData;
43
+ private dispatch;
44
+ private onResize;
45
+ constructor(options?: TerminalOptions);
46
+ size(): TerminalSize;
47
+ write(data: string): void;
48
+ /** Enter full-screen mode. Idempotent. */
49
+ enter(): void;
50
+ /** Put the terminal back exactly as it was found. Safe to call twice. */
51
+ restore(): void;
52
+ onInput(listener: Listener<InputEvent>): () => void;
53
+ onResizeEvent(listener: Listener<TerminalSize>): () => void;
54
+ private installExitHandlers;
55
+ }
56
+ export declare function createTerminal(options?: TerminalOptions): Terminal;
57
+ /**
58
+ * Last-resort cleanup for a process that lost its Terminal reference.
59
+ * Safe to call from a signal handler or a REPL after a bad crash.
60
+ */
61
+ export declare function emergencyRestore(output?: NodeJS.WriteStream): void;
62
+ export {};
63
+ //# sourceMappingURL=terminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAsB,MAAM,mBAAmB,CAAC;AACpG,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,gFAAgF;IAChF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,4EAA4E;IAC5E,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAEtC;;;GAGG;AACH,qBAAa,QAAQ;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,OAAO,CAAC,OAAO,CAAwH;IACvI,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,OAAO,CAAS;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,MAAM,CAaZ;IAEF,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,QAAQ,CAGd;gBAEU,OAAO,GAAE,eAAoB;IAgBzC,IAAI,IAAI,YAAY;IAOpB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKzB,0CAA0C;IAC1C,KAAK,IAAI,IAAI;IA0Bb,yEAAyE;IACzE,OAAO,IAAI,IAAI;IA0Bf,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,MAAM,IAAI;IAKnD,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,MAAM,IAAI;IAK3D,OAAO,CAAC,mBAAmB;CAmC5B;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAEtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,MAAM,CAAC,WAA4B,GAAG,IAAI,CAQlF"}
@@ -0,0 +1,189 @@
1
+ import { ansi, setTitle } from "./ansi.js";
2
+ import { detectCapabilities } from "./capabilities.js";
3
+ import { InputParser } from "./input.js";
4
+ /**
5
+ * Owns the TTY: raw mode, alternate screen, mouse reporting, and — above all —
6
+ * putting everything back. A crashed app must never leave an unusable shell.
7
+ */
8
+ export class Terminal {
9
+ input;
10
+ output;
11
+ capabilities;
12
+ options;
13
+ parser = new InputParser();
14
+ entered = false;
15
+ /** Milliseconds to wait before deciding a lone ESC was the Escape key. */
16
+ escapeTimeout;
17
+ rawWasSet = false;
18
+ inputListeners = new Set();
19
+ resizeListeners = new Set();
20
+ cleanupHandlers = [];
21
+ escapeTimer = null;
22
+ onData = (chunk) => {
23
+ const text = typeof chunk === "string" ? chunk : chunk.toString("utf8");
24
+ this.dispatch(this.parser.parse(text));
25
+ // A lone ESC is only the Escape key once nothing follows it.
26
+ if (this.escapeTimer)
27
+ clearTimeout(this.escapeTimer);
28
+ this.escapeTimer = null;
29
+ if (this.parser.hasPending) {
30
+ this.escapeTimer = setTimeout(() => {
31
+ this.escapeTimer = null;
32
+ this.dispatch(this.parser.flush());
33
+ }, this.escapeTimeout);
34
+ this.escapeTimer.unref?.();
35
+ }
36
+ };
37
+ dispatch(events) {
38
+ for (const event of events) {
39
+ for (const listener of this.inputListeners)
40
+ listener(event);
41
+ }
42
+ }
43
+ onResize = () => {
44
+ const size = this.size();
45
+ for (const listener of this.resizeListeners)
46
+ listener(size);
47
+ };
48
+ constructor(options = {}) {
49
+ this.input = options.input ?? process.stdin;
50
+ this.output = options.output ?? process.stdout;
51
+ this.capabilities = detectCapabilities(options.capabilities ?? {}, process.env, this.output);
52
+ this.escapeTimeout = options.escapeTimeout ?? 30;
53
+ this.options = {
54
+ alternateScreen: options.alternateScreen ?? true,
55
+ mouse: options.mouse ?? this.capabilities.mouse,
56
+ hideCursor: options.hideCursor ?? true,
57
+ bracketedPaste: options.bracketedPaste ?? this.capabilities.bracketedPaste,
58
+ focusEvents: options.focusEvents ?? this.capabilities.focusEvents,
59
+ installExitHandlers: options.installExitHandlers ?? true,
60
+ title: options.title,
61
+ };
62
+ }
63
+ size() {
64
+ return {
65
+ columns: this.output.columns ?? 80,
66
+ rows: this.output.rows ?? 24,
67
+ };
68
+ }
69
+ write(data) {
70
+ if (data.length === 0)
71
+ return;
72
+ this.output.write(data);
73
+ }
74
+ /** Enter full-screen mode. Idempotent. */
75
+ enter() {
76
+ if (this.entered)
77
+ return;
78
+ this.entered = true;
79
+ let setup = "";
80
+ if (this.options.alternateScreen)
81
+ setup += ansi.alternateScreenOn;
82
+ if (this.options.hideCursor)
83
+ setup += ansi.cursorHide;
84
+ if (this.options.mouse && this.capabilities.mouse)
85
+ setup += ansi.mouseOn;
86
+ if (this.options.bracketedPaste)
87
+ setup += ansi.bracketedPasteOn;
88
+ if (this.options.focusEvents)
89
+ setup += ansi.focusOn;
90
+ if (this.options.title)
91
+ setup += setTitle(this.options.title);
92
+ setup += ansi.clearScreen + ansi.cursorHome;
93
+ this.write(setup);
94
+ if (this.input.isTTY && typeof this.input.setRawMode === "function") {
95
+ this.input.setRawMode(true);
96
+ this.rawWasSet = true;
97
+ }
98
+ this.input.resume?.();
99
+ this.input.setEncoding?.("utf8");
100
+ this.input.on("data", this.onData);
101
+ this.output.on("resize", this.onResize);
102
+ if (this.options.installExitHandlers)
103
+ this.installExitHandlers();
104
+ }
105
+ /** Put the terminal back exactly as it was found. Safe to call twice. */
106
+ restore() {
107
+ if (!this.entered)
108
+ return;
109
+ this.entered = false;
110
+ if (this.escapeTimer)
111
+ clearTimeout(this.escapeTimer);
112
+ this.escapeTimer = null;
113
+ this.input.off?.("data", this.onData);
114
+ this.output.off?.("resize", this.onResize);
115
+ if (this.rawWasSet && typeof this.input.setRawMode === "function") {
116
+ this.input.setRawMode(false);
117
+ this.rawWasSet = false;
118
+ }
119
+ this.input.pause?.();
120
+ let teardown = ansi.reset;
121
+ if (this.options.focusEvents)
122
+ teardown += ansi.focusOff;
123
+ if (this.options.bracketedPaste)
124
+ teardown += ansi.bracketedPasteOff;
125
+ if (this.options.mouse)
126
+ teardown += ansi.mouseOff;
127
+ if (this.options.hideCursor)
128
+ teardown += ansi.cursorShow;
129
+ teardown += this.options.alternateScreen ? ansi.alternateScreenOff : `\n`;
130
+ this.write(teardown);
131
+ for (const off of this.cleanupHandlers)
132
+ off();
133
+ this.cleanupHandlers = [];
134
+ }
135
+ onInput(listener) {
136
+ this.inputListeners.add(listener);
137
+ return () => this.inputListeners.delete(listener);
138
+ }
139
+ onResizeEvent(listener) {
140
+ this.resizeListeners.add(listener);
141
+ return () => this.resizeListeners.delete(listener);
142
+ }
143
+ installExitHandlers() {
144
+ const restore = () => this.restore();
145
+ const onSignal = (signal) => () => {
146
+ restore();
147
+ process.exit(signal === "SIGINT" ? 130 : 143);
148
+ };
149
+ const onExit = () => restore();
150
+ const onError = (error) => {
151
+ restore();
152
+ // The terminal is usable again, so the stack trace is actually readable.
153
+ console.error(error);
154
+ process.exit(1);
155
+ };
156
+ const sigint = onSignal("SIGINT");
157
+ const sigterm = onSignal("SIGTERM");
158
+ const sighup = onSignal("SIGHUP");
159
+ process.on("SIGINT", sigint);
160
+ process.on("SIGTERM", sigterm);
161
+ process.on("SIGHUP", sighup);
162
+ process.on("exit", onExit);
163
+ process.on("uncaughtException", onError);
164
+ process.on("unhandledRejection", onError);
165
+ this.cleanupHandlers.push(() => {
166
+ process.off("SIGINT", sigint);
167
+ process.off("SIGTERM", sigterm);
168
+ process.off("SIGHUP", sighup);
169
+ process.off("exit", onExit);
170
+ process.off("uncaughtException", onError);
171
+ process.off("unhandledRejection", onError);
172
+ });
173
+ }
174
+ }
175
+ export function createTerminal(options = {}) {
176
+ return new Terminal(options);
177
+ }
178
+ /**
179
+ * Last-resort cleanup for a process that lost its Terminal reference.
180
+ * Safe to call from a signal handler or a REPL after a bad crash.
181
+ */
182
+ export function emergencyRestore(output = process.stdout) {
183
+ output.write(ansi.reset + ansi.focusOff + ansi.bracketedPasteOff + ansi.mouseOff +
184
+ ansi.cursorShow + ansi.alternateScreenOff);
185
+ if (process.stdin.isTTY && typeof process.stdin.setRawMode === "function") {
186
+ process.stdin.setRawMode(false);
187
+ }
188
+ }
189
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { FrameBuffer } from "./buffer.ts";
2
+ import { Container } from "./ui.ts";
3
+ import { type Theme, type ThemeName } from "./theme.ts";
4
+ import { type Capabilities, type CapabilityOverrides } from "./capabilities.ts";
5
+ import { type Color } from "./color.ts";
6
+ export interface RenderOptions {
7
+ width?: number;
8
+ height?: number;
9
+ theme?: Theme | ThemeName | string;
10
+ capabilities?: CapabilityOverrides;
11
+ /** Frame number reported to the view, for animation snapshots. */
12
+ frame?: number;
13
+ elapsed?: number;
14
+ focus?: number;
15
+ }
16
+ export interface CellSnapshot {
17
+ char: string;
18
+ fg: Color;
19
+ bg: Color;
20
+ attrs: number;
21
+ }
22
+ export interface RenderedScreen {
23
+ width: number;
24
+ height: number;
25
+ buffer: FrameBuffer;
26
+ /** Plain text, one line per row, trailing spaces trimmed. */
27
+ text(): string;
28
+ /** One row of plain text. */
29
+ line(y: number): string;
30
+ /** Everything, with ANSI colors — paste into a terminal to see it. */
31
+ ansi(): string;
32
+ cell(x: number, y: number): CellSnapshot;
33
+ /** Row/col of the first occurrence, or null. */
34
+ find(needle: string): {
35
+ x: number;
36
+ y: number;
37
+ } | null;
38
+ contains(needle: string): boolean;
39
+ /** Cell grid as JSON, for structural assertions. */
40
+ toJSON(): CellSnapshot[][];
41
+ }
42
+ /**
43
+ * Render a view to an in-memory screen. No TTY, no escape codes, no timers —
44
+ * which is what makes TUI code written with this library actually testable.
45
+ *
46
+ * const screen = renderToScreen(({ ui }) => ui.text("CPU 72%"));
47
+ * expect(screen.text()).toContain("CPU 72%");
48
+ */
49
+ export declare function renderToScreen(view: (args: {
50
+ ui: Container;
51
+ theme: Theme;
52
+ width: number;
53
+ height: number;
54
+ capabilities: Capabilities;
55
+ }) => void, options?: RenderOptions): RenderedScreen;
56
+ /** Shorthand: render and return plain text. Ideal for snapshot tests. */
57
+ export declare function renderToText(view: Parameters<typeof renderToScreen>[0], options?: RenderOptions): string;
58
+ /** Render with ANSI colors, e.g. to write a demo screenshot to a file. */
59
+ export declare function renderToAnsi(view: Parameters<typeof renderToScreen>[0], options?: RenderOptions): string;
60
+ /**
61
+ * Render to standalone HTML — a real screenshot of the UI, no terminal needed.
62
+ * This is how the marketing site and the docs show live examples.
63
+ */
64
+ export declare function renderToHtml(view: Parameters<typeof renderToScreen>[0], options?: RenderOptions & {
65
+ fontSize?: number;
66
+ padding?: number;
67
+ className?: string;
68
+ }): string;
69
+ /** Drive a view for N frames — for animation and performance assertions. */
70
+ export declare function renderFrames(view: Parameters<typeof renderToScreen>[0], count: number, options?: RenderOptions): RenderedScreen[];
71
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}