@next_term/web 0.1.0-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.
Files changed (61) hide show
  1. package/dist/accessibility.d.ts +46 -0
  2. package/dist/accessibility.d.ts.map +1 -0
  3. package/dist/accessibility.js +196 -0
  4. package/dist/accessibility.js.map +1 -0
  5. package/dist/addon.d.ts.map +1 -0
  6. package/dist/addon.js +2 -0
  7. package/dist/addon.js.map +1 -0
  8. package/dist/addons/fit.d.ts.map +1 -0
  9. package/dist/addons/fit.js +40 -0
  10. package/dist/addons/fit.js.map +1 -0
  11. package/dist/addons/search.d.ts +56 -0
  12. package/dist/addons/search.d.ts.map +1 -0
  13. package/dist/addons/search.js +178 -0
  14. package/dist/addons/search.js.map +1 -0
  15. package/dist/addons/web-links.d.ts +30 -0
  16. package/dist/addons/web-links.d.ts.map +1 -0
  17. package/dist/addons/web-links.js +170 -0
  18. package/dist/addons/web-links.js.map +1 -0
  19. package/dist/fit.d.ts.map +1 -0
  20. package/dist/fit.js +14 -0
  21. package/dist/fit.js.map +1 -0
  22. package/dist/index.d.ts +24 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +14 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/input-handler.d.ts +185 -0
  27. package/dist/input-handler.d.ts.map +1 -0
  28. package/dist/input-handler.js +1197 -0
  29. package/dist/input-handler.js.map +1 -0
  30. package/dist/parser-worker.d.ts.map +1 -0
  31. package/dist/parser-worker.js +128 -0
  32. package/dist/parser-worker.js.map +1 -0
  33. package/dist/render-bridge.d.ts +56 -0
  34. package/dist/render-bridge.d.ts.map +1 -0
  35. package/dist/render-bridge.js +158 -0
  36. package/dist/render-bridge.js.map +1 -0
  37. package/dist/render-worker.d.ts +62 -0
  38. package/dist/render-worker.d.ts.map +1 -0
  39. package/dist/render-worker.js +720 -0
  40. package/dist/render-worker.js.map +1 -0
  41. package/dist/renderer.d.ts +86 -0
  42. package/dist/renderer.d.ts.map +1 -0
  43. package/dist/renderer.js +454 -0
  44. package/dist/renderer.js.map +1 -0
  45. package/dist/shared-context.d.ts +93 -0
  46. package/dist/shared-context.d.ts.map +1 -0
  47. package/dist/shared-context.js +561 -0
  48. package/dist/shared-context.js.map +1 -0
  49. package/dist/web-terminal.d.ts +152 -0
  50. package/dist/web-terminal.d.ts.map +1 -0
  51. package/dist/web-terminal.js +684 -0
  52. package/dist/web-terminal.js.map +1 -0
  53. package/dist/webgl-renderer.d.ts +146 -0
  54. package/dist/webgl-renderer.d.ts.map +1 -0
  55. package/dist/webgl-renderer.js +1047 -0
  56. package/dist/webgl-renderer.js.map +1 -0
  57. package/dist/worker-bridge.d.ts +51 -0
  58. package/dist/worker-bridge.d.ts.map +1 -0
  59. package/dist/worker-bridge.js +185 -0
  60. package/dist/worker-bridge.js.map +1 -0
  61. package/package.json +36 -0
@@ -0,0 +1,170 @@
1
+ // ---------------------------------------------------------------------------
2
+ // URL detection
3
+ // ---------------------------------------------------------------------------
4
+ /**
5
+ * Regex pattern for detecting URLs in terminal text.
6
+ * Matches http:// and https:// URLs.
7
+ */
8
+ const URL_REGEX = /https?:\/\/[^\s<>"{}|\\^`[\]]+/g;
9
+ /**
10
+ * Extract the text content of a single row from a CellGrid.
11
+ */
12
+ function extractRowText(grid, row) {
13
+ let line = "";
14
+ for (let col = 0; col < grid.cols; col++) {
15
+ const cp = grid.getCodepoint(row, col);
16
+ line += cp > 0x20 ? String.fromCodePoint(cp) : " ";
17
+ }
18
+ return line;
19
+ }
20
+ /**
21
+ * Find all URLs in the visible rows of a grid.
22
+ */
23
+ export function findLinks(grid) {
24
+ const links = [];
25
+ for (let row = 0; row < grid.rows; row++) {
26
+ const text = extractRowText(grid, row);
27
+ URL_REGEX.lastIndex = 0;
28
+ let m;
29
+ while (true) {
30
+ m = URL_REGEX.exec(text);
31
+ if (m === null)
32
+ break;
33
+ // Trim trailing punctuation that is likely not part of the URL
34
+ let url = m[0];
35
+ while (url.length > 0 && /[.,;:!?)']$/.test(url)) {
36
+ url = url.slice(0, -1);
37
+ }
38
+ if (url.length === 0)
39
+ continue;
40
+ links.push({
41
+ row,
42
+ startCol: m.index,
43
+ endCol: m.index + url.length - 1,
44
+ url,
45
+ });
46
+ }
47
+ }
48
+ return links;
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // WebLinksAddon
52
+ // ---------------------------------------------------------------------------
53
+ export class WebLinksAddon {
54
+ terminal = null;
55
+ handler;
56
+ links = [];
57
+ currentHoverLink = null;
58
+ mouseMoveHandler = null;
59
+ clickHandler = null;
60
+ constructor(handler) {
61
+ this.handler =
62
+ handler ??
63
+ ((url) => {
64
+ if (typeof window !== "undefined") {
65
+ if (!url.startsWith("http://") && !url.startsWith("https://"))
66
+ return;
67
+ window.open(url, "_blank", "noopener,noreferrer");
68
+ }
69
+ });
70
+ }
71
+ activate(terminal) {
72
+ this.terminal = terminal;
73
+ // Listen for mouse events on the terminal's container
74
+ const container = terminal.element;
75
+ if (!container)
76
+ return;
77
+ this.mouseMoveHandler = (e) => this.onMouseMove(e);
78
+ this.clickHandler = (e) => this.onClick(e);
79
+ container.addEventListener("mousemove", this.mouseMoveHandler);
80
+ container.addEventListener("click", this.clickHandler);
81
+ }
82
+ dispose() {
83
+ if (this.terminal) {
84
+ const container = this.terminal.element;
85
+ if (container) {
86
+ if (this.mouseMoveHandler) {
87
+ container.removeEventListener("mousemove", this.mouseMoveHandler);
88
+ }
89
+ if (this.clickHandler) {
90
+ container.removeEventListener("click", this.clickHandler);
91
+ }
92
+ container.style.cursor = "";
93
+ }
94
+ }
95
+ this.terminal = null;
96
+ this.links = [];
97
+ this.currentHoverLink = null;
98
+ this.mouseMoveHandler = null;
99
+ this.clickHandler = null;
100
+ }
101
+ // -----------------------------------------------------------------------
102
+ // Internal
103
+ // -----------------------------------------------------------------------
104
+ refreshLinks() {
105
+ if (!this.terminal)
106
+ return;
107
+ const grid = this.terminal.activeGrid;
108
+ this.links = findLinks(grid);
109
+ }
110
+ getCellPosition(e) {
111
+ if (!this.terminal)
112
+ return null;
113
+ const container = this.terminal.element;
114
+ if (!container)
115
+ return null;
116
+ const rect = container.getBoundingClientRect();
117
+ const { width, height } = this.terminal.getCellSize();
118
+ if (width <= 0 || height <= 0)
119
+ return null;
120
+ const x = e.clientX - rect.left;
121
+ const y = e.clientY - rect.top;
122
+ const col = Math.floor(x / width);
123
+ const row = Math.floor(y / height);
124
+ return { row, col };
125
+ }
126
+ findLinkAt(row, col) {
127
+ for (const link of this.links) {
128
+ if (link.row === row && col >= link.startCol && col <= link.endCol) {
129
+ return link;
130
+ }
131
+ }
132
+ return null;
133
+ }
134
+ onMouseMove(e) {
135
+ if (!this.terminal)
136
+ return;
137
+ // Refresh links on each mousemove for simplicity
138
+ // (could be optimized to only refresh when rows change)
139
+ this.refreshLinks();
140
+ const pos = this.getCellPosition(e);
141
+ if (!pos)
142
+ return;
143
+ const link = this.findLinkAt(pos.row, pos.col);
144
+ const container = this.terminal.element;
145
+ if (link) {
146
+ if (container)
147
+ container.style.cursor = "pointer";
148
+ this.currentHoverLink = link;
149
+ }
150
+ else {
151
+ if (container)
152
+ container.style.cursor = "";
153
+ this.currentHoverLink = null;
154
+ }
155
+ }
156
+ onClick(e) {
157
+ if (!this.terminal)
158
+ return;
159
+ this.refreshLinks();
160
+ const pos = this.getCellPosition(e);
161
+ if (!pos)
162
+ return;
163
+ const link = this.findLinkAt(pos.row, pos.col);
164
+ if (link) {
165
+ e.preventDefault();
166
+ this.handler(link.url);
167
+ }
168
+ }
169
+ }
170
+ //# sourceMappingURL=web-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-links.js","sourceRoot":"","sources":["../../src/addons/web-links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fit.d.ts","sourceRoot":"","sources":["../src/fit.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAYhC"}
package/dist/fit.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Calculate how many terminal columns/rows fit in a container element.
3
+ */
4
+ export function calculateFit(container, cellWidth, cellHeight) {
5
+ const { width, height } = container.getBoundingClientRect();
6
+ const cols = Math.max(2, Math.floor(width / cellWidth));
7
+ const rows = Math.max(1, Math.floor(height / cellHeight));
8
+ // Guard against Infinity/NaN — critical gotcha from xterm.js
9
+ if (!Number.isFinite(cols) || !Number.isFinite(rows)) {
10
+ return { cols: 80, rows: 24 };
11
+ }
12
+ return { cols, rows };
13
+ }
14
+ //# sourceMappingURL=fit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fit.js","sourceRoot":"","sources":["../src/fit.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAsB,EACtB,SAAiB,EACjB,UAAkB;IAElB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;IAE5D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;IAE1D,6DAA6D;IAC7D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,24 @@
1
+ export type { CursorState, SelectionRange, TerminalOptions, Theme } from "@next_term/core";
2
+ export { CELL_SIZE, CellGrid, DEFAULT_THEME, extractText, normalizeSelection, } from "@next_term/core";
3
+ export { AccessibilityManager, extractRowText } from "./accessibility.js";
4
+ export type { ITerminalAddon } from "./addon.js";
5
+ export { FitAddon } from "./addons/fit.js";
6
+ export type { SearchMatch, SearchOptions } from "./addons/search.js";
7
+ export { SearchAddon } from "./addons/search.js";
8
+ export type { LinkMatch } from "./addons/web-links.js";
9
+ export { WebLinksAddon } from "./addons/web-links.js";
10
+ export { calculateFit } from "./fit.js";
11
+ export type { InputHandlerOptions, SelectionState } from "./input-handler.js";
12
+ export { InputHandler } from "./input-handler.js";
13
+ export type { RenderBridgeOptions } from "./render-bridge.js";
14
+ export { canUseOffscreenCanvas, RenderBridge } from "./render-bridge.js";
15
+ export type { HighlightRange, IRenderer, RendererOptions } from "./renderer.js";
16
+ export { build256Palette, Canvas2DRenderer } from "./renderer.js";
17
+ export type { TerminalEntry } from "./shared-context.js";
18
+ export { SharedWebGLContext } from "./shared-context.js";
19
+ export type { WebTerminalOptions } from "./web-terminal.js";
20
+ export { WebTerminal } from "./web-terminal.js";
21
+ export type { GlyphInfo } from "./webgl-renderer.js";
22
+ export { createRenderer, GlyphAtlas, hexToFloat4, WebGLRenderer } from "./webgl-renderer.js";
23
+ export { WorkerBridge } from "./worker-bridge.js";
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EACL,SAAS,EACT,QAAQ,EACR,aAAa,EACb,WAAW,EACX,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE1E,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACzE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ export { CELL_SIZE, CellGrid, DEFAULT_THEME, extractText, normalizeSelection, } from "@next_term/core";
2
+ export { AccessibilityManager, extractRowText } from "./accessibility.js";
3
+ export { FitAddon } from "./addons/fit.js";
4
+ export { SearchAddon } from "./addons/search.js";
5
+ export { WebLinksAddon } from "./addons/web-links.js";
6
+ export { calculateFit } from "./fit.js";
7
+ export { InputHandler } from "./input-handler.js";
8
+ export { canUseOffscreenCanvas, RenderBridge } from "./render-bridge.js";
9
+ export { build256Palette, Canvas2DRenderer } from "./renderer.js";
10
+ export { SharedWebGLContext } from "./shared-context.js";
11
+ export { WebTerminal } from "./web-terminal.js";
12
+ export { createRenderer, GlyphAtlas, hexToFloat4, WebGLRenderer } from "./webgl-renderer.js";
13
+ export { WorkerBridge } from "./worker-bridge.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EACT,QAAQ,EACR,aAAa,EACb,WAAW,EACX,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAG1E,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAElE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Keyboard, mouse, and touch input handling for the web terminal.
3
+ *
4
+ * Uses a hidden <textarea> to capture keyboard input. This is essential
5
+ * for mobile browsers (iOS Safari, Android Chrome) where a plain div with
6
+ * tabindex="0" does NOT trigger the virtual keyboard. The textarea is
7
+ * positioned behind the terminal canvas so it's invisible but focusable.
8
+ *
9
+ * Touch gestures are delegated to the shared GestureHandler from
10
+ * @next_term/core, providing the same behavior on web and native:
11
+ * tap to focus, pan to scroll, long-press to select, pinch to zoom.
12
+ */
13
+ import type { CellGrid, MouseEncoding, MouseProtocol } from "@next_term/core";
14
+ export interface InputHandlerOptions {
15
+ /** Called when the user types data that should be sent to the PTY. */
16
+ onData: (data: Uint8Array) => void;
17
+ /** Called when the selection state changes. */
18
+ onSelectionChange?: (selection: SelectionState | null) => void;
19
+ /** Called when the user scrolls (deltaRows: positive = scroll down / toward newer). */
20
+ onScroll?: (deltaRows: number) => void;
21
+ /** Called when pinch-to-zoom changes font size. Receives the new fontSize. */
22
+ onFontSizeChange?: (fontSize: number) => void;
23
+ /** Whether the terminal is in application cursor-key mode (\x1bOA vs \x1b[A). */
24
+ applicationCursorKeys?: boolean;
25
+ }
26
+ export interface SelectionState {
27
+ startRow: number;
28
+ startCol: number;
29
+ endRow: number;
30
+ endCol: number;
31
+ }
32
+ export declare class InputHandler {
33
+ private container;
34
+ private textarea;
35
+ private onData;
36
+ private onSelectionChange;
37
+ private onScroll;
38
+ private onFontSizeChange;
39
+ private applicationCursorKeys;
40
+ private bracketedPasteMode;
41
+ private mouseProtocol;
42
+ private mouseEncoding;
43
+ private sendFocusEvents;
44
+ private kittyFlags;
45
+ private cellWidth;
46
+ private cellHeight;
47
+ private currentFontSize;
48
+ private grid;
49
+ private selecting;
50
+ private selection;
51
+ private gestureHandler;
52
+ private touchStartX;
53
+ private touchStartY;
54
+ private touchLastX;
55
+ private touchLastY;
56
+ private longPressTimer;
57
+ private pinchStartDistance;
58
+ private pinchStartFontSize;
59
+ private isPinching;
60
+ private swipeDirection;
61
+ private hSwipeRemainder;
62
+ private composing;
63
+ private copyTooltip;
64
+ /** Text currently staged for copy. */
65
+ private pendingCopyText;
66
+ private boundKeyDown;
67
+ private boundKeyUp;
68
+ private boundInput;
69
+ private boundCompositionStart;
70
+ private boundCompositionEnd;
71
+ private boundPaste;
72
+ private boundMouseDown;
73
+ private boundMouseMove;
74
+ private boundMouseUp;
75
+ private boundFocus;
76
+ private boundBlur;
77
+ private boundWheel;
78
+ private boundTouchStart;
79
+ private boundTouchMove;
80
+ private boundTouchEnd;
81
+ private boundTouchCancel;
82
+ constructor(options: InputHandlerOptions);
83
+ attach(container: HTMLElement, cellWidth: number, cellHeight: number): void;
84
+ focus(): void;
85
+ blur(): void;
86
+ setApplicationCursorKeys(enabled: boolean): void;
87
+ setBracketedPasteMode(enabled: boolean): void;
88
+ setMouseProtocol(protocol: MouseProtocol): void;
89
+ setMouseEncoding(encoding: MouseEncoding): void;
90
+ setSendFocusEvents(enabled: boolean): void;
91
+ setKittyFlags(flags: number): void;
92
+ updateCellSize(cellWidth: number, cellHeight: number): void;
93
+ setFontSize(fontSize: number): void;
94
+ setGrid(grid: CellGrid): void;
95
+ getSelection(): SelectionState | null;
96
+ clearSelection(): void;
97
+ dispose(): void;
98
+ private handleKeyDown;
99
+ private handleKeyUp;
100
+ /**
101
+ * Handle input events from the hidden textarea.
102
+ * On mobile browsers, the virtual keyboard fires `input` events rather
103
+ * than `keydown` for printable characters. We read the textarea value
104
+ * and send any new characters to the PTY.
105
+ */
106
+ private handleInput;
107
+ private handleCompositionStart;
108
+ private handleCompositionEnd;
109
+ private handlePaste;
110
+ /** Send pasted text, wrapping in bracketed paste sequences if enabled. */
111
+ private sendPastedText;
112
+ /**
113
+ * Convert a KeyboardEvent into the VT sequence string to send to the PTY,
114
+ * or null if the event should not be handled.
115
+ */
116
+ keyToSequence(e: KeyboardEvent): string | null;
117
+ /**
118
+ * Produce the key-release sequence for a keyup event.
119
+ * Only meaningful when kittyFlags & 2 (report event types) is active.
120
+ * Returns null if event types are not enabled or the key has no kitty-encoded release.
121
+ */
122
+ keyUpToSequence(e: KeyboardEvent): string | null;
123
+ /**
124
+ * Kitty keyboard protocol key encoding (disambiguate mode, flag 1).
125
+ *
126
+ * Modifier bitmask (add 1 for the wire value):
127
+ * shift=1, alt=2, ctrl=4
128
+ *
129
+ * Encoding rules:
130
+ * - Escape → CSI 27 u (CSI 27;1:type u when flag 2)
131
+ * - Modifier + letter → CSI codepoint[:alt] ; modifier+1 u
132
+ * - Shift+Tab → CSI 9 ; 2 u
133
+ * - Modified cursor keys → CSI 1 ; modifier+1 <ABCDHF>
134
+ * - Modified tilde keys → CSI n ; modifier+1 ~
135
+ * - Modified ESC-O F1-F4 → CSI 1 ; modifier+1 <PQRS>
136
+ * - Unmodified keys → fall back to legacy encoding (no event type suffix)
137
+ *
138
+ * When kittyFlags & 2 (report event types), `:eventType` is appended to the
139
+ * modifier parameter of all enhanced sequences (not legacy fallbacks).
140
+ * When kittyFlags & 4 (report alternate keys), the key codepoint gains
141
+ * `:shifted[:base]` sub-parameters for single printable characters.
142
+ */
143
+ private _keyToSequenceKitty;
144
+ /**
145
+ * Alternate key sub-parameters for flag 4 (report alternate keys).
146
+ *
147
+ * Returns the sub-parameter string to append to the Unicode codepoint in
148
+ * CSI u sequences: `:shifted`, `::base`, `:shifted:base`, or `""`.
149
+ * - shifted: codepoint when Shift is held on the same physical key
150
+ * - base: codepoint of the physical key without modifiers (US QWERTY)
151
+ * Sub-parameters equal to the main codepoint are omitted.
152
+ */
153
+ private _kittyAltParam;
154
+ private handleFocus;
155
+ private handleBlur;
156
+ private getMouseCellPos;
157
+ /**
158
+ * Encode a mouse event as a VT sequence.
159
+ * button: 0=left, 1=middle, 2=right, 3=release, 64=scrollUp, 65=scrollDown
160
+ */
161
+ private encodeMouseEvent;
162
+ private handleMouseDown;
163
+ private handleMouseMove;
164
+ private handleMouseUp;
165
+ private handleWheel;
166
+ private cancelLongPress;
167
+ private getPinchDistance;
168
+ /** Convert a touch point to local pixel coordinates relative to container. */
169
+ private touchToLocal;
170
+ private handleTouchStart;
171
+ private handleTouchMove;
172
+ private handleTouchEnd;
173
+ private handleTouchCancel;
174
+ /**
175
+ * Show a floating "Copy" button near the selection so the user can tap
176
+ * to copy. iOS Safari doesn't show its native callout for programmatic
177
+ * selections, so we provide our own.
178
+ */
179
+ private showCopyTooltip;
180
+ /** Copy pending text to clipboard and dismiss the tooltip. */
181
+ private doCopy;
182
+ /** Hide the copy tooltip. */
183
+ private hideCopyTooltip;
184
+ }
185
+ //# sourceMappingURL=input-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-handler.d.ts","sourceRoot":"","sources":["../src/input-handler.ts"],"names":[],"mappings":"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"}