@kernlang/terminal 3.1.9 → 3.3.4

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 CHANGED
@@ -3,7 +3,10 @@
3
3
  [![npm](https://img.shields.io/npm/v/@kernlang/terminal?color=cb3837&label=npm)](https://www.npmjs.com/package/@kernlang/terminal)
4
4
  [![license](https://img.shields.io/badge/license-AGPL--3.0-blue)](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,6 @@
1
+ import React from 'react';
2
+ export type AlternateScreenProps = {
3
+ mouseTracking?: boolean;
4
+ children?: React.ReactNode;
5
+ };
6
+ export declare function AlternateScreen({ mouseTracking, children }: AlternateScreenProps): React.ReactElement;
@@ -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,4 @@
1
+ export type { AlternateScreenProps } from './alternate-screen.js';
2
+ export { AlternateScreen } from './alternate-screen.js';
3
+ export type { ScrollBoxHandle, ScrollBoxProps } from './scroll-box.js';
4
+ export { ScrollBox } from './scroll-box.js';
@@ -0,0 +1,3 @@
1
+ export { AlternateScreen } from './alternate-screen.js';
2
+ export { ScrollBox } from './scroll-box.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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":";AAAA,OAAO,KAAK,EAAE,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,eAAe,EACf,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAyBpD,MAAM,iBAAiB,GAAG,iCAAiC,CAAC;AAC5D,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,SAAS,eAAe,CAAC,KAAa;IACpC,iFAAiF;IACjF,0EAA0E;IAC1E,6DAA6D;IAC7D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,iBAAiB,CAAC,SAAS,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,KAAK,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;QACvB,IAAI,OAAO,IAAI,GAAG,KAAK,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;aAChC,IAAI,OAAO,IAAI,GAAG,KAAK,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;QAC1C,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAkC,SAAS,SAAS,CACrF,EAAE,YAAY,GAAG,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,QAAQ,EAAE,EAC/E,GAAG;IAEH,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAE/B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC;IAEhD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAS,GAAG,EAAE;QAC5D,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC;QAC9C,OAAO,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC9C,IAAI,CAAC,YAAY;YAAE,OAAO,CAAC,CAAC;QAC5B,MAAM,eAAe,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACnF,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;QAChE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,eAAe,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,MAAM,CAA6B,IAAI,GAAG,EAAE,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,MAAM,CAAsC,IAAI,CAAC,CAAC;IACvE,MAAM,cAAc,GAAG,MAAM,CAAS,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC;QACvB,SAAS,EAAE,CAAC;QACZ,YAAY;QACZ,SAAS;QACT,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC,iBAAiB;QAClC,YAAY;KACb,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,OAAO,GAAG,YAAY,CAAC;IACnC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAExC,MAAM,KAAK,GAAG,WAAW,CACvB,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAClE,CAAC,SAAS,EAAE,SAAS,CAAC,CACvB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,OAAO,GAAG;YAClB,SAAS;YACT,YAAY;YACZ,SAAS;YACT,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,SAAS;YACnB,YAAY;SACb,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,YAAY,CAAC,OAAO;YAAE,OAAO;QAClC,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,cAAc,GAAG,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;QAC7C,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,KAAK,YAAY,EAAE,CAAC;YAC1D,eAAe,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YACjE,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,eAAe,CAAC,GAAG,EAAE;QACnB,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;YACpB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAO;QAC/B,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAE3B,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,GAAW,EAAE,EAAE;QACnD,KAAK,MAAM,QAAQ,IAAI,YAAY,CAAC,OAAO;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,IAAI,CAAC,kBAAkB;YAAE,OAAO;QAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACzE,cAAc,CAAC,OAAO,IAAI,IAAI,CAAC;YAC/B,IAAI,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC;YACjC,IAAI,GAAG,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBACzC,GAAG,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,cAAc,CAAC,OAAO,GAAG,GAAG,CAAC;YAC/B,CAAC;YACD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1E,IAAI,YAAY,KAAK,CAAC,CAAC;gBAAE,OAAO;YAChC,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;YAC/C,cAAc,CAAC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO;YACxB,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;gBACpB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC;gBAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;gBAC1D,IAAI,IAAI,KAAK,IAAI;oBAAE,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;qBACxC,IAAI,CAAC;oBAAE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;gBACrC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACvB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzB,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE9D,mBAAmB,CACjB,GAAG,EACH,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,CAAC,CAAS;YAChB,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC;gBAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/C,SAAS,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC;gBACvC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACvB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,CAAC,EAAU;YACjB,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE;gBACpB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC;gBAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;gBACvD,SAAS,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC;gBACvC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACvB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;QACD,cAAc;YACZ,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC;YACxE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC1C,YAAY,CAAC,MAAM,CAAC,CAAC;YACrB,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QACD,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS;QAC/C,eAAe,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS;QAClD,oBAAoB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,SAAS;QACtE,iBAAiB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY;QACvD,cAAc,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS;QACjD,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO;QACjC,cAAc,CAAC,GAAW,EAAE,GAAW;YACrC,WAAW,CAAC,GAAG,CAAC,CAAC;YACjB,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,SAAS,CAAC,QAA+B;YACvC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnC,OAAO,GAAG,EAAE;gBACV,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC,CAAC;QACJ,CAAC;KACF,CAAC,EACF,CAAC,gBAAgB,EAAE,QAAQ,EAAE,SAAS,CAAC,CACxC,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEvD,OAAO,CACL,KAAC,GAAG,IACF,GAAG,EAAE,YAAY,EACjB,aAAa,EAAC,QAAQ,EACtB,QAAQ,EAAC,QAAQ,EACjB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,YAEb,OAAO,GACJ,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -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"}