@teaui/core 1.3.8 → 1.4.8
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.
- package/.dist/Buffer.d.ts +9 -4
- package/.dist/Buffer.js +19 -16
- package/.dist/Buffer.js.map +1 -1
- package/.dist/Color.js +8 -12
- package/.dist/Color.js.map +1 -1
- package/.dist/Container.d.ts +4 -4
- package/.dist/Container.js +6 -10
- package/.dist/Container.js.map +1 -1
- package/.dist/Screen.d.ts +40 -11
- package/.dist/Screen.js +134 -94
- package/.dist/Screen.js.map +1 -1
- package/.dist/StringTerminal.d.ts +21 -0
- package/.dist/StringTerminal.js +100 -0
- package/.dist/StringTerminal.js.map +1 -0
- package/.dist/Style.d.ts +1 -1
- package/.dist/Style.js +24 -32
- package/.dist/Style.js.map +1 -1
- package/.dist/System.d.ts +2 -2
- package/.dist/System.js +2 -7
- package/.dist/System.js.map +1 -1
- package/.dist/TestTerminal.d.ts +100 -0
- package/.dist/TestTerminal.js +290 -0
- package/.dist/TestTerminal.js.map +1 -0
- package/.dist/Theme.d.ts +2 -2
- package/.dist/Theme.js +11 -15
- package/.dist/Theme.js.map +1 -1
- package/.dist/UI.d.ts +1 -1
- package/.dist/UI.js +3 -6
- package/.dist/UI.js.map +1 -1
- package/.dist/View.d.ts +8 -8
- package/.dist/View.js +17 -22
- package/.dist/View.js.map +1 -1
- package/.dist/Viewport.d.ts +6 -6
- package/.dist/Viewport.js +26 -30
- package/.dist/Viewport.js.map +1 -1
- package/.dist/ansi.js +25 -43
- package/.dist/ansi.js.map +1 -1
- package/.dist/components/Accordion.d.ts +8 -9
- package/.dist/components/Accordion.js +32 -40
- package/.dist/components/Accordion.js.map +1 -1
- package/.dist/components/Box.d.ts +3 -3
- package/.dist/components/Box.js +27 -31
- package/.dist/components/Box.js.map +1 -1
- package/.dist/components/Button.d.ts +8 -8
- package/.dist/components/Button.js +18 -22
- package/.dist/components/Button.js.map +1 -1
- package/.dist/components/Checkbox.d.ts +7 -7
- package/.dist/components/Checkbox.js +15 -20
- package/.dist/components/Checkbox.js.map +1 -1
- package/.dist/components/Collapsible.d.ts +6 -6
- package/.dist/components/Collapsible.js +16 -20
- package/.dist/components/Collapsible.js.map +1 -1
- package/.dist/components/CollapsibleText.d.ts +6 -6
- package/.dist/components/CollapsibleText.js +22 -26
- package/.dist/components/CollapsibleText.js.map +1 -1
- package/.dist/components/Digits.d.ts +5 -5
- package/.dist/components/Digits.js +7 -11
- package/.dist/components/Digits.js.map +1 -1
- package/.dist/components/Drawer.d.ts +7 -7
- package/.dist/components/Drawer.js +34 -38
- package/.dist/components/Drawer.js.map +1 -1
- package/.dist/components/Dropdown.d.ts +6 -6
- package/.dist/components/Dropdown.js +21 -25
- package/.dist/components/Dropdown.js.map +1 -1
- package/.dist/components/Header.d.ts +5 -5
- package/.dist/components/Header.js +14 -24
- package/.dist/components/Header.js.map +1 -1
- package/.dist/components/HotKey.d.ts +4 -4
- package/.dist/components/HotKey.js +6 -10
- package/.dist/components/HotKey.js.map +1 -1
- package/.dist/components/Input.d.ts +7 -7
- package/.dist/components/Input.js +38 -42
- package/.dist/components/Input.js.map +1 -1
- package/.dist/components/Log.d.ts +5 -5
- package/.dist/components/Log.js +26 -31
- package/.dist/components/Log.js.map +1 -1
- package/.dist/components/Progress.d.ts +4 -4
- package/.dist/components/Progress.js +11 -15
- package/.dist/components/Progress.js.map +1 -1
- package/.dist/components/Scrollable.d.ts +4 -4
- package/.dist/components/Scrollable.js +21 -25
- package/.dist/components/Scrollable.js.map +1 -1
- package/.dist/components/ScrollableList.d.ts +5 -5
- package/.dist/components/ScrollableList.js +13 -17
- package/.dist/components/ScrollableList.js.map +1 -1
- package/.dist/components/Separator.d.ts +5 -5
- package/.dist/components/Separator.js +6 -10
- package/.dist/components/Separator.js.map +1 -1
- package/.dist/components/Slider.d.ts +5 -5
- package/.dist/components/Slider.js +34 -38
- package/.dist/components/Slider.js.map +1 -1
- package/.dist/components/Space.d.ts +5 -5
- package/.dist/components/Space.js +6 -10
- package/.dist/components/Space.js.map +1 -1
- package/.dist/components/Spinner.d.ts +4 -4
- package/.dist/components/Spinner.js +5 -9
- package/.dist/components/Spinner.js.map +1 -1
- package/.dist/components/Stack.d.ts +6 -6
- package/.dist/components/Stack.js +16 -20
- package/.dist/components/Stack.js.map +1 -1
- package/.dist/components/Tabs.d.ts +7 -7
- package/.dist/components/Tabs.js +30 -34
- package/.dist/components/Tabs.js.map +1 -1
- package/.dist/components/Text.d.ts +6 -6
- package/.dist/components/Text.js +19 -23
- package/.dist/components/Text.js.map +1 -1
- package/.dist/components/ToggleGroup.d.ts +7 -7
- package/.dist/components/ToggleGroup.js +20 -24
- package/.dist/components/ToggleGroup.js.map +1 -1
- package/.dist/components/Tree.d.ts +4 -4
- package/.dist/components/Tree.js +17 -21
- package/.dist/components/Tree.js.map +1 -1
- package/.dist/components/Window.d.ts +2 -2
- package/.dist/components/Window.js +2 -6
- package/.dist/components/Window.js.map +1 -1
- package/.dist/components/fonts.d.ts +1 -1
- package/.dist/components/fonts.js +1 -4
- package/.dist/components/fonts.js.map +1 -1
- package/.dist/components/index.d.ts +27 -27
- package/.dist/components/index.js +27 -47
- package/.dist/components/index.js.map +1 -1
- package/.dist/components/types.js +1 -4
- package/.dist/components/types.js.map +1 -1
- package/.dist/components/utility/TrackMouse.d.ts +5 -5
- package/.dist/components/utility/TrackMouse.js +14 -18
- package/.dist/components/utility/TrackMouse.js.map +1 -1
- package/.dist/components/utility/index.d.ts +1 -1
- package/.dist/components/utility/index.js +1 -5
- package/.dist/components/utility/index.js.map +1 -1
- package/.dist/events/index.d.ts +9 -10
- package/.dist/events/index.js +3 -19
- package/.dist/events/index.js.map +1 -1
- package/.dist/events/key.d.ts +17 -3
- package/.dist/events/key.js +6 -13
- package/.dist/events/key.js.map +1 -1
- package/.dist/events/mouse.d.ts +3 -3
- package/.dist/events/mouse.js +12 -24
- package/.dist/events/mouse.js.map +1 -1
- package/.dist/events/translate.d.ts +4 -0
- package/.dist/events/translate.js +84 -0
- package/.dist/events/translate.js.map +1 -0
- package/.dist/events/window.js +1 -2
- package/.dist/geometry.js +4 -11
- package/.dist/geometry.js.map +1 -1
- package/.dist/iTerm2.d.ts +8 -4
- package/.dist/iTerm2.js +5 -9
- package/.dist/iTerm2.js.map +1 -1
- package/.dist/index.d.ts +23 -19
- package/.dist/index.js +21 -37
- package/.dist/index.js.map +1 -1
- package/.dist/inspect.js +23 -28
- package/.dist/inspect.js.map +1 -1
- package/.dist/log.js +9 -17
- package/.dist/log.js.map +1 -1
- package/.dist/managers/FocusManager.d.ts +2 -2
- package/.dist/managers/FocusManager.js +3 -7
- package/.dist/managers/FocusManager.js.map +1 -1
- package/.dist/managers/ModalManager.d.ts +4 -4
- package/.dist/managers/ModalManager.js +5 -9
- package/.dist/managers/ModalManager.js.map +1 -1
- package/.dist/managers/MouseManager.d.ts +4 -4
- package/.dist/managers/MouseManager.js +11 -14
- package/.dist/managers/MouseManager.js.map +1 -1
- package/.dist/managers/TickManager.d.ts +1 -1
- package/.dist/managers/TickManager.js +1 -5
- package/.dist/managers/TickManager.js.map +1 -1
- package/.dist/renderToAnsi.d.ts +12 -0
- package/.dist/renderToAnsi.js +43 -0
- package/.dist/renderToAnsi.js.map +1 -0
- package/.dist/terminal.d.ts +8 -3
- package/.dist/terminal.js +1 -2
- package/.dist/testing.d.ts +44 -0
- package/.dist/testing.js +164 -0
- package/.dist/testing.js.map +1 -0
- package/.dist/util.js +17 -25
- package/.dist/util.js.map +1 -1
- package/LICENSE +0 -3
- package/package.json +9 -31
- package/.dist/sys/alias.d.ts +0 -470
- package/.dist/sys/alias.js +0 -487
- package/.dist/sys/alias.js.map +0 -1
- package/.dist/sys/colors.d.ts +0 -10
- package/.dist/sys/colors.js +0 -285
- package/.dist/sys/colors.js.map +0 -1
- package/.dist/sys/gpmclient.d.ts +0 -11
- package/.dist/sys/gpmclient.js +0 -193
- package/.dist/sys/gpmclient.js.map +0 -1
- package/.dist/sys/index.d.ts +0 -4
- package/.dist/sys/index.js +0 -41
- package/.dist/sys/index.js.map +0 -1
- package/.dist/sys/keys.d.ts +0 -4
- package/.dist/sys/keys.js +0 -531
- package/.dist/sys/keys.js.map +0 -1
- package/.dist/sys/program.d.ts +0 -356
- package/.dist/sys/program.js +0 -3739
- package/.dist/sys/program.js.map +0 -1
- package/.dist/sys/tput.d.ts +0 -297
- package/.dist/sys/tput.js +0 -2708
- package/.dist/sys/tput.js.map +0 -1
- package/.dist/sys/unicode.d.ts +0 -25
- package/.dist/sys/unicode.js +0 -593
- package/.dist/sys/unicode.js.map +0 -1
- package/.dist/sys/usr/linux +0 -0
- package/.dist/sys/usr/windows-ansi +0 -0
- package/.dist/sys/usr/xterm +0 -0
- package/.dist/sys/usr/xterm-256color +0 -0
- package/.dist/sys/usr/xterm.termcap +0 -243
- package/.dist/sys/usr/xterm.terminfo +0 -1977
package/.dist/Buffer.d.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
import type { Terminal, SGRTerminal } from './terminal';
|
|
2
|
-
import type { Color } from './Color';
|
|
3
|
-
import { Style } from './Style';
|
|
4
|
-
import { Size } from './geometry';
|
|
1
|
+
import type { Terminal, SGRTerminal } from './terminal.js';
|
|
2
|
+
import type { Color } from './Color.js';
|
|
3
|
+
import { Style } from './Style.js';
|
|
4
|
+
import { Size } from './geometry.js';
|
|
5
5
|
export declare class Buffer implements Terminal {
|
|
6
6
|
#private;
|
|
7
7
|
size: Size;
|
|
8
8
|
setForeground(fg: Color): void;
|
|
9
9
|
setBackground(bg: Color): void;
|
|
10
10
|
resize(size: Size): void;
|
|
11
|
+
/**
|
|
12
|
+
* Invalidates the diff cache so the next flush writes all cells.
|
|
13
|
+
* Used by test harnesses that reset the terminal between renders.
|
|
14
|
+
*/
|
|
15
|
+
invalidate(): void;
|
|
11
16
|
/**
|
|
12
17
|
* Writes the string at the cursor from left to write. Exits on newline (no default
|
|
13
18
|
* wrapping behavior).
|
package/.dist/Buffer.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const geometry_1 = require("./geometry");
|
|
8
|
-
class Buffer {
|
|
9
|
-
size = geometry_1.Size.zero;
|
|
1
|
+
import * as unicode from '@teaui/term';
|
|
2
|
+
import { BG_DRAW } from './ansi.js';
|
|
3
|
+
import { Style } from './Style.js';
|
|
4
|
+
import { Size } from './geometry.js';
|
|
5
|
+
export class Buffer {
|
|
6
|
+
size = Size.zero;
|
|
10
7
|
#meta = '';
|
|
11
8
|
#canvas = new Map();
|
|
12
9
|
#prev = new Map();
|
|
@@ -18,6 +15,13 @@ class Buffer {
|
|
|
18
15
|
}
|
|
19
16
|
this.size = size;
|
|
20
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Invalidates the diff cache so the next flush writes all cells.
|
|
20
|
+
* Used by test harnesses that reset the terminal between renders.
|
|
21
|
+
*/
|
|
22
|
+
invalidate() {
|
|
23
|
+
this.#prev = new Map();
|
|
24
|
+
}
|
|
21
25
|
/**
|
|
22
26
|
* Writes the string at the cursor from left to write. Exits on newline (no default
|
|
23
27
|
* wrapping behavior).
|
|
@@ -28,7 +32,7 @@ class Buffer {
|
|
|
28
32
|
if (char === '\n') {
|
|
29
33
|
return;
|
|
30
34
|
}
|
|
31
|
-
const width =
|
|
35
|
+
const width = unicode.charWidth(char);
|
|
32
36
|
if (width === 0) {
|
|
33
37
|
return;
|
|
34
38
|
}
|
|
@@ -38,7 +42,7 @@ class Buffer {
|
|
|
38
42
|
let line = this.#canvas.get(y);
|
|
39
43
|
if (line) {
|
|
40
44
|
const prev = line.get(x);
|
|
41
|
-
if (prev?.char ===
|
|
45
|
+
if (prev?.char === BG_DRAW) {
|
|
42
46
|
const { foreground, background } = prev.style;
|
|
43
47
|
if (style.foreground === undefined) {
|
|
44
48
|
style = style.merge({ foreground });
|
|
@@ -90,7 +94,7 @@ class Buffer {
|
|
|
90
94
|
if (this.#meta) {
|
|
91
95
|
terminal.write(this.#meta);
|
|
92
96
|
}
|
|
93
|
-
let prevStyle =
|
|
97
|
+
let prevStyle = Style.NONE;
|
|
94
98
|
for (let y = 0; y < this.size.height; y++) {
|
|
95
99
|
const line = this.#canvas.get(y) ?? new Map();
|
|
96
100
|
const prevLine = this.#prev.get(y) ?? new Map();
|
|
@@ -98,7 +102,7 @@ class Buffer {
|
|
|
98
102
|
let didWrite = false;
|
|
99
103
|
let dx = 1;
|
|
100
104
|
for (let x = 0; x < this.size.width; x += dx) {
|
|
101
|
-
const chrInfo = line.get(x) ?? { char: ' ', style:
|
|
105
|
+
const chrInfo = line.get(x) ?? { char: ' ', style: Style.NONE, width: 1 };
|
|
102
106
|
const prevInfo = prevLine.get(x);
|
|
103
107
|
dx = chrInfo.width;
|
|
104
108
|
if (prevInfo && isCharEqual(chrInfo, prevInfo)) {
|
|
@@ -110,7 +114,7 @@ class Buffer {
|
|
|
110
114
|
terminal.move(x, y);
|
|
111
115
|
}
|
|
112
116
|
let { char, style } = chrInfo;
|
|
113
|
-
if (char ===
|
|
117
|
+
if (char === BG_DRAW) {
|
|
114
118
|
char = ' ';
|
|
115
119
|
}
|
|
116
120
|
if (!prevStyle.isEqual(style)) {
|
|
@@ -124,14 +128,13 @@ class Buffer {
|
|
|
124
128
|
}
|
|
125
129
|
}
|
|
126
130
|
}
|
|
127
|
-
if (prevStyle !==
|
|
131
|
+
if (prevStyle !== Style.NONE) {
|
|
128
132
|
terminal.write('\x1b[0m');
|
|
129
133
|
}
|
|
130
134
|
terminal.flush();
|
|
131
135
|
this.#canvas = new Map();
|
|
132
136
|
}
|
|
133
137
|
}
|
|
134
|
-
exports.Buffer = Buffer;
|
|
135
138
|
function isCharEqual(lhs, rhs) {
|
|
136
139
|
return (lhs.char === rhs.char &&
|
|
137
140
|
lhs.width === rhs.width &&
|
package/.dist/Buffer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Buffer.js","sourceRoot":"","sources":["../lib/Buffer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Buffer.js","sourceRoot":"","sources":["../lib/Buffer.ts"],"names":[],"mappings":"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"}
|
package/.dist/Color.js
CHANGED
|
@@ -1,27 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.colorToHex = colorToHex;
|
|
4
|
-
exports.colorToSGR = colorToSGR;
|
|
5
|
-
const sys_1 = require("./sys");
|
|
6
|
-
function colorToHex(color) {
|
|
1
|
+
import { colors } from '@teaui/term';
|
|
2
|
+
export function colorToHex(color) {
|
|
7
3
|
if (Array.isArray(color)) {
|
|
8
|
-
return
|
|
4
|
+
return colors.RGBtoHex(color);
|
|
9
5
|
}
|
|
10
6
|
else if (typeof color === 'string' && color.startsWith('#')) {
|
|
11
7
|
return color;
|
|
12
8
|
}
|
|
13
9
|
else if (typeof color === 'object' && 'sgr' in color) {
|
|
14
|
-
return
|
|
10
|
+
return colors.indexToHex(+color.sgr);
|
|
15
11
|
}
|
|
16
12
|
else if (typeof color === 'object' && 'grayscale' in color) {
|
|
17
|
-
return
|
|
13
|
+
return colors.RGBtoHex(color.grayscale, color.grayscale, color.grayscale);
|
|
18
14
|
}
|
|
19
15
|
else {
|
|
20
|
-
const index =
|
|
21
|
-
return index === -1 ? '#ffffff' :
|
|
16
|
+
const index = colors.nameToIndex(color);
|
|
17
|
+
return index === -1 ? '#ffffff' : colors.indexToHex(index);
|
|
22
18
|
}
|
|
23
19
|
}
|
|
24
|
-
function colorToSGR(color, fgbg) {
|
|
20
|
+
export function colorToSGR(color, fgbg) {
|
|
25
21
|
if (typeof color === 'object' && 'sgr' in color) {
|
|
26
22
|
return `${color.sgr} ${fgbg}`;
|
|
27
23
|
}
|
package/.dist/Color.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Color.js","sourceRoot":"","sources":["../lib/Color.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Color.js","sourceRoot":"","sources":["../lib/Color.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAuClC,MAAM,UAAU,UAAU,CAAC,KAAY;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9D,OAAO,KAAqB,CAAA;IAC9B,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;QACvD,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACtC,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IAC3E,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QACvC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAY,EAAE,IAAiB;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;QAChD,OAAO,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAA;IAC/B,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAA;IACvC,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;QAC3D,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAA;IAChD,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,KAAK,IAAI,IAAI,EAAE,CAAA;IAC3B,CAAC;AACH,CAAC"}
|
package/.dist/Container.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Size } from './geometry';
|
|
2
|
-
import type { Viewport } from './Viewport';
|
|
3
|
-
import { type Props as ViewProps, View } from './View';
|
|
4
|
-
import { Screen } from './Screen';
|
|
1
|
+
import { Size } from './geometry.js';
|
|
2
|
+
import type { Viewport } from './Viewport.js';
|
|
3
|
+
import { type Props as ViewProps, View } from './View.js';
|
|
4
|
+
import { Screen } from './Screen.js';
|
|
5
5
|
export interface Props extends ViewProps {
|
|
6
6
|
child?: View;
|
|
7
7
|
children?: View[];
|
package/.dist/Container.js
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const View_1 = require("./View");
|
|
6
|
-
const util_1 = require("./util");
|
|
7
|
-
class Container extends View_1.View {
|
|
1
|
+
import { Size } from './geometry.js';
|
|
2
|
+
import { View } from './View.js';
|
|
3
|
+
import { define } from './util.js';
|
|
4
|
+
export class Container extends View {
|
|
8
5
|
#children = [];
|
|
9
6
|
constructor({ child, children, ...viewProps } = {}) {
|
|
10
7
|
super(viewProps);
|
|
11
|
-
|
|
8
|
+
define(this, 'children', { enumerable: true });
|
|
12
9
|
if (child) {
|
|
13
10
|
this.add(child);
|
|
14
11
|
}
|
|
@@ -59,7 +56,7 @@ class Container extends View_1.View {
|
|
|
59
56
|
width = Math.max(width, naturalSize.width);
|
|
60
57
|
height = Math.max(height, naturalSize.height);
|
|
61
58
|
}
|
|
62
|
-
return new
|
|
59
|
+
return new Size(width, height);
|
|
63
60
|
}
|
|
64
61
|
render(viewport) {
|
|
65
62
|
this.renderChildren(viewport);
|
|
@@ -134,5 +131,4 @@ class Container extends View_1.View {
|
|
|
134
131
|
}
|
|
135
132
|
}
|
|
136
133
|
}
|
|
137
|
-
exports.Container = Container;
|
|
138
134
|
//# sourceMappingURL=Container.js.map
|
package/.dist/Container.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Container.js","sourceRoot":"","sources":["../lib/Container.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Container.js","sourceRoot":"","sources":["../lib/Container.ts"],"names":[],"mappings":"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"}
|
package/.dist/Screen.d.ts
CHANGED
|
@@ -1,10 +1,39 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type { SGRTerminal } from './terminal';
|
|
3
|
-
import type { Rect, Point } from './geometry';
|
|
4
|
-
import { View } from './View';
|
|
5
|
-
import type { HotKeyDef, KeyEvent, MouseEventListenerName, SystemEvent, SystemMouseEvent } from './events';
|
|
6
|
-
import { Window } from './components/Window';
|
|
7
|
-
type
|
|
1
|
+
import { Terminal as TermTerminal } from '@teaui/term';
|
|
2
|
+
import type { SGRTerminal } from './terminal.js';
|
|
3
|
+
import type { Rect, Point } from './geometry.js';
|
|
4
|
+
import { View } from './View.js';
|
|
5
|
+
import type { HotKeyDef, KeyEvent, MouseEventListenerName, SystemEvent, SystemMouseEvent } from './events/index.js';
|
|
6
|
+
import { Window } from './components/Window.js';
|
|
7
|
+
type KeyListener = (char: string, key: KeyEvent) => void;
|
|
8
|
+
/**
|
|
9
|
+
* Wraps @teaui/term's Terminal for use by Screen and the public API.
|
|
10
|
+
* Provides a blessed-compatible `.key()` helper and implements SGRTerminal.
|
|
11
|
+
*/
|
|
12
|
+
export declare class TerminalProgram implements SGRTerminal {
|
|
13
|
+
#private;
|
|
14
|
+
constructor();
|
|
15
|
+
get terminal(): TermTerminal;
|
|
16
|
+
get cols(): number;
|
|
17
|
+
get rows(): number;
|
|
18
|
+
move(x: number, y: number): void;
|
|
19
|
+
write(str: string): void;
|
|
20
|
+
flush(): void;
|
|
21
|
+
enterFullscreen(): void;
|
|
22
|
+
exitFullscreen(): void;
|
|
23
|
+
clear(): void;
|
|
24
|
+
startInput(screen: Screen): void;
|
|
25
|
+
stopInput(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Register a key binding (blessed-compatible).
|
|
28
|
+
* Pattern: 'escape', 'C-c', 'C-q', 'return', etc.
|
|
29
|
+
*/
|
|
30
|
+
key(pattern: string | string[], fn: KeyListener): void;
|
|
31
|
+
/**
|
|
32
|
+
* Provide raw data listener (for iTerm2 etc.)
|
|
33
|
+
*/
|
|
34
|
+
once(event: string, fn: (...args: any[]) => void): void;
|
|
35
|
+
}
|
|
36
|
+
type ViewConstructor<T extends View> = (program: TerminalProgram) => T | Promise<T>;
|
|
8
37
|
export interface ScreenOptions {
|
|
9
38
|
quitChar?: 'c' | 'q' | '' | undefined | false;
|
|
10
39
|
}
|
|
@@ -17,13 +46,13 @@ export declare class Screen {
|
|
|
17
46
|
* again.
|
|
18
47
|
*/
|
|
19
48
|
static reset(): void;
|
|
20
|
-
static start(): Promise<[Screen,
|
|
21
|
-
static start<T extends View>(viewConstructor: T | ViewConstructor<T>, opts?: Partial<ScreenOptions>): Promise<[Screen,
|
|
22
|
-
constructor(program:
|
|
49
|
+
static start(): Promise<[Screen, TerminalProgram, Window]>;
|
|
50
|
+
static start<T extends View>(viewConstructor: T | ViewConstructor<T>, opts?: Partial<ScreenOptions>): Promise<[Screen, TerminalProgram, T]>;
|
|
51
|
+
constructor(program: TerminalProgram, rootView: View);
|
|
23
52
|
onExit(callback: () => void): void;
|
|
24
53
|
/**
|
|
25
54
|
* Called from Screen.start(). Don't call this yourself unless you wanted
|
|
26
|
-
* to construct your own 'program'
|
|
55
|
+
* to construct your own 'program'. I recommend starting with a
|
|
27
56
|
* copy of the implementation of Screen.start.
|
|
28
57
|
*/
|
|
29
58
|
start(): void;
|
package/.dist/Screen.js
CHANGED
|
@@ -1,39 +1,132 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
import { Terminal as TermTerminal, cursorTo, isKeyEvent, isMouseEvent, isFocusEvent, } from '@teaui/term';
|
|
2
|
+
import { Size } from './geometry.js';
|
|
3
|
+
import { View } from './View.js';
|
|
4
|
+
import { Viewport } from './Viewport.js';
|
|
5
|
+
import { Buffer } from './Buffer.js';
|
|
6
|
+
import { translateTermKeyEvent, translateTermMouseEvent, } from './events/translate.js';
|
|
7
|
+
import { FocusManager } from './managers/FocusManager.js';
|
|
8
|
+
import { ModalManager } from './managers/ModalManager.js';
|
|
9
|
+
import { MouseManager } from './managers/MouseManager.js';
|
|
10
|
+
import { TickManager } from './managers/TickManager.js';
|
|
11
|
+
import { Window } from './components/Window.js';
|
|
12
|
+
import { UnboundSystem } from './System.js';
|
|
13
|
+
/**
|
|
14
|
+
* Wraps @teaui/term's Terminal for use by Screen and the public API.
|
|
15
|
+
* Provides a blessed-compatible `.key()` helper and implements SGRTerminal.
|
|
16
|
+
*/
|
|
17
|
+
export class TerminalProgram {
|
|
18
|
+
#terminal;
|
|
19
|
+
#keyListeners = [];
|
|
20
|
+
#cleanupInput;
|
|
21
|
+
constructor() {
|
|
22
|
+
this.#terminal = new TermTerminal();
|
|
23
|
+
this.#terminal.enableWriteBuffer();
|
|
24
|
+
}
|
|
25
|
+
get terminal() {
|
|
26
|
+
return this.#terminal;
|
|
27
|
+
}
|
|
28
|
+
// --- SGRTerminal interface ---
|
|
29
|
+
get cols() {
|
|
30
|
+
return this.#terminal.cols;
|
|
31
|
+
}
|
|
32
|
+
get rows() {
|
|
33
|
+
return this.#terminal.rows;
|
|
34
|
+
}
|
|
35
|
+
move(x, y) {
|
|
36
|
+
this.#terminal.write(cursorTo(x, y));
|
|
37
|
+
}
|
|
38
|
+
write(str) {
|
|
39
|
+
this.#terminal.write(str);
|
|
40
|
+
}
|
|
41
|
+
flush() {
|
|
42
|
+
this.#terminal.flushWrites();
|
|
43
|
+
}
|
|
44
|
+
// --- Lifecycle ---
|
|
45
|
+
enterFullscreen() {
|
|
46
|
+
this.#terminal.enterFullscreen({
|
|
47
|
+
mouse: true,
|
|
48
|
+
hideCursor: true,
|
|
49
|
+
focusEvents: true,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
exitFullscreen() {
|
|
53
|
+
this.#terminal.exitFullscreen();
|
|
54
|
+
}
|
|
55
|
+
clear() {
|
|
56
|
+
this.#terminal.clear();
|
|
57
|
+
}
|
|
58
|
+
// --- Input ---
|
|
59
|
+
startInput(screen) {
|
|
60
|
+
this.#cleanupInput = this.#terminal.onInput((event) => {
|
|
61
|
+
if (isFocusEvent(event)) {
|
|
62
|
+
screen.trigger({ type: event.focused ? 'focus' : 'blur' });
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (isKeyEvent(event)) {
|
|
66
|
+
const keyEvent = translateTermKeyEvent(event);
|
|
67
|
+
// Check .key() listeners
|
|
68
|
+
for (const { pattern, fn } of this.#keyListeners) {
|
|
69
|
+
if (matchKeyPattern(pattern, keyEvent)) {
|
|
70
|
+
fn(keyEvent.char, keyEvent);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
screen.trigger(keyEvent);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (isMouseEvent(event)) {
|
|
77
|
+
const mouseEvent = translateTermMouseEvent(event);
|
|
78
|
+
if (mouseEvent) {
|
|
79
|
+
screen.trigger(mouseEvent);
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
this.#terminal.onResize(() => {
|
|
85
|
+
screen.trigger({ type: 'resize' });
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
stopInput() {
|
|
89
|
+
this.#cleanupInput?.();
|
|
90
|
+
this.#cleanupInput = undefined;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Register a key binding (blessed-compatible).
|
|
94
|
+
* Pattern: 'escape', 'C-c', 'C-q', 'return', etc.
|
|
95
|
+
*/
|
|
96
|
+
key(pattern, fn) {
|
|
97
|
+
const patterns = Array.isArray(pattern) ? pattern : [pattern];
|
|
98
|
+
for (const p of patterns) {
|
|
99
|
+
this.#keyListeners.push({ pattern: p, fn });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Provide raw data listener (for iTerm2 etc.)
|
|
104
|
+
*/
|
|
105
|
+
once(event, fn) {
|
|
106
|
+
if (event === 'data') {
|
|
107
|
+
this.#terminal.onceRawData(fn);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export class Screen {
|
|
16
112
|
#program;
|
|
17
113
|
#onExit;
|
|
18
114
|
rootView;
|
|
19
115
|
#buffer;
|
|
20
|
-
#focusManager = new
|
|
21
|
-
#modalManager = new
|
|
22
|
-
#mouseManager = new
|
|
23
|
-
#tickManager = new
|
|
116
|
+
#focusManager = new FocusManager();
|
|
117
|
+
#modalManager = new ModalManager();
|
|
118
|
+
#mouseManager = new MouseManager();
|
|
119
|
+
#tickManager = new TickManager(() => this.render());
|
|
24
120
|
/**
|
|
25
121
|
* A helper function that puts the terminal into a "known good" state. I use this
|
|
26
122
|
* during debugging, if the app crashes and I need to get the terminal CLI working
|
|
27
123
|
* again.
|
|
28
124
|
*/
|
|
29
125
|
static reset() {
|
|
30
|
-
const program = (
|
|
31
|
-
useBuffer: true,
|
|
32
|
-
tput: true,
|
|
33
|
-
});
|
|
126
|
+
const program = new TerminalProgram();
|
|
34
127
|
program.clear();
|
|
35
|
-
program.showCursor();
|
|
36
|
-
program.
|
|
128
|
+
program.terminal.showCursor();
|
|
129
|
+
program.exitFullscreen();
|
|
37
130
|
setTimeout(() => {
|
|
38
131
|
process.exit(0);
|
|
39
132
|
}, 0);
|
|
@@ -43,76 +136,38 @@ class Screen {
|
|
|
43
136
|
* consumes all the available screen space) *or* an async function that creates the
|
|
44
137
|
* root node, and accepts a small amount of options.
|
|
45
138
|
*
|
|
46
|
-
* @return the Screen, the
|
|
139
|
+
* @return the Screen, the TerminalProgram that controls the terminal, and the root node
|
|
47
140
|
* instance.
|
|
48
141
|
*/
|
|
49
|
-
static async start(viewConstructor = new
|
|
142
|
+
static async start(viewConstructor = new Window(), opts) {
|
|
50
143
|
opts ??= {};
|
|
51
144
|
opts = {
|
|
52
145
|
quitChar: 'c',
|
|
53
146
|
...opts,
|
|
54
147
|
};
|
|
55
|
-
const program = (
|
|
56
|
-
|
|
57
|
-
tput: true,
|
|
58
|
-
});
|
|
59
|
-
program.alternateBuffer();
|
|
60
|
-
program.enableMouse();
|
|
61
|
-
program.hideCursor();
|
|
148
|
+
const program = new TerminalProgram();
|
|
149
|
+
program.enterFullscreen();
|
|
62
150
|
program.clear();
|
|
63
|
-
|
|
64
|
-
// weird quirk of blessed - bind anything to 'keypress' before
|
|
65
|
-
// attaching the screen or else I-don't-remember-what will happen.
|
|
66
|
-
const fn = function () { };
|
|
67
|
-
program.on('keypress', fn);
|
|
68
|
-
program.off('keypress', fn);
|
|
69
|
-
const rootView = viewConstructor instanceof View_1.View
|
|
151
|
+
const rootView = viewConstructor instanceof View
|
|
70
152
|
? viewConstructor
|
|
71
153
|
: await viewConstructor(program);
|
|
72
154
|
const screen = new Screen(program, rootView);
|
|
73
155
|
screen.onExit(() => {
|
|
74
156
|
program.clear();
|
|
75
|
-
program.
|
|
76
|
-
program.showCursor();
|
|
77
|
-
program.normalBuffer();
|
|
78
|
-
});
|
|
79
|
-
program.on('focus', function () {
|
|
80
|
-
screen.trigger({ type: 'focus' });
|
|
81
|
-
});
|
|
82
|
-
program.on('blur', function () {
|
|
83
|
-
screen.trigger({ type: 'blur' });
|
|
84
|
-
});
|
|
85
|
-
program.on('resize', function () {
|
|
86
|
-
screen.trigger({ type: 'resize' });
|
|
157
|
+
program.exitFullscreen();
|
|
87
158
|
});
|
|
88
159
|
if (opts.quitChar) {
|
|
89
160
|
program.key(`C-${opts.quitChar}`, () => {
|
|
90
161
|
screen.exit();
|
|
91
162
|
});
|
|
92
163
|
}
|
|
93
|
-
program.
|
|
94
|
-
screen.trigger({ type: 'key', ...key });
|
|
95
|
-
});
|
|
96
|
-
program.on('mouse', function (data) {
|
|
97
|
-
let action = data.action;
|
|
98
|
-
if (action === 'focus' || action === 'blur') {
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
if (data.button === 'unknown') {
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
screen.trigger({
|
|
105
|
-
...data,
|
|
106
|
-
name: translateMouseAction(action),
|
|
107
|
-
type: 'mouse',
|
|
108
|
-
});
|
|
109
|
-
});
|
|
164
|
+
program.startInput(screen);
|
|
110
165
|
screen.start();
|
|
111
166
|
return [screen, program, rootView];
|
|
112
167
|
}
|
|
113
168
|
constructor(program, rootView) {
|
|
114
169
|
this.#program = program;
|
|
115
|
-
this.#buffer = new
|
|
170
|
+
this.#buffer = new Buffer();
|
|
116
171
|
this.rootView = rootView;
|
|
117
172
|
Object.defineProperty(this, 'program', {
|
|
118
173
|
enumerable: false,
|
|
@@ -132,7 +187,7 @@ class Screen {
|
|
|
132
187
|
}
|
|
133
188
|
/**
|
|
134
189
|
* Called from Screen.start(). Don't call this yourself unless you wanted
|
|
135
|
-
* to construct your own 'program'
|
|
190
|
+
* to construct your own 'program'. I recommend starting with a
|
|
136
191
|
* copy of the implementation of Screen.start.
|
|
137
192
|
*/
|
|
138
193
|
start() {
|
|
@@ -145,6 +200,7 @@ class Screen {
|
|
|
145
200
|
stop() {
|
|
146
201
|
this.#tickManager.stop();
|
|
147
202
|
this.rootView.moveToScreen(undefined);
|
|
203
|
+
this.#program.stopInput();
|
|
148
204
|
this.#onExit?.();
|
|
149
205
|
}
|
|
150
206
|
/**
|
|
@@ -214,7 +270,7 @@ class Screen {
|
|
|
214
270
|
this.#mouseManager.checkMouse(view, x, y);
|
|
215
271
|
}
|
|
216
272
|
triggerMouse(systemEvent) {
|
|
217
|
-
const system = new
|
|
273
|
+
const system = new UnboundSystem(this.#focusManager);
|
|
218
274
|
this.#mouseManager.trigger(systemEvent, system);
|
|
219
275
|
}
|
|
220
276
|
registerTick(view) {
|
|
@@ -231,7 +287,7 @@ class Screen {
|
|
|
231
287
|
* @return boolean Whether or not to rerender the view due to focus or mouse change
|
|
232
288
|
*/
|
|
233
289
|
commit() {
|
|
234
|
-
const system = new
|
|
290
|
+
const system = new UnboundSystem(this.#focusManager);
|
|
235
291
|
const focusNeedsRender = this.#focusManager.commit();
|
|
236
292
|
const mouseNeedsRender = this.#mouseManager.commit(system);
|
|
237
293
|
return focusNeedsRender || mouseNeedsRender;
|
|
@@ -240,12 +296,12 @@ class Screen {
|
|
|
240
296
|
this.#tickManager.needsRender();
|
|
241
297
|
}
|
|
242
298
|
render() {
|
|
243
|
-
const screenSize = new
|
|
299
|
+
const screenSize = new Size(this.#program.cols, this.#program.rows);
|
|
244
300
|
this.#buffer.resize(screenSize);
|
|
245
301
|
// this may be called again by renderModals, before the last modal renders
|
|
246
302
|
this.preRender(this.rootView);
|
|
247
303
|
const size = this.rootView.naturalSize(screenSize).max(screenSize);
|
|
248
|
-
const viewport = new
|
|
304
|
+
const viewport = new Viewport(this, this.#buffer, size);
|
|
249
305
|
this.rootView.render(viewport);
|
|
250
306
|
const rerenderView = this.#modalManager.renderModals(this, viewport);
|
|
251
307
|
const needsRerender = this.commit();
|
|
@@ -257,24 +313,8 @@ class Screen {
|
|
|
257
313
|
this.#buffer.flush(this.#program);
|
|
258
314
|
}
|
|
259
315
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
switch (action) {
|
|
263
|
-
case 'mousemove':
|
|
264
|
-
return 'mouse.move.in';
|
|
265
|
-
case 'mousedown':
|
|
266
|
-
return `mouse.button.down`;
|
|
267
|
-
case 'mouseup':
|
|
268
|
-
return `mouse.button.up`;
|
|
269
|
-
case 'wheeldown':
|
|
270
|
-
return 'mouse.wheel.down';
|
|
271
|
-
case 'wheelup':
|
|
272
|
-
return 'mouse.wheel.up';
|
|
273
|
-
case 'wheelleft':
|
|
274
|
-
return 'mouse.wheel.left';
|
|
275
|
-
case 'wheelright':
|
|
276
|
-
return 'mouse.wheel.right';
|
|
277
|
-
}
|
|
316
|
+
function matchKeyPattern(pattern, event) {
|
|
317
|
+
return event.full === pattern;
|
|
278
318
|
}
|
|
279
319
|
/**
|
|
280
320
|
* These are mostly due to my own terminal keybindings; would be better to have
|