@kernlang/terminal 3.2.3 → 3.3.5
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/README.md +27 -1
- package/dist/runtime/alternate-screen.d.ts +6 -0
- package/dist/runtime/alternate-screen.js +103 -0
- package/dist/runtime/alternate-screen.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/scroll-box.d.ts +23 -0
- package/dist/runtime/scroll-box.js +186 -0
- package/dist/runtime/scroll-box.js.map +1 -0
- package/dist/runtime/terminal-mode.d.ts +10 -0
- package/dist/runtime/terminal-mode.js +59 -0
- package/dist/runtime/terminal-mode.js.map +1 -0
- package/dist/transpiler-ink.js +269 -30
- package/dist/transpiler-ink.js.map +1 -1
- package/package.json +22 -2
package/README.md
CHANGED
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@kernlang/terminal)
|
|
4
4
|
[](https://github.com/KERNlang/kern/blob/main/LICENSE)
|
|
5
5
|
|
|
6
|
-
Kern ANSI terminal rendering transpiler
|
|
6
|
+
Kern ANSI terminal rendering transpiler with two separate targets:
|
|
7
|
+
|
|
8
|
+
- `terminal`: pure ANSI / Node.js output
|
|
9
|
+
- `ink`: React + Ink terminal UI output
|
|
7
10
|
|
|
8
11
|
Part of the [KERN monorepo](https://github.com/KERNlang/kern).
|
|
9
12
|
|
|
@@ -13,6 +16,18 @@ Part of the [KERN monorepo](https://github.com/KERNlang/kern).
|
|
|
13
16
|
npm install @kernlang/terminal
|
|
14
17
|
```
|
|
15
18
|
|
|
19
|
+
Generated Ink apps also need runtime dependencies in the consuming project:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install react ink @inkjs/ui
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Current upstream runtime baseline:
|
|
26
|
+
|
|
27
|
+
- `react` `19.2.x`
|
|
28
|
+
- `ink` `7.x`
|
|
29
|
+
- Node.js `22+`
|
|
30
|
+
|
|
16
31
|
## Usage
|
|
17
32
|
|
|
18
33
|
```ts
|
|
@@ -22,6 +37,17 @@ const ansiOutput = transpileTerminal(kernSource);
|
|
|
22
37
|
const inkComponent = transpileInk(kernSource);
|
|
23
38
|
```
|
|
24
39
|
|
|
40
|
+
## Ink Output
|
|
41
|
+
|
|
42
|
+
`transpileInk()` returns the component source in `result.code` and, when the screen is exported, a runnable entry artifact in `result.artifacts`.
|
|
43
|
+
|
|
44
|
+
For the CLI path, `kern compile --target=ink` now emits:
|
|
45
|
+
|
|
46
|
+
- `<name>.tsx` — the generated screen/component module
|
|
47
|
+
- `<name>.entry.tsx` — the runnable Ink entrypoint (`render(<Screen />)` + `waitUntilExit()`)
|
|
48
|
+
|
|
49
|
+
Use the companion `*.entry.tsx` file as the process entry when you want to run the generated Ink app directly.
|
|
50
|
+
|
|
25
51
|
## License
|
|
26
52
|
|
|
27
53
|
AGPL-3.0
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useInsertionEffect, useRef, useState } from 'react';
|
|
3
|
+
import { Box, useStdin, useStdout } from 'ink';
|
|
4
|
+
import { acquireAltScreen, acquireRawMode } from './terminal-mode.js';
|
|
5
|
+
const ENTER_ALT_SCREEN = '\x1b[?1049h\x1b[2J\x1b[H';
|
|
6
|
+
const EXIT_ALT_SCREEN = '\x1b[?1049l';
|
|
7
|
+
const ENABLE_MOUSE = '\x1b[?1000h\x1b[?1002h\x1b[?1006h';
|
|
8
|
+
const DISABLE_MOUSE = '\x1b[?1006l\x1b[?1002l\x1b[?1000l';
|
|
9
|
+
const activeInstances = new Set();
|
|
10
|
+
let signalHandlers = null;
|
|
11
|
+
function runGlobalCleanup() {
|
|
12
|
+
for (const inst of activeInstances) {
|
|
13
|
+
try {
|
|
14
|
+
inst.release();
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// stream already closed
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function attachSignalHandlers() {
|
|
22
|
+
if (signalHandlers)
|
|
23
|
+
return;
|
|
24
|
+
const cleanup = () => runGlobalCleanup();
|
|
25
|
+
const onInt = () => {
|
|
26
|
+
cleanup();
|
|
27
|
+
process.exit(130);
|
|
28
|
+
};
|
|
29
|
+
const onTerm = () => {
|
|
30
|
+
cleanup();
|
|
31
|
+
process.exit(143);
|
|
32
|
+
};
|
|
33
|
+
const onExcept = (err) => {
|
|
34
|
+
cleanup();
|
|
35
|
+
throw err;
|
|
36
|
+
};
|
|
37
|
+
signalHandlers = { cleanup, onInt, onTerm, onExcept };
|
|
38
|
+
process.on('exit', cleanup);
|
|
39
|
+
process.on('SIGINT', onInt);
|
|
40
|
+
process.on('SIGTERM', onTerm);
|
|
41
|
+
process.on('uncaughtException', onExcept);
|
|
42
|
+
}
|
|
43
|
+
function detachSignalHandlers() {
|
|
44
|
+
if (!signalHandlers)
|
|
45
|
+
return;
|
|
46
|
+
process.off('exit', signalHandlers.cleanup);
|
|
47
|
+
process.off('SIGINT', signalHandlers.onInt);
|
|
48
|
+
process.off('SIGTERM', signalHandlers.onTerm);
|
|
49
|
+
process.off('uncaughtException', signalHandlers.onExcept);
|
|
50
|
+
signalHandlers = null;
|
|
51
|
+
}
|
|
52
|
+
export function AlternateScreen({ mouseTracking = false, children }) {
|
|
53
|
+
const { stdout } = useStdout();
|
|
54
|
+
const { stdin, setRawMode, isRawModeSupported } = useStdin();
|
|
55
|
+
const [dimensions, setDimensions] = useState(() => ({
|
|
56
|
+
rows: stdout?.rows ?? 24,
|
|
57
|
+
columns: stdout?.columns ?? 80,
|
|
58
|
+
}));
|
|
59
|
+
const instanceRef = useRef(null);
|
|
60
|
+
useInsertionEffect(() => {
|
|
61
|
+
const release = acquireAltScreen({
|
|
62
|
+
enter: () => stdout.write(ENTER_ALT_SCREEN),
|
|
63
|
+
exit: () => stdout.write(EXIT_ALT_SCREEN),
|
|
64
|
+
enableMouse: mouseTracking ? () => stdout.write(ENABLE_MOUSE) : undefined,
|
|
65
|
+
disableMouse: mouseTracking ? () => stdout.write(DISABLE_MOUSE) : undefined,
|
|
66
|
+
});
|
|
67
|
+
const inst = { release };
|
|
68
|
+
instanceRef.current = inst;
|
|
69
|
+
activeInstances.add(inst);
|
|
70
|
+
attachSignalHandlers();
|
|
71
|
+
return () => {
|
|
72
|
+
release();
|
|
73
|
+
activeInstances.delete(inst);
|
|
74
|
+
instanceRef.current = null;
|
|
75
|
+
if (activeInstances.size === 0)
|
|
76
|
+
detachSignalHandlers();
|
|
77
|
+
};
|
|
78
|
+
}, [stdout, mouseTracking]);
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (!mouseTracking)
|
|
81
|
+
return;
|
|
82
|
+
const release = acquireRawMode(setRawMode, isRawModeSupported);
|
|
83
|
+
return () => {
|
|
84
|
+
release();
|
|
85
|
+
};
|
|
86
|
+
}, [mouseTracking, isRawModeSupported, setRawMode, stdin]);
|
|
87
|
+
useEffect(() => {
|
|
88
|
+
if (!stdout)
|
|
89
|
+
return;
|
|
90
|
+
const onResize = () => {
|
|
91
|
+
setDimensions({
|
|
92
|
+
rows: stdout.rows ?? 24,
|
|
93
|
+
columns: stdout.columns ?? 80,
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
stdout.on('resize', onResize);
|
|
97
|
+
return () => {
|
|
98
|
+
stdout.off('resize', onResize);
|
|
99
|
+
};
|
|
100
|
+
}, [stdout]);
|
|
101
|
+
return (_jsx(Box, { flexDirection: "column", width: dimensions.columns, height: dimensions.rows, flexShrink: 0, children: children }));
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=alternate-screen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alternate-screen.js","sourceRoot":"","sources":["../../src/runtime/alternate-screen.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEtE,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AACpD,MAAM,eAAe,GAAG,aAAa,CAAC;AACtC,MAAM,YAAY,GAAG,mCAAmC,CAAC;AACzD,MAAM,aAAa,GAAG,mCAAmC,CAAC;AAW1D,MAAM,eAAe,GAAG,IAAI,GAAG,EAAiB,CAAC;AACjD,IAAI,cAAc,GAA0G,IAAI,CAAC;AAEjI,SAAS,gBAAgB;IACvB,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,cAAc;QAAE,OAAO;IAC3B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAE,EAAE;QAChC,OAAO,EAAE,CAAC;QACV,MAAM,GAAG,CAAC;IACZ,CAAC,CAAC;IACF,cAAc,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,CAAC,cAAc;QAAE,OAAO;IAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC1D,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAE,aAAa,GAAG,KAAK,EAAE,QAAQ,EAAwB;IACvF,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC7D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QAClD,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE;QACxB,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE;KAC/B,CAAC,CAAC,CAAC;IACJ,MAAM,WAAW,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IAEvD,kBAAkB,CAAC,GAAG,EAAE;QACtB,MAAM,OAAO,GAAG,gBAAgB,CAAC;YAC/B,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAC3C,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;YACzC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;YACzE,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;SAC5E,CAAC,CAAC;QACH,MAAM,IAAI,GAAkB,EAAE,OAAO,EAAE,CAAC;QACxC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,oBAAoB,EAAE,CAAC;QACvB,OAAO,GAAG,EAAE;YACV,OAAO,EAAE,CAAC;YACV,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7B,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC3B,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC;gBAAE,oBAAoB,EAAE,CAAC;QACzD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IAE5B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa;YAAE,OAAO;QAC3B,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QAC/D,OAAO,GAAG,EAAE;YACV,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,aAAa,EAAE,kBAAkB,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,aAAa,CAAC;gBACZ,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;aAC9B,CAAC,CAAC;QACL,CAAC,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,YAC1F,QAAQ,GACL,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type ScrollBoxHandle = {
|
|
3
|
+
scrollTo(y: number): void;
|
|
4
|
+
scrollBy(dy: number): void;
|
|
5
|
+
scrollToBottom(): void;
|
|
6
|
+
getScrollTop(): number;
|
|
7
|
+
getScrollHeight(): number;
|
|
8
|
+
getFreshScrollHeight(): number;
|
|
9
|
+
getViewportHeight(): number;
|
|
10
|
+
getViewportTop(): number;
|
|
11
|
+
isSticky(): boolean;
|
|
12
|
+
setClampBounds(min: number, max: number): void;
|
|
13
|
+
subscribe(listener: (scrollTop: number) => void): () => void;
|
|
14
|
+
};
|
|
15
|
+
export type ScrollBoxProps = {
|
|
16
|
+
stickyScroll?: boolean;
|
|
17
|
+
flexGrow?: number;
|
|
18
|
+
flexShrink?: number;
|
|
19
|
+
height?: number;
|
|
20
|
+
rowHeight?: number;
|
|
21
|
+
children?: React.ReactNode;
|
|
22
|
+
};
|
|
23
|
+
export declare const ScrollBox: React.ForwardRefExoticComponent<ScrollBoxProps & React.RefAttributes<ScrollBoxHandle>>;
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState, } from 'react';
|
|
3
|
+
import { Box, measureElement, useStdin, useStdout } from 'ink';
|
|
4
|
+
import { acquireRawMode } from './terminal-mode.js';
|
|
5
|
+
const SGR_MOUSE_PATTERN = /\x1b\[<(\d+);(\d+);(\d+)([Mm])/g;
|
|
6
|
+
const STDIN_BUFFER_MAX = 4096;
|
|
7
|
+
function parseWheelDelta(chunk) {
|
|
8
|
+
// XTerm mouse: bit 6 (64) = wheel, bit 7 (128) = extended, bits 2-5 = modifiers.
|
|
9
|
+
// Wheel-up = bit 6 set, low bits 00. Wheel-down = bit 6 set, low bits 01.
|
|
10
|
+
// Drag, release, and plain clicks are intentionally ignored.
|
|
11
|
+
let delta = 0;
|
|
12
|
+
SGR_MOUSE_PATTERN.lastIndex = 0;
|
|
13
|
+
let match = SGR_MOUSE_PATTERN.exec(chunk);
|
|
14
|
+
while (match !== null) {
|
|
15
|
+
const button = Number(match[1]);
|
|
16
|
+
const isWheel = (button & 64) === 64 && (button & 128) === 0;
|
|
17
|
+
const low = button & 3;
|
|
18
|
+
if (isWheel && low === 0)
|
|
19
|
+
delta -= 3;
|
|
20
|
+
else if (isWheel && low === 1)
|
|
21
|
+
delta += 3;
|
|
22
|
+
match = SGR_MOUSE_PATTERN.exec(chunk);
|
|
23
|
+
}
|
|
24
|
+
return delta;
|
|
25
|
+
}
|
|
26
|
+
export const ScrollBox = forwardRef(function ScrollBox({ stickyScroll = false, flexGrow, flexShrink, height, rowHeight = 1, children }, ref) {
|
|
27
|
+
const { stdin, isRawModeSupported, setRawMode } = useStdin();
|
|
28
|
+
const { stdout } = useStdout();
|
|
29
|
+
const childArray = useMemo(() => React.Children.toArray(children), [children]);
|
|
30
|
+
const totalRows = childArray.length * rowHeight;
|
|
31
|
+
const [viewportRows, setViewportRows] = useState(() => {
|
|
32
|
+
if (typeof height === 'number')
|
|
33
|
+
return height;
|
|
34
|
+
return stdout?.rows ?? 24;
|
|
35
|
+
});
|
|
36
|
+
const [scrollTop, setScrollTop] = useState(() => {
|
|
37
|
+
if (!stickyScroll)
|
|
38
|
+
return 0;
|
|
39
|
+
const initialViewport = typeof height === 'number' ? height : (stdout?.rows ?? 24);
|
|
40
|
+
const initialTotal = React.Children.count(children) * rowHeight;
|
|
41
|
+
return Math.max(0, initialTotal - initialViewport);
|
|
42
|
+
});
|
|
43
|
+
const [clampMin, setClampMin] = useState(0);
|
|
44
|
+
const [clampMax, setClampMax] = useState(Number.POSITIVE_INFINITY);
|
|
45
|
+
const stickyRef = useRef(stickyScroll);
|
|
46
|
+
const listenersRef = useRef(new Set());
|
|
47
|
+
const containerRef = useRef(null);
|
|
48
|
+
const stdinBufferRef = useRef('');
|
|
49
|
+
const latestRef = useRef({
|
|
50
|
+
scrollTop: 0,
|
|
51
|
+
viewportRows,
|
|
52
|
+
totalRows,
|
|
53
|
+
clampMin: 0,
|
|
54
|
+
clampMax: Number.POSITIVE_INFINITY,
|
|
55
|
+
stickyScroll,
|
|
56
|
+
});
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
stickyRef.current = stickyScroll;
|
|
59
|
+
}, [stickyScroll]);
|
|
60
|
+
const maxScroll = Math.max(0, Math.min(clampMax, totalRows - viewportRows));
|
|
61
|
+
const minScroll = Math.max(0, clampMin);
|
|
62
|
+
const clamp = useCallback((value) => Math.max(minScroll, Math.min(maxScroll, value)), [minScroll, maxScroll]);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
latestRef.current = {
|
|
65
|
+
scrollTop,
|
|
66
|
+
viewportRows,
|
|
67
|
+
totalRows,
|
|
68
|
+
clampMin: minScroll,
|
|
69
|
+
clampMax: maxScroll,
|
|
70
|
+
stickyScroll,
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
useLayoutEffect(() => {
|
|
74
|
+
if (!containerRef.current)
|
|
75
|
+
return;
|
|
76
|
+
const measured = measureElement(containerRef.current);
|
|
77
|
+
const measuredHeight = measured?.height ?? 0;
|
|
78
|
+
if (measuredHeight > 0 && measuredHeight !== viewportRows) {
|
|
79
|
+
setViewportRows(measuredHeight);
|
|
80
|
+
}
|
|
81
|
+
else if (typeof height === 'number' && height !== viewportRows) {
|
|
82
|
+
setViewportRows(height);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
useLayoutEffect(() => {
|
|
86
|
+
setScrollTop((prev) => {
|
|
87
|
+
const next = clamp(prev);
|
|
88
|
+
return next === prev ? prev : next;
|
|
89
|
+
});
|
|
90
|
+
}, [clamp]);
|
|
91
|
+
useLayoutEffect(() => {
|
|
92
|
+
if (!stickyRef.current)
|
|
93
|
+
return;
|
|
94
|
+
setScrollTop(maxScroll);
|
|
95
|
+
}, [totalRows, maxScroll]);
|
|
96
|
+
const notifyImperative = useCallback((top) => {
|
|
97
|
+
for (const listener of listenersRef.current)
|
|
98
|
+
listener(top);
|
|
99
|
+
}, []);
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
if (!stdin || !isRawModeSupported)
|
|
102
|
+
return;
|
|
103
|
+
const release = acquireRawMode(setRawMode, isRawModeSupported);
|
|
104
|
+
const onData = (chunk) => {
|
|
105
|
+
const text = typeof chunk === 'string' ? chunk : chunk.toString('utf-8');
|
|
106
|
+
stdinBufferRef.current += text;
|
|
107
|
+
let buf = stdinBufferRef.current;
|
|
108
|
+
if (buf.length > STDIN_BUFFER_MAX) {
|
|
109
|
+
const keepFrom = buf.lastIndexOf('\x1b');
|
|
110
|
+
buf = keepFrom >= 0 ? buf.slice(keepFrom) : '';
|
|
111
|
+
stdinBufferRef.current = buf;
|
|
112
|
+
}
|
|
113
|
+
const lastComplete = Math.max(buf.lastIndexOf('M'), buf.lastIndexOf('m'));
|
|
114
|
+
if (lastComplete === -1)
|
|
115
|
+
return;
|
|
116
|
+
const toParse = buf.slice(0, lastComplete + 1);
|
|
117
|
+
stdinBufferRef.current = buf.slice(lastComplete + 1);
|
|
118
|
+
const delta = parseWheelDelta(toParse);
|
|
119
|
+
if (delta === 0)
|
|
120
|
+
return;
|
|
121
|
+
setScrollTop((prev) => {
|
|
122
|
+
const { clampMin: cMin, clampMax: cMax, stickyScroll: s } = latestRef.current;
|
|
123
|
+
const next = Math.max(cMin, Math.min(cMax, prev + delta));
|
|
124
|
+
if (next !== cMax)
|
|
125
|
+
stickyRef.current = false;
|
|
126
|
+
else if (s)
|
|
127
|
+
stickyRef.current = true;
|
|
128
|
+
notifyImperative(next);
|
|
129
|
+
return next;
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
stdin.on('data', onData);
|
|
133
|
+
return () => {
|
|
134
|
+
stdin.off('data', onData);
|
|
135
|
+
release();
|
|
136
|
+
};
|
|
137
|
+
}, [stdin, isRawModeSupported, setRawMode, notifyImperative]);
|
|
138
|
+
useImperativeHandle(ref, () => ({
|
|
139
|
+
scrollTo(y) {
|
|
140
|
+
setScrollTop((_prev) => {
|
|
141
|
+
const { clampMin: cMin, clampMax: cMax, stickyScroll: s } = latestRef.current;
|
|
142
|
+
const next = Math.max(cMin, Math.min(cMax, y));
|
|
143
|
+
stickyRef.current = next === cMax && s;
|
|
144
|
+
notifyImperative(next);
|
|
145
|
+
return next;
|
|
146
|
+
});
|
|
147
|
+
},
|
|
148
|
+
scrollBy(dy) {
|
|
149
|
+
setScrollTop((prev) => {
|
|
150
|
+
const { clampMin: cMin, clampMax: cMax, stickyScroll: s } = latestRef.current;
|
|
151
|
+
const next = Math.max(cMin, Math.min(cMax, prev + dy));
|
|
152
|
+
stickyRef.current = next === cMax && s;
|
|
153
|
+
notifyImperative(next);
|
|
154
|
+
return next;
|
|
155
|
+
});
|
|
156
|
+
},
|
|
157
|
+
scrollToBottom() {
|
|
158
|
+
stickyRef.current = stickyRef.current || latestRef.current.stickyScroll;
|
|
159
|
+
const target = latestRef.current.clampMax;
|
|
160
|
+
setScrollTop(target);
|
|
161
|
+
notifyImperative(target);
|
|
162
|
+
},
|
|
163
|
+
getScrollTop: () => latestRef.current.scrollTop,
|
|
164
|
+
getScrollHeight: () => latestRef.current.totalRows,
|
|
165
|
+
getFreshScrollHeight: () => React.Children.count(children) * rowHeight,
|
|
166
|
+
getViewportHeight: () => latestRef.current.viewportRows,
|
|
167
|
+
getViewportTop: () => latestRef.current.scrollTop,
|
|
168
|
+
isSticky: () => stickyRef.current,
|
|
169
|
+
setClampBounds(min, max) {
|
|
170
|
+
setClampMin(min);
|
|
171
|
+
setClampMax(max);
|
|
172
|
+
},
|
|
173
|
+
subscribe(listener) {
|
|
174
|
+
listenersRef.current.add(listener);
|
|
175
|
+
return () => {
|
|
176
|
+
listenersRef.current.delete(listener);
|
|
177
|
+
};
|
|
178
|
+
},
|
|
179
|
+
}), [notifyImperative, children, rowHeight]);
|
|
180
|
+
const startIndex = Math.max(0, Math.floor(scrollTop / rowHeight));
|
|
181
|
+
const endScroll = scrollTop + viewportRows;
|
|
182
|
+
const endIndex = Math.min(childArray.length, Math.ceil(endScroll / rowHeight));
|
|
183
|
+
const visible = childArray.slice(startIndex, endIndex);
|
|
184
|
+
return (_jsx(Box, { ref: containerRef, flexDirection: "column", overflow: "hidden", flexGrow: flexGrow, flexShrink: flexShrink, height: height, children: visible }));
|
|
185
|
+
});
|
|
186
|
+
//# sourceMappingURL=scroll-box.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-box.js","sourceRoot":"","sources":["../../src/runtime/scroll-box.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function acquireRawMode(setRawMode: (v: boolean) => void, supported: boolean): () => void;
|
|
2
|
+
type AltScreenOps = {
|
|
3
|
+
enter: () => void;
|
|
4
|
+
exit: () => void;
|
|
5
|
+
enableMouse?: () => void;
|
|
6
|
+
disableMouse?: () => void;
|
|
7
|
+
};
|
|
8
|
+
export declare function acquireAltScreen(ops: AltScreenOps): () => void;
|
|
9
|
+
export declare function getAltScreenActiveCount(): number;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
let rawModeRefCount = 0;
|
|
2
|
+
export function acquireRawMode(setRawMode, supported) {
|
|
3
|
+
if (!supported)
|
|
4
|
+
return () => undefined;
|
|
5
|
+
if (rawModeRefCount === 0)
|
|
6
|
+
setRawMode(true);
|
|
7
|
+
rawModeRefCount += 1;
|
|
8
|
+
let released = false;
|
|
9
|
+
return () => {
|
|
10
|
+
if (released)
|
|
11
|
+
return;
|
|
12
|
+
released = true;
|
|
13
|
+
rawModeRefCount -= 1;
|
|
14
|
+
if (rawModeRefCount === 0)
|
|
15
|
+
setRawMode(false);
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
let altScreenRefCount = 0;
|
|
19
|
+
let mouseTrackingRefCount = 0;
|
|
20
|
+
function safeCall(fn) {
|
|
21
|
+
try {
|
|
22
|
+
fn();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// terminal stream already closed
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function acquireAltScreen(ops) {
|
|
29
|
+
if (altScreenRefCount === 0) {
|
|
30
|
+
ops.enter();
|
|
31
|
+
}
|
|
32
|
+
altScreenRefCount += 1;
|
|
33
|
+
const tracksMouse = Boolean(ops.enableMouse && ops.disableMouse);
|
|
34
|
+
if (tracksMouse) {
|
|
35
|
+
if (mouseTrackingRefCount === 0)
|
|
36
|
+
ops.enableMouse();
|
|
37
|
+
mouseTrackingRefCount += 1;
|
|
38
|
+
}
|
|
39
|
+
let released = false;
|
|
40
|
+
return () => {
|
|
41
|
+
if (released)
|
|
42
|
+
return;
|
|
43
|
+
released = true;
|
|
44
|
+
if (tracksMouse) {
|
|
45
|
+
mouseTrackingRefCount -= 1;
|
|
46
|
+
if (mouseTrackingRefCount === 0) {
|
|
47
|
+
safeCall(ops.disableMouse);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
altScreenRefCount -= 1;
|
|
51
|
+
if (altScreenRefCount === 0) {
|
|
52
|
+
safeCall(ops.exit);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function getAltScreenActiveCount() {
|
|
57
|
+
return altScreenRefCount;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=terminal-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-mode.js","sourceRoot":"","sources":["../../src/runtime/terminal-mode.ts"],"names":[],"mappings":"AAAA,IAAI,eAAe,GAAG,CAAC,CAAC;AAExB,MAAM,UAAU,cAAc,CAAC,UAAgC,EAAE,SAAkB;IACjF,IAAI,CAAC,SAAS;QAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;IACvC,IAAI,eAAe,KAAK,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5C,eAAe,IAAI,CAAC,CAAC;IACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO,GAAG,EAAE;QACV,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,eAAe,IAAI,CAAC,CAAC;QACrB,IAAI,eAAe,KAAK,CAAC;YAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC;AAED,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAC1B,IAAI,qBAAqB,GAAG,CAAC,CAAC;AAS9B,SAAS,QAAQ,CAAC,EAAc;IAC9B,IAAI,CAAC;QACH,EAAE,EAAE,CAAC;IACP,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAiB;IAChD,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;QAC5B,GAAG,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;IACD,iBAAiB,IAAI,CAAC,CAAC;IAEvB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IACjE,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,qBAAqB,KAAK,CAAC;YAAE,GAAG,CAAC,WAAY,EAAE,CAAC;QACpD,qBAAqB,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO,GAAG,EAAE;QACV,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAEhB,IAAI,WAAW,EAAE,CAAC;YAChB,qBAAqB,IAAI,CAAC,CAAC;YAC3B,IAAI,qBAAqB,KAAK,CAAC,EAAE,CAAC;gBAChC,QAAQ,CAAC,GAAG,CAAC,YAAa,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,iBAAiB,IAAI,CAAC,CAAC;QACvB,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
|