@next_term/core 0.0.1-next.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.
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Platform-agnostic touch gesture handling for terminal emulators.
3
+ *
4
+ * Pure-logic handler with zero platform dependencies — translates
5
+ * gesture coordinates and states into terminal actions. Used by
6
+ * both @next_term/web (DOM touch events) and @next_term/native
7
+ * (React Native gesture handler).
8
+ */
9
+ import type { SelectionRange } from "./cell-grid.js";
10
+ export declare enum GestureState {
11
+ BEGAN = "began",
12
+ ACTIVE = "active",
13
+ END = "end",
14
+ CANCELLED = "cancelled"
15
+ }
16
+ export interface GestureConfig {
17
+ onScroll: (deltaRows: number) => void;
18
+ onTap: (row: number, col: number) => void;
19
+ onDoubleTap: (row: number, col: number) => void;
20
+ onLongPress: (row: number, col: number) => void;
21
+ onPinch: (scale: number) => void;
22
+ onSelectionChange: (selection: SelectionRange | null) => void;
23
+ }
24
+ export declare class GestureHandler {
25
+ private cellWidth;
26
+ private cellHeight;
27
+ private config;
28
+ /** Accumulated sub-row scroll remainder for smooth scrolling. */
29
+ private scrollRemainder;
30
+ /** Whether a long-press selection is active. */
31
+ private selectionActive;
32
+ private selectionAnchor;
33
+ constructor(cellWidth: number, cellHeight: number, config: GestureConfig);
34
+ updateCellSize(width: number, height: number): void;
35
+ /**
36
+ * Convert pixel coordinates to cell coordinates.
37
+ * Clamps to non-negative values (caller is responsible for upper bounds).
38
+ */
39
+ pixelToCell(x: number, y: number): {
40
+ row: number;
41
+ col: number;
42
+ };
43
+ /**
44
+ * Handle a pan gesture. Translation values are cumulative pixel offsets
45
+ * from the gesture start. velocityY is in pixels/ms.
46
+ */
47
+ handlePan(_translationX: number, translationY: number, velocityY: number, state: GestureState): void;
48
+ /**
49
+ * Compute the number of rows a fling gesture should scroll based on
50
+ * initial velocity and deceleration.
51
+ */
52
+ private computeFlingRows;
53
+ handleTap(x: number, y: number): void;
54
+ handleDoubleTap(x: number, y: number): void;
55
+ handleLongPress(x: number, y: number): void;
56
+ handlePinch(scale: number, state: GestureState): void;
57
+ /**
58
+ * Extend a selection during a drag gesture. Call this from the pan handler
59
+ * when `isSelectionActive` is true.
60
+ */
61
+ extendSelection(x: number, y: number): void;
62
+ get isSelectionActive(): boolean;
63
+ clearSelection(): void;
64
+ }
65
+ //# sourceMappingURL=gesture-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gesture-handler.d.ts","sourceRoot":"","sources":["../src/gesture-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD,oBAAY,YAAY;IACtB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,GAAG,QAAQ;IACX,SAAS,cAAc;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,iBAAiB,EAAE,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;CAC/D;AAgBD,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAE9B,iEAAiE;IACjE,OAAO,CAAC,eAAe,CAAK;IAE5B,gDAAgD;IAChD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,eAAe,CAA6C;gBAExD,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa;IAUxE,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IASnD;;;OAGG;IACH,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAc/D;;;OAGG;IACH,SAAS,CACP,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,YAAY,GAClB,IAAI;IA+BP;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAWxB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAiBrC,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAS3C,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAoB3C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAUrD;;;OAGG;IACH,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAY3C,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED,cAAc,IAAI,IAAI;CAKvB"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Platform-agnostic touch gesture handling for terminal emulators.
3
+ *
4
+ * Pure-logic handler with zero platform dependencies — translates
5
+ * gesture coordinates and states into terminal actions. Used by
6
+ * both @next_term/web (DOM touch events) and @next_term/native
7
+ * (React Native gesture handler).
8
+ */
9
+ // ---------------------------------------------------------------------------
10
+ // Types
11
+ // ---------------------------------------------------------------------------
12
+ export var GestureState;
13
+ (function (GestureState) {
14
+ GestureState["BEGAN"] = "began";
15
+ GestureState["ACTIVE"] = "active";
16
+ GestureState["END"] = "end";
17
+ GestureState["CANCELLED"] = "cancelled";
18
+ })(GestureState || (GestureState = {}));
19
+ // ---------------------------------------------------------------------------
20
+ // Constants
21
+ // ---------------------------------------------------------------------------
22
+ /** Deceleration factor for fling physics (pixels/ms^2). */
23
+ const FLING_DECELERATION = 0.003;
24
+ /** Minimum velocity (pixels/ms) to trigger a fling. */
25
+ const FLING_MIN_VELOCITY = 0.5;
26
+ // ---------------------------------------------------------------------------
27
+ // GestureHandler
28
+ // ---------------------------------------------------------------------------
29
+ export class GestureHandler {
30
+ cellWidth;
31
+ cellHeight;
32
+ config;
33
+ /** Accumulated sub-row scroll remainder for smooth scrolling. */
34
+ scrollRemainder = 0;
35
+ /** Whether a long-press selection is active. */
36
+ selectionActive = false;
37
+ selectionAnchor = null;
38
+ constructor(cellWidth, cellHeight, config) {
39
+ this.cellWidth = cellWidth;
40
+ this.cellHeight = cellHeight;
41
+ this.config = config;
42
+ }
43
+ // -----------------------------------------------------------------------
44
+ // Cell size
45
+ // -----------------------------------------------------------------------
46
+ updateCellSize(width, height) {
47
+ this.cellWidth = width;
48
+ this.cellHeight = height;
49
+ }
50
+ // -----------------------------------------------------------------------
51
+ // Coordinate conversion
52
+ // -----------------------------------------------------------------------
53
+ /**
54
+ * Convert pixel coordinates to cell coordinates.
55
+ * Clamps to non-negative values (caller is responsible for upper bounds).
56
+ */
57
+ pixelToCell(x, y) {
58
+ if (this.cellWidth <= 0 || this.cellHeight <= 0) {
59
+ return { row: 0, col: 0 };
60
+ }
61
+ return {
62
+ row: Math.max(0, Math.floor(y / this.cellHeight)),
63
+ col: Math.max(0, Math.floor(x / this.cellWidth)),
64
+ };
65
+ }
66
+ // -----------------------------------------------------------------------
67
+ // Pan / Scroll
68
+ // -----------------------------------------------------------------------
69
+ /**
70
+ * Handle a pan gesture. Translation values are cumulative pixel offsets
71
+ * from the gesture start. velocityY is in pixels/ms.
72
+ */
73
+ handlePan(_translationX, translationY, velocityY, state) {
74
+ if (this.cellHeight <= 0)
75
+ return;
76
+ if (state === GestureState.ACTIVE) {
77
+ // Convert pixel translation to row delta, keeping a fractional remainder
78
+ const totalPixels = translationY + this.scrollRemainder;
79
+ const deltaRows = Math.trunc(totalPixels / this.cellHeight);
80
+ this.scrollRemainder = totalPixels - deltaRows * this.cellHeight;
81
+ if (deltaRows !== 0) {
82
+ // Negate: dragging down means scrolling up (seeing older content)
83
+ this.config.onScroll(-deltaRows);
84
+ }
85
+ }
86
+ else if (state === GestureState.END) {
87
+ this.scrollRemainder = 0;
88
+ // Fling: apply velocity-based scroll
89
+ const absVelocity = Math.abs(velocityY);
90
+ if (absVelocity > FLING_MIN_VELOCITY) {
91
+ const flingRows = this.computeFlingRows(velocityY);
92
+ if (flingRows !== 0) {
93
+ this.config.onScroll(-flingRows);
94
+ }
95
+ }
96
+ }
97
+ else if (state === GestureState.CANCELLED) {
98
+ this.scrollRemainder = 0;
99
+ }
100
+ else if (state === GestureState.BEGAN) {
101
+ this.scrollRemainder = 0;
102
+ }
103
+ }
104
+ /**
105
+ * Compute the number of rows a fling gesture should scroll based on
106
+ * initial velocity and deceleration.
107
+ */
108
+ computeFlingRows(velocityPxPerMs) {
109
+ // d = v^2 / (2 * a) — kinematic distance from constant deceleration
110
+ const distancePx = (velocityPxPerMs * velocityPxPerMs) / (2 * FLING_DECELERATION);
111
+ const sign = velocityPxPerMs > 0 ? 1 : -1;
112
+ return Math.round((sign * distancePx) / this.cellHeight);
113
+ }
114
+ // -----------------------------------------------------------------------
115
+ // Tap
116
+ // -----------------------------------------------------------------------
117
+ handleTap(x, y) {
118
+ if (this.selectionActive) {
119
+ // Tap clears an active selection
120
+ this.selectionActive = false;
121
+ this.selectionAnchor = null;
122
+ this.config.onSelectionChange(null);
123
+ return;
124
+ }
125
+ const { row, col } = this.pixelToCell(x, y);
126
+ this.config.onTap(row, col);
127
+ }
128
+ // -----------------------------------------------------------------------
129
+ // Double-tap (word selection)
130
+ // -----------------------------------------------------------------------
131
+ handleDoubleTap(x, y) {
132
+ const { row, col } = this.pixelToCell(x, y);
133
+ this.config.onDoubleTap(row, col);
134
+ }
135
+ // -----------------------------------------------------------------------
136
+ // Long press (enter selection mode)
137
+ // -----------------------------------------------------------------------
138
+ handleLongPress(x, y) {
139
+ const { row, col } = this.pixelToCell(x, y);
140
+ this.selectionActive = true;
141
+ this.selectionAnchor = { row, col };
142
+ this.config.onLongPress(row, col);
143
+ // Initialize selection at the long-press point
144
+ this.config.onSelectionChange({
145
+ startRow: row,
146
+ startCol: col,
147
+ endRow: row,
148
+ endCol: col,
149
+ });
150
+ }
151
+ // -----------------------------------------------------------------------
152
+ // Pinch-to-zoom
153
+ // -----------------------------------------------------------------------
154
+ handlePinch(scale, state) {
155
+ if (state === GestureState.ACTIVE || state === GestureState.END) {
156
+ this.config.onPinch(scale);
157
+ }
158
+ }
159
+ // -----------------------------------------------------------------------
160
+ // Selection drag (called during pan when selection is active)
161
+ // -----------------------------------------------------------------------
162
+ /**
163
+ * Extend a selection during a drag gesture. Call this from the pan handler
164
+ * when `isSelectionActive` is true.
165
+ */
166
+ extendSelection(x, y) {
167
+ if (!this.selectionActive || !this.selectionAnchor)
168
+ return;
169
+ const { row, col } = this.pixelToCell(x, y);
170
+ this.config.onSelectionChange({
171
+ startRow: this.selectionAnchor.row,
172
+ startCol: this.selectionAnchor.col,
173
+ endRow: row,
174
+ endCol: col,
175
+ });
176
+ }
177
+ get isSelectionActive() {
178
+ return this.selectionActive;
179
+ }
180
+ clearSelection() {
181
+ this.selectionActive = false;
182
+ this.selectionAnchor = null;
183
+ this.config.onSelectionChange(null);
184
+ }
185
+ }
186
+ //# sourceMappingURL=gesture-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gesture-handler.js","sourceRoot":"","sources":["../src/gesture-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { Buffer, BufferSet } from "./buffer.js";
2
+ export type { SelectionRange } from "./cell-grid.js";
3
+ export { CELL_SIZE, CellGrid, DEFAULT_CELL_W0, DEFAULT_CELL_W1, extractText, modPositive, normalizeSelection, } from "./cell-grid.js";
4
+ export type { GestureConfig } from "./gesture-handler.js";
5
+ export { GestureHandler, GestureState } from "./gesture-handler.js";
6
+ export type { MouseEncoding, MouseProtocol } from "./parser/index.js";
7
+ export { VTParser } from "./parser/index.js";
8
+ export { Action, State, TABLE, unpackAction, unpackState } from "./parser/states.js";
9
+ export type { CursorState, SelectionState, TerminalOptions, Theme } from "./types.js";
10
+ export { DEFAULT_THEME, DirtyState } from "./types.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EACL,SAAS,EACT,QAAQ,EACR,eAAe,EACf,eAAe,EACf,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACrF,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { Buffer, BufferSet } from "./buffer.js";
2
+ export { CELL_SIZE, CellGrid, DEFAULT_CELL_W0, DEFAULT_CELL_W1, extractText, modPositive, normalizeSelection, } from "./cell-grid.js";
3
+ export { GestureHandler, GestureState } from "./gesture-handler.js";
4
+ export { VTParser } from "./parser/index.js";
5
+ export { Action, State, TABLE, unpackAction, unpackState } from "./parser/states.js";
6
+ export { DEFAULT_THEME, DirtyState } from "./types.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EACL,SAAS,EACT,QAAQ,EACR,eAAe,EACf,eAAe,EACf,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAErF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,196 @@
1
+ import type { BufferSet } from "../buffer.js";
2
+ import type { CursorState } from "../types.js";
3
+ /** Mouse tracking protocol. */
4
+ export type MouseProtocol = "none" | "x10" | "vt200" | "drag" | "any";
5
+ /** Mouse encoding format. */
6
+ export type MouseEncoding = "default" | "sgr";
7
+ export declare class VTParser {
8
+ private state;
9
+ private readonly bufferSet;
10
+ private static readonly MAX_PARAMS;
11
+ private readonly params;
12
+ private paramCount;
13
+ private currentParam;
14
+ private hasParam;
15
+ private intermediatesByte;
16
+ private prefixByte;
17
+ private fgIndex;
18
+ private bgIndex;
19
+ private attrs;
20
+ private fgIsRGB;
21
+ private bgIsRGB;
22
+ private fgRGB;
23
+ private bgRGB;
24
+ private static readonly MAX_OSC_LENGTH;
25
+ private readonly oscParts;
26
+ private oscLength;
27
+ private static readonly MAX_DCS_LENGTH;
28
+ private readonly dcsParts;
29
+ private dcsLength;
30
+ private dcsFinal;
31
+ private static readonly MAX_TMUX_LENGTH;
32
+ private readonly tmuxParts;
33
+ private tmuxLength;
34
+ private tmuxSeeking;
35
+ private inTmuxDcs;
36
+ private tmuxPrevWasEsc;
37
+ private tmuxDepth;
38
+ private utf8Bytes;
39
+ private utf8Codepoint;
40
+ private lineFeedMode;
41
+ private autoWrapMode;
42
+ private originMode;
43
+ applicationCursorKeys: boolean;
44
+ applicationKeypad: boolean;
45
+ bracketedPasteMode: boolean;
46
+ syncedOutput: boolean;
47
+ mouseProtocol: MouseProtocol;
48
+ mouseEncoding: MouseEncoding;
49
+ sendFocusEvents: boolean;
50
+ kittyFlags: number;
51
+ private readonly kittyFlagsStack;
52
+ private lastPrintedCodepoint;
53
+ private responseBuffer;
54
+ private titleStack;
55
+ private onTitleChange;
56
+ private onOsc52;
57
+ private onOsc4;
58
+ private onOsc7;
59
+ private onOsc10;
60
+ private onOsc11;
61
+ private onOsc12;
62
+ private onOsc104;
63
+ private onOsc8;
64
+ private onOsc133;
65
+ private onSyncOutput;
66
+ private onDcs;
67
+ private onDcsTmux;
68
+ private onKittyFlags;
69
+ constructor(bufferSet: BufferSet);
70
+ /** Register a callback for title changes (OSC 0/1/2). */
71
+ setTitleChangeCallback(cb: (title: string) => void): void;
72
+ /** Register a callback for OSC 52 clipboard sequences.
73
+ * `selection` is the clipboard selection string (e.g. "c" for clipboard).
74
+ * `data` is the base64-encoded payload, or null for a query request ("?").
75
+ */
76
+ setOsc52Callback(cb: (selection: string, data: string | null) => void): void;
77
+ /** Register a callback for OSC 4 color palette sequences.
78
+ * Called once per index;spec pair in the sequence.
79
+ * `index` is the palette index (0-255).
80
+ * `spec` is the color specification string (e.g. "rgb:ff/00/00"), or null for a query ("?").
81
+ */
82
+ setOsc4Callback(cb: (index: number, spec: string | null) => void): void;
83
+ /** Register a callback for OSC 7 current working directory sequences.
84
+ * Called with the URI payload (e.g. "file:///hostname/path").
85
+ */
86
+ setOsc7Callback(cb: (uri: string) => void): void;
87
+ /** Register a callback for OSC 10 foreground color sequences.
88
+ * `spec` is the color specification string (e.g. "rgb:ffff/ffff/ffff"), or null for a query ("?").
89
+ */
90
+ setOsc10Callback(cb: (spec: string | null) => void): void;
91
+ /** Register a callback for OSC 11 background color sequences.
92
+ * `spec` is the color specification string (e.g. "rgb:0000/0000/0000"), or null for a query ("?").
93
+ */
94
+ setOsc11Callback(cb: (spec: string | null) => void): void;
95
+ /** Register a callback for OSC 12 cursor color sequences.
96
+ * `spec` is the color specification string, or null for a query ("?").
97
+ */
98
+ setOsc12Callback(cb: (spec: string | null) => void): void;
99
+ /** Register a callback for OSC 104 reset color palette sequences.
100
+ * Called once per index to reset; `index` is 0-255 for a specific palette
101
+ * entry, or -1 when no index is given (reset the entire palette).
102
+ */
103
+ setOsc104Callback(cb: (index: number) => void): void;
104
+ /** Register a callback for OSC 8 hyperlink sequences.
105
+ * `params` is the optional colon-separated key=value metadata string (may be "").
106
+ * `uri` is the hyperlink target URI (empty string closes the active link).
107
+ */
108
+ setOsc8Callback(cb: (params: string, uri: string) => void): void;
109
+ /** Register a callback for OSC 133 shell integration (semantic prompt) sequences.
110
+ * `type` is the event letter: "A" (prompt start), "B" (command start),
111
+ * "C" (command output start), "D" (command end), "E" (command text), "P" (property), etc.
112
+ * `payload` is the string after the type letter and its optional semicolon separator
113
+ * (both `133;<type>;<payload>` and `133;<type><payload>` forms are accepted; empty string
114
+ * for A/B/C; exit-code digits for D; command text for E; key=value for P).
115
+ */
116
+ setOsc133Callback(cb: (type: string, payload: string) => void): void;
117
+ /** Register a callback for synchronized output mode 2026 changes.
118
+ * Called with `true` when DECSET ?2026h activates the mode and `false`
119
+ * when DECRST ?2026l deactivates it. The web layer uses this to pause
120
+ * and resume the render loop (frame buffering).
121
+ */
122
+ setSyncOutputCallback(cb: (active: boolean) => void): void;
123
+ /** Register a callback for DCS (Device Control String) sequences.
124
+ * Called when a DCS sequence is fully received (terminated by ST or C1 ST).
125
+ * `finalByte` identifies the DCS command (0x40–0x7E, e.g. 0x70 for 'p').
126
+ * `params` are the numeric params collected before the intermediate/final byte.
127
+ * `intermediate` is the single intermediate byte (0x20–0x2F), or 0 if none.
128
+ * `data` is the passthrough string collected between the final byte and ST.
129
+ */
130
+ setDcsCallback(cb: (finalByte: number, params: readonly number[], intermediate: number, data: string) => void): void;
131
+ /** Register a callback for DCS tmux passthrough sequences.
132
+ * Called when the outer DCS tmux wrapper (ESC P tmux; ... ESC \) is received.
133
+ * `innerSeq` is the decoded inner escape sequence string (with doubled ESCs unescaped).
134
+ * The inner sequence is also automatically processed through the parser.
135
+ */
136
+ setDcsTmuxCallback(cb: (innerSeq: string) => void): void;
137
+ /** Register a callback fired when kitty keyboard flags change (CSI =/>/</? u). */
138
+ setKittyFlagsCallback(cb: (flags: number) => void): void;
139
+ get cursor(): CursorState;
140
+ get cols(): number;
141
+ get rows(): number;
142
+ private get buf();
143
+ private get grid();
144
+ /** Check if there are pending responses to read. */
145
+ hasResponse(): boolean;
146
+ /** Read the next response from the response buffer. */
147
+ readResponse(): Uint8Array | null;
148
+ /** Process raw bytes from the PTY. */
149
+ write(data: Uint8Array): void;
150
+ private printCodepoint;
151
+ private execute;
152
+ private linefeed;
153
+ /**
154
+ * Fast-path scroll up: combines scrollUpWithHistory + scrollUp for the
155
+ * common full-screen case (rotateUp instead of copyWithin). Falls back
156
+ * to scrollUpWithHistory for partial scroll regions.
157
+ */
158
+ private _scrollUpFull;
159
+ private clear;
160
+ private finalizeParams;
161
+ private csiDispatch;
162
+ private csiPrivate;
163
+ private decset;
164
+ /** SM - Set Mode (non-private) */
165
+ private setMode;
166
+ /** RM - Reset Mode (non-private) */
167
+ private resetMode;
168
+ private escDispatch;
169
+ private dcsDispatch;
170
+ private dispatchTmux;
171
+ private oscDispatch;
172
+ private cursorUp;
173
+ private cursorDown;
174
+ private cursorForward;
175
+ private cursorBackward;
176
+ private cursorPosition;
177
+ private setCursorStyle;
178
+ private reportCursorPosition;
179
+ private reportDeviceAttributes;
180
+ private windowManipulation;
181
+ private eraseInDisplay;
182
+ private eraseInLine;
183
+ private eraseCells;
184
+ private eraseChars;
185
+ private insertLines;
186
+ private deleteLines;
187
+ private insertChars;
188
+ private deleteChars;
189
+ private setScrollRegion;
190
+ private sgr;
191
+ /** Parse SGR 38/48 extended color. Returns updated index. */
192
+ private parseSgrColor;
193
+ private softReset;
194
+ private fullReset;
195
+ }
196
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"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"}