tmex-cli 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/runtime/server.js +18 -0
- package/package.json +1 -1
- package/resources/fe-dist/assets/{DevicePage-n4JoyDed.js → DevicePage-CKaPUo7L.js} +2 -2
- package/resources/fe-dist/assets/{DevicePage-n4JoyDed.js.map → DevicePage-CKaPUo7L.js.map} +1 -1
- package/resources/fe-dist/assets/DevicesPage-FqU-Dxhu.js +17 -0
- package/resources/fe-dist/assets/{DevicesPage-BwLKaiUR.js.map → DevicesPage-FqU-Dxhu.js.map} +1 -1
- package/resources/fe-dist/assets/{SettingsPage-hS99lHcp.js → SettingsPage-BfkOW0fc.js} +2 -2
- package/resources/fe-dist/assets/{SettingsPage-hS99lHcp.js.map → SettingsPage-BfkOW0fc.js.map} +1 -1
- package/resources/fe-dist/assets/{index-CJyFlAt8.js → index-EgHfq93I.js} +6 -6
- package/resources/fe-dist/assets/index-EgHfq93I.js.map +1 -0
- package/resources/fe-dist/assets/index-Ytlj3p_q.css +1 -0
- package/resources/fe-dist/assets/{select-DGBwxGiK.js → select-CNlE6MiW.js} +3 -3
- package/resources/fe-dist/assets/{select-DGBwxGiK.js.map → select-CNlE6MiW.js.map} +1 -1
- package/resources/fe-dist/assets/{switch-CWUBjs7N.js → switch-CxkzOIL6.js} +2 -2
- package/resources/fe-dist/assets/{switch-CWUBjs7N.js.map → switch-CxkzOIL6.js.map} +1 -1
- package/resources/fe-dist/assets/{useValueChanged-DwJ_SDCu.js → useValueChanged-CO2U5MoL.js} +2 -2
- package/resources/fe-dist/assets/{useValueChanged-DwJ_SDCu.js.map → useValueChanged-CO2U5MoL.js.map} +1 -1
- package/resources/fe-dist/index.html +2 -2
- package/resources/fe-dist/assets/DevicesPage-BwLKaiUR.js +0 -17
- package/resources/fe-dist/assets/index-CJaX5rlK.css +0 -1
- package/resources/fe-dist/assets/index-CJyFlAt8.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevicePage-n4JoyDed.js","sources":["../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/arrow-down-to-line.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/keyboard.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/refresh-cw.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/smartphone.js","../../../../packages/ghostty-terminal/src/canvas-renderer.ts","../../../../packages/ghostty-terminal/src/ghostty-keycodes.ts","../../../../packages/ghostty-terminal/src/render-state.ts","../../../../packages/ghostty-terminal/src/selection-model.ts","../../../../packages/ghostty-terminal/src/selection-clipboard.ts","../../../../packages/ghostty-terminal/src/assets/ghostty-vt.wasm?url","../../../../packages/ghostty-terminal/src/ghostty-wasm.ts","../../../../packages/ghostty-terminal/src/terminal.ts","../../src/components/terminal/theme.ts","../../src/components/terminal/normalization.ts","../../src/components/terminal/useMobileTouch.ts","../../src/utils/resizeSyncGuards.ts","../../src/components/terminal/useTerminalResize.ts","../../src/components/terminal/Terminal.tsx","../../src/utils/selectionGuards.ts","../../src/utils/site.ts","../../src/utils/terminalMeta.ts","../../src/pages/DevicePage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 17V3\", key: \"1cwfxf\" }],\n [\"path\", { d: \"m6 11 6 6 6-6\", key: \"12ii2o\" }],\n [\"path\", { d: \"M19 21H5\", key: \"150jfl\" }]\n];\nconst ArrowDownToLine = createLucideIcon(\"arrow-down-to-line\", __iconNode);\n\nexport { __iconNode, ArrowDownToLine as default };\n//# sourceMappingURL=arrow-down-to-line.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 8h.01\", key: \"1r9ogq\" }],\n [\"path\", { d: \"M12 12h.01\", key: \"1mp3jc\" }],\n [\"path\", { d: \"M14 8h.01\", key: \"1primd\" }],\n [\"path\", { d: \"M16 12h.01\", key: \"1l6xoz\" }],\n [\"path\", { d: \"M18 8h.01\", key: \"emo2bl\" }],\n [\"path\", { d: \"M6 8h.01\", key: \"x9i8wu\" }],\n [\"path\", { d: \"M7 16h10\", key: \"wp8him\" }],\n [\"path\", { d: \"M8 12h.01\", key: \"czm47f\" }],\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }]\n];\nconst Keyboard = createLucideIcon(\"keyboard\", __iconNode);\n\nexport { __iconNode, Keyboard as default };\n//# sourceMappingURL=keyboard.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"20\", x: \"5\", y: \"2\", rx: \"2\", ry: \"2\", key: \"1yt0o3\" }],\n [\"path\", { d: \"M12 18h.01\", key: \"mhygvu\" }]\n];\nconst Smartphone = createLucideIcon(\"smartphone\", __iconNode);\n\nexport { __iconNode, Smartphone as default };\n//# sourceMappingURL=smartphone.js.map\n","import type {\n GhosttyCellDimensions,\n GhosttyColorRgb,\n GhosttyRenderRow,\n GhosttyRenderSnapshotMeta,\n GhosttySelectionRect,\n GhosttyTheme,\n} from './types';\n\ntype CanvasRendererOptions = {\n screenElement: HTMLElement;\n theme: GhosttyTheme;\n fontFamily: string;\n fontSize: number;\n};\n\ntype CanvasRendererFrame = {\n meta: GhosttyRenderSnapshotMeta;\n rows: GhosttyRenderRow[];\n cellDimensions: GhosttyCellDimensions;\n selectionRects?: GhosttySelectionRect[];\n selectionColor?: string;\n};\n\ntype CanvasRendererDebugState = {\n kind: 'canvas';\n frameCount: number;\n lastDrawnRows: number[];\n};\n\ntype CursorCell = {\n x: number;\n y: number;\n style: GhosttyRenderSnapshotMeta['cursor']['style'];\n};\n\nfunction colorToCss(color: GhosttyColorRgb): string {\n return `rgb(${color.r} ${color.g} ${color.b})`;\n}\n\nfunction ensureContext(canvas: HTMLCanvasElement): CanvasRenderingContext2D {\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('2d canvas context unavailable');\n }\n\n return context;\n}\n\nexport class CanvasRenderer {\n readonly kind = 'canvas';\n\n private readonly mainCanvas: HTMLCanvasElement;\n private readonly selectionCanvas: HTMLCanvasElement;\n private readonly cursorCanvas: HTMLCanvasElement;\n private readonly mainContext: CanvasRenderingContext2D;\n private readonly selectionContext: CanvasRenderingContext2D;\n private readonly cursorContext: CanvasRenderingContext2D;\n private theme: GhosttyTheme;\n private readonly fontFamily: string;\n private readonly fontSize: number;\n private cellDimensions: GhosttyCellDimensions = { width: 9, height: 17 };\n private cols = 0;\n private rows = 0;\n private lastCursor: CursorCell | null = null;\n private frameCount = 0;\n private lastDrawnRows: number[] = [];\n private readonly colorCache = new Map<string, string>();\n private readonly fontCache = new Map<string, string>();\n private cursorBlinkVisible = true;\n private cursorBlinkTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: CanvasRendererOptions) {\n this.theme = options.theme;\n this.fontFamily = options.fontFamily;\n this.fontSize = options.fontSize;\n\n options.screenElement.style.position = 'relative';\n options.screenElement.style.overflow = 'hidden';\n\n this.mainCanvas = document.createElement('canvas');\n this.selectionCanvas = document.createElement('canvas');\n this.cursorCanvas = document.createElement('canvas');\n\n for (const [canvas, layer] of [\n [this.mainCanvas, 'main'],\n [this.selectionCanvas, 'selection'],\n [this.cursorCanvas, 'cursor'],\n ] as const) {\n canvas.dataset.layer = layer;\n canvas.style.position = 'absolute';\n canvas.style.inset = '0';\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n canvas.style.pointerEvents = 'none';\n options.screenElement.appendChild(canvas);\n }\n\n this.mainContext = ensureContext(this.mainCanvas);\n this.selectionContext = ensureContext(this.selectionCanvas);\n this.cursorContext = ensureContext(this.cursorCanvas);\n }\n\n setTheme(theme: GhosttyTheme): void {\n this.theme = theme;\n this.colorCache.clear();\n }\n\n render(frame: CanvasRendererFrame): void {\n this.frameCount += 1;\n this.lastDrawnRows = [];\n this.cellDimensions = frame.cellDimensions;\n this.resize(frame.meta.cols, frame.meta.rows);\n this.drawSelection(frame.selectionRects ?? [], frame.selectionColor ?? this.theme.selectionBackground);\n\n if (frame.meta.dirty === 'clean') {\n this.drawCursor(frame.meta);\n return;\n }\n\n const drawAllRows = frame.meta.dirty === 'full';\n const targetRows = drawAllRows ? frame.rows : frame.rows.filter((row) => row.dirty);\n\n for (const row of targetRows) {\n this.drawRow(row, frame.meta.colors);\n this.lastDrawnRows.push(row.y);\n }\n\n this.drawCursor(frame.meta);\n }\n\n getDebugState(): CanvasRendererDebugState {\n return {\n kind: this.kind,\n frameCount: this.frameCount,\n lastDrawnRows: [...this.lastDrawnRows],\n };\n }\n\n dispose(): void {\n this.mainCanvas.remove();\n this.selectionCanvas.remove();\n this.cursorCanvas.remove();\n this.colorCache.clear();\n this.fontCache.clear();\n this.lastCursor = null;\n this.stopCursorBlink();\n }\n\n private startCursorBlink(): void {\n if (this.cursorBlinkTimer) {\n return;\n }\n this.cursorBlinkTimer = setInterval(() => {\n this.cursorBlinkVisible = !this.cursorBlinkVisible;\n this.cursorCanvas.style.opacity = this.cursorBlinkVisible ? '1' : '0';\n }, 1000);\n }\n\n private stopCursorBlink(): void {\n if (this.cursorBlinkTimer) {\n clearInterval(this.cursorBlinkTimer);\n this.cursorBlinkTimer = null;\n }\n this.cursorBlinkVisible = true;\n this.cursorCanvas.style.opacity = '1';\n }\n\n private resize(cols: number, rows: number): void {\n const nextCols = Math.max(1, cols);\n const nextRows = Math.max(1, rows);\n const width = nextCols * this.cellDimensions.width;\n const height = nextRows * this.cellDimensions.height;\n const dpr = Math.max(1, globalThis.devicePixelRatio ?? 1);\n\n if (this.cols === nextCols && this.rows === nextRows) {\n const cssWidth = `${width}px`;\n const cssHeight = `${height}px`;\n if (this.mainCanvas.style.width === cssWidth && this.mainCanvas.style.height === cssHeight) {\n return;\n }\n }\n\n this.cols = nextCols;\n this.rows = nextRows;\n\n for (const canvas of [this.mainCanvas, this.selectionCanvas, this.cursorCanvas]) {\n canvas.width = Math.max(1, Math.ceil(width * dpr));\n canvas.height = Math.max(1, Math.ceil(height * dpr));\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n }\n\n for (const context of [this.mainContext, this.selectionContext, this.cursorContext]) {\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.textBaseline = 'top';\n context.imageSmoothingEnabled = false;\n }\n }\n\n private drawSelection(rects: GhosttySelectionRect[], color: string): void {\n this.selectionContext.clearRect(\n 0,\n 0,\n this.cols * this.cellDimensions.width,\n this.rows * this.cellDimensions.height\n );\n\n if (rects.length === 0) {\n return;\n }\n\n this.selectionContext.fillStyle = color;\n for (const rect of rects) {\n this.selectionContext.fillRect(\n rect.x * this.cellDimensions.width,\n rect.row * this.cellDimensions.height,\n rect.width * this.cellDimensions.width,\n this.cellDimensions.height\n );\n }\n }\n\n private drawRow(row: GhosttyRenderRow, colors: GhosttyRenderSnapshotMeta['colors']): void {\n const y = row.y * this.cellDimensions.height;\n const width = this.cols * this.cellDimensions.width;\n const defaultBackground = this.toCss(colors.background);\n\n this.mainContext.clearRect(0, y, width, this.cellDimensions.height);\n this.mainContext.fillStyle = defaultBackground;\n this.mainContext.fillRect(0, y, width, this.cellDimensions.height);\n\n for (const cell of row.cells) {\n if (cell.widthKind === 'spacer-tail' || cell.widthKind === 'spacer-head') {\n continue;\n }\n\n const x = cell.x * this.cellDimensions.width;\n const bg = cell.style.inverse\n ? cell.fgColor ?? colors.foreground\n : cell.bgColor ?? colors.background;\n const fg = cell.style.inverse\n ? cell.bgColor ?? colors.background\n : cell.fgColor ?? colors.foreground;\n const cellWidth = cell.widthKind === 'wide' ? this.cellDimensions.width * 2 : this.cellDimensions.width;\n\n if (bg.r !== colors.background.r || bg.g !== colors.background.g || bg.b !== colors.background.b) {\n this.mainContext.fillStyle = this.toCss(bg);\n this.mainContext.fillRect(x, y, cellWidth, this.cellDimensions.height);\n }\n\n if (!cell.text || cell.style.invisible) {\n continue;\n }\n\n this.mainContext.font = this.resolveFont(cell.style);\n this.mainContext.fillStyle = this.toCss(fg);\n this.mainContext.fillText(cell.text, x, y);\n\n if (cell.style.underline > 0) {\n this.mainContext.fillRect(\n x,\n y + this.cellDimensions.height - 2,\n Math.max(cellWidth - 1, 1),\n 1\n );\n }\n\n if (cell.style.strikethrough) {\n this.mainContext.fillRect(\n x,\n y + this.cellDimensions.height * 0.55,\n Math.max(cellWidth - 1, 1),\n 1\n );\n }\n\n if (cell.style.overline) {\n this.mainContext.fillRect(x, y + 1, Math.max(cellWidth - 1, 1), 1);\n }\n }\n }\n\n private drawCursor(meta: GhosttyRenderSnapshotMeta): void {\n const colors = meta.colors;\n const cursor = meta.cursor;\n const previous = this.lastCursor;\n this.cursorContext.clearRect(\n 0,\n 0,\n this.cols * this.cellDimensions.width,\n this.rows * this.cellDimensions.height\n );\n\n if (!cursor.visible || cursor.x === null || cursor.y === null) {\n this.lastCursor = null;\n this.stopCursorBlink();\n return;\n }\n\n const x = cursor.x * this.cellDimensions.width;\n const y = cursor.y * this.cellDimensions.height;\n const width = cursor.wideTail ? this.cellDimensions.width * 2 : this.cellDimensions.width;\n const cursorColor = colors.cursor ?? colors.foreground;\n const cssColor = this.toCss(cursorColor);\n\n this.cursorContext.fillStyle = cssColor;\n this.cursorContext.strokeStyle = cssColor;\n this.cursorContext.globalAlpha = 0.7;\n this.cursorContext.fillRect(\n x,\n y + this.cellDimensions.height - 2,\n Math.max(width - 1, 1),\n 2\n );\n this.cursorContext.globalAlpha = 1;\n\n this.startCursorBlink();\n\n this.lastCursor = {\n x: cursor.x,\n y: cursor.y,\n style: cursor.style,\n };\n\n if (\n previous &&\n (previous.x !== this.lastCursor.x ||\n previous.y !== this.lastCursor.y ||\n previous.style !== this.lastCursor.style)\n ) {\n this.lastDrawnRows.push(previous.y);\n }\n }\n\n private resolveFont(style: GhosttyRenderRow['cells'][number]['style']): string {\n const key = [\n style.italic ? 'italic' : 'normal',\n style.bold ? '700' : '400',\n `${this.fontSize}px`,\n this.fontFamily,\n ].join('|');\n\n const cached = this.fontCache.get(key);\n if (cached) {\n return cached;\n }\n\n const font = `${style.italic ? 'italic ' : ''}${style.bold ? '700 ' : ''}${this.fontSize}px ${this.fontFamily}`;\n this.fontCache.set(key, font);\n return font;\n }\n\n private toCss(color: GhosttyColorRgb): string {\n const key = `${color.r},${color.g},${color.b}`;\n const cached = this.colorCache.get(key);\n if (cached) {\n return cached;\n }\n\n const css = colorToCss(color);\n this.colorCache.set(key, css);\n return css;\n }\n}\n\nexport type { CanvasRendererDebugState, CanvasRendererFrame, CanvasRendererOptions };\n","const KEY_UNIDENTIFIED = 0;\n\nconst KEY_CODE_MAP: Record<string, number> = {\n Backquote: 1,\n Backslash: 2,\n BracketLeft: 3,\n BracketRight: 4,\n Comma: 5,\n Digit0: 6,\n Digit1: 7,\n Digit2: 8,\n Digit3: 9,\n Digit4: 10,\n Digit5: 11,\n Digit6: 12,\n Digit7: 13,\n Digit8: 14,\n Digit9: 15,\n Equal: 16,\n IntlBackslash: 17,\n IntlRo: 18,\n IntlYen: 19,\n KeyA: 20,\n KeyB: 21,\n KeyC: 22,\n KeyD: 23,\n KeyE: 24,\n KeyF: 25,\n KeyG: 26,\n KeyH: 27,\n KeyI: 28,\n KeyJ: 29,\n KeyK: 30,\n KeyL: 31,\n KeyM: 32,\n KeyN: 33,\n KeyO: 34,\n KeyP: 35,\n KeyQ: 36,\n KeyR: 37,\n KeyS: 38,\n KeyT: 39,\n KeyU: 40,\n KeyV: 41,\n KeyW: 42,\n KeyX: 43,\n KeyY: 44,\n KeyZ: 45,\n Minus: 46,\n Period: 47,\n Quote: 48,\n Semicolon: 49,\n Slash: 50,\n AltLeft: 51,\n AltRight: 52,\n Backspace: 53,\n CapsLock: 54,\n ContextMenu: 55,\n ControlLeft: 56,\n ControlRight: 57,\n Enter: 58,\n MetaLeft: 59,\n MetaRight: 60,\n ShiftLeft: 61,\n ShiftRight: 62,\n Space: 63,\n Tab: 64,\n Convert: 65,\n KanaMode: 66,\n NonConvert: 67,\n Delete: 68,\n End: 69,\n Help: 70,\n Home: 71,\n Insert: 72,\n PageDown: 73,\n PageUp: 74,\n ArrowDown: 75,\n ArrowLeft: 76,\n ArrowRight: 77,\n ArrowUp: 78,\n NumLock: 79,\n Numpad0: 80,\n Numpad1: 81,\n Numpad2: 82,\n Numpad3: 83,\n Numpad4: 84,\n Numpad5: 85,\n Numpad6: 86,\n Numpad7: 87,\n Numpad8: 88,\n Numpad9: 89,\n NumpadAdd: 90,\n NumpadBackspace: 91,\n NumpadClear: 92,\n NumpadClearEntry: 93,\n NumpadComma: 94,\n NumpadDecimal: 95,\n NumpadDivide: 96,\n NumpadEnter: 97,\n NumpadEqual: 98,\n NumpadMemoryAdd: 99,\n NumpadMemoryClear: 100,\n NumpadMemoryRecall: 101,\n NumpadMemoryStore: 102,\n NumpadMemorySubtract: 103,\n NumpadMultiply: 104,\n NumpadParenLeft: 105,\n NumpadParenRight: 106,\n NumpadSubtract: 107,\n NumpadSeparator: 108,\n NumpadUp: 109,\n NumpadDown: 110,\n NumpadRight: 111,\n NumpadLeft: 112,\n NumpadBegin: 113,\n NumpadHome: 114,\n NumpadEnd: 115,\n NumpadInsert: 116,\n NumpadDelete: 117,\n NumpadPageUp: 118,\n NumpadPageDown: 119,\n Escape: 120,\n F1: 121,\n F2: 122,\n F3: 123,\n F4: 124,\n F5: 125,\n F6: 126,\n F7: 127,\n F8: 128,\n F9: 129,\n F10: 130,\n F11: 131,\n F12: 132,\n F13: 133,\n F14: 134,\n F15: 135,\n F16: 136,\n F17: 137,\n F18: 138,\n F19: 139,\n F20: 140,\n F21: 141,\n F22: 142,\n F23: 143,\n F24: 144,\n F25: 145,\n Fn: 146,\n FnLock: 147,\n PrintScreen: 148,\n ScrollLock: 149,\n Pause: 150,\n BrowserBack: 151,\n BrowserFavorites: 152,\n BrowserForward: 153,\n BrowserHome: 154,\n BrowserRefresh: 155,\n BrowserSearch: 156,\n BrowserStop: 157,\n Eject: 158,\n LaunchApp1: 159,\n LaunchApp2: 160,\n LaunchMail: 161,\n MediaPlayPause: 162,\n MediaSelect: 163,\n MediaStop: 164,\n MediaTrackNext: 165,\n MediaTrackPrevious: 166,\n Power: 167,\n Sleep: 168,\n AudioVolumeDown: 169,\n AudioVolumeMute: 170,\n AudioVolumeUp: 171,\n WakeUp: 172,\n Copy: 173,\n Cut: 174,\n Paste: 175,\n};\n\nconst UNSHIFTED_CODEPOINTS: Record<string, string> = {\n Backquote: '`',\n Backslash: '\\\\',\n BracketLeft: '[',\n BracketRight: ']',\n Comma: ',',\n Equal: '=',\n Minus: '-',\n Period: '.',\n Quote: \"'\",\n Semicolon: ';',\n Slash: '/',\n Space: ' ',\n IntlBackslash: '\\\\',\n IntlYen: '¥',\n IntlRo: '\\\\',\n};\n\nfor (let index = 0; index <= 9; index += 1) {\n UNSHIFTED_CODEPOINTS[`Digit${index}`] = String(index);\n}\n\nfor (let index = 0; index < 26; index += 1) {\n const uppercase = String.fromCharCode(65 + index);\n const lowercase = String.fromCharCode(97 + index);\n UNSHIFTED_CODEPOINTS[`Key${uppercase}`] = lowercase;\n}\n\nexport function getGhosttyKeyCode(code: string): number {\n return KEY_CODE_MAP[code] ?? KEY_UNIDENTIFIED;\n}\n\nexport function getUnshiftedCodepoint(code: string): number | null {\n const value = UNSHIFTED_CODEPOINTS[code];\n return value ? value.codePointAt(0) ?? null : null;\n}\n","import type { GhosttyBindings } from './ghostty-wasm';\nimport type {\n GhosttyCellWidthKind,\n GhosttyColorRgb,\n GhosttyCursorVisualStyle,\n GhosttyRenderCell,\n GhosttyRenderCellStyle,\n GhosttyRenderDirtyState,\n GhosttyRenderRow,\n GhosttyRenderSnapshotMeta,\n} from './types';\n\nconst GHOSTTY_SUCCESS = 0;\nconst GHOSTTY_INVALID_VALUE = -2;\n\nconst GHOSTTY_RENDER_STATE_DATA_COLS = 1;\nconst GHOSTTY_RENDER_STATE_DATA_ROWS = 2;\nconst GHOSTTY_RENDER_STATE_DATA_DIRTY = 3;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VISUAL_STYLE = 10;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VISIBLE = 11;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_BLINKING = 12;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_PASSWORD_INPUT = 13;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE = 14;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_X = 15;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_Y = 16;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_WIDE_TAIL = 17;\n\nconst GHOSTTY_RENDER_STATE_ROW_DATA_DIRTY = 1;\nconst GHOSTTY_RENDER_STATE_ROW_DATA_RAW = 2;\n\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_RAW = 1;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_STYLE = 2;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_LEN = 3;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_BUF = 4;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_BG_COLOR = 5;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_FG_COLOR = 6;\n\nconst GHOSTTY_ROW_DATA_WRAP = 1;\nconst GHOSTTY_ROW_DATA_WRAP_CONTINUATION = 2;\n\nconst GHOSTTY_CELL_DATA_WIDE = 3;\nconst GHOSTTY_CELL_DATA_HAS_TEXT = 4;\n\ntype GhosttyRenderStateResources = {\n bindings: GhosttyBindings;\n renderStateHandle: number;\n rowIteratorHandle: number;\n rowCellsHandle: number;\n snapshotVersion: number;\n disposed: boolean;\n cachedMeta: GhosttyRenderSnapshotMeta | null;\n};\n\nfunction ensureActive(resources: GhosttyRenderStateResources): void {\n if (resources.disposed || resources.renderStateHandle === 0) {\n throw new Error('render state resources already disposed');\n }\n}\n\nfunction resultToDirtyState(value: number): GhosttyRenderDirtyState {\n switch (value) {\n case 2:\n return 'full';\n case 1:\n return 'partial';\n default:\n return 'clean';\n }\n}\n\nfunction resultToCursorStyle(value: number): GhosttyCursorVisualStyle {\n switch (value) {\n case 0:\n return 'bar';\n case 2:\n return 'underline';\n case 3:\n return 'block-hollow';\n default:\n return 'block';\n }\n}\n\nfunction resultToCellWidthKind(value: number): GhosttyCellWidthKind {\n switch (value) {\n case 1:\n return 'wide';\n case 2:\n return 'spacer-tail';\n case 3:\n return 'spacer-head';\n default:\n return 'narrow';\n }\n}\n\nfunction readColorAt(bindings: GhosttyBindings, ptr: number): GhosttyColorRgb {\n return {\n r: bindings.view().getUint8(ptr),\n g: bindings.view().getUint8(ptr + 1),\n b: bindings.view().getUint8(ptr + 2),\n };\n}\n\nfunction readOptionalColor(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number\n): GhosttyColorRgb | null {\n const color = resources.bindings.allocStruct('GhosttyColorRgb');\n\n try {\n const result = read(color.ptr);\n if (result === GHOSTTY_INVALID_VALUE) {\n return null;\n }\n\n if (result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty optional color read failed with result ${result}`);\n }\n\n return readColorAt(resources.bindings, color.ptr);\n } finally {\n color.free();\n }\n}\n\nfunction readBool(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): boolean {\n const ptr = resources.bindings.allocU8();\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty bool read failed with result ${result}`);\n }\n\n return resources.bindings.readU8(ptr) !== 0;\n } finally {\n resources.bindings.freeU8(ptr);\n }\n}\n\nfunction readU16(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): number {\n const ptr = resources.bindings.allocBytes(2);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty u16 read failed with result ${result}`);\n }\n\n return resources.bindings.view().getUint16(ptr, true);\n } finally {\n resources.bindings.freeBytes(ptr, 2);\n }\n}\n\nfunction readU32(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): number {\n const ptr = resources.bindings.allocBytes(4);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty u32 read failed with result ${result}`);\n }\n\n return resources.bindings.view().getUint32(ptr, true);\n } finally {\n resources.bindings.freeBytes(ptr, 4);\n }\n}\n\nfunction readEnumI32(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): number {\n const ptr = resources.bindings.allocBytes(4);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty enum read failed with result ${result}`);\n }\n\n return resources.bindings.view().getInt32(ptr, true);\n } finally {\n resources.bindings.freeBytes(ptr, 4);\n }\n}\n\nfunction readU64(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): bigint {\n const ptr = resources.bindings.allocBytes(8);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty u64 read failed with result ${result}`);\n }\n\n return resources.bindings.readU64(ptr);\n } finally {\n resources.bindings.freeBytes(ptr, 8);\n }\n}\n\nfunction readStyle(resources: GhosttyRenderStateResources): GhosttyRenderCellStyle {\n const style = resources.bindings.allocStruct('GhosttyStyle');\n\n try {\n resources.bindings.setField(\n style.view,\n 'GhosttyStyle',\n 'size',\n resources.bindings.typeSize('GhosttyStyle')\n );\n resources.bindings.getRenderStateRowCellValue(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_STYLE,\n style.ptr\n );\n\n const field = (name: string) => resources.bindings.field('GhosttyStyle', name).offset;\n return {\n bold: style.view.getUint8(field('bold')) !== 0,\n italic: style.view.getUint8(field('italic')) !== 0,\n faint: style.view.getUint8(field('faint')) !== 0,\n blink: style.view.getUint8(field('blink')) !== 0,\n inverse: style.view.getUint8(field('inverse')) !== 0,\n invisible: style.view.getUint8(field('invisible')) !== 0,\n strikethrough: style.view.getUint8(field('strikethrough')) !== 0,\n overline: style.view.getUint8(field('overline')) !== 0,\n underline: style.view.getInt32(field('underline'), true),\n };\n } finally {\n style.free();\n }\n}\n\nfunction readCodepoints(resources: GhosttyRenderStateResources): number[] {\n const graphemeLen = readU32(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_LEN,\n ptr\n )\n );\n\n if (graphemeLen === 0) {\n return [];\n }\n\n const bufPtr = resources.bindings.allocBytes(graphemeLen * 4);\n\n try {\n resources.bindings.getRenderStateRowCellValue(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_BUF,\n bufPtr\n );\n\n const codepoints: number[] = [];\n for (let index = 0; index < graphemeLen; index += 1) {\n codepoints.push(resources.bindings.view().getUint32(bufPtr + index * 4, true));\n }\n\n return codepoints;\n } finally {\n resources.bindings.freeBytes(bufPtr, graphemeLen * 4);\n }\n}\n\nfunction codepointsToText(codepoints: number[]): string {\n if (codepoints.length === 0) {\n return '';\n }\n\n try {\n return String.fromCodePoint(...codepoints);\n } catch {\n return '';\n }\n}\n\nfunction buildRowText(cells: GhosttyRenderCell[]): string {\n let text = '';\n\n for (const cell of cells) {\n if (cell.widthKind === 'spacer-tail' || cell.widthKind === 'spacer-head') {\n continue;\n }\n\n if (cell.text) {\n text += cell.text;\n continue;\n }\n\n if (cell.widthKind === 'narrow') {\n text += ' ';\n }\n }\n\n return text;\n}\n\nfunction readMeta(resources: GhosttyRenderStateResources): GhosttyRenderSnapshotMeta {\n const colors = resources.bindings.allocStruct('GhosttyRenderStateColors');\n\n try {\n resources.bindings.setField(\n colors.view,\n 'GhosttyRenderStateColors',\n 'size',\n resources.bindings.typeSize('GhosttyRenderStateColors')\n );\n resources.bindings.getRenderStateColors(resources.renderStateHandle, colors.ptr);\n\n const paletteOffset = resources.bindings.field('GhosttyRenderStateColors', 'palette').offset;\n const palette: GhosttyColorRgb[] = [];\n for (let index = 0; index < 256; index += 1) {\n const colorOffset = colors.ptr + paletteOffset + index * 3;\n palette.push(readColorAt(resources.bindings, colorOffset));\n }\n\n const cursorHasValue =\n colors.view.getUint8(\n resources.bindings.field('GhosttyRenderStateColors', 'cursor_has_value').offset\n ) !== 0;\n\n const cursorViewportHasValue = readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE,\n ptr\n )\n );\n\n return {\n cols: readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_COLS,\n ptr\n )\n ),\n rows: readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_ROWS,\n ptr\n )\n ),\n dirty: resultToDirtyState(\n readEnumI32(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_DIRTY,\n ptr\n )\n )\n ),\n colors: {\n background: readColorAt(\n resources.bindings,\n colors.ptr + resources.bindings.field('GhosttyRenderStateColors', 'background').offset\n ),\n foreground: readColorAt(\n resources.bindings,\n colors.ptr + resources.bindings.field('GhosttyRenderStateColors', 'foreground').offset\n ),\n cursor: cursorHasValue\n ? readColorAt(\n resources.bindings,\n colors.ptr + resources.bindings.field('GhosttyRenderStateColors', 'cursor').offset\n )\n : null,\n palette,\n },\n cursor: {\n style: resultToCursorStyle(\n readEnumI32(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VISUAL_STYLE,\n ptr\n )\n )\n ),\n visible: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VISIBLE,\n ptr\n )\n ),\n blinking: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_BLINKING,\n ptr\n )\n ),\n passwordInput: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_PASSWORD_INPUT,\n ptr\n )\n ),\n x: cursorViewportHasValue\n ? readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_X,\n ptr\n )\n )\n : null,\n y: cursorViewportHasValue\n ? readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_Y,\n ptr\n )\n )\n : null,\n wideTail: cursorViewportHasValue\n ? readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_WIDE_TAIL,\n ptr\n )\n )\n : false,\n },\n };\n } finally {\n colors.free();\n }\n}\n\nfunction readRow(resources: GhosttyRenderStateResources, rowIndex: number): GhosttyRenderRow {\n const rawRow = readU64(resources, (ptr) =>\n resources.bindings.getRenderStateRowValueResult(\n resources.rowIteratorHandle,\n GHOSTTY_RENDER_STATE_ROW_DATA_RAW,\n ptr\n )\n );\n resources.bindings.bindRenderStateRowCells(resources.rowIteratorHandle, resources.rowCellsHandle);\n\n const cells: GhosttyRenderCell[] = [];\n let x = 0;\n while (resources.bindings.nextRenderStateRowCell(resources.rowCellsHandle)) {\n const rawCell = readU64(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_RAW,\n ptr\n )\n );\n const codepoints = readCodepoints(resources);\n const widthKind = resultToCellWidthKind(\n readEnumI32(resources, (ptr) =>\n resources.bindings.getRawCellValueResult(rawCell, GHOSTTY_CELL_DATA_WIDE, ptr)\n )\n );\n const cell: GhosttyRenderCell = {\n x,\n text: codepointsToText(codepoints),\n codepoints,\n widthKind,\n hasText: readBool(resources, (ptr) =>\n resources.bindings.getRawCellValueResult(rawCell, GHOSTTY_CELL_DATA_HAS_TEXT, ptr)\n ),\n style: readStyle(resources),\n fgColor: readOptionalColor(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_FG_COLOR,\n ptr\n )\n ),\n bgColor: readOptionalColor(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_BG_COLOR,\n ptr\n )\n ),\n };\n cells.push(cell);\n x += 1;\n }\n\n return {\n y: rowIndex,\n dirty: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateRowValueResult(\n resources.rowIteratorHandle,\n GHOSTTY_RENDER_STATE_ROW_DATA_DIRTY,\n ptr\n )\n ),\n wrap: readBool(resources, (ptr) =>\n resources.bindings.getRawRowValueResult(rawRow, GHOSTTY_ROW_DATA_WRAP, ptr)\n ),\n wrapContinuation: readBool(resources, (ptr) =>\n resources.bindings.getRawRowValueResult(rawRow, GHOSTTY_ROW_DATA_WRAP_CONTINUATION, ptr)\n ),\n text: buildRowText(cells),\n cells,\n };\n}\n\nexport function createRenderState(bindings: GhosttyBindings): GhosttyRenderStateResources {\n return {\n bindings,\n renderStateHandle: bindings.createRenderState(),\n rowIteratorHandle: bindings.createRenderStateRowIterator(),\n rowCellsHandle: bindings.createRenderStateRowCells(),\n snapshotVersion: 0,\n disposed: false,\n cachedMeta: null,\n };\n}\n\nexport function updateRenderState(\n resources: GhosttyRenderStateResources,\n terminalHandle: number\n): void {\n ensureActive(resources);\n resources.bindings.updateRenderState(resources.renderStateHandle, terminalHandle);\n resources.bindings.bindRenderStateRowIterator(\n resources.renderStateHandle,\n resources.rowIteratorHandle\n );\n resources.snapshotVersion += 1;\n resources.cachedMeta = null;\n}\n\nexport function readRenderSnapshotMeta(\n resources: GhosttyRenderStateResources\n): GhosttyRenderSnapshotMeta {\n ensureActive(resources);\n if (!resources.cachedMeta) {\n resources.cachedMeta = readMeta(resources);\n }\n\n return resources.cachedMeta;\n}\n\nexport function* iterateRows(\n resources: GhosttyRenderStateResources\n): Generator<GhosttyRenderRow, void, undefined> {\n ensureActive(resources);\n const meta = readRenderSnapshotMeta(resources);\n resources.bindings.bindRenderStateRowIterator(\n resources.renderStateHandle,\n resources.rowIteratorHandle\n );\n\n let rowIndex = 0;\n while (\n rowIndex < meta.rows &&\n resources.bindings.nextRenderStateRowIterator(resources.rowIteratorHandle)\n ) {\n yield readRow(resources, rowIndex);\n rowIndex += 1;\n }\n}\n\nexport function disposeRenderStateResources(resources: GhosttyRenderStateResources): void {\n if (resources.disposed) {\n return;\n }\n\n resources.disposed = true;\n if (resources.rowCellsHandle !== 0) {\n resources.bindings.freeRenderStateRowCells(resources.rowCellsHandle);\n resources.rowCellsHandle = 0;\n }\n if (resources.rowIteratorHandle !== 0) {\n resources.bindings.freeRenderStateRowIterator(resources.rowIteratorHandle);\n resources.rowIteratorHandle = 0;\n }\n if (resources.renderStateHandle !== 0) {\n resources.bindings.freeRenderState(resources.renderStateHandle);\n resources.renderStateHandle = 0;\n }\n resources.cachedMeta = null;\n}\n\nexport type { GhosttyRenderStateResources };\n","import type { GhosttySelectionRect } from './types';\n\nexport type SelectionMode = 'character' | 'word' | 'line';\n\nexport type SelectionPoint = {\n line: number;\n col: number;\n};\n\nexport type SelectionState = {\n anchor: SelectionPoint | null;\n focus: SelectionPoint | null;\n mode: SelectionMode;\n};\n\ntype SelectionRange = {\n start: SelectionPoint;\n end: SelectionPoint;\n};\n\nfunction clampColumn(lineText: string, col: number): number {\n return Math.max(0, Math.min(Math.max(lineText.length - 1, 0), Math.floor(col)));\n}\n\nfunction normalizeRange(anchor: SelectionPoint, focus: SelectionPoint): SelectionRange {\n if (anchor.line < focus.line) {\n return { start: anchor, end: focus };\n }\n\n if (anchor.line > focus.line) {\n return { start: focus, end: anchor };\n }\n\n if (anchor.col <= focus.col) {\n return { start: anchor, end: focus };\n }\n\n return { start: focus, end: anchor };\n}\n\nfunction expandWord(line: number, col: number, lineText: string): SelectionRange {\n if (!lineText) {\n return {\n start: { line, col: 0 },\n end: { line, col: 0 },\n };\n }\n\n const safeCol = clampColumn(lineText, col);\n const isWordChar = (value: string) => /[\\p{L}\\p{N}_-]/u.test(value);\n const cursorChar = lineText[safeCol] ?? '';\n\n if (!isWordChar(cursorChar)) {\n return {\n start: { line, col: safeCol },\n end: { line, col: safeCol },\n };\n }\n\n let start = safeCol;\n let end = safeCol;\n while (start > 0 && isWordChar(lineText[start - 1] ?? '')) {\n start -= 1;\n }\n while (end + 1 < lineText.length && isWordChar(lineText[end + 1] ?? '')) {\n end += 1;\n }\n\n return {\n start: { line, col: start },\n end: { line, col: end },\n };\n}\n\nfunction expandLine(line: number, lineText: string): SelectionRange {\n const lastCol = Math.max(lineText.length - 1, 0);\n return {\n start: { line, col: 0 },\n end: { line, col: lastCol },\n };\n}\n\nfunction pointForMode(\n point: SelectionPoint,\n mode: SelectionMode,\n getLineText: (line: number) => string\n): SelectionRange {\n const lineText = getLineText(point.line);\n\n switch (mode) {\n case 'word':\n return expandWord(point.line, point.col, lineText);\n case 'line':\n return expandLine(point.line, lineText);\n default: {\n const safeCol = clampColumn(lineText, point.col);\n return {\n start: { line: point.line, col: safeCol },\n end: { line: point.line, col: safeCol },\n };\n }\n }\n}\n\nexport function createEmptySelectionState(): SelectionState {\n return {\n anchor: null,\n focus: null,\n mode: 'character',\n };\n}\n\nexport function hasSelection(state: SelectionState): boolean {\n return Boolean(state.anchor && state.focus);\n}\n\nexport function clearSelection(): SelectionState {\n return createEmptySelectionState();\n}\n\nexport function resolvePointerSelection(\n _previous: SelectionState,\n point: SelectionPoint & { mode: SelectionMode },\n getLineText: (line: number) => string\n): SelectionState {\n const expanded = pointForMode(point, point.mode, getLineText);\n return {\n anchor: expanded.start,\n focus: expanded.end,\n mode: point.mode,\n };\n}\n\nexport function updateSelectionFocus(\n state: SelectionState,\n point: SelectionPoint,\n getLineText: (line: number) => string\n): SelectionState {\n if (!state.anchor) {\n return state;\n }\n\n if (state.mode === 'line') {\n return {\n ...state,\n focus: expandLine(point.line, getLineText(point.line)).end,\n };\n }\n\n if (state.mode === 'word') {\n return {\n ...state,\n focus: pointForMode(point, 'word', getLineText).end,\n };\n }\n\n return {\n ...state,\n focus: {\n line: point.line,\n col: clampColumn(getLineText(point.line), point.col),\n },\n };\n}\n\nexport function getSelectionRange(state: SelectionState): SelectionRange | null {\n if (!state.anchor || !state.focus) {\n return null;\n }\n\n return normalizeRange(state.anchor, state.focus);\n}\n\nexport function serializeSelectionText(\n state: SelectionState,\n getLineText: (line: number) => string\n): string | null {\n const range = getSelectionRange(state);\n if (!range) {\n return null;\n }\n\n const segments: string[] = [];\n for (let line = range.start.line; line <= range.end.line; line += 1) {\n const text = getLineText(line);\n if (line === range.start.line && line === range.end.line) {\n segments.push(text.slice(range.start.col, range.end.col + 1));\n continue;\n }\n\n if (line === range.start.line) {\n segments.push(text.slice(range.start.col));\n continue;\n }\n\n if (line === range.end.line) {\n segments.push(text.slice(0, range.end.col + 1));\n continue;\n }\n\n segments.push(text);\n }\n\n return segments.join('\\n');\n}\n\nexport function projectSelectionRects(\n state: SelectionState,\n viewportStartLine: number,\n viewportRows: number,\n getLineText?: (line: number) => string\n): GhosttySelectionRect[] {\n const range = getSelectionRange(state);\n if (!range) {\n return [];\n }\n\n const viewportEndLine = viewportStartLine + viewportRows - 1;\n const rects: GhosttySelectionRect[] = [];\n for (\n let line = Math.max(range.start.line, viewportStartLine);\n line <= Math.min(range.end.line, viewportEndLine);\n line += 1\n ) {\n const row = line - viewportStartLine;\n if (line === range.start.line && line === range.end.line) {\n rects.push({\n row,\n x: range.start.col,\n width: range.end.col - range.start.col + 1,\n });\n continue;\n }\n\n if (line === range.start.line) {\n const lineWidth = getLineText ? Math.max(getLineText(line).length - range.start.col, 0) : Number.MAX_SAFE_INTEGER;\n rects.push({\n row,\n x: range.start.col,\n width: lineWidth,\n });\n continue;\n }\n\n if (line === range.end.line) {\n rects.push({\n row,\n x: 0,\n width: range.end.col + 1,\n });\n continue;\n }\n\n const middleWidth = getLineText ? getLineText(line).length : Number.MAX_SAFE_INTEGER;\n rects.push({\n row,\n x: 0,\n width: middleWidth,\n });\n }\n\n return rects;\n}\n","export function hasCopyModifier(event: KeyboardEvent): boolean {\n return (event.metaKey || event.ctrlKey) && !event.altKey;\n}\n\nexport function isCopyShortcut(event: KeyboardEvent): boolean {\n return hasCopyModifier(event) && event.key.toLowerCase() === 'c';\n}\n\nexport async function writeSelectionToClipboard(text: string): Promise<void> {\n if (!text) {\n return;\n }\n\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n }\n}\n\nexport function writeSelectionToCopyEvent(event: ClipboardEvent, text: string): boolean {\n if (!text || !event.clipboardData) {\n return false;\n }\n\n event.clipboardData.setData('text/plain', text);\n event.preventDefault();\n return true;\n}\n","export default \"__VITE_ASSET__D7nLG8tf__\"","import ghosttyWasmUrl from './assets/ghostty-vt.wasm?url';\nimport type { GhosttyCellDimensions, GhosttyTheme } from './types';\n\nconst GHOSTTY_SUCCESS = 0;\nconst GHOSTTY_OUT_OF_SPACE = -3;\n\nconst GHOSTTY_TERMINAL_OPT_COLOR_FOREGROUND = 11;\nconst GHOSTTY_TERMINAL_OPT_COLOR_BACKGROUND = 12;\nconst GHOSTTY_TERMINAL_OPT_COLOR_CURSOR = 13;\nconst GHOSTTY_TERMINAL_OPT_COLOR_PALETTE = 14;\n\nconst GHOSTTY_TERMINAL_DATA_COLS = 1;\nconst GHOSTTY_TERMINAL_DATA_ROWS = 2;\nconst GHOSTTY_TERMINAL_DATA_SCROLLBAR = 9;\nconst GHOSTTY_POINT_TAG_VIEWPORT = 1;\n\nconst GHOSTTY_SCROLL_VIEWPORT_TOP = 0;\nconst GHOSTTY_SCROLL_VIEWPORT_BOTTOM = 1;\nconst GHOSTTY_SCROLL_VIEWPORT_DELTA = 2;\n\nconst GHOSTTY_KEY_ACTION_RELEASE = 0;\nconst GHOSTTY_KEY_ACTION_PRESS = 1;\nconst GHOSTTY_KEY_ACTION_REPEAT = 2;\n\nconst GHOSTTY_MOUSE_ENCODER_OPT_TRACK_LAST_CELL = 4;\n\nconst GHOSTTY_MODE_BRACKETED_PASTE = 2004;\nconst GHOSTTY_MODE_X10_MOUSE = 9;\nconst GHOSTTY_MODE_NORMAL_MOUSE = 1000;\nconst GHOSTTY_MODE_BUTTON_MOUSE = 1002;\nconst GHOSTTY_MODE_ANY_MOUSE = 1003;\nconst GHOSTTY_MODE_UTF8_MOUSE = 1005;\nconst GHOSTTY_MODE_SGR_MOUSE = 1006;\nconst GHOSTTY_MODE_URXVT_MOUSE = 1015;\nconst GHOSTTY_MODE_SGR_PIXELS_MOUSE = 1016;\n\nconst GHOSTTY_FORMATTER_FORMAT_PLAIN = 0;\nconst GHOSTTY_FORMATTER_FORMAT_HTML = 2;\nconst WASM_USIZE_BYTES = 4;\n\ntype LayoutField = {\n offset: number;\n size: number;\n type: string;\n};\n\ntype LayoutType = {\n size: number;\n align: number;\n fields: Record<string, LayoutField>;\n};\n\ntype LayoutMap = Record<string, LayoutType>;\n\ntype GhosttyMouseEncodeOptions = {\n action: 'press' | 'release' | 'motion';\n button?: number | null;\n mods: number;\n x: number;\n y: number;\n anyButtonPressed: boolean;\n screenWidth: number;\n screenHeight: number;\n cellWidth: number;\n cellHeight: number;\n};\n\ntype GhosttyExports = WebAssembly.Exports & {\n memory: WebAssembly.Memory;\n ghostty_type_json: () => number;\n ghostty_alloc: (allocatorPtr: number, size: number, alignment: number) => number;\n ghostty_free: (allocatorPtr: number, ptr: number, len: number) => void;\n ghostty_wasm_alloc_opaque: () => number;\n ghostty_wasm_free_opaque: (ptr: number) => void;\n ghostty_wasm_alloc_u8: () => number;\n ghostty_wasm_free_u8: (ptr: number) => void;\n ghostty_wasm_alloc_u8_array: (len: number) => number;\n ghostty_wasm_free_u8_array: (ptr: number, len: number) => void;\n ghostty_wasm_alloc_usize: () => number;\n ghostty_wasm_free_usize: (ptr: number) => void;\n ghostty_terminal_new: (allocatorPtr: number, outTerminalPtr: number, optionsPtr: number) => number;\n ghostty_terminal_free: (terminal: number) => void;\n ghostty_terminal_reset: (terminal: number) => void;\n ghostty_terminal_resize: (\n terminal: number,\n cols: number,\n rows: number,\n cellWidthPx: number,\n cellHeightPx: number\n ) => number;\n ghostty_terminal_vt_write: (terminal: number, dataPtr: number, len: number) => void;\n ghostty_terminal_scroll_viewport: (terminal: number, behaviorPtr: number) => void;\n ghostty_terminal_set: (terminal: number, option: number, valuePtr: number) => number;\n ghostty_terminal_get: (terminal: number, data: number, outPtr: number) => number;\n ghostty_terminal_mode_get: (terminal: number, mode: number, outValuePtr: number) => number;\n ghostty_terminal_mode_set: (terminal: number, mode: number, enabled: number) => number;\n ghostty_terminal_grid_ref: (terminal: number, pointPtr: number, outRefPtr: number) => number;\n ghostty_render_state_new: (allocatorPtr: number, outStatePtr: number) => number;\n ghostty_render_state_free: (state: number) => void;\n ghostty_render_state_update: (state: number, terminal: number) => number;\n ghostty_render_state_get: (state: number, data: number, outPtr: number) => number;\n ghostty_render_state_set: (state: number, option: number, valuePtr: number) => number;\n ghostty_render_state_colors_get: (state: number, outColorsPtr: number) => number;\n ghostty_render_state_row_iterator_new: (allocatorPtr: number, outIteratorPtr: number) => number;\n ghostty_render_state_row_iterator_free: (iterator: number) => void;\n ghostty_render_state_row_iterator_next: (iterator: number) => number;\n ghostty_render_state_row_get: (iterator: number, data: number, outPtr: number) => number;\n ghostty_render_state_row_set: (iterator: number, option: number, valuePtr: number) => number;\n ghostty_render_state_row_cells_new: (allocatorPtr: number, outCellsPtr: number) => number;\n ghostty_render_state_row_cells_free: (cells: number) => void;\n ghostty_render_state_row_cells_next: (cells: number) => number;\n ghostty_render_state_row_cells_select: (cells: number, x: number) => number;\n ghostty_render_state_row_cells_get: (cells: number, data: number, outPtr: number) => number;\n ghostty_row_get: (row: bigint, data: number, outPtr: number) => number;\n ghostty_cell_get: (cell: bigint, data: number, outPtr: number) => number;\n ghostty_formatter_terminal_new: (\n allocatorPtr: number,\n outFormatterPtr: number,\n terminal: number,\n optionsPtr: number\n ) => number;\n ghostty_formatter_format_alloc: (\n formatter: number,\n allocatorPtr: number,\n outPtrPtr: number,\n outLenPtr: number\n ) => number;\n ghostty_formatter_free: (formatter: number) => void;\n ghostty_key_encoder_new: (allocatorPtr: number, outEncoderPtr: number) => number;\n ghostty_key_encoder_free: (encoder: number) => void;\n ghostty_key_encoder_setopt_from_terminal: (encoder: number, terminal: number) => void;\n ghostty_mouse_encoder_new: (allocatorPtr: number, outEncoderPtr: number) => number;\n ghostty_mouse_encoder_free: (encoder: number) => void;\n ghostty_mouse_encoder_reset: (encoder: number) => void;\n ghostty_mouse_encoder_setopt: (encoder: number, option: number, valuePtr: number) => void;\n ghostty_mouse_encoder_setopt_from_terminal: (encoder: number, terminal: number) => void;\n ghostty_mouse_encoder_encode: (\n encoder: number,\n event: number,\n outBufPtr: number,\n outBufLen: number,\n outWrittenPtr: number\n ) => number;\n ghostty_mouse_event_new: (allocatorPtr: number, outEventPtr: number) => number;\n ghostty_mouse_event_free: (event: number) => void;\n ghostty_mouse_event_set_action: (event: number, action: number) => void;\n ghostty_mouse_event_set_button: (event: number, button: number) => void;\n ghostty_mouse_event_clear_button: (event: number) => void;\n ghostty_mouse_event_set_mods: (event: number, mods: number) => void;\n ghostty_mouse_event_set_position: (event: number, positionPtr: number) => void;\n ghostty_key_event_new: (allocatorPtr: number, outEventPtr: number) => number;\n ghostty_key_event_free: (event: number) => void;\n ghostty_key_event_set_action: (event: number, action: number) => void;\n ghostty_key_event_set_key: (event: number, key: number) => void;\n ghostty_key_event_set_mods: (event: number, mods: number) => void;\n ghostty_key_event_set_consumed_mods: (event: number, consumedMods: number) => void;\n ghostty_key_event_set_composing: (event: number, composing: number) => void;\n ghostty_key_event_set_utf8: (event: number, utf8Ptr: number, len: number) => void;\n ghostty_key_event_set_unshifted_codepoint: (event: number, codepoint: number) => void;\n ghostty_key_encoder_encode: (\n encoder: number,\n event: number,\n outBufPtr: number,\n outBufLen: number,\n outWrittenPtr: number\n ) => number;\n ghostty_paste_encode: (\n dataPtr: number,\n dataLen: number,\n bracketed: number,\n outBufPtr: number,\n outBufLen: number,\n outWrittenPtr: number\n ) => number;\n};\n\nlet bindingsPromise: Promise<GhosttyBindings> | null = null;\n\nfunction assertResult(result: number, action: string): void {\n if (result === GHOSTTY_SUCCESS) {\n return;\n }\n\n throw new Error(`${action} failed with result ${result}`);\n}\n\nfunction parseHexRgb(hex: string): [number, number, number] {\n const normalized = hex.trim().replace(/^#/, '');\n if (normalized.length !== 6) {\n throw new Error(`expected #RRGGBB color, received: ${hex}`);\n }\n\n return [\n Number.parseInt(normalized.slice(0, 2), 16),\n Number.parseInt(normalized.slice(2, 4), 16),\n Number.parseInt(normalized.slice(4, 6), 16),\n ];\n}\n\nfunction createAnsi256Palette(theme: GhosttyTheme): Array<[number, number, number]> {\n const base16 = [\n theme.black,\n theme.red,\n theme.green,\n theme.yellow,\n theme.blue,\n theme.magenta,\n theme.cyan,\n theme.white,\n theme.brightBlack,\n theme.brightRed,\n theme.brightGreen,\n theme.brightYellow,\n theme.brightBlue,\n theme.brightMagenta,\n theme.brightCyan,\n theme.brightWhite,\n ].map(parseHexRgb);\n\n const palette = [...base16];\n const cube = [0, 95, 135, 175, 215, 255];\n\n for (const red of cube) {\n for (const green of cube) {\n for (const blue of cube) {\n palette.push([red, green, blue]);\n }\n }\n }\n\n for (let index = 0; index < 24; index += 1) {\n const value = 8 + index * 10;\n palette.push([value, value, value]);\n }\n\n return palette;\n}\n\nfunction encodeMouseModifierBits(mods: number): number {\n let encoded = 0;\n if (mods & (1 << 0)) encoded += 4;\n if (mods & (1 << 2)) encoded += 8;\n if (mods & (1 << 1)) encoded += 16;\n return encoded;\n}\n\nfunction encodeX10Byte(value: number): string | null {\n if (value < 0 || value > 223) {\n return null;\n }\n\n return String.fromCharCode(value + 32);\n}\n\nfunction mouseButtonCode(button: number | null | undefined): number | null {\n switch (button) {\n case 1:\n return 0;\n case 3:\n return 1;\n case 2:\n return 2;\n case 4:\n return 64;\n case 5:\n return 65;\n case 6:\n return 66;\n case 7:\n return 67;\n case 8:\n return 128;\n case 9:\n return 129;\n case null:\n case undefined:\n return 3;\n default:\n return null;\n }\n}\n\nexport function keyboardEventToGhosttyMods(event: KeyboardEvent): number {\n let mods = 0;\n\n if (event.shiftKey) mods |= 1 << 0;\n if (event.ctrlKey) mods |= 1 << 1;\n if (event.altKey) mods |= 1 << 2;\n if (event.metaKey) mods |= 1 << 3;\n if (event.getModifierState?.('CapsLock')) mods |= 1 << 4;\n if (event.getModifierState?.('NumLock')) mods |= 1 << 5;\n\n return mods;\n}\n\nclass StructAllocation {\n constructor(\n private readonly bindings: GhosttyBindings,\n readonly typeName: string,\n readonly ptr: number\n ) {}\n\n get view(): DataView {\n return this.bindings.view(this.ptr, this.bindings.typeSize(this.typeName));\n }\n\n free(): void {\n this.bindings.freeBytes(this.ptr, this.bindings.typeSize(this.typeName));\n }\n}\n\nexport class GhosttyBindings {\n readonly exports: GhosttyExports;\n readonly layout: LayoutMap;\n\n private readonly decoder = new TextDecoder();\n private readonly encoder = new TextEncoder();\n\n constructor(exports: GhosttyExports, layout: LayoutMap) {\n this.exports = exports;\n this.layout = layout;\n }\n\n buffer(): ArrayBuffer {\n return this.exports.memory.buffer;\n }\n\n bytes(ptr = 0, len = this.buffer().byteLength - ptr): Uint8Array {\n return new Uint8Array(this.buffer(), ptr, len);\n }\n\n view(ptr = 0, len = this.buffer().byteLength - ptr): DataView {\n return new DataView(this.buffer(), ptr, len);\n }\n\n typeSize(typeName: string): number {\n const type = this.layout[typeName];\n if (!type) {\n throw new Error(`unknown ghostty type: ${typeName}`);\n }\n\n return type.size;\n }\n\n field(typeName: string, fieldName: string): LayoutField {\n const type = this.layout[typeName];\n const field = type?.fields[fieldName];\n if (!type || !field) {\n throw new Error(`unknown ghostty field: ${typeName}.${fieldName}`);\n }\n\n return field;\n }\n\n allocStruct(typeName: string): StructAllocation {\n const ptr = this.allocBytes(this.typeSize(typeName));\n this.bytes(ptr, this.typeSize(typeName)).fill(0);\n return new StructAllocation(this, typeName, ptr);\n }\n\n allocBytes(len: number): number {\n return this.exports.ghostty_wasm_alloc_u8_array(len);\n }\n\n freeBytes(ptr: number, len: number): void {\n this.exports.ghostty_wasm_free_u8_array(ptr, len);\n }\n\n allocOpaque(): number {\n return this.exports.ghostty_wasm_alloc_opaque();\n }\n\n freeOpaque(ptr: number): void {\n this.exports.ghostty_wasm_free_opaque(ptr);\n }\n\n allocU8(): number {\n return this.exports.ghostty_wasm_alloc_u8();\n }\n\n freeU8(ptr: number): void {\n this.exports.ghostty_wasm_free_u8(ptr);\n }\n\n allocUsize(): number {\n return this.exports.ghostty_wasm_alloc_usize();\n }\n\n freeUsize(ptr: number): void {\n this.exports.ghostty_wasm_free_usize(ptr);\n }\n\n readPointer(ptr: number): number {\n return this.view().getUint32(ptr, true);\n }\n\n readU8(ptr: number): number {\n return this.view().getUint8(ptr);\n }\n\n readUsize(ptr: number): number {\n if (WASM_USIZE_BYTES === 4) {\n return this.view().getUint32(ptr, true);\n }\n\n return Number(this.view().getBigUint64(ptr, true));\n }\n\n readU64(ptr: number): bigint {\n return this.view().getBigUint64(ptr, true);\n }\n\n setField(target: DataView, typeName: string, fieldName: string, value: number | boolean): void {\n const field = this.field(typeName, fieldName);\n const offset = field.offset;\n\n switch (field.type) {\n case 'u8':\n case 'bool':\n target.setUint8(offset, Number(value));\n return;\n case 'u16':\n target.setUint16(offset, Number(value), true);\n return;\n case 'u32':\n target.setUint32(offset, Number(value), true);\n return;\n case 'u64':\n target.setBigUint64(offset, BigInt(value), true);\n return;\n case 'usize':\n if (WASM_USIZE_BYTES === 4) {\n target.setUint32(offset, Number(value), true);\n return;\n }\n\n target.setBigUint64(offset, BigInt(value), true);\n return;\n case 'i32':\n case 'enum':\n target.setInt32(offset, Number(value), true);\n return;\n default:\n throw new Error(`unsupported field type ${typeName}.${fieldName}: ${field.type}`);\n }\n }\n\n writeString(data: string): { ptr: number; len: number; free: () => void } {\n const encoded = this.encoder.encode(data);\n const ptr = this.allocBytes(encoded.length);\n this.bytes(ptr, encoded.length).set(encoded);\n\n return {\n ptr,\n len: encoded.length,\n free: () => this.freeBytes(ptr, encoded.length),\n };\n }\n\n writeBytes(data: Uint8Array): { ptr: number; len: number; free: () => void } {\n const ptr = this.allocBytes(data.length);\n this.bytes(ptr, data.length).set(data);\n\n return {\n ptr,\n len: data.length,\n free: () => this.freeBytes(ptr, data.length),\n };\n }\n\n readOwnedUtf8(ptr: number, len: number): string {\n return this.decoder.decode(this.bytes(ptr, len));\n }\n\n createTerminal(cols: number, rows: number, scrollback: number): number {\n const options = this.allocStruct('GhosttyTerminalOptions');\n this.setField(options.view, 'GhosttyTerminalOptions', 'cols', cols);\n this.setField(options.view, 'GhosttyTerminalOptions', 'rows', rows);\n this.setField(options.view, 'GhosttyTerminalOptions', 'max_scrollback', scrollback);\n\n const termPtrPtr = this.allocOpaque();\n\n try {\n assertResult(\n this.exports.ghostty_terminal_new(0, termPtrPtr, options.ptr),\n 'ghostty_terminal_new'\n );\n return this.readPointer(termPtrPtr);\n } finally {\n options.free();\n this.freeOpaque(termPtrPtr);\n }\n }\n\n freeTerminal(terminal: number): void {\n this.exports.ghostty_terminal_free(terminal);\n }\n\n writeVt(terminal: number, data: string | Uint8Array): void {\n const bytes = typeof data === 'string' ? this.encoder.encode(data) : data;\n const allocation = this.writeBytes(bytes);\n\n try {\n this.exports.ghostty_terminal_vt_write(terminal, allocation.ptr, allocation.len);\n } finally {\n allocation.free();\n }\n }\n\n resetTerminal(terminal: number): void {\n this.exports.ghostty_terminal_reset(terminal);\n }\n\n resizeTerminal(\n terminal: number,\n cols: number,\n rows: number,\n cell: GhosttyCellDimensions\n ): void {\n assertResult(\n this.exports.ghostty_terminal_resize(\n terminal,\n cols,\n rows,\n Math.max(1, Math.round(cell.width)),\n Math.max(1, Math.round(cell.height))\n ),\n 'ghostty_terminal_resize'\n );\n }\n\n scrollViewportDelta(terminal: number, delta: number): void {\n const behavior = this.allocStruct('GhosttyTerminalScrollViewport');\n\n try {\n this.setField(\n behavior.view,\n 'GhosttyTerminalScrollViewport',\n 'tag',\n GHOSTTY_SCROLL_VIEWPORT_DELTA\n );\n behavior.view.setBigInt64(\n this.field('GhosttyTerminalScrollViewport', 'value').offset,\n BigInt(delta),\n true\n );\n this.exports.ghostty_terminal_scroll_viewport(terminal, behavior.ptr);\n } finally {\n behavior.free();\n }\n }\n\n scrollViewportTop(terminal: number): void {\n const behavior = this.allocStruct('GhosttyTerminalScrollViewport');\n\n try {\n this.setField(\n behavior.view,\n 'GhosttyTerminalScrollViewport',\n 'tag',\n GHOSTTY_SCROLL_VIEWPORT_TOP\n );\n this.exports.ghostty_terminal_scroll_viewport(terminal, behavior.ptr);\n } finally {\n behavior.free();\n }\n }\n\n scrollViewportBottom(terminal: number): void {\n const behavior = this.allocStruct('GhosttyTerminalScrollViewport');\n\n try {\n this.setField(\n behavior.view,\n 'GhosttyTerminalScrollViewport',\n 'tag',\n GHOSTTY_SCROLL_VIEWPORT_BOTTOM\n );\n this.exports.ghostty_terminal_scroll_viewport(terminal, behavior.ptr);\n } finally {\n behavior.free();\n }\n }\n\n setTerminalTheme(terminal: number, theme: GhosttyTheme): void {\n const foreground = this.allocStruct('GhosttyColorRgb');\n const background = this.allocStruct('GhosttyColorRgb');\n const cursor = this.allocStruct('GhosttyColorRgb');\n const paletteColors = createAnsi256Palette(theme);\n const palettePtr = this.allocBytes(paletteColors.length * 3);\n\n const assignRgb = (target: StructAllocation, value: string) => {\n const [red, green, blue] = parseHexRgb(value);\n this.setField(target.view, 'GhosttyColorRgb', 'r', red);\n this.setField(target.view, 'GhosttyColorRgb', 'g', green);\n this.setField(target.view, 'GhosttyColorRgb', 'b', blue);\n };\n\n assignRgb(foreground, theme.foreground);\n assignRgb(background, theme.background);\n assignRgb(cursor, theme.cursor);\n\n const paletteBytes = this.bytes(palettePtr, paletteColors.length * 3);\n paletteColors.forEach(([red, green, blue], index) => {\n const offset = index * 3;\n paletteBytes[offset] = red;\n paletteBytes[offset + 1] = green;\n paletteBytes[offset + 2] = blue;\n });\n\n try {\n assertResult(\n this.exports.ghostty_terminal_set(\n terminal,\n GHOSTTY_TERMINAL_OPT_COLOR_FOREGROUND,\n foreground.ptr\n ),\n 'ghostty_terminal_set(foreground)'\n );\n assertResult(\n this.exports.ghostty_terminal_set(\n terminal,\n GHOSTTY_TERMINAL_OPT_COLOR_BACKGROUND,\n background.ptr\n ),\n 'ghostty_terminal_set(background)'\n );\n assertResult(\n this.exports.ghostty_terminal_set(terminal, GHOSTTY_TERMINAL_OPT_COLOR_CURSOR, cursor.ptr),\n 'ghostty_terminal_set(cursor)'\n );\n assertResult(\n this.exports.ghostty_terminal_set(\n terminal,\n GHOSTTY_TERMINAL_OPT_COLOR_PALETTE,\n palettePtr\n ),\n 'ghostty_terminal_set(palette)'\n );\n } finally {\n foreground.free();\n background.free();\n cursor.free();\n this.freeBytes(palettePtr, paletteColors.length * 3);\n }\n }\n\n readTerminalSize(terminal: number): { cols: number; rows: number } {\n const colsPtr = this.allocBytes(2);\n const rowsPtr = this.allocBytes(2);\n\n try {\n assertResult(\n this.exports.ghostty_terminal_get(terminal, GHOSTTY_TERMINAL_DATA_COLS, colsPtr),\n 'ghostty_terminal_get(cols)'\n );\n assertResult(\n this.exports.ghostty_terminal_get(terminal, GHOSTTY_TERMINAL_DATA_ROWS, rowsPtr),\n 'ghostty_terminal_get(rows)'\n );\n return {\n cols: this.view().getUint16(colsPtr, true),\n rows: this.view().getUint16(rowsPtr, true),\n };\n } finally {\n this.freeBytes(colsPtr, 2);\n this.freeBytes(rowsPtr, 2);\n }\n }\n\n readScrollbar(terminal: number): { total: number; offset: number; len: number } {\n const scrollbar = this.allocStruct('GhosttyTerminalScrollbar');\n\n try {\n assertResult(\n this.exports.ghostty_terminal_get(terminal, GHOSTTY_TERMINAL_DATA_SCROLLBAR, scrollbar.ptr),\n 'ghostty_terminal_get(scrollbar)'\n );\n\n return {\n total: Number(\n scrollbar.view.getBigUint64(\n this.field('GhosttyTerminalScrollbar', 'total').offset,\n true\n )\n ),\n offset: Number(\n scrollbar.view.getBigUint64(\n this.field('GhosttyTerminalScrollbar', 'offset').offset,\n true\n )\n ),\n len: Number(\n scrollbar.view.getBigUint64(this.field('GhosttyTerminalScrollbar', 'len').offset, true)\n ),\n };\n } finally {\n scrollbar.free();\n }\n }\n\n isTerminalModeEnabled(terminal: number, mode: number): boolean {\n const valuePtr = this.allocU8();\n\n try {\n assertResult(\n this.exports.ghostty_terminal_mode_get(terminal, mode, valuePtr),\n 'ghostty_terminal_mode_get'\n );\n return this.readU8(valuePtr) !== 0;\n } finally {\n this.freeU8(valuePtr);\n }\n }\n\n setTerminalMode(terminal: number, mode: number, enabled: boolean): void {\n assertResult(\n this.exports.ghostty_terminal_mode_set(terminal, mode, enabled ? 1 : 0),\n 'ghostty_terminal_mode_set'\n );\n }\n\n createFormatter(\n terminal: number,\n emit: number,\n options: { trim: boolean; unwrap: boolean; includePalette: boolean; selectionPtr?: number | null }\n ): number {\n const formatterOptions = this.allocStruct('GhosttyFormatterTerminalOptions');\n const extraOffset = this.field('GhosttyFormatterTerminalOptions', 'extra').offset;\n const extraView = this.view(\n formatterOptions.ptr + extraOffset,\n this.typeSize('GhosttyFormatterTerminalExtra')\n );\n const screenOffset = this.field('GhosttyFormatterTerminalExtra', 'screen').offset;\n const screenView = this.view(\n formatterOptions.ptr + extraOffset + screenOffset,\n this.typeSize('GhosttyFormatterScreenExtra')\n );\n const outFormatterPtr = this.allocOpaque();\n\n try {\n this.setField(\n formatterOptions.view,\n 'GhosttyFormatterTerminalOptions',\n 'size',\n this.typeSize('GhosttyFormatterTerminalOptions')\n );\n this.setField(formatterOptions.view, 'GhosttyFormatterTerminalOptions', 'emit', emit);\n this.setField(\n formatterOptions.view,\n 'GhosttyFormatterTerminalOptions',\n 'unwrap',\n options.unwrap\n );\n this.setField(\n formatterOptions.view,\n 'GhosttyFormatterTerminalOptions',\n 'trim',\n options.trim\n );\n this.setField(\n extraView,\n 'GhosttyFormatterTerminalExtra',\n 'size',\n this.typeSize('GhosttyFormatterTerminalExtra')\n );\n this.setField(\n extraView,\n 'GhosttyFormatterTerminalExtra',\n 'palette',\n options.includePalette\n );\n this.setField(\n screenView,\n 'GhosttyFormatterScreenExtra',\n 'size',\n this.typeSize('GhosttyFormatterScreenExtra')\n );\n const selectionOffset = this.field('GhosttyFormatterTerminalOptions', 'selection').offset;\n formatterOptions.view.setUint32(selectionOffset, options.selectionPtr ?? 0, true);\n\n assertResult(\n this.exports.ghostty_formatter_terminal_new(\n 0,\n outFormatterPtr,\n terminal,\n formatterOptions.ptr\n ),\n 'ghostty_formatter_terminal_new'\n );\n\n return this.readPointer(outFormatterPtr);\n } finally {\n formatterOptions.free();\n this.freeOpaque(outFormatterPtr);\n }\n }\n\n freeFormatter(formatter: number): void {\n this.exports.ghostty_formatter_free(formatter);\n }\n\n private resolveViewportGridRef(\n terminal: number,\n x: number,\n y: number\n ): StructAllocation | null {\n const point = this.allocStruct('GhosttyPoint');\n const outRef = this.allocStruct('GhosttyGridRef');\n\n try {\n this.setField(point.view, 'GhosttyPoint', 'tag', GHOSTTY_POINT_TAG_VIEWPORT);\n const coordOffset = this.field('GhosttyPoint', 'value').offset;\n const coordView = this.view(\n point.ptr + coordOffset,\n this.typeSize('GhosttyPointCoordinate')\n );\n this.setField(coordView, 'GhosttyPointCoordinate', 'x', x);\n this.setField(coordView, 'GhosttyPointCoordinate', 'y', y);\n\n const result = this.exports.ghostty_terminal_grid_ref(terminal, point.ptr, outRef.ptr);\n if (result !== GHOSTTY_SUCCESS) {\n outRef.free();\n return null;\n }\n\n return outRef;\n } finally {\n point.free();\n }\n }\n\n private createViewportSelection(\n terminal: number,\n cols: number,\n rows: number\n ): StructAllocation | null {\n const safeCols = Math.max(1, Math.floor(cols));\n const safeRows = Math.max(1, Math.floor(rows));\n const start = this.resolveViewportGridRef(terminal, 0, 0);\n if (!start) {\n return null;\n }\n\n let end: StructAllocation | null = null;\n for (let row = safeRows - 1; row >= 0; row -= 1) {\n end = this.resolveViewportGridRef(terminal, safeCols - 1, row);\n if (end) {\n break;\n }\n }\n\n if (!end) {\n start.free();\n return null;\n }\n\n const selection = this.allocStruct('GhosttySelection');\n try {\n this.setField(selection.view, 'GhosttySelection', 'size', this.typeSize('GhosttySelection'));\n this.setField(selection.view, 'GhosttySelection', 'rectangle', false);\n\n const startOffset = this.field('GhosttySelection', 'start').offset;\n const endOffset = this.field('GhosttySelection', 'end').offset;\n this.bytes(selection.ptr + startOffset, this.typeSize('GhosttyGridRef')).set(\n this.bytes(start.ptr, this.typeSize('GhosttyGridRef'))\n );\n this.bytes(selection.ptr + endOffset, this.typeSize('GhosttyGridRef')).set(\n this.bytes(end.ptr, this.typeSize('GhosttyGridRef'))\n );\n\n return selection;\n } finally {\n start.free();\n end.free();\n }\n }\n\n formatViewport(\n terminal: number,\n emit: number,\n options: { trim: boolean; unwrap: boolean; includePalette: boolean },\n viewport: { cols: number; rows: number }\n ): string {\n const terminalSize = this.readTerminalSize(terminal);\n const selection = this.createViewportSelection(\n terminal,\n Math.max(1, Math.min(terminalSize.cols, viewport.cols)),\n Math.max(1, Math.min(terminalSize.rows, viewport.rows))\n );\n const formatter = this.createFormatter(terminal, emit, {\n ...options,\n selectionPtr: selection?.ptr ?? null,\n });\n\n try {\n return this.formatFormatter(formatter);\n } finally {\n this.freeFormatter(formatter);\n selection?.free();\n }\n }\n\n formatFormatter(formatter: number): string {\n const outPtrPtr = this.allocOpaque();\n const outLenPtr = this.allocUsize();\n\n try {\n assertResult(\n this.exports.ghostty_formatter_format_alloc(formatter, 0, outPtrPtr, outLenPtr),\n 'ghostty_formatter_format_alloc'\n );\n\n const outPtr = this.readPointer(outPtrPtr);\n const outLen = this.readUsize(outLenPtr);\n const memoryByteLength = this.buffer().byteLength;\n\n try {\n if (outLen === 0 || outPtr === 0) {\n return '';\n }\n\n if (outPtr < 0 || outPtr > memoryByteLength || outLen > memoryByteLength - outPtr) {\n throw new Error(\n `ghostty_formatter_format_alloc returned invalid slice ptr=${outPtr} len=${outLen} mem=${memoryByteLength}`\n );\n }\n\n return this.readOwnedUtf8(outPtr, outLen);\n } finally {\n if (outLen > 0 && outPtr !== 0) {\n this.exports.ghostty_free(0, outPtr, outLen);\n }\n }\n } finally {\n this.freeOpaque(outPtrPtr);\n this.freeUsize(outLenPtr);\n }\n }\n\n createRenderState(): number {\n const outStatePtr = this.allocOpaque();\n\n try {\n assertResult(this.exports.ghostty_render_state_new(0, outStatePtr), 'ghostty_render_state_new');\n return this.readPointer(outStatePtr);\n } finally {\n this.freeOpaque(outStatePtr);\n }\n }\n\n freeRenderState(state: number): void {\n this.exports.ghostty_render_state_free(state);\n }\n\n updateRenderState(state: number, terminal: number): void {\n assertResult(\n this.exports.ghostty_render_state_update(state, terminal),\n 'ghostty_render_state_update'\n );\n }\n\n getRenderStateValueResult(state: number, data: number, outPtr: number): number {\n return this.exports.ghostty_render_state_get(state, data, outPtr);\n }\n\n getRenderStateValue(state: number, data: number, outPtr: number): void {\n assertResult(this.getRenderStateValueResult(state, data, outPtr), 'ghostty_render_state_get');\n }\n\n setRenderStateValue(state: number, option: number, valuePtr: number): void {\n assertResult(this.exports.ghostty_render_state_set(state, option, valuePtr), 'ghostty_render_state_set');\n }\n\n getRenderStateColors(state: number, outColorsPtr: number): void {\n assertResult(\n this.exports.ghostty_render_state_colors_get(state, outColorsPtr),\n 'ghostty_render_state_colors_get'\n );\n }\n\n createRenderStateRowIterator(): number {\n const outIteratorPtr = this.allocOpaque();\n\n try {\n assertResult(\n this.exports.ghostty_render_state_row_iterator_new(0, outIteratorPtr),\n 'ghostty_render_state_row_iterator_new'\n );\n return this.readPointer(outIteratorPtr);\n } finally {\n this.freeOpaque(outIteratorPtr);\n }\n }\n\n freeRenderStateRowIterator(iterator: number): void {\n this.exports.ghostty_render_state_row_iterator_free(iterator);\n }\n\n bindRenderStateRowIterator(state: number, iterator: number): void {\n const outPtr = this.allocOpaque();\n\n try {\n this.view(outPtr, 4).setUint32(0, iterator, true);\n this.getRenderStateValue(state, 4, outPtr);\n } finally {\n this.freeOpaque(outPtr);\n }\n }\n\n nextRenderStateRowIterator(iterator: number): boolean {\n return this.exports.ghostty_render_state_row_iterator_next(iterator) !== 0;\n }\n\n getRenderStateRowValueResult(iterator: number, data: number, outPtr: number): number {\n return this.exports.ghostty_render_state_row_get(iterator, data, outPtr);\n }\n\n getRenderStateRowValue(iterator: number, data: number, outPtr: number): void {\n assertResult(this.getRenderStateRowValueResult(iterator, data, outPtr), 'ghostty_render_state_row_get');\n }\n\n setRenderStateRowValue(iterator: number, option: number, valuePtr: number): void {\n assertResult(\n this.exports.ghostty_render_state_row_set(iterator, option, valuePtr),\n 'ghostty_render_state_row_set'\n );\n }\n\n createRenderStateRowCells(): number {\n const outCellsPtr = this.allocOpaque();\n\n try {\n assertResult(\n this.exports.ghostty_render_state_row_cells_new(0, outCellsPtr),\n 'ghostty_render_state_row_cells_new'\n );\n return this.readPointer(outCellsPtr);\n } finally {\n this.freeOpaque(outCellsPtr);\n }\n }\n\n freeRenderStateRowCells(cells: number): void {\n this.exports.ghostty_render_state_row_cells_free(cells);\n }\n\n bindRenderStateRowCells(iterator: number, cells: number): void {\n const outPtr = this.allocOpaque();\n\n try {\n this.view(outPtr, 4).setUint32(0, cells, true);\n this.getRenderStateRowValue(iterator, 3, outPtr);\n } finally {\n this.freeOpaque(outPtr);\n }\n }\n\n nextRenderStateRowCell(cells: number): boolean {\n return this.exports.ghostty_render_state_row_cells_next(cells) !== 0;\n }\n\n selectRenderStateRowCell(cells: number, x: number): void {\n assertResult(\n this.exports.ghostty_render_state_row_cells_select(cells, x),\n 'ghostty_render_state_row_cells_select'\n );\n }\n\n getRenderStateRowCellValueResult(cells: number, data: number, outPtr: number): number {\n return this.exports.ghostty_render_state_row_cells_get(cells, data, outPtr);\n }\n\n getRenderStateRowCellValue(cells: number, data: number, outPtr: number): void {\n assertResult(\n this.getRenderStateRowCellValueResult(cells, data, outPtr),\n 'ghostty_render_state_row_cells_get'\n );\n }\n\n getRawRowValueResult(row: bigint, data: number, outPtr: number): number {\n return this.exports.ghostty_row_get(row, data, outPtr);\n }\n\n getRawRowValue(row: bigint, data: number, outPtr: number): void {\n assertResult(this.getRawRowValueResult(row, data, outPtr), 'ghostty_row_get');\n }\n\n getRawCellValueResult(cell: bigint, data: number, outPtr: number): number {\n return this.exports.ghostty_cell_get(cell, data, outPtr);\n }\n\n getRawCellValue(cell: bigint, data: number, outPtr: number): void {\n assertResult(this.getRawCellValueResult(cell, data, outPtr), 'ghostty_cell_get');\n }\n\n createKeyEncoder(): number {\n const outEncoderPtr = this.allocOpaque();\n\n try {\n assertResult(this.exports.ghostty_key_encoder_new(0, outEncoderPtr), 'ghostty_key_encoder_new');\n return this.readPointer(outEncoderPtr);\n } finally {\n this.freeOpaque(outEncoderPtr);\n }\n }\n\n freeKeyEncoder(encoder: number): void {\n this.exports.ghostty_key_encoder_free(encoder);\n }\n\n createMouseEncoder(): number {\n const outEncoderPtr = this.allocOpaque();\n const trackLastCellPtr = this.allocU8();\n\n try {\n assertResult(\n this.exports.ghostty_mouse_encoder_new(0, outEncoderPtr),\n 'ghostty_mouse_encoder_new'\n );\n const encoder = this.readPointer(outEncoderPtr);\n this.view().setUint8(trackLastCellPtr, 1);\n this.exports.ghostty_mouse_encoder_setopt(\n encoder,\n GHOSTTY_MOUSE_ENCODER_OPT_TRACK_LAST_CELL,\n trackLastCellPtr\n );\n return encoder;\n } finally {\n this.freeU8(trackLastCellPtr);\n this.freeOpaque(outEncoderPtr);\n }\n }\n\n freeMouseEncoder(encoder: number): void {\n this.exports.ghostty_mouse_encoder_free(encoder);\n }\n\n resetMouseEncoder(encoder: number): void {\n this.exports.ghostty_mouse_encoder_reset(encoder);\n }\n\n encodeMouseEvent(\n encoder: number,\n terminal: number,\n options: GhosttyMouseEncodeOptions\n ): string | null {\n void encoder;\n\n const trackingAny = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_ANY_MOUSE);\n const trackingButton = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_BUTTON_MOUSE);\n const trackingNormal = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_NORMAL_MOUSE);\n const trackingX10 = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_X10_MOUSE);\n\n if (!trackingAny && !trackingButton && !trackingNormal && !trackingX10) {\n return null;\n }\n\n if (options.action === 'motion' && !(trackingAny || (trackingButton && options.anyButtonPressed))) {\n return null;\n }\n\n if (trackingX10 && options.action !== 'press') {\n return null;\n }\n\n if (!trackingAny && !trackingButton && !trackingX10 && options.action === 'motion') {\n return null;\n }\n\n const baseCode = mouseButtonCode(options.button);\n if (baseCode === null) {\n return null;\n }\n\n const column = Math.max(1, Math.floor(options.x / Math.max(1, options.cellWidth)) + 1);\n const row = Math.max(1, Math.floor(options.y / Math.max(1, options.cellHeight)) + 1);\n const pixelX = Math.round(options.x + 1);\n const pixelY = Math.round(options.y + 1);\n\n let code =\n options.action === 'release' &&\n !this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_MOUSE) &&\n !this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_PIXELS_MOUSE)\n ? 3\n : baseCode;\n\n if (options.action === 'motion') {\n code += 32;\n }\n\n code += encodeMouseModifierBits(options.mods);\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_PIXELS_MOUSE)) {\n const suffix = options.action === 'release' ? 'm' : 'M';\n return `\\u001b[<${code};${pixelX};${pixelY}${suffix}`;\n }\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_MOUSE)) {\n const suffix = options.action === 'release' ? 'm' : 'M';\n return `\\u001b[<${code};${column};${row}${suffix}`;\n }\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_URXVT_MOUSE)) {\n return `\\u001b[${code};${column};${row}M`;\n }\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_UTF8_MOUSE) || trackingNormal || trackingButton || trackingAny || trackingX10) {\n const encodedCode = encodeX10Byte(code);\n const encodedColumn = encodeX10Byte(column);\n const encodedRow = encodeX10Byte(row);\n if (!encodedCode || !encodedColumn || !encodedRow) {\n return null;\n }\n return `\\u001b[M${encodedCode}${encodedColumn}${encodedRow}`;\n }\n\n return null;\n }\n\n encodeKeyEvent(\n encoder: number,\n terminal: number,\n options: {\n action: 'press' | 'repeat' | 'release';\n keyCode: number;\n mods: number;\n composing: boolean;\n utf8?: string | null;\n unshiftedCodepoint?: number | null;\n }\n ): string | null {\n if (options.keyCode <= 0) {\n return null;\n }\n\n const eventPtrPtr = this.allocOpaque();\n let eventHandle = 0;\n let utf8Allocation: { ptr: number; len: number; free: () => void } | null = null;\n\n try {\n assertResult(this.exports.ghostty_key_event_new(0, eventPtrPtr), 'ghostty_key_event_new');\n eventHandle = this.readPointer(eventPtrPtr);\n this.exports.ghostty_key_encoder_setopt_from_terminal(encoder, terminal);\n this.exports.ghostty_key_event_set_action(\n eventHandle,\n options.action === 'release'\n ? GHOSTTY_KEY_ACTION_RELEASE\n : options.action === 'repeat'\n ? GHOSTTY_KEY_ACTION_REPEAT\n : GHOSTTY_KEY_ACTION_PRESS\n );\n this.exports.ghostty_key_event_set_key(eventHandle, options.keyCode);\n this.exports.ghostty_key_event_set_mods(eventHandle, options.mods);\n this.exports.ghostty_key_event_set_consumed_mods(eventHandle, 0);\n this.exports.ghostty_key_event_set_composing(eventHandle, options.composing ? 1 : 0);\n\n if (options.utf8) {\n utf8Allocation = this.writeString(options.utf8);\n this.exports.ghostty_key_event_set_utf8(\n eventHandle,\n utf8Allocation.ptr,\n utf8Allocation.len\n );\n }\n\n if (typeof options.unshiftedCodepoint === 'number') {\n this.exports.ghostty_key_event_set_unshifted_codepoint(\n eventHandle,\n options.unshiftedCodepoint\n );\n }\n\n return this.encodeKeyHandle(encoder, eventHandle);\n } finally {\n utf8Allocation?.free();\n if (eventHandle !== 0) {\n this.exports.ghostty_key_event_free(eventHandle);\n }\n this.freeOpaque(eventPtrPtr);\n }\n }\n\n private encodeKeyHandle(encoder: number, eventHandle: number): string | null {\n const requiredPtr = this.allocUsize();\n\n try {\n const sizeResult = this.exports.ghostty_key_encoder_encode(encoder, eventHandle, 0, 0, requiredPtr);\n if (sizeResult !== GHOSTTY_OUT_OF_SPACE && sizeResult !== GHOSTTY_SUCCESS) {\n assertResult(sizeResult, 'ghostty_key_encoder_encode(size)');\n }\n\n const required = Math.max(0, this.readUsize(requiredPtr));\n if (required === 0) {\n return null;\n }\n\n const bufferPtr = this.allocBytes(required);\n const writtenPtr = this.allocUsize();\n\n try {\n assertResult(\n this.exports.ghostty_key_encoder_encode(\n encoder,\n eventHandle,\n bufferPtr,\n required,\n writtenPtr\n ),\n 'ghostty_key_encoder_encode'\n );\n\n const written = this.readUsize(writtenPtr);\n if (written === 0) {\n return null;\n }\n\n return this.readOwnedUtf8(bufferPtr, written);\n } finally {\n this.freeBytes(bufferPtr, required);\n this.freeUsize(writtenPtr);\n }\n } finally {\n this.freeUsize(requiredPtr);\n }\n }\n\n encodePaste(terminal: number, data: string): string {\n const input = this.writeString(data);\n const requiredPtr = this.allocUsize();\n\n try {\n const bracketed = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_BRACKETED_PASTE);\n const sizeResult = this.exports.ghostty_paste_encode(\n input.ptr,\n input.len,\n bracketed ? 1 : 0,\n 0,\n 0,\n requiredPtr\n );\n if (sizeResult !== GHOSTTY_OUT_OF_SPACE && sizeResult !== GHOSTTY_SUCCESS) {\n assertResult(sizeResult, 'ghostty_paste_encode(size)');\n }\n\n const required = Math.max(0, this.readUsize(requiredPtr));\n if (required === 0) {\n return '';\n }\n\n const outputPtr = this.allocBytes(required);\n const writtenPtr = this.allocUsize();\n\n try {\n assertResult(\n this.exports.ghostty_paste_encode(\n input.ptr,\n input.len,\n bracketed ? 1 : 0,\n outputPtr,\n required,\n writtenPtr\n ),\n 'ghostty_paste_encode'\n );\n\n return this.readOwnedUtf8(outputPtr, this.readUsize(writtenPtr));\n } finally {\n this.freeBytes(outputPtr, required);\n this.freeUsize(writtenPtr);\n }\n } finally {\n input.free();\n this.freeUsize(requiredPtr);\n }\n }\n}\n\nasync function loadGhosttyWasmBytes(source: string): Promise<ArrayBuffer> {\n const isFilePath =\n source.startsWith('/') ||\n source.startsWith('./') ||\n source.startsWith('../') ||\n /^[A-Za-z]:[\\\\/]/.test(source);\n\n if (isFilePath && typeof Bun !== 'undefined') {\n return Bun.file(source).arrayBuffer();\n }\n\n const response = await fetch(source);\n if (!response.ok) {\n throw new Error(`failed to load ghostty wasm: ${response.status} ${response.statusText}`);\n }\n\n return response.arrayBuffer();\n}\n\nexport async function getGhosttyBindings(): Promise<GhosttyBindings> {\n if (!bindingsPromise) {\n bindingsPromise = (async () => {\n const wasmBytes = await loadGhosttyWasmBytes(ghosttyWasmUrl);\n const wasmModule = await WebAssembly.instantiate(wasmBytes, {\n env: {\n log() {\n // ignore wasm logs in production usage\n },\n },\n });\n\n const exports = wasmModule.instance.exports as GhosttyExports;\n const bytes = new Uint8Array(exports.memory.buffer);\n const typeJsonPtr = exports.ghostty_type_json();\n let end = typeJsonPtr;\n\n while (bytes[end] !== 0) {\n end += 1;\n }\n\n const layout = JSON.parse(\n new TextDecoder().decode(bytes.subarray(typeJsonPtr, end))\n ) as LayoutMap;\n\n return new GhosttyBindings(exports, layout);\n })();\n }\n\n return bindingsPromise;\n}\n\nexport {\n GHOSTTY_FORMATTER_FORMAT_HTML,\n GHOSTTY_FORMATTER_FORMAT_PLAIN,\n GHOSTTY_KEY_ACTION_PRESS,\n GHOSTTY_KEY_ACTION_RELEASE,\n GHOSTTY_KEY_ACTION_REPEAT,\n};\n","import { CanvasRenderer } from './canvas-renderer';\nimport { getGhosttyKeyCode, getUnshiftedCodepoint } from './ghostty-keycodes';\nimport {\n createRenderState,\n disposeRenderStateResources,\n iterateRows,\n readRenderSnapshotMeta,\n updateRenderState,\n type GhosttyRenderStateResources,\n} from './render-state';\nimport {\n clearSelection as resetSelectionData,\n createEmptySelectionState,\n hasSelection,\n projectSelectionRects,\n resolvePointerSelection,\n serializeSelectionText,\n updateSelectionFocus,\n type SelectionMode,\n type SelectionPoint,\n type SelectionState,\n} from './selection-model';\nimport {\n isCopyShortcut,\n writeSelectionToClipboard,\n writeSelectionToCopyEvent,\n} from './selection-clipboard';\nimport {\n getGhosttyBindings,\n keyboardEventToGhosttyMods,\n type GhosttyBindings,\n} from './ghostty-wasm';\nimport type {\n CompatibleBufferLine,\n CompatibleTerminalBuffer,\n CompatibleTerminalLike,\n GhosttyCellDimensions,\n GhosttyRenderRow,\n GhosttyTerminalModeSnapshot,\n GhosttyTerminalInitOptions,\n GhosttyTerminalSize,\n GhosttyViewportGesture,\n TerminalDisposable,\n} from './types';\n\nconst DEFAULT_COLS = 80;\nconst DEFAULT_ROWS = 24;\nconst DEFAULT_CELL_WIDTH = 9;\nconst DEFAULT_CELL_HEIGHT = 17;\nconst AUTO_SCROLL_INTERVAL_MS = 48;\nconst TERMINAL_ENGINE = 'ghostty-official';\n\nconst GHOSTTY_MODE_X10_MOUSE = 9;\nconst GHOSTTY_MODE_NORMAL_MOUSE = 1000;\nconst GHOSTTY_MODE_BUTTON_MOUSE = 1002;\nconst GHOSTTY_MODE_ANY_MOUSE = 1003;\nconst GHOSTTY_MODE_ALT_SCROLL = 1007;\nconst GHOSTTY_MODE_ALT_SCREEN = 1047;\nconst GHOSTTY_MODE_ALT_SCREEN_SAVE = 1049;\n\nconst MOUSE_TRACKING_MODES: readonly number[] = [\n GHOSTTY_MODE_X10_MOUSE,\n GHOSTTY_MODE_NORMAL_MOUSE,\n GHOSTTY_MODE_BUTTON_MOUSE,\n GHOSTTY_MODE_ANY_MOUSE,\n];\n\nconst GHOSTTY_MOUSE_BUTTON_LEFT = 1;\nconst GHOSTTY_MOUSE_BUTTON_MIDDLE = 3;\nconst GHOSTTY_MOUSE_BUTTON_RIGHT = 2;\nconst GHOSTTY_MOUSE_BUTTON_FOUR = 4;\nconst GHOSTTY_MOUSE_BUTTON_FIVE = 5;\n\ntype PointerDragState = {\n active: boolean;\n moved: boolean;\n mode: SelectionMode;\n lastClientX: number | null;\n lastClientY: number | null;\n};\n\ntype InputRoutingState = {\n mouseReporting: boolean;\n altScroll: boolean;\n};\n\nclass BufferLine implements CompatibleBufferLine {\n constructor(private readonly content: string) {}\n\n translateToString(trimRight: boolean): string {\n return trimRight ? this.content.replace(/\\s+$/u, '') : this.content;\n }\n}\n\nclass TerminalBuffer implements CompatibleTerminalBuffer {\n active = {\n baseY: 0,\n viewportY: 0,\n length: DEFAULT_ROWS,\n getLine: (index: number): CompatibleBufferLine | null => {\n const relativeIndex = index - this.active.viewportY;\n const line = this.visibleLines[relativeIndex];\n return typeof line === 'string' ? new BufferLine(line) : null;\n },\n };\n\n private visibleLines: string[] = Array.from({ length: DEFAULT_ROWS }, () => '');\n\n setViewport(viewportY: number, baseY: number, length: number, lines: string[]): void {\n this.active.viewportY = viewportY;\n this.active.baseY = baseY;\n this.active.length = length;\n this.visibleLines = lines;\n }\n}\n\nfunction shouldEncodeOnKeyDown(event: KeyboardEvent): boolean {\n const isPlainText = event.key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey;\n if (isPlainText) {\n return false;\n }\n\n return true;\n}\n\nfunction normalizeVisibleLines(rows: GhosttyRenderRow[], expectedRows: number): string[] {\n const lines = rows.slice(0, expectedRows).map((row) => row.text);\n while (lines.length < expectedRows) {\n lines.push('');\n }\n return lines;\n}\n\nfunction pointerLikeEventToGhosttyMods(event: {\n shiftKey?: boolean;\n ctrlKey?: boolean;\n altKey?: boolean;\n metaKey?: boolean;\n}): number {\n return keyboardEventToGhosttyMods({\n shiftKey: Boolean(event.shiftKey),\n ctrlKey: Boolean(event.ctrlKey),\n altKey: Boolean(event.altKey),\n metaKey: Boolean(event.metaKey),\n getModifierState: () => false,\n } as unknown as KeyboardEvent);\n}\n\nexport class FitAddon {\n private terminal: GhosttyTerminalController | null = null;\n\n activate(terminal: CompatibleTerminalLike): void {\n this.terminal = terminal instanceof GhosttyTerminalController ? terminal : null;\n }\n\n fit(): void {\n const proposed = this.proposeDimensions();\n if (!this.terminal || !proposed) {\n return;\n }\n\n this.terminal.resize(proposed.cols, proposed.rows);\n }\n\n proposeDimensions(): GhosttyTerminalSize | null {\n return this.terminal?.measureSizeFromElement() ?? null;\n }\n\n dispose(): void {\n this.terminal = null;\n }\n}\n\nexport class GhosttyTerminalController implements CompatibleTerminalLike {\n readonly buffer = new TerminalBuffer();\n readonly _core = {\n _renderService: {\n dimensions: {\n css: {\n cell: {\n width: DEFAULT_CELL_WIDTH,\n height: DEFAULT_CELL_HEIGHT,\n },\n },\n },\n },\n };\n\n readonly options: GhosttyTerminalInitOptions;\n\n element: HTMLElement | null = null;\n textarea: HTMLElement | null = null;\n cols = DEFAULT_COLS;\n rows = DEFAULT_ROWS;\n\n private readonly bindings: GhosttyBindings;\n private readonly terminalHandle: number;\n private readonly keyEncoderHandle: number;\n private readonly mouseEncoderHandle: number;\n private readonly renderState: GhosttyRenderStateResources;\n private readonly dataListeners = new Set<(data: string) => void>();\n private readonly addons = new Set<{ dispose: () => void }>();\n private screenElement: HTMLDivElement | null = null;\n private renderer: CanvasRenderer | null = null;\n private renderRaf: number | null = null;\n private disposed = false;\n private disableStdin: boolean;\n private customKeyEventHandler: (event: KeyboardEvent) => boolean = () => true;\n private imeIsComposing = false;\n private lastCompositionCommit: { data: string; at: number } | null = null;\n private selectionState: SelectionState = createEmptySelectionState();\n private readonly lineCache = new Map<number, string>();\n private lastViewportOffset = 0;\n private lastViewportRows = DEFAULT_ROWS;\n private lastRenderedRows: GhosttyRenderRow[] = [];\n private pointerDrag: PointerDragState = {\n active: false,\n moved: false,\n mode: 'character',\n lastClientX: null,\n lastClientY: null,\n };\n private autoScrollTimer: ReturnType<typeof setInterval> | null = null;\n private readonly domEventDisposers: Array<() => void> = [];\n private copyShortcutSuppressed = false;\n private scrollbarThumb: HTMLDivElement | null = null;\n private scrollbarFadeTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly pressedMouseButtons = new Set<number>();\n private wheelPixelDelta = 0;\n private mouseDragActive = false;\n\n private constructor(\n bindings: GhosttyBindings,\n terminalHandle: number,\n keyEncoderHandle: number,\n mouseEncoderHandle: number,\n renderState: GhosttyRenderStateResources,\n options: GhosttyTerminalInitOptions\n ) {\n this.bindings = bindings;\n this.terminalHandle = terminalHandle;\n this.keyEncoderHandle = keyEncoderHandle;\n this.mouseEncoderHandle = mouseEncoderHandle;\n this.renderState = renderState;\n this.options = options;\n this.disableStdin = Boolean(options.disableStdin);\n }\n\n static async create(options: GhosttyTerminalInitOptions): Promise<GhosttyTerminalController> {\n const bindings = await getGhosttyBindings();\n const terminalHandle = bindings.createTerminal(DEFAULT_COLS, DEFAULT_ROWS, options.scrollback);\n let keyEncoderHandle = 0;\n let mouseEncoderHandle = 0;\n let renderState: GhosttyRenderStateResources | null = null;\n\n try {\n bindings.setTerminalTheme(terminalHandle, options.theme);\n keyEncoderHandle = bindings.createKeyEncoder();\n mouseEncoderHandle = bindings.createMouseEncoder();\n renderState = createRenderState(bindings);\n\n return new GhosttyTerminalController(\n bindings,\n terminalHandle,\n keyEncoderHandle,\n mouseEncoderHandle,\n renderState,\n options\n );\n } catch (error) {\n if (renderState) {\n disposeRenderStateResources(renderState);\n }\n if (keyEncoderHandle !== 0) {\n bindings.freeKeyEncoder(keyEncoderHandle);\n }\n if (mouseEncoderHandle !== 0) {\n bindings.freeMouseEncoder(mouseEncoderHandle);\n }\n bindings.freeTerminal(terminalHandle);\n throw error;\n }\n }\n\n open(container: HTMLElement): void {\n if (this.disposed || this.element) {\n return;\n }\n\n const root = document.createElement('div');\n root.className = 'xterm';\n root.style.position = 'absolute';\n root.style.inset = '0';\n root.style.overflow = 'hidden';\n root.style.width = '100%';\n root.style.height = '100%';\n root.style.backgroundColor = this.options.theme.background;\n root.style.color = this.options.theme.foreground;\n root.style.fontFamily = this.options.fontFamily;\n root.style.fontSize = `${this.options.fontSize}px`;\n root.style.lineHeight = '1.2';\n\n const viewport = document.createElement('div');\n viewport.className = 'xterm-viewport';\n viewport.style.width = '100%';\n viewport.style.height = '100%';\n viewport.style.overflow = 'hidden';\n viewport.style.position = 'relative';\n\n const screen = document.createElement('div');\n screen.className = 'xterm-screen';\n screen.style.width = '100%';\n screen.style.height = '100%';\n screen.style.position = 'relative';\n screen.style.userSelect = 'none';\n screen.style.webkitUserSelect = 'none';\n screen.style.backgroundColor = this.options.theme.background;\n\n const textarea = document.createElement('div');\n textarea.className = 'xterm-helper-textarea';\n textarea.setAttribute('aria-label', 'Terminal Input');\n textarea.setAttribute('role', 'textbox');\n textarea.setAttribute('contenteditable', 'true');\n textarea.setAttribute('autocorrect', 'off');\n textarea.setAttribute('autocapitalize', 'off');\n textarea.setAttribute('spellcheck', 'false');\n textarea.style.position = 'absolute';\n textarea.style.opacity = '1';\n textarea.style.pointerEvents = 'none';\n textarea.style.left = '0';\n textarea.style.top = '0';\n textarea.style.minWidth = '1px';\n textarea.style.minHeight = '1px';\n textarea.style.whiteSpace = 'pre';\n textarea.style.border = '0';\n textarea.style.padding = '0';\n textarea.style.margin = '0';\n textarea.style.color = this.options.theme.foreground;\n textarea.style.backgroundColor = 'transparent';\n textarea.style.caretColor = 'transparent';\n textarea.style.overflow = 'visible';\n textarea.style.outline = 'none';\n textarea.style.boxShadow = 'none';\n textarea.style.fontFamily = this.options.fontFamily;\n textarea.style.fontSize = `${this.options.fontSize}px`;\n textarea.style.userSelect = 'text';\n textarea.style.webkitUserSelect = 'text';\n\n const scrollbarTrack = document.createElement('div');\n scrollbarTrack.className = 'xterm-scrollbar-track';\n scrollbarTrack.style.position = 'absolute';\n scrollbarTrack.style.top = '0';\n scrollbarTrack.style.right = '0';\n scrollbarTrack.style.width = '8px';\n scrollbarTrack.style.height = '100%';\n scrollbarTrack.style.backgroundColor = 'transparent';\n scrollbarTrack.style.pointerEvents = 'none';\n\n const scrollbarThumb = document.createElement('div');\n scrollbarThumb.className = 'xterm-scrollbar-thumb';\n scrollbarThumb.style.position = 'absolute';\n scrollbarThumb.style.top = '0';\n scrollbarThumb.style.right = '0';\n scrollbarThumb.style.width = '6px';\n scrollbarThumb.style.marginRight = '1px';\n scrollbarThumb.style.borderRadius = '3px';\n scrollbarThumb.style.backgroundColor = 'rgba(128, 128, 128, 0.5)';\n scrollbarThumb.style.pointerEvents = 'none';\n scrollbarThumb.style.transition = 'opacity 0.15s ease';\n scrollbarThumb.style.opacity = '0';\n\n scrollbarTrack.appendChild(scrollbarThumb);\n\n viewport.appendChild(screen);\n root.appendChild(viewport);\n root.appendChild(textarea);\n root.appendChild(scrollbarTrack);\n container.appendChild(root);\n\n this.element = root;\n this.screenElement = screen;\n this.textarea = textarea;\n this.scrollbarThumb = scrollbarThumb;\n this.renderer = new CanvasRenderer({\n screenElement: screen,\n theme: this.options.theme,\n fontFamily: this.options.fontFamily,\n fontSize: this.options.fontSize,\n });\n\n this.syncInputState();\n this.bindDomEvents();\n this.updateCellDimensions();\n\n const measured = this.measureSizeFromElement();\n if (measured) {\n this.resize(measured.cols, measured.rows);\n } else {\n this.render();\n }\n }\n\n loadAddon(addon: { activate: (terminal: CompatibleTerminalLike) => void; dispose: () => void }): void {\n addon.activate(this);\n this.addons.add(addon);\n }\n\n onData(callback: (data: string) => void): TerminalDisposable {\n this.dataListeners.add(callback);\n return {\n dispose: () => {\n this.dataListeners.delete(callback);\n },\n };\n }\n\n attachCustomKeyEventHandler(callback: (event: KeyboardEvent) => boolean): void {\n this.customKeyEventHandler = callback;\n }\n\n write(data: string | Uint8Array): void {\n if (this.disposed) {\n return;\n }\n\n const prevAltScreen = this.isAltScreenActive();\n this.bindings.writeVt(this.terminalHandle, data);\n const nextAltScreen = this.isAltScreenActive();\n if (prevAltScreen && !nextAltScreen) {\n this.clearMouseTrackingModes();\n }\n this.scheduleRender();\n }\n\n clearMouseTrackingModes(): void {\n if (this.disposed) {\n return;\n }\n for (const mode of MOUSE_TRACKING_MODES) {\n this.bindings.setTerminalMode(this.terminalHandle, mode, false);\n }\n this.bindings.resetMouseEncoder(this.mouseEncoderHandle);\n this.pressedMouseButtons.clear();\n this.mouseDragActive = false;\n }\n\n private isAltScreenActive(): boolean {\n return (\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN) ||\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN_SAVE)\n );\n }\n\n reset(): void {\n if (this.disposed) {\n return;\n }\n\n this.lineCache.clear();\n this.clearSelectionState(false);\n this.bindings.resetTerminal(this.terminalHandle);\n this.scheduleRender();\n }\n\n refresh(): void {\n if (this.disposed) {\n return;\n }\n\n this.render();\n }\n\n resize(cols: number, rows: number): void {\n if (this.disposed) {\n return;\n }\n\n const nextCols = Math.max(2, Math.floor(cols));\n const nextRows = Math.max(2, Math.floor(rows));\n this.cols = nextCols;\n this.rows = nextRows;\n this.clearSelectionState(false);\n this.bindings.resizeTerminal(this.terminalHandle, nextCols, nextRows, this.cellDimensions());\n this.bindings.resetMouseEncoder(this.mouseEncoderHandle);\n this.scheduleRender();\n }\n\n scrollLines(amount: number): void {\n if (this.disposed || amount === 0) {\n return;\n }\n\n this.bindings.scrollViewportDelta(this.terminalHandle, amount);\n this.render();\n }\n\n scrollToTop(): void {\n if (this.disposed) {\n return;\n }\n\n this.bindings.scrollViewportTop(this.terminalHandle);\n this.render();\n }\n\n scrollToBottom(): void {\n if (this.disposed) {\n return;\n }\n\n this.bindings.scrollViewportBottom(this.terminalHandle);\n this.render();\n }\n\n exportModeSnapshot(): GhosttyTerminalModeSnapshot {\n return {\n mouseX10: this.isModeEnabled(GHOSTTY_MODE_X10_MOUSE),\n mouseNormal: this.isModeEnabled(GHOSTTY_MODE_NORMAL_MOUSE),\n mouseButton: this.isModeEnabled(GHOSTTY_MODE_BUTTON_MOUSE),\n mouseAny: this.isModeEnabled(GHOSTTY_MODE_ANY_MOUSE),\n mouseUtf8: this.isModeEnabled(1005),\n mouseSgr: this.isModeEnabled(1006),\n mouseSgrPixels: this.isModeEnabled(1016),\n mouseUrxvt: this.isModeEnabled(1015),\n altScroll: this.isModeEnabled(GHOSTTY_MODE_ALT_SCROLL),\n altScreen1047: this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN),\n altScreen1049: this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN_SAVE),\n };\n }\n\n restoreModeSnapshot(snapshot: GhosttyTerminalModeSnapshot): void {\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_X10_MOUSE, snapshot.mouseX10);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_NORMAL_MOUSE, snapshot.mouseNormal);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_BUTTON_MOUSE, snapshot.mouseButton);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ANY_MOUSE, snapshot.mouseAny);\n this.bindings.setTerminalMode(this.terminalHandle, 1005, snapshot.mouseUtf8);\n this.bindings.setTerminalMode(this.terminalHandle, 1006, snapshot.mouseSgr);\n this.bindings.setTerminalMode(this.terminalHandle, 1016, snapshot.mouseSgrPixels);\n this.bindings.setTerminalMode(this.terminalHandle, 1015, snapshot.mouseUrxvt);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ALT_SCROLL, snapshot.altScroll);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ALT_SCREEN, snapshot.altScreen1047);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ALT_SCREEN_SAVE, snapshot.altScreen1049);\n this.bindings.resetMouseEncoder(this.mouseEncoderHandle);\n }\n\n handleViewportGesture(gesture: GhosttyViewportGesture): boolean {\n if (this.disposed || gesture.deltaY === 0) {\n return false;\n }\n\n const lines = this.gestureToLines(gesture);\n if (lines === 0) {\n return false;\n }\n\n const routing = this.getInputRoutingState();\n if (routing.mouseReporting) {\n const button = lines < 0 ? GHOSTTY_MOUSE_BUTTON_FOUR : GHOSTTY_MOUSE_BUTTON_FIVE;\n let consumed = false;\n for (let index = 0; index < Math.abs(lines); index += 1) {\n consumed =\n this.emitMouseInput({\n action: 'press',\n button,\n clientX: gesture.clientX,\n clientY: gesture.clientY,\n mods: pointerLikeEventToGhosttyMods(gesture),\n anyButtonPressed: this.pressedMouseButtons.size > 0,\n }) || consumed;\n }\n return consumed;\n }\n\n if (routing.altScroll) {\n return this.emitAltScrollInput(lines);\n }\n\n this.scrollLines(lines);\n return true;\n }\n\n paste(data: string): void {\n if (this.disposed || this.disableStdin || !data) {\n return;\n }\n\n const encoded = this.bindings.encodePaste(this.terminalHandle, data);\n if (!encoded) {\n return;\n }\n\n this.emitData(encoded);\n }\n\n focus(): void {\n this.textarea?.focus({ preventScroll: true });\n }\n\n getRendererKind(): string {\n return this.renderer?.kind ?? 'unknown';\n }\n\n setTheme(theme: GhosttyTerminalInitOptions['theme']): void {\n this.bindings.setTerminalTheme(this.terminalHandle, theme);\n this.options.theme = theme;\n\n if (this.element) {\n this.element.style.backgroundColor = theme.background;\n this.element.style.color = theme.foreground;\n }\n\n if (this.screenElement) {\n this.screenElement.style.backgroundColor = theme.background;\n }\n\n this.renderer?.setTheme(theme);\n this.scheduleRender();\n }\n\n setDisableStdin(disabled: boolean): void {\n this.disableStdin = disabled;\n this.syncInputState();\n }\n\n measureSizeFromElement(): GhosttyTerminalSize | null {\n const element = this.element;\n if (!element) {\n return null;\n }\n\n const rect = element.getBoundingClientRect();\n const { width, height } = this.cellDimensions();\n if (rect.width === 0 || rect.height === 0 || width <= 0 || height <= 0) {\n return null;\n }\n\n return {\n cols: Math.max(2, Math.floor(rect.width / width)),\n rows: Math.max(2, Math.floor(rect.height / height)),\n };\n }\n\n dispose(): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (this.renderRaf !== null) {\n cancelAnimationFrame(this.renderRaf);\n this.renderRaf = null;\n }\n\n this.stopAutoScroll();\n this.updateSelectionTextProbe(null);\n this.clearDomEventListeners();\n\n if (this.scrollbarFadeTimer) {\n clearTimeout(this.scrollbarFadeTimer);\n this.scrollbarFadeTimer = null;\n }\n\n for (const addon of this.addons) {\n addon.dispose();\n }\n this.addons.clear();\n\n this.renderer?.dispose();\n this.renderer = null;\n\n this.element?.remove();\n this.element = null;\n this.screenElement = null;\n this.textarea = null;\n this.scrollbarThumb = null;\n\n disposeRenderStateResources(this.renderState);\n this.bindings.freeMouseEncoder(this.mouseEncoderHandle);\n this.bindings.freeKeyEncoder(this.keyEncoderHandle);\n this.bindings.freeTerminal(this.terminalHandle);\n }\n\n private cellDimensions(): GhosttyCellDimensions {\n return this._core._renderService.dimensions.css.cell;\n }\n\n private syncInputState(): void {\n if (!this.textarea) {\n return;\n }\n\n (this.textarea as any).readOnly = this.disableStdin;\n this.textarea.tabIndex = this.disableStdin ? -1 : 0;\n if (this.disableStdin && document.activeElement === this.textarea) {\n this.textarea.blur();\n }\n }\n\n private bindDomEvents(): void {\n const root = this.element;\n const textarea = this.textarea;\n if (!root || !textarea) {\n return;\n }\n\n root.addEventListener('click', () => {\n if (!this.disableStdin) {\n this.focus();\n }\n });\n\n const selectSurface = this.screenElement ?? root;\n selectSurface.addEventListener('mousedown', (event) => {\n if (!(event instanceof MouseEvent)) {\n return;\n }\n\n if (!this.disableStdin) {\n this.focus();\n }\n\n if (this.getInputRoutingState().mouseReporting) {\n const button = this.mouseButtonFromEvent(event);\n if (button === null) {\n return;\n }\n this.clearSelectionState();\n this.pressedMouseButtons.add(button);\n this.mouseDragActive = true;\n this.emitMouseInput({\n action: 'press',\n button,\n clientX: event.clientX,\n clientY: event.clientY,\n mods: pointerLikeEventToGhosttyMods(event),\n anyButtonPressed: true,\n });\n event.preventDefault();\n return;\n }\n\n if (event.button !== 0) {\n return;\n }\n\n this.mouseDragActive = true;\n this.beginPointerSelection(event);\n event.preventDefault();\n });\n\n root.addEventListener(\n 'wheel',\n (event) => {\n if (\n this.handleViewportGesture({\n source: 'wheel',\n deltaY: event.deltaY,\n deltaMode: event.deltaMode,\n clientX: event.clientX,\n clientY: event.clientY,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n altKey: event.altKey,\n metaKey: event.metaKey,\n })\n ) {\n event.preventDefault();\n }\n },\n { passive: false }\n );\n\n const dragEventTarget =\n typeof window !== 'undefined' && typeof window.addEventListener === 'function'\n ? window\n : null;\n if (dragEventTarget) {\n const moveListener = (event: MouseEvent) => {\n if (!this.mouseDragActive) {\n return;\n }\n if (this.getInputRoutingState().mouseReporting) {\n this.emitMouseInput({\n action: 'motion',\n button: this.mouseButtonFromButtons(event.buttons),\n clientX: event.clientX,\n clientY: event.clientY,\n mods: pointerLikeEventToGhosttyMods(event),\n anyButtonPressed: this.pressedMouseButtons.size > 0 || event.buttons > 0,\n });\n return;\n }\n this.updatePointerSelection(event);\n };\n const upListener = (event: MouseEvent) => {\n if (!this.mouseDragActive) {\n return;\n }\n this.mouseDragActive = false;\n if (this.getInputRoutingState().mouseReporting) {\n const button = this.mouseButtonFromEvent(event);\n if (button !== null) {\n this.pressedMouseButtons.delete(button);\n }\n this.emitMouseInput({\n action: 'release',\n button,\n clientX: event.clientX,\n clientY: event.clientY,\n mods: pointerLikeEventToGhosttyMods(event),\n anyButtonPressed: this.pressedMouseButtons.size > 0,\n });\n return;\n }\n this.finishPointerSelection(event);\n };\n dragEventTarget.addEventListener('mousemove', moveListener);\n dragEventTarget.addEventListener('mouseup', upListener);\n this.domEventDisposers.push(() => {\n dragEventTarget.removeEventListener('mousemove', moveListener);\n dragEventTarget.removeEventListener('mouseup', upListener);\n });\n }\n\n textarea.addEventListener('keydown', (event) => {\n const selectionText = this.getSelectionText();\n if (selectionText && isCopyShortcut(event)) {\n this.copyShortcutSuppressed = true;\n event.preventDefault();\n void writeSelectionToClipboard(selectionText).catch(() => {});\n this.clearTextarea();\n return;\n }\n\n if (!this.customKeyEventHandler(event)) {\n return;\n }\n\n if (this.disableStdin || this.imeIsComposing) {\n return;\n }\n\n if (event.keyCode === 229) {\n return;\n }\n\n if (!shouldEncodeOnKeyDown(event)) {\n return;\n }\n\n const payload = this.encodeKeyboardEvent(event, event.repeat ? 'repeat' : 'press');\n if (!payload) {\n return;\n }\n\n event.preventDefault();\n this.emitData(payload);\n this.clearTextarea();\n });\n\n textarea.addEventListener('keyup', (event) => {\n if (this.copyShortcutSuppressed) {\n const key = event.key.toLowerCase();\n if (key === 'c') {\n event.preventDefault();\n return;\n }\n\n if (key === 'control' || key === 'meta' || key === 'os') {\n this.copyShortcutSuppressed = false;\n event.preventDefault();\n return;\n }\n }\n\n if (this.disableStdin || this.imeIsComposing) {\n return;\n }\n\n const payload = this.encodeKeyboardEvent(event, 'release');\n if (!payload) {\n return;\n }\n\n event.preventDefault();\n this.emitData(payload);\n this.clearTextarea();\n });\n\n textarea.addEventListener('compositionstart', () => {\n this.imeIsComposing = true;\n this.lastCompositionCommit = null;\n this.syncTextareaPositionToCursor();\n });\n\n textarea.addEventListener('compositionupdate', () => {\n this.syncTextareaPositionToCursor();\n });\n\n textarea.addEventListener('compositionend', (event) => {\n this.imeIsComposing = false;\n const finalData = event.data ?? '';\n if (finalData) {\n this.lastCompositionCommit = { data: finalData, at: Date.now() };\n this.emitData(finalData);\n this.clearTextarea();\n }\n });\n\n textarea.addEventListener('beforeinput', (event) => {\n if (this.disableStdin) {\n return;\n }\n\n if (event.inputType === 'insertFromPaste') {\n return;\n }\n\n const data = event.data ?? '';\n if (!data) {\n return;\n }\n\n if (event.isComposing || this.imeIsComposing) {\n return;\n }\n\n const recentCompositionCommit = this.lastCompositionCommit;\n if (\n recentCompositionCommit &&\n recentCompositionCommit.data === data &&\n Date.now() - recentCompositionCommit.at < 40\n ) {\n this.lastCompositionCommit = null;\n event.preventDefault();\n this.clearTextarea();\n return;\n }\n\n this.lastCompositionCommit = null;\n\n event.preventDefault();\n this.emitData(data);\n this.clearTextarea();\n });\n\n textarea.addEventListener('paste', (event) => {\n if (this.disableStdin) {\n return;\n }\n\n const text = event.clipboardData?.getData('text/plain') ?? '';\n if (!text) {\n return;\n }\n\n event.preventDefault();\n this.paste(text);\n this.clearTextarea();\n });\n\n textarea.addEventListener('copy', (event) => {\n const selectionText = this.getSelectionText();\n if (!selectionText) {\n return;\n }\n\n writeSelectionToCopyEvent(event, selectionText);\n });\n\n textarea.addEventListener('input', () => {\n if (this.disableStdin || this.imeIsComposing) {\n return;\n }\n\n const data = textarea.textContent ?? '';\n if (!data) {\n this.clearTextarea();\n return;\n }\n\n const recentCompositionCommit = this.lastCompositionCommit;\n if (\n recentCompositionCommit &&\n recentCompositionCommit.data === data &&\n Date.now() - recentCompositionCommit.at < 40\n ) {\n this.lastCompositionCommit = null;\n this.clearTextarea();\n return;\n }\n\n this.lastCompositionCommit = null;\n this.emitData(data);\n this.clearTextarea();\n });\n }\n\n private encodeKeyboardEvent(\n event: KeyboardEvent,\n action: 'press' | 'repeat' | 'release'\n ): string | null {\n const keyCode = getGhosttyKeyCode(event.code);\n if (keyCode === 0) {\n return null;\n }\n\n const utf8 =\n event.key.length === 1 && !event.ctrlKey && !event.metaKey ? event.key : null;\n\n return this.bindings.encodeKeyEvent(this.keyEncoderHandle, this.terminalHandle, {\n action,\n keyCode,\n mods: keyboardEventToGhosttyMods(event),\n composing: event.isComposing,\n utf8,\n unshiftedCodepoint: getUnshiftedCodepoint(event.code),\n });\n }\n\n private getInputRoutingState(): InputRoutingState {\n const mouseReporting =\n this.isModeEnabled(GHOSTTY_MODE_X10_MOUSE) ||\n this.isModeEnabled(GHOSTTY_MODE_NORMAL_MOUSE) ||\n this.isModeEnabled(GHOSTTY_MODE_BUTTON_MOUSE) ||\n this.isModeEnabled(GHOSTTY_MODE_ANY_MOUSE);\n const altScreen =\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN) ||\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN_SAVE);\n\n return {\n mouseReporting,\n altScroll: !mouseReporting && altScreen && this.isModeEnabled(GHOSTTY_MODE_ALT_SCROLL),\n };\n }\n\n private gestureToLines(gesture: GhosttyViewportGesture): number {\n const cellHeight = this.cellDimensions().height || DEFAULT_CELL_HEIGHT;\n\n if (gesture.source === 'wheel') {\n if (gesture.deltaMode === 1) {\n this.wheelPixelDelta = 0;\n return gesture.deltaY > 0 ? Math.ceil(gesture.deltaY) : Math.floor(gesture.deltaY);\n }\n\n if (gesture.deltaMode === 2) {\n this.wheelPixelDelta = 0;\n const pageLines = Math.max(1, this.rows);\n const scaled = gesture.deltaY * pageLines;\n return scaled > 0 ? Math.ceil(scaled) : Math.floor(scaled);\n }\n\n this.wheelPixelDelta += gesture.deltaY;\n const lines =\n this.wheelPixelDelta > 0\n ? Math.floor(this.wheelPixelDelta / cellHeight)\n : Math.ceil(this.wheelPixelDelta / cellHeight);\n if (lines !== 0) {\n this.wheelPixelDelta -= lines * cellHeight;\n }\n return lines;\n }\n\n return gesture.deltaY > 0\n ? Math.ceil(gesture.deltaY / cellHeight)\n : Math.floor(gesture.deltaY / cellHeight);\n }\n\n private isModeEnabled(mode: number): boolean {\n return this.bindings.isTerminalModeEnabled(this.terminalHandle, mode);\n }\n\n private mouseButtonFromEvent(event: MouseEvent): number | null {\n switch (event.button) {\n case 0:\n return GHOSTTY_MOUSE_BUTTON_LEFT;\n case 1:\n return GHOSTTY_MOUSE_BUTTON_MIDDLE;\n case 2:\n return GHOSTTY_MOUSE_BUTTON_RIGHT;\n default:\n return null;\n }\n }\n\n private mouseButtonFromButtons(buttons: number): number | null {\n if (buttons & 1) {\n return GHOSTTY_MOUSE_BUTTON_LEFT;\n }\n if (buttons & 4) {\n return GHOSTTY_MOUSE_BUTTON_MIDDLE;\n }\n if (buttons & 2) {\n return GHOSTTY_MOUSE_BUTTON_RIGHT;\n }\n\n return null;\n }\n\n private pointerPositionFromClient(clientX: number, clientY: number): { x: number; y: number } | null {\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n\n const width = Math.max(1, rect.width);\n const height = Math.max(1, rect.height);\n return {\n x: Math.max(0, Math.min(width - 1, clientX - rect.left)),\n y: Math.max(0, Math.min(height - 1, clientY - rect.top)),\n };\n }\n\n private emitMouseInput(options: {\n action: 'press' | 'release' | 'motion';\n button?: number | null;\n clientX: number;\n clientY: number;\n mods: number;\n anyButtonPressed: boolean;\n }): boolean {\n if (this.disableStdin) {\n return false;\n }\n\n const position = this.pointerPositionFromClient(options.clientX, options.clientY);\n if (!position) {\n return false;\n }\n\n const cell = this.cellDimensions();\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n return false;\n }\n\n const payload = this.bindings.encodeMouseEvent(this.mouseEncoderHandle, this.terminalHandle, {\n action: options.action,\n button: options.button,\n mods: options.mods,\n x: position.x,\n y: position.y,\n anyButtonPressed: options.anyButtonPressed,\n screenWidth: Math.max(1, Math.round(rect.width)),\n screenHeight: Math.max(1, Math.round(rect.height)),\n cellWidth: Math.max(1, Math.round(cell.width || DEFAULT_CELL_WIDTH)),\n cellHeight: Math.max(1, Math.round(cell.height || DEFAULT_CELL_HEIGHT)),\n });\n if (!payload) {\n return false;\n }\n\n this.emitData(payload);\n return true;\n }\n\n private emitAltScrollInput(lines: number): boolean {\n const keyCode = getGhosttyKeyCode(lines < 0 ? 'ArrowUp' : 'ArrowDown');\n if (keyCode === 0) {\n return false;\n }\n\n let consumed = false;\n for (let index = 0; index < Math.abs(lines); index += 1) {\n const payload = this.bindings.encodeKeyEvent(this.keyEncoderHandle, this.terminalHandle, {\n action: 'press',\n keyCode,\n mods: 0,\n composing: false,\n utf8: null,\n unshiftedCodepoint: null,\n });\n if (!payload) {\n continue;\n }\n this.emitData(payload);\n consumed = true;\n }\n\n return consumed;\n }\n\n private emitData(data: string): void {\n for (const listener of this.dataListeners) {\n listener(data);\n }\n }\n\n private clearTextarea(): void {\n if (this.textarea) {\n this.textarea.textContent = '';\n }\n }\n\n private syncTextareaPositionToCursor(): void {\n const textarea = this.textarea;\n const screen = this.screenElement;\n if (!textarea || !screen) {\n return;\n }\n\n const { width, height } = this.cellDimensions();\n if (width <= 0 || height <= 0) {\n return;\n }\n\n const renderState = createRenderState(this.bindings);\n let cursorX = 0;\n let cursorY = 0;\n try {\n updateRenderState(renderState, this.terminalHandle);\n const meta = readRenderSnapshotMeta(renderState);\n if (meta.cursor.x !== null && meta.cursor.y !== null) {\n cursorX = meta.cursor.x;\n cursorY = meta.cursor.y;\n }\n } finally {\n disposeRenderStateResources(renderState);\n }\n\n const left = cursorX * width;\n const top = cursorY * height;\n\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.width = `${Math.max(1, width)}px`;\n textarea.style.height = `${Math.max(1, height)}px`;\n textarea.style.lineHeight = `${height}px`;\n textarea.style.fontFamily = this.options.fontFamily;\n textarea.style.fontSize = `${this.options.fontSize}px`;\n }\n\n private scheduleRender(): void {\n if (this.renderRaf !== null) {\n return;\n }\n\n this.renderRaf = requestAnimationFrame(() => {\n this.renderRaf = null;\n this.render();\n });\n }\n\n private render(): void {\n if (this.disposed || !this.screenElement || !this.renderer) {\n return;\n }\n\n const scrollbar = this.bindings.readScrollbar(this.terminalHandle);\n const viewportRows = Math.max(1, scrollbar.len || this.rows);\n\n updateRenderState(this.renderState, this.terminalHandle);\n const meta = readRenderSnapshotMeta(this.renderState);\n const rows = Array.from(iterateRows(this.renderState));\n\n this.cols = Math.max(2, meta.cols);\n this.rows = Math.max(2, meta.rows || viewportRows);\n this.lastViewportOffset = scrollbar.offset;\n this.lastViewportRows = this.rows;\n this.lastRenderedRows = rows;\n\n for (const row of rows) {\n this.lineCache.set(scrollbar.offset + row.y, row.text);\n }\n\n const selectionRects = projectSelectionRects(\n this.selectionState,\n this.lastViewportOffset,\n this.lastViewportRows,\n (line) => this.getLineText(line)\n );\n const selectionText = this.getSelectionText();\n\n this.renderer.render({\n meta,\n rows,\n cellDimensions: this.cellDimensions(),\n selectionRects,\n selectionColor: this.options.theme.selectionBackground,\n });\n\n const visibleLines = normalizeVisibleLines(rows, this.rows);\n const baseY = Math.max(0, scrollbar.total - scrollbar.len);\n this.buffer.setViewport(scrollbar.offset, baseY, scrollbar.total, visibleLines);\n this.updateSelectionTextProbe(selectionText);\n this.updateScrollbar(scrollbar);\n }\n\n private updateScrollbar(scrollbar: { total: number; offset: number; len: number }): void {\n const thumb = this.scrollbarThumb;\n if (!thumb) {\n return;\n }\n\n const trackHeight = this.screenElement?.clientHeight ?? 0;\n if (trackHeight === 0 || scrollbar.total <= scrollbar.len) {\n thumb.style.opacity = '0';\n return;\n }\n\n const ratio = scrollbar.len / scrollbar.total;\n const thumbHeight = Math.max(20, ratio * trackHeight);\n const scrollRatio = scrollbar.offset / Math.max(1, scrollbar.total - scrollbar.len);\n const thumbTop = scrollRatio * (trackHeight - thumbHeight);\n\n thumb.style.height = `${thumbHeight}px`;\n thumb.style.transform = `translateY(${thumbTop}px)`;\n thumb.style.opacity = '1';\n\n if (this.scrollbarFadeTimer) {\n clearTimeout(this.scrollbarFadeTimer);\n }\n this.scrollbarFadeTimer = setTimeout(() => {\n thumb.style.opacity = '0';\n }, 800);\n }\n\n private updateCellDimensions(): void {\n if (!this.element) {\n return;\n }\n\n const probe = document.createElement('span');\n probe.textContent = 'WWWWWWWWWW';\n probe.style.position = 'absolute';\n probe.style.visibility = 'hidden';\n probe.style.whiteSpace = 'pre';\n probe.style.fontFamily = this.options.fontFamily;\n probe.style.fontSize = `${this.options.fontSize}px`;\n probe.style.lineHeight = '1.2';\n\n this.element.appendChild(probe);\n const rect = probe.getBoundingClientRect();\n probe.remove();\n\n this._core._renderService.dimensions.css.cell.width =\n rect.width > 0 ? rect.width / 10 : DEFAULT_CELL_WIDTH;\n this._core._renderService.dimensions.css.cell.height =\n rect.height > 0 ? rect.height : DEFAULT_CELL_HEIGHT;\n }\n\n private clearSelectionState(repaint = true): void {\n this.selectionState = resetSelectionData();\n this.pressedMouseButtons.clear();\n this.wheelPixelDelta = 0;\n this.pointerDrag = {\n active: false,\n moved: false,\n mode: 'character',\n lastClientX: null,\n lastClientY: null,\n };\n this.copyShortcutSuppressed = false;\n this.stopAutoScroll();\n this.updateSelectionTextProbe(null);\n\n if (repaint && this.screenElement && this.renderer) {\n this.render();\n }\n }\n\n private beginPointerSelection(event: MouseEvent): void {\n const point = this.hitTest(event.clientX, event.clientY);\n if (!point) {\n return;\n }\n\n const mode = this.selectionModeFromClickDetail(event.detail);\n this.pointerDrag = {\n active: true,\n moved: false,\n mode,\n lastClientX: event.clientX,\n lastClientY: event.clientY,\n };\n this.selectionState = resolvePointerSelection(\n this.selectionState,\n {\n ...point,\n mode,\n },\n (line) => this.getLineText(line)\n );\n this.updateAutoScroll();\n this.render();\n }\n\n private updatePointerSelection(event: MouseEvent): void {\n if (!this.pointerDrag.active) {\n return;\n }\n\n const point = this.hitTest(event.clientX, event.clientY);\n this.pointerDrag.lastClientX = event.clientX;\n this.pointerDrag.lastClientY = event.clientY;\n\n if (point) {\n this.pointerDrag.moved = true;\n this.selectionState = updateSelectionFocus(this.selectionState, point, (line) =>\n this.getLineText(line)\n );\n this.render();\n }\n\n this.updateAutoScroll();\n }\n\n private finishPointerSelection(event: MouseEvent): void {\n if (!this.pointerDrag.active || event.button !== 0) {\n return;\n }\n\n this.pointerDrag.lastClientX = event.clientX;\n this.pointerDrag.lastClientY = event.clientY;\n this.stopAutoScroll();\n\n const shouldClear =\n this.pointerDrag.mode === 'character' &&\n !this.pointerDrag.moved &&\n this.selectionState.anchor?.line === this.selectionState.focus?.line &&\n this.selectionState.anchor?.col === this.selectionState.focus?.col;\n this.pointerDrag.active = false;\n\n if (shouldClear) {\n this.clearSelectionState();\n return;\n }\n\n this.render();\n }\n\n private selectionModeFromClickDetail(detail: number): SelectionMode {\n if (detail >= 3) {\n return 'line';\n }\n if (detail === 2) {\n return 'word';\n }\n return 'character';\n }\n\n private hitTest(clientX: number, clientY: number): SelectionPoint | null {\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n\n const { width, height } = this.cellDimensions();\n if (width <= 0 || height <= 0) {\n return null;\n }\n\n const relativeX = clientX - rect.left;\n const relativeY = clientY - rect.top;\n const maxCol = Math.max(this.cols - 1, 0);\n const maxRow = Math.max(this.lastViewportRows - 1, 0);\n const col = Math.max(0, Math.min(maxCol, Math.floor(relativeX / width)));\n const row = Math.max(0, Math.min(maxRow, Math.floor(relativeY / height)));\n\n return {\n line: this.lastViewportOffset + row,\n col,\n };\n }\n\n private getLineText(line: number): string {\n const cached = this.lineCache.get(line);\n if (typeof cached === 'string') {\n return cached;\n }\n\n const visibleIndex = line - this.lastViewportOffset;\n const visibleRow = this.lastRenderedRows[visibleIndex];\n return visibleRow?.text ?? '';\n }\n\n private getSelectionText(): string | null {\n if (!hasSelection(this.selectionState)) {\n return null;\n }\n\n return serializeSelectionText(this.selectionState, (line) => this.getLineText(line));\n }\n\n private updateSelectionTextProbe(value: string | null): void {\n (globalThis as { __tmexE2eTerminalSelectionText?: string | null }).__tmexE2eTerminalSelectionText =\n value;\n }\n\n private updateAutoScroll(): void {\n if (!this.pointerDrag.active || this.pointerDrag.lastClientY === null) {\n this.stopAutoScroll();\n return;\n }\n\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n this.stopAutoScroll();\n return;\n }\n\n const outsideViewport =\n this.pointerDrag.lastClientY < rect.top || this.pointerDrag.lastClientY > rect.bottom;\n if (!outsideViewport) {\n this.stopAutoScroll();\n return;\n }\n\n if (this.autoScrollTimer !== null) {\n return;\n }\n\n this.autoScrollTimer = setInterval(() => {\n this.stepAutoScroll();\n }, AUTO_SCROLL_INTERVAL_MS);\n }\n\n private stepAutoScroll(): void {\n if (!this.pointerDrag.active || this.pointerDrag.lastClientX === null || this.pointerDrag.lastClientY === null) {\n this.stopAutoScroll();\n return;\n }\n\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n this.stopAutoScroll();\n return;\n }\n\n let delta = 0;\n if (this.pointerDrag.lastClientY < rect.top) {\n delta = -1;\n } else if (this.pointerDrag.lastClientY > rect.bottom) {\n delta = 1;\n }\n\n if (delta === 0) {\n this.stopAutoScroll();\n return;\n }\n\n this.bindings.scrollViewportDelta(this.terminalHandle, delta);\n this.render();\n\n const point = this.hitTest(this.pointerDrag.lastClientX, this.pointerDrag.lastClientY);\n if (!point) {\n return;\n }\n\n this.selectionState = updateSelectionFocus(this.selectionState, point, (line) =>\n this.getLineText(line)\n );\n this.pointerDrag.moved = true;\n this.render();\n }\n\n private stopAutoScroll(): void {\n if (this.autoScrollTimer === null) {\n return;\n }\n\n clearInterval(this.autoScrollTimer);\n this.autoScrollTimer = null;\n }\n\n private clearDomEventListeners(): void {\n while (this.domEventDisposers.length > 0) {\n const dispose = this.domEventDisposers.pop();\n dispose?.();\n }\n }\n}\n\nexport async function createTerminalController(\n options: GhosttyTerminalInitOptions\n): Promise<GhosttyTerminalController> {\n return GhosttyTerminalController.create(options);\n}\n\nexport { TERMINAL_ENGINE };\n","/**\n * seoul256.vim color scheme\n * https://github.com/junegunn/seoul256.vim\n * https://github.com/mikker/seoul256-iTerm\n *\n * Dark theme uses seoul256-iTerm colors\n * Light theme uses seoul256.vim colors\n */\n\n/**\n * seoul256-light - Seoul Colors Light\n * From seoul256.vim: Background 253 (#E1E1E1), Foreground 239 (#616161)\n */\nexport const XTERM_THEME_LIGHT = {\n background: '#e1e1e1',\n foreground: '#616161',\n cursor: '#616161',\n selectionBackground: 'rgba(97, 97, 97, 0.25)',\n // ANSI colors\n black: '#171717',\n red: '#bf2172',\n green: '#009799',\n yellow: '#9a7200',\n blue: '#007299',\n magenta: '#9b1d72',\n cyan: '#007173',\n white: '#d9d9d9',\n // Bright colors\n brightBlack: '#4e4e4e',\n brightRed: '#e12672',\n brightGreen: '#00bddf',\n brightYellow: '#ffdd00',\n brightBlue: '#7299bc',\n brightMagenta: '#e17899',\n brightCyan: '#6fbcbd',\n brightWhite: '#f1f1f1',\n};\n\n/**\n * seoul256-dark - Seoul Colors Dark\n * From seoul256-iTerm: https://github.com/mikker/seoul256-iTerm\n */\nexport const XTERM_THEME_DARK = {\n background: '#262626',\n foreground: '#d0d0d0',\n cursor: '#c5c5c5',\n selectionBackground: 'rgba(197, 197, 197, 0.25)',\n // ANSI colors (from iTerm colors)\n black: '#000000',\n red: '#ba3c3c',\n green: '#5d876d',\n yellow: '#d5a54e',\n blue: '#887c8d',\n magenta: '#cd6d6d',\n cyan: '#618484',\n white: '#cfcdc3',\n // Bright colors (from iTerm colors)\n brightBlack: '#000000',\n brightRed: '#ea7171',\n brightGreen: '#7aab7a',\n brightYellow: '#d1d194',\n brightBlue: '#afa3b5',\n brightMagenta: '#e29f9f',\n brightCyan: '#a0aea3',\n brightWhite: '#d0d0d0',\n};\n\nexport const XTERM_FONT_FAMILY =\n '\"JetBrains Mono\", \"SF Mono\", Menlo, Monaco, Consolas, \"Liberation Mono\", \"Noto Sans Mono CJK SC\", \"Source Han Mono SC\", \"Sarasa Mono SC\", \"Noto Color Emoji\", \"Apple Color Emoji\", \"Segoe UI Emoji\", monospace';\n\n// 别名导出,保持兼容性\nexport const XTERM_THEME_MIDNIGHT_AMETHYST = XTERM_THEME_DARK;\nexport const XTERM_THEME_DAWN_AMETHYST = XTERM_THEME_LIGHT;\n","export function normalizeHistoryForTerminal(data: string): string {\n if (!data) return data;\n const canonical = data.replace(/\\r\\n/g, '\\n');\n const trimmed = canonical.endsWith('\\n') ? canonical.slice(0, -1) : canonical;\n return trimmed.replace(/\\n/g, '\\r\\n');\n}\n\nconst ALT_SCREEN_HISTORY_PREAMBLE = '\\x1b[?1049h\\x1b[H\\x1b[2J';\n\nexport function wrapAlternateScreenHistory(data: string): string {\n return ALT_SCREEN_HISTORY_PREAMBLE + normalizeHistoryForTerminal(data);\n}\n\nexport function normalizeLiveOutputForTerminal(\n data: Uint8Array,\n previousEndedWithCR: boolean\n): { normalized: Uint8Array; endedWithCR: boolean } {\n let prevWasCR = previousEndedWithCR;\n let extraCRCount = 0;\n\n for (const byte of data) {\n if (byte === 0x0a && !prevWasCR) {\n extraCRCount += 1;\n }\n prevWasCR = byte === 0x0d;\n }\n\n const endedWithCR = prevWasCR;\n if (extraCRCount === 0) {\n return { normalized: data, endedWithCR };\n }\n\n const normalized = new Uint8Array(data.length + extraCRCount);\n let writeIndex = 0;\n prevWasCR = previousEndedWithCR;\n\n for (const byte of data) {\n if (byte === 0x0a && !prevWasCR) {\n normalized[writeIndex] = 0x0d;\n writeIndex += 1;\n }\n normalized[writeIndex] = byte;\n writeIndex += 1;\n prevWasCR = byte === 0x0d;\n }\n\n return { normalized, endedWithCR };\n}\n","import { useEffect, useRef } from 'react';\n\ninterface TerminalScroller {\n scrollLines: (amount: number) => void;\n handleViewportGesture?: (gesture: {\n source: 'touch';\n deltaY: number;\n clientX: number;\n clientY: number;\n }) => boolean;\n buffer?: {\n active?: {\n viewportY?: number;\n };\n };\n}\n\nconst TOUCH_SCROLL_GAIN = 1.3;\nconst SCROLLBAR_TOUCH_HOTZONE_PX = 36;\n\nexport function useMobileTouch(\n containerRef: React.RefObject<HTMLElement | null>,\n getTerminal?: () => TerminalScroller | null\n) {\n const isActiveRef = useRef(false);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const isMobile =\n window.innerWidth < 768 || navigator.maxTouchPoints > 0 || 'ontouchstart' in window;\n if (!isMobile) return;\n\n isActiveRef.current = true;\n let lastTouchY = 0;\n let touchId: number | null = null;\n let bypassCustomScroll = false;\n let pendingPixelDelta = 0;\n\n const isScrollbarElement = (target: Element | null): boolean => {\n if (!target) return false;\n return Boolean(\n target.closest('.scrollbar') ||\n target.closest('.slider') ||\n target.closest('.xterm-scroll-area')\n );\n };\n\n const shouldBypassCustomScroll = (\n clientX: number,\n clientY: number,\n eventTarget: EventTarget | null\n ): boolean => {\n const directTarget = eventTarget instanceof Element ? eventTarget : null;\n if (isScrollbarElement(directTarget)) {\n return true;\n }\n\n const pointTarget = document.elementFromPoint(clientX, clientY);\n if (isScrollbarElement(pointTarget)) {\n return true;\n }\n\n const xtermRoot = container.querySelector('.xterm');\n if (!(xtermRoot instanceof HTMLElement)) {\n return false;\n }\n\n const rect = xtermRoot.getBoundingClientRect();\n const insideX = clientX >= rect.left && clientX <= rect.right;\n const insideY = clientY >= rect.top && clientY <= rect.bottom;\n if (!insideX || !insideY) {\n return false;\n }\n\n return clientX >= rect.right - SCROLLBAR_TOUCH_HOTZONE_PX;\n };\n\n const findScrollTargets = (): HTMLElement[] => {\n const candidates = [\n container.querySelector('.xterm-viewport'),\n container.querySelector('.xterm-scrollable-element'),\n ];\n\n return candidates.filter((el): el is HTMLElement => el instanceof HTMLElement);\n };\n\n const findTouchById = (touchList: TouchList): Touch | null => {\n if (touchId === null) return null;\n for (let i = 0; i < touchList.length; i += 1) {\n const touch = touchList.item(i);\n if (touch && touch.identifier === touchId) {\n return touch;\n }\n }\n return null;\n };\n\n const handleTouchStart = (event: TouchEvent) => {\n if (event.touches.length !== 1) return;\n const touch = event.touches.item(0);\n if (!touch) return;\n\n touchId = touch.identifier;\n lastTouchY = touch.clientY;\n pendingPixelDelta = 0;\n bypassCustomScroll = shouldBypassCustomScroll(touch.clientX, touch.clientY, event.target);\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n const touch = findTouchById(event.touches) ?? event.touches.item(0);\n if (!touch) return;\n if (!bypassCustomScroll) {\n bypassCustomScroll = shouldBypassCustomScroll(touch.clientX, touch.clientY, event.target);\n if (bypassCustomScroll) {\n pendingPixelDelta = 0;\n }\n }\n if (bypassCustomScroll) return;\n\n const currentY = touch.clientY;\n const deltaY = lastTouchY - currentY;\n lastTouchY = currentY;\n\n if (deltaY === 0) return;\n\n let didScroll = false;\n let atTopWhilePullingDown = false;\n const terminal = getTerminal?.() ?? null;\n\n if (terminal) {\n const core = (terminal as any)?._core;\n const lineHeight = core?._renderService?.dimensions?.css?.cell?.height ?? 18;\n pendingPixelDelta += deltaY * TOUCH_SCROLL_GAIN;\n const linesToScroll =\n pendingPixelDelta > 0\n ? Math.floor(pendingPixelDelta / lineHeight)\n : Math.ceil(pendingPixelDelta / lineHeight);\n\n if (typeof terminal.handleViewportGesture === 'function') {\n if (linesToScroll !== 0) {\n didScroll = terminal.handleViewportGesture({\n source: 'touch',\n deltaY: linesToScroll * lineHeight,\n clientX: touch.clientX,\n clientY: touch.clientY,\n });\n pendingPixelDelta -= linesToScroll * lineHeight;\n }\n } else {\n if (linesToScroll !== 0) {\n const beforeViewportY = terminal.buffer?.active?.viewportY ?? 0;\n terminal.scrollLines(linesToScroll);\n const afterViewportY = terminal.buffer?.active?.viewportY ?? 0;\n didScroll = beforeViewportY !== afterViewportY;\n atTopWhilePullingDown = linesToScroll < 0 && beforeViewportY <= 0 && afterViewportY <= 0;\n pendingPixelDelta -= linesToScroll * lineHeight;\n }\n }\n } else {\n const scrollTargets = findScrollTargets();\n if (scrollTargets.length === 0) return;\n\n for (const target of scrollTargets) {\n const previousScrollTop = target.scrollTop;\n target.scrollTop += deltaY;\n const nextScrollTop = target.scrollTop;\n\n if (Math.abs(nextScrollTop - previousScrollTop) > 0) {\n didScroll = true;\n }\n if (deltaY < 0 && nextScrollTop <= 0) {\n atTopWhilePullingDown = true;\n }\n }\n if (!didScroll) {\n const xtermRoot = container.querySelector('.xterm');\n if (xtermRoot instanceof HTMLElement) {\n const wheelEvent = new WheelEvent('wheel', {\n bubbles: true,\n cancelable: true,\n deltaMode: WheelEvent.DOM_DELTA_PIXEL,\n deltaY,\n });\n const dispatched = xtermRoot.dispatchEvent(wheelEvent);\n didScroll = wheelEvent.defaultPrevented || !dispatched;\n }\n }\n }\n\n if (!event.cancelable) return;\n if (didScroll || atTopWhilePullingDown) {\n event.preventDefault();\n }\n };\n\n const handleTouchEnd = (event: TouchEvent) => {\n if (touchId === null) return;\n const endedTouch = findTouchById(event.changedTouches);\n if (!endedTouch) return;\n touchId = null;\n pendingPixelDelta = 0;\n bypassCustomScroll = false;\n };\n\n container.addEventListener('touchstart', handleTouchStart, { passive: true });\n container.addEventListener('touchmove', handleTouchMove, { passive: false });\n container.addEventListener('touchend', handleTouchEnd, { passive: true });\n container.addEventListener('touchcancel', handleTouchEnd, { passive: true });\n\n return () => {\n isActiveRef.current = false;\n container.removeEventListener('touchstart', handleTouchStart);\n container.removeEventListener('touchmove', handleTouchMove);\n container.removeEventListener('touchend', handleTouchEnd);\n container.removeEventListener('touchcancel', handleTouchEnd);\n };\n }, [containerRef, getTerminal]);\n\n return isActiveRef;\n}\n","export interface TerminalSizeSnapshot {\n cols: number;\n rows: number;\n}\n\nexport interface TimedTerminalSizeSnapshot extends TerminalSizeSnapshot {\n at: number;\n}\n\ninterface ViewportRestoreSyncInput {\n currentSize: TerminalSizeSnapshot;\n containerSize: TerminalSizeSnapshot;\n force?: boolean;\n}\n\ninterface RemotePaneSizeGuardInput {\n now: number;\n remoteSize: TerminalSizeSnapshot;\n pendingLocalSize: TimedTerminalSizeSnapshot | null;\n ttlMs?: number;\n}\n\nexport function shouldApplyRemotePaneSize({\n now,\n remoteSize,\n pendingLocalSize,\n ttlMs = 2000,\n}: RemotePaneSizeGuardInput): boolean {\n if (!pendingLocalSize) {\n return true;\n }\n\n if (now - pendingLocalSize.at > ttlMs) {\n return true;\n }\n\n return pendingLocalSize.cols === remoteSize.cols && pendingLocalSize.rows === remoteSize.rows;\n}\n\ninterface ForceLocalSizeSyncInput extends RemotePaneSizeGuardInput {\n containerSize: TerminalSizeSnapshot | null;\n}\n\nexport function shouldForceLocalSizeSync({\n now: _now,\n remoteSize: _remoteSize,\n pendingLocalSize: _pendingLocalSize,\n containerSize: _containerSize,\n ttlMs: _ttlMs = 2000,\n}: ForceLocalSizeSyncInput): boolean {\n return false;\n}\n\nexport function shouldSyncOnViewportRestore({\n currentSize,\n containerSize,\n force = false,\n}: ViewportRestoreSyncInput): boolean {\n if (force) {\n return true;\n }\n\n return currentSize.cols !== containerSize.cols || currentSize.rows !== containerSize.rows;\n}\n","import { shouldSyncOnViewportRestore } from '@/utils/resizeSyncGuards';\nimport type { CompatibleTerminalLike } from 'ghostty-terminal';\nimport type { FitAddon } from 'ghostty-terminal';\nimport { useCallback, useEffect, useRef } from 'react';\n\ninterface UseTerminalResizeOptions {\n deviceId: string;\n paneId: string;\n deviceConnected: boolean;\n isSelectionInvalid: boolean;\n onResize: (cols: number, rows: number) => void;\n onSync: (cols: number, rows: number) => void;\n /** 获取容器尺寸的回调函数,用于 fitAddon 失败时的回退计算 */\n getContainerRect?: () => { width: number; height: number } | null;\n}\n\nexport function useTerminalResize({\n deviceId,\n paneId,\n deviceConnected,\n isSelectionInvalid,\n onResize,\n onSync,\n getContainerRect,\n}: UseTerminalResizeOptions) {\n const resizeRaf = useRef<number | null>(null);\n const resizeTimer = useRef<number | null>(null);\n const lastReportedSize = useRef<{ cols: number; rows: number } | null>(null);\n const pendingLocalSize = useRef<{ cols: number; rows: number; at: number } | null>(null);\n const suppressLocalResizeUntil = useRef(0);\n const postSelectResizeTimers = useRef<number[]>([]);\n const fitAddonRef = useRef<FitAddon | null>(null);\n const terminalRef = useRef<CompatibleTerminalLike | null>(null);\n const getContainerRectRef = useRef(getContainerRect);\n const viewportRestorePendingRef = useRef(false);\n\n // Use refs to store callbacks to avoid dependency cycles\n const onResizeRef = useRef(onResize);\n const onSyncRef = useRef(onSync);\n\n // Update refs when callbacks change\n useEffect(() => {\n onResizeRef.current = onResize;\n }, [onResize]);\n\n useEffect(() => {\n onSyncRef.current = onSync;\n }, [onSync]);\n\n useEffect(() => {\n getContainerRectRef.current = getContainerRect;\n }, [getContainerRect]);\n\n const measureTerminalSize = useCallback((): { cols: number; rows: number } | null => {\n const term = terminalRef.current;\n const fitAddon = fitAddonRef.current;\n if (!term || !fitAddon || !term.element) {\n return null;\n }\n\n let cols: number;\n\n try {\n const proposed = fitAddon.proposeDimensions();\n if (!proposed) {\n throw new Error('fitAddon.proposeDimensions() returned null');\n }\n cols = Math.max(2, proposed.cols);\n } catch {\n const core = (term as any)._core;\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n const rect = getContainerRectRef.current?.();\n if (!rect || rect.width === 0) {\n return null;\n }\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n\n const containerRect = getContainerRectRef.current?.();\n if (!containerRect || containerRect.height === 0) {\n return null;\n }\n const core = (term as any)._core;\n const cellHeight = core?._renderService?.dimensions?.css?.cell?.height ?? 17;\n const rows = Math.max(2, Math.floor(containerRect.height / cellHeight));\n\n return { cols, rows };\n }, []);\n\n const applyTerminalSize = useCallback((cols: number, rows: number): void => {\n const term = terminalRef.current;\n if (!term) {\n return;\n }\n if (term.cols === cols && term.rows === rows) {\n return;\n }\n term.resize(cols, rows);\n }, []);\n\n const reportSize = useCallback(\n (kind: 'resize' | 'sync', force = false) => {\n // sync 操作即使在 isSelectionInvalid 时也应该执行,因为尺寸同步是基础功能\n // isSelectionInvalid 主要影响用户输入,不应该阻止终端尺寸同步\n if (!deviceId || !paneId || !deviceConnected) {\n return false;\n }\n if (isSelectionInvalid && kind !== 'sync') {\n return false;\n }\n\n if (!force && Date.now() < suppressLocalResizeUntil.current) {\n return false;\n }\n\n const term = terminalRef.current;\n if (!term) {\n return false;\n }\n\n const measuredSize = measureTerminalSize();\n if (!measuredSize) {\n return false;\n }\n const { cols, rows } = measuredSize;\n // Debug: console.log('[resize] success:', { kind, cols, rows, force });\n const lastSize = lastReportedSize.current;\n\n if (!force && lastSize && lastSize.cols === cols && lastSize.rows === rows) {\n applyTerminalSize(cols, rows);\n return true;\n }\n\n applyTerminalSize(cols, rows);\n\n if (kind === 'sync') {\n onSyncRef.current(cols, rows);\n } else {\n onResizeRef.current(cols, rows);\n }\n\n lastReportedSize.current = { cols, rows };\n pendingLocalSize.current = { cols, rows, at: Date.now() };\n return true;\n },\n // Only depend on stable values, not the callbacks\n [applyTerminalSize, deviceConnected, deviceId, isSelectionInvalid, measureTerminalSize, paneId]\n );\n\n const scheduleResize = useCallback(\n (\n kind: 'resize' | 'sync' = 'resize',\n options: { immediate?: boolean; force?: boolean } = {}\n ) => {\n const { immediate = false, force = false } = options;\n\n if (resizeTimer.current !== null) {\n window.clearTimeout(resizeTimer.current);\n resizeTimer.current = null;\n }\n\n if (resizeRaf.current !== null) {\n cancelAnimationFrame(resizeRaf.current);\n resizeRaf.current = null;\n }\n\n const run = () => {\n resizeRaf.current = requestAnimationFrame(() => {\n resizeRaf.current = null;\n reportSize(kind, force);\n });\n };\n\n if (immediate) {\n run();\n return;\n }\n\n resizeTimer.current = window.setTimeout(() => {\n resizeTimer.current = null;\n run();\n }, 150);\n },\n [reportSize]\n );\n\n const clearPostSelectResizeTimers = useCallback(() => {\n for (const id of postSelectResizeTimers.current) {\n window.clearTimeout(id);\n }\n postSelectResizeTimers.current = [];\n }, []);\n\n const runPostSelectResize = useCallback(() => {\n clearPostSelectResizeTimers();\n scheduleResize('sync', { immediate: true, force: true });\n\n const retryId = window.setTimeout(() => {\n scheduleResize('sync', { immediate: true, force: true });\n }, 60);\n postSelectResizeTimers.current.push(retryId);\n\n if (typeof document !== 'undefined' && 'fonts' in document && document.fonts?.ready) {\n document.fonts.ready\n .then(() => {\n scheduleResize('sync', { immediate: true, force: true });\n })\n .catch(() => {\n // ignore\n });\n }\n }, [clearPostSelectResizeTimers, scheduleResize]);\n\n // 浏览器窗口 resize 处理 - 共享 scheduleResize 的防抖\n useEffect(() => {\n let rafId: number | null = null;\n const handleWindowResize = () => {\n // 使用 RAF 确保在布局完成后执行,并与 ResizeObserver 协调\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n rafId = requestAnimationFrame(() => {\n rafId = null;\n scheduleResize('resize');\n });\n };\n\n window.addEventListener('resize', handleWindowResize);\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n };\n }, [scheduleResize]);\n\n useEffect(() => {\n const handleViewportRestore = () => {\n const term = terminalRef.current;\n const containerSize = measureTerminalSize();\n if (!term || !containerSize) {\n return;\n }\n\n const shouldSync = shouldSyncOnViewportRestore({\n currentSize: { cols: Math.max(2, term.cols), rows: Math.max(2, term.rows) },\n containerSize,\n });\n if (!shouldSync) {\n term.refresh?.();\n return;\n }\n\n scheduleResize('sync', { force: true });\n };\n\n const handleVisibilityChange = () => {\n if (document.visibilityState !== 'visible') {\n viewportRestorePendingRef.current = true;\n return;\n }\n if (!viewportRestorePendingRef.current) {\n return;\n }\n viewportRestorePendingRef.current = false;\n handleViewportRestore();\n };\n\n const handleWindowBlur = () => {\n viewportRestorePendingRef.current = true;\n };\n\n const handleWindowFocus = () => {\n if (!viewportRestorePendingRef.current) {\n return;\n }\n viewportRestorePendingRef.current = false;\n handleViewportRestore();\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n window.addEventListener('blur', handleWindowBlur);\n window.addEventListener('focus', handleWindowFocus);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n window.removeEventListener('blur', handleWindowBlur);\n window.removeEventListener('focus', handleWindowFocus);\n };\n }, [measureTerminalSize, scheduleResize]);\n\n // 清理\n useEffect(() => {\n return () => {\n clearPostSelectResizeTimers();\n if (resizeTimer.current !== null) {\n window.clearTimeout(resizeTimer.current);\n }\n if (resizeRaf.current !== null) {\n cancelAnimationFrame(resizeRaf.current);\n }\n };\n }, [clearPostSelectResizeTimers]);\n\n const setFitAddon = useCallback((addon: FitAddon | null) => {\n fitAddonRef.current = addon;\n }, []);\n\n const setTerminal = useCallback((terminal: CompatibleTerminalLike | null) => {\n terminalRef.current = terminal;\n }, []);\n\n return {\n scheduleResize,\n runPostSelectResize,\n clearPostSelectResizeTimers,\n setFitAddon,\n setTerminal,\n lastReportedSize,\n pendingLocalSize,\n suppressLocalResizeUntil,\n };\n}\n","import {\n FitAddon,\n TERMINAL_ENGINE,\n createTerminalController,\n type CompatibleTerminalLike,\n type GhosttyTerminalModeSnapshot,\n} from 'ghostty-terminal';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTmuxStore } from '@/stores/tmux';\nimport { type SelectCallbacks, getSelectStateMachine } from '@/ws-borsh';\nimport { XTERM_FONT_FAMILY, XTERM_THEME_DARK, XTERM_THEME_LIGHT } from './theme';\nimport {\n normalizeHistoryForTerminal,\n normalizeLiveOutputForTerminal,\n wrapAlternateScreenHistory,\n} from './normalization';\nimport type { TerminalProps, TerminalRef } from './types';\nimport { useMobileTouch } from './useMobileTouch';\nimport { useTerminalResize } from './useTerminalResize';\n\nconst TERMINAL_CONFIG = {\n fontFamily: XTERM_FONT_FAMILY,\n fontSize: 13,\n scrollback: 10000,\n};\n\nconst TERMINAL_MODE_CACHE_KEY = 'tmex:terminal-mode-cache';\n\nfunction readTerminalModeCache(\n deviceId: string,\n paneId: string\n): GhosttyTerminalModeSnapshot | null {\n try {\n const raw = sessionStorage.getItem(TERMINAL_MODE_CACHE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Record<string, GhosttyTerminalModeSnapshot | undefined>;\n return parsed[`${deviceId}:${paneId}`] ?? null;\n } catch {\n return null;\n }\n}\n\nfunction writeTerminalModeCache(\n deviceId: string,\n paneId: string,\n snapshot: GhosttyTerminalModeSnapshot | null\n): void {\n try {\n const raw = sessionStorage.getItem(TERMINAL_MODE_CACHE_KEY);\n const parsed = raw ? (JSON.parse(raw) as Record<string, GhosttyTerminalModeSnapshot | undefined>) : {};\n const key = `${deviceId}:${paneId}`;\n if (snapshot) {\n parsed[key] = snapshot;\n } else {\n delete parsed[key];\n }\n sessionStorage.setItem(TERMINAL_MODE_CACHE_KEY, JSON.stringify(parsed));\n } catch {\n // ignore storage failures\n }\n}\n\nfunction createAlternateScreenFallbackSnapshot(): GhosttyTerminalModeSnapshot {\n return {\n mouseX10: false,\n mouseNormal: true,\n mouseButton: false,\n mouseAny: false,\n mouseUtf8: false,\n mouseSgr: true,\n mouseSgrPixels: false,\n mouseUrxvt: false,\n altScroll: true,\n altScreen1047: false,\n altScreen1049: false,\n };\n}\n\nfunction reconcileRecoveredModes(\n cached: GhosttyTerminalModeSnapshot | null,\n alternateScreen: boolean\n): GhosttyTerminalModeSnapshot | null {\n if (!alternateScreen) {\n if (!cached) return null;\n return {\n ...cached,\n mouseX10: false,\n mouseNormal: false,\n mouseButton: false,\n mouseAny: false,\n mouseUtf8: false,\n mouseSgrPixels: false,\n mouseUrxvt: false,\n altScreen1047: false,\n altScreen1049: false,\n };\n }\n\n const fallback = createAlternateScreenFallbackSnapshot();\n if (!cached) {\n return fallback;\n }\n\n const hasTrackingMode = cached.mouseNormal || cached.mouseButton || cached.mouseAny;\n\n return {\n ...cached,\n mouseX10: false,\n mouseUtf8: false,\n mouseSgr: true,\n mouseSgrPixels: false,\n mouseUrxvt: false,\n altScroll: true,\n altScreen1047: false,\n altScreen1049: false,\n mouseNormal: hasTrackingMode ? cached.mouseNormal : fallback.mouseNormal,\n };\n}\n\nfunction setE2eTerminalProbe(terminal: CompatibleTerminalLike): void {\n const g = globalThis as any;\n g.__tmexE2eXterm = terminal;\n g.__tmexE2eTerminal = terminal;\n g.__tmexE2eTerminalEngine = TERMINAL_ENGINE;\n g.__tmexE2eTerminalRenderer = terminal.getRendererKind?.() ?? null;\n}\n\nfunction clearE2eTerminalProbe(terminal: CompatibleTerminalLike | null): void {\n if (!terminal) {\n return;\n }\n\n const g = globalThis as any;\n if (g.__tmexE2eTerminal !== terminal && g.__tmexE2eXterm !== terminal) {\n return;\n }\n\n g.__tmexE2eXterm = null;\n g.__tmexE2eTerminal = null;\n g.__tmexE2eTerminalEngine = null;\n g.__tmexE2eTerminalRenderer = null;\n g.__tmexE2eTerminalSelectionText = null;\n}\n\nexport const Terminal = forwardRef<TerminalRef, TerminalProps>(\n (\n { deviceId, paneId, theme, inputMode, deviceConnected, isSelectionInvalid, onResize, onSync },\n ref\n ) => {\n const [instance, setInstance] = useState<CompatibleTerminalLike | null>(null);\n const sendInput = useTmuxStore((state) => state.sendInput);\n\n const terminalTheme = useMemo(() => {\n switch (theme) {\n case 'light':\n return XTERM_THEME_LIGHT;\n default:\n return XTERM_THEME_DARK;\n }\n }, [theme]);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const mountRef = useRef<HTMLDivElement>(null);\n const fitAddonRef = useRef<FitAddon | null>(null);\n const currentDeviceIdRef = useRef(deviceId);\n const currentPaneIdRef = useRef(paneId);\n const attachedDeviceIdRef = useRef(deviceId);\n const attachedPaneIdRef = useRef(paneId);\n const canWriteRef = useRef(deviceConnected && !isSelectionInvalid);\n const currentInputModeRef = useRef(inputMode);\n const currentTerminalThemeRef = useRef(terminalTheme);\n const liveOutputEndedWithCR = useRef(false);\n const keepShortHistoryVisibleRef = useRef(false);\n const lastTerminalInstanceRef = useRef<CompatibleTerminalLike | null>(null);\n const skipNextDetachPersistRef = useRef(false);\n\n const persistTerminalModes = useCallback(\n (terminal: CompatibleTerminalLike | null, targetDeviceId: string, targetPaneId: string) => {\n if (!terminal?.exportModeSnapshot || !targetDeviceId || !targetPaneId) {\n return;\n }\n writeTerminalModeCache(targetDeviceId, targetPaneId, terminal.exportModeSnapshot());\n },\n []\n );\n\n const getTerminalForTouch = useCallback(() => instance, [instance]);\n useMobileTouch(containerRef, getTerminalForTouch);\n\n useEffect(() => {\n currentDeviceIdRef.current = deviceId;\n currentPaneIdRef.current = paneId;\n keepShortHistoryVisibleRef.current = false;\n }, [deviceId, paneId]);\n\n useEffect(() => {\n canWriteRef.current = deviceConnected && !isSelectionInvalid;\n }, [deviceConnected, isSelectionInvalid]);\n\n useEffect(() => {\n currentInputModeRef.current = inputMode;\n }, [inputMode]);\n\n useEffect(() => {\n currentTerminalThemeRef.current = terminalTheme;\n }, [terminalTheme]);\n\n const sendTerminalInput = useCallback(\n (data: string) => {\n if (!data || inputMode !== 'direct') {\n return;\n }\n if (!canWriteRef.current) {\n return;\n }\n\n const activeDeviceId = currentDeviceIdRef.current;\n const activePaneId = currentPaneIdRef.current;\n if (!activeDeviceId || !activePaneId) {\n return;\n }\n\n sendInput(activeDeviceId, activePaneId, data, false);\n },\n [inputMode, sendInput]\n );\n\n const { pendingLocalSize, scheduleResize, runPostSelectResize, setFitAddon, setTerminal } =\n useTerminalResize({\n deviceId,\n paneId,\n deviceConnected,\n isSelectionInvalid,\n onResize,\n onSync,\n getContainerRect: () => {\n const el = containerRef.current;\n if (!el) return null;\n const rect = el.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n },\n });\n\n useEffect(() => {\n let cancelled = false;\n let createdTerminal: Awaited<ReturnType<typeof createTerminalController>> | null = null;\n\n void createTerminalController({\n ...TERMINAL_CONFIG,\n theme: currentTerminalThemeRef.current,\n disableStdin: currentInputModeRef.current === 'editor',\n }).then((terminal) => {\n if (cancelled) {\n terminal.dispose();\n return;\n }\n\n createdTerminal = terminal;\n if (mountRef.current) {\n terminal.open(mountRef.current);\n }\n setE2eTerminalProbe(terminal);\n setInstance(terminal);\n });\n\n return () => {\n cancelled = true;\n setInstance(null);\n clearE2eTerminalProbe(createdTerminal);\n createdTerminal?.dispose();\n };\n }, []);\n\n useEffect(() => {\n if (!instance || !('setTheme' in instance)) {\n return;\n }\n\n (instance as any).setTheme(terminalTheme);\n }, [instance, terminalTheme]);\n\n useEffect(() => {\n if (!instance || !('setDisableStdin' in instance)) {\n return;\n }\n\n (instance as any).setDisableStdin(inputMode === 'editor');\n }, [instance, inputMode]);\n\n const callbacks: SelectCallbacks = useMemo(() => {\n if (!instance) {\n return {};\n }\n\n return {\n onResetTerminal: (targetDeviceId) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n persistTerminalModes(instance, attachedDeviceIdRef.current, attachedPaneIdRef.current);\n skipNextDetachPersistRef.current = true;\n instance.reset();\n liveOutputEndedWithCR.current = false;\n runPostSelectResize();\n },\n onApplyHistory: (targetDeviceId, data, alternateScreen) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n const recoveredModes = reconcileRecoveredModes(\n readTerminalModeCache(currentDeviceIdRef.current, currentPaneIdRef.current),\n alternateScreen\n );\n if (recoveredModes) {\n instance.restoreModeSnapshot?.(recoveredModes);\n }\n const payload = alternateScreen\n ? wrapAlternateScreenHistory(data)\n : normalizeHistoryForTerminal(data);\n keepShortHistoryVisibleRef.current = true;\n instance.write(payload);\n skipNextDetachPersistRef.current = false;\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n persistTerminalModes(instance, currentDeviceIdRef.current, currentPaneIdRef.current);\n },\n onFlushBuffer: (targetDeviceId, buffer) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n for (const chunk of buffer) {\n const normalized = normalizeLiveOutputForTerminal(chunk, liveOutputEndedWithCR.current);\n liveOutputEndedWithCR.current = normalized.endedWithCR;\n instance.write(normalized.normalized);\n }\n if (keepShortHistoryVisibleRef.current) {\n if (instance.buffer.active.baseY <= 1) {\n instance.scrollToTop();\n }\n keepShortHistoryVisibleRef.current = false;\n }\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n persistTerminalModes(instance, currentDeviceIdRef.current, currentPaneIdRef.current);\n },\n onOutput: (targetDeviceId, targetPaneId, data) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n if (currentPaneIdRef.current !== targetPaneId) return;\n const normalized = normalizeLiveOutputForTerminal(data, liveOutputEndedWithCR.current);\n liveOutputEndedWithCR.current = normalized.endedWithCR;\n instance.write(normalized.normalized);\n if (keepShortHistoryVisibleRef.current) {\n if (instance.buffer.active.baseY <= 1) {\n instance.scrollToTop();\n }\n keepShortHistoryVisibleRef.current = false;\n }\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n persistTerminalModes(instance, currentDeviceIdRef.current, currentPaneIdRef.current);\n },\n };\n }, [instance, persistTerminalModes, runPostSelectResize]);\n\n useEffect(() => {\n if (!instance) {\n lastTerminalInstanceRef.current = null;\n } else if (lastTerminalInstanceRef.current !== instance) {\n liveOutputEndedWithCR.current = false;\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n lastTerminalInstanceRef.current = instance;\n }\n }, [instance]);\n\n useEffect(() => {\n if (!instance || !deviceId || !paneId) {\n return;\n }\n\n return () => {\n if (skipNextDetachPersistRef.current) {\n skipNextDetachPersistRef.current = false;\n return;\n }\n persistTerminalModes(instance, attachedDeviceIdRef.current, attachedPaneIdRef.current);\n };\n }, [deviceId, instance, paneId, persistTerminalModes]);\n\n useEffect(() => {\n getSelectStateMachine(callbacks);\n }, [callbacks]);\n\n useEffect(() => {\n return () => {\n getSelectStateMachine({});\n };\n }, []);\n\n useEffect(() => {\n if (!instance) {\n fitAddonRef.current = null;\n setFitAddon(null);\n setTerminal(null);\n return;\n }\n\n const fitAddon = new FitAddon();\n instance.loadAddon(fitAddon);\n fitAddonRef.current = fitAddon;\n setFitAddon(fitAddon);\n setTerminal(instance);\n\n runPostSelectResize();\n\n return () => {\n try {\n fitAddon.dispose();\n } finally {\n fitAddonRef.current = null;\n setFitAddon(null);\n setTerminal(null);\n }\n };\n }, [instance, runPostSelectResize, setFitAddon, setTerminal]);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n let rafId: number | null = null;\n const ro = new ResizeObserver(() => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n rafId = requestAnimationFrame(() => {\n rafId = null;\n scheduleResize('resize');\n });\n });\n ro.observe(el);\n return () => {\n ro.disconnect();\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n };\n }, [scheduleResize]);\n\n useEffect(() => {\n if (!instance || !deviceId || !paneId) return;\n\n const disposable = instance.onData((data) => {\n if (!deviceConnected || isSelectionInvalid) return;\n sendTerminalInput(data);\n });\n\n instance.attachCustomKeyEventHandler((domEvent) => {\n if (!deviceConnected || isSelectionInvalid) return true;\n if (domEvent.type !== 'keydown') return true;\n if (inputMode !== 'direct') return true;\n\n if (domEvent.shiftKey && domEvent.key === 'Enter') {\n domEvent.preventDefault();\n sendTerminalInput('\\x1b[13;2u');\n return false;\n }\n\n return true;\n });\n\n return () => {\n disposable.dispose();\n instance.attachCustomKeyEventHandler(() => true);\n };\n }, [\n instance,\n deviceConnected,\n isSelectionInvalid,\n inputMode,\n sendTerminalInput,\n deviceId,\n paneId,\n ]);\n\n useImperativeHandle(\n ref,\n () => ({\n write: (data) => instance?.write(data),\n reset: () => {\n instance?.reset();\n liveOutputEndedWithCR.current = false;\n },\n scrollToBottom: () => instance?.scrollToBottom(),\n resize: (cols, rows) => instance?.resize(cols, rows),\n getTerminal: () => instance ?? null,\n getSize: () => {\n if (!instance) return null;\n return { cols: Math.max(2, instance.cols), rows: Math.max(2, instance.rows) };\n },\n runPostSelectResize: () => runPostSelectResize(),\n scheduleResize: (kind, options) => scheduleResize(kind, options),\n calculateSizeFromContainer: () => {\n const container = containerRef.current;\n const term = instance;\n const fitAddon = fitAddonRef.current;\n if (!container || !term) return null;\n\n const rect = container.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n\n const core = term._core;\n let cols: number;\n if (fitAddon) {\n try {\n const dims = fitAddon.proposeDimensions();\n if (dims) {\n cols = Math.max(2, dims.cols);\n } else {\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n } catch {\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n } else {\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n\n const cellHeight = core?._renderService?.dimensions?.css?.cell?.height ?? 17;\n const rows = Math.max(2, Math.floor(rect.height / cellHeight));\n\n return { cols, rows };\n },\n getPendingLocalSize: () => pendingLocalSize.current,\n }),\n [instance, pendingLocalSize, runPostSelectResize, scheduleResize]\n );\n\n return (\n <div\n ref={containerRef}\n className=\"h-full w-full relative\"\n style={{ backgroundColor: terminalTheme.background }}\n data-terminal-engine={TERMINAL_ENGINE}\n >\n <div ref={mountRef} className=\"absolute inset-0\" />\n </div>\n );\n }\n);\n\nTerminal.displayName = 'Terminal';\n","export interface PaneSelection {\n windowId: string;\n paneId: string;\n}\n\nexport interface TimedPaneSelection extends PaneSelection {\n at: number;\n}\n\nexport const RECENT_SELECT_REQUEST_TTL_MS = 1200;\nexport const PENDING_USER_SELECTION_TTL_MS = 2000;\n\nfunction matchesPaneSelection(\n left: PaneSelection | null | undefined,\n right: PaneSelection | null | undefined\n): boolean {\n if (!left || !right) {\n return false;\n }\n return left.windowId === right.windowId && left.paneId === right.paneId;\n}\n\nfunction getLatestRecentSelectRequest(\n recentSelectRequests: TimedPaneSelection[],\n now: number\n): TimedPaneSelection | null {\n const recentRequests = recentSelectRequests.filter(\n (request) => now - request.at < RECENT_SELECT_REQUEST_TTL_MS\n );\n if (recentRequests.length === 0) {\n return null;\n }\n return recentRequests.reduce((latest, request) => (request.at > latest.at ? request : latest));\n}\n\nexport function resolvePendingUserSelection(\n pendingUserSelection: TimedPaneSelection | null | undefined,\n now = Date.now()\n): TimedPaneSelection | null {\n if (!pendingUserSelection) {\n return null;\n }\n if (now - pendingUserSelection.at > PENDING_USER_SELECTION_TTL_MS) {\n return null;\n }\n return pendingUserSelection;\n}\n\nexport function shouldIgnoreActivePaneEvent(params: {\n now?: number;\n pendingUserSelection: TimedPaneSelection | null | undefined;\n activePaneFromEvent: PaneSelection;\n currentRoute: PaneSelection | null | undefined;\n recentSelectRequests: TimedPaneSelection[];\n lastHandledActive: PaneSelection | null | undefined;\n}): boolean {\n const now = params.now ?? Date.now();\n const latestRecentSelectRequest = getLatestRecentSelectRequest(params.recentSelectRequests, now);\n\n if (\n latestRecentSelectRequest &&\n !matchesPaneSelection(latestRecentSelectRequest, params.activePaneFromEvent)\n ) {\n return true;\n }\n\n if (matchesPaneSelection(params.currentRoute, params.activePaneFromEvent)) {\n return true;\n }\n\n if (matchesPaneSelection(params.lastHandledActive, params.activePaneFromEvent)) {\n return true;\n }\n\n const pendingUserSelection = resolvePendingUserSelection(params.pendingUserSelection, now);\n if (\n pendingUserSelection &&\n !matchesPaneSelection(pendingUserSelection, params.activePaneFromEvent)\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function shouldSkipSnapshotFollow(params: {\n now?: number;\n pendingUserSelection: TimedPaneSelection | null | undefined;\n snapshotActive: PaneSelection;\n recentSelectRequests: TimedPaneSelection[];\n}): boolean {\n const now = params.now ?? Date.now();\n const latestRecentSelectRequest = getLatestRecentSelectRequest(params.recentSelectRequests, now);\n\n const pendingUserSelection = resolvePendingUserSelection(params.pendingUserSelection, now);\n if (pendingUserSelection && !matchesPaneSelection(pendingUserSelection, params.snapshotActive)) {\n return true;\n }\n\n if (\n latestRecentSelectRequest &&\n !matchesPaneSelection(latestRecentSelectRequest, params.snapshotActive)\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function shouldTrackPendingRouteSelection(params: {\n now?: number;\n routeTarget: PaneSelection;\n snapshotActive: PaneSelection | null | undefined;\n pendingUserSelection: TimedPaneSelection | null | undefined;\n}): boolean {\n const now = params.now ?? Date.now();\n const pendingUserSelection = resolvePendingUserSelection(params.pendingUserSelection, now);\n\n if (pendingUserSelection && matchesPaneSelection(pendingUserSelection, params.routeTarget)) {\n return false;\n }\n\n if (params.snapshotActive && matchesPaneSelection(params.snapshotActive, params.routeTarget)) {\n return false;\n }\n\n return true;\n}\n","import { useSiteStore } from '../stores/site';\n\nexport function getSiteNameFallback(): string {\n const settings = useSiteStore.getState().settings;\n return settings?.siteName || 'tmex';\n}\n\nexport function getSiteUrlFallback(): string {\n const settings = useSiteStore.getState().settings;\n return settings?.siteUrl || window.location.origin;\n}\n","import { getSiteNameFallback } from './site';\n\ninterface TerminalLabelInput {\n paneIdx?: number | null;\n windowIdx?: number | null;\n paneTitle?: string | null;\n windowName?: string | null;\n deviceName?: string | null;\n}\n\nfunction toSafeText(value: string | null | undefined): string {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : '?';\n}\n\nexport function buildTerminalLabel({\n paneIdx,\n windowIdx,\n paneTitle,\n windowName,\n deviceName,\n}: TerminalLabelInput): string {\n const safeWindowIdx = windowIdx ?? '?';\n const safePaneIdx = paneIdx ?? '?';\n const safePaneTitle = toSafeText(paneTitle ?? windowName);\n const safeDeviceName = toSafeText(deviceName);\n return `${safeWindowIdx}/${safePaneIdx}: ${safePaneTitle}@${safeDeviceName}`;\n}\n\nexport function buildBrowserTitle(label?: string | null): string {\n const siteName = getSiteNameFallback();\n if (!label?.trim()) {\n return siteName;\n }\n return `[${siteName}]${label}`;\n}\n","import { Terminal as TerminalComponent, type TerminalRef } from '@/components/terminal';\nimport { XTERM_THEME_DARK, XTERM_THEME_LIGHT } from '@/components/terminal/theme';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@/components/ui/alert-dialog';\nimport { Button } from '@/components/ui/button';\nimport { Switch } from '@/components/ui/switch';\nimport { useQuery } from '@tanstack/react-query';\nimport type { Device } from '@tmex/shared';\nimport {\n ArrowDownToLine,\n Keyboard,\n Loader2,\n RefreshCw,\n Send,\n Smartphone,\n Trash2,\n} from 'lucide-react';\nimport { type FocusEvent, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate, useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useSiteStore } from '../stores/site';\nimport { useTmuxStore } from '../stores/tmux';\nimport { useUIStore } from '../stores/ui';\nimport { shouldApplyRemotePaneSize } from '../utils/resizeSyncGuards';\nimport {\n type TimedPaneSelection,\n resolvePendingUserSelection,\n shouldIgnoreActivePaneEvent,\n shouldSkipSnapshotFollow,\n shouldTrackPendingRouteSelection,\n} from '../utils/selectionGuards';\nimport { buildBrowserTitle, buildTerminalLabel } from '../utils/terminalMeta';\nimport { decodePaneIdFromUrlParam, encodePaneIdForUrl } from '../utils/tmuxUrl';\n\ninterface EditorShortcut {\n key: string;\n label: string;\n payload: string;\n}\n\nfunction isIOSMobileBrowser(): boolean {\n if (typeof navigator === 'undefined') {\n return false;\n }\n\n const userAgent = navigator.userAgent;\n const isIOSDevice = /iPad|iPhone|iPod/.test(userAgent);\n const isTouchMac = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n return isIOSDevice || isTouchMac;\n}\n\nconst EDITOR_SHORTCUTS: EditorShortcut[] = [\n { key: 'enter', label: 'ENTER', payload: '\\r' },\n { key: 'ctrl-c', label: 'CTRL-C', payload: '\\u0003' },\n { key: 'ctrl-d', label: 'CTRL-D', payload: '\\u0004' },\n { key: 'up', label: '↑', payload: '\\u001b[A' },\n { key: 'down', label: '↓', payload: '\\u001b[B' },\n { key: 'left', label: '←', payload: '\\u001b[D' },\n { key: 'right', label: '→', payload: '\\u001b[C' },\n { key: 'shift-enter', label: 'SHIFT+ENTER', payload: '\\x1b[13;2u' },\n { key: 'tab', label: 'TAB', payload: '\\u0009' },\n { key: 'backspace', label: 'BACKSPACE', payload: '\\u0008' },\n { key: 'esc', label: 'ESC', payload: '\\u001b' },\n { key: 'delete', label: 'DELETE', payload: '\\u007f' },\n { key: ':', label: ':', payload: ':' },\n { key: '/', label: '/', payload: '/' },\n { key: \"'\", label: \"'\", payload: \"'\" },\n { key: '\"', label: '\"', payload: '\"' },\n { key: '`', label: '`', payload: '`' },\n];\n\n// ShortcutsBar 组件 - 使用 memo 避免不必要的重绘\ninterface ShortcutsBarProps {\n onSend: (payload: string) => void;\n onFocusEditor?: () => void;\n disabled: boolean;\n isMobile: boolean;\n inputMode: 'direct' | 'editor';\n}\n\nconst ShortcutsBar = memo(function ShortcutsBar({\n onSend,\n onFocusEditor,\n disabled,\n isMobile,\n inputMode,\n}: ShortcutsBarProps) {\n return (\n <div\n className=\"terminal-shortcuts-strip my-2 bg-muted rounded-xl\"\n data-testid=\"terminal-shortcuts-strip\"\n >\n <div\n className=\"shortcut-row flex items-center gap-1.5 p-2 overflow-x-auto scrollbar-thin\"\n data-testid=\"editor-shortcuts-row\"\n >\n {EDITOR_SHORTCUTS.map((shortcut) => (\n <Button\n key={shortcut.key}\n variant=\"secondary\"\n size=\"sm\"\n className=\"h-7 min-w-9 px-2.5 rounded-full text-[11px] font-medium tracking-wide shrink-0 [@media(any-pointer:coarse)]:h-9 [@media(any-pointer:coarse)]:min-w-10 [@media(any-pointer:coarse)]:px-3\"\n title={shortcut.label}\n aria-label={shortcut.label}\n data-testid={`editor-shortcut-${shortcut.key}`}\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n onSend(shortcut.payload);\n if (isMobile && inputMode === 'editor') {\n onFocusEditor?.();\n }\n }}\n disabled={disabled}\n >\n {shortcut.label}\n </Button>\n ))}\n </div>\n </div>\n );\n});\n\nexport default function DevicePage() {\n const { t } = useTranslation();\n const { deviceId, windowId, paneId } = useParams();\n const navigate = useNavigate();\n const terminalContainerRef = useRef<HTMLDivElement>(null);\n const editorContainerRef = useRef<HTMLDivElement | null>(null);\n const editorTextareaRef = useRef<HTMLTextAreaElement | null>(null);\n const terminalRef = useRef<TerminalRef>(null);\n const autoSelected = useRef(false);\n const iosAddressBarCollapseTried = useRef(false);\n // Track user-initiated navigation to prevent auto-redirect overwriting it\n const userInitiatedSelectionRef = useRef<TimedPaneSelection | null>(null);\n\n const selectPane = useTmuxStore((state) => state.selectPane);\n\n const snapshot = useTmuxStore((state) => (deviceId ? state.snapshots[deviceId] : undefined));\n const deviceError = useTmuxStore((state) =>\n deviceId ? state.deviceErrors?.[deviceId] : undefined\n );\n const deviceConnected = useTmuxStore((state) =>\n deviceId ? (state.deviceConnected?.[deviceId] ?? false) : false\n );\n const siteName = useSiteStore((state) => state.settings?.siteName ?? 'tmex');\n\n const resolvedPaneId = useMemo(() => decodePaneIdFromUrlParam(paneId), [paneId]);\n const draftKey = useMemo(\n () => (deviceId && resolvedPaneId ? `${deviceId}:${resolvedPaneId}` : null),\n [deviceId, resolvedPaneId]\n );\n\n const [isMobile, setIsMobile] = useState(false);\n const [editorText, setEditorText] = useState('');\n const [isEditorFocused, setIsEditorFocused] = useState(false);\n const isComposingRef = useRef(false);\n // Loading state - false when connected and has pane\n const isLoading = !deviceConnected || !resolvedPaneId;\n const [keyboardInsetBottom, setKeyboardInsetBottom] = useState(0);\n const [editorDockHeight, setEditorDockHeight] = useState(0);\n const [isSending, setIsSending] = useState(false);\n const inputMode = useUIStore((state) => state.inputMode);\n const uiTheme = useUIStore((state) => state.theme);\n const editorSendWithEnter = useUIStore((state) => state.editorSendWithEnter);\n const setEditorSendWithEnter = useUIStore((state) => state.setEditorSendWithEnter);\n const addEditorHistory = useUIStore((state) => state.addEditorHistory);\n const setEditorDraft = useUIStore((state) => state.setEditorDraft);\n const removeEditorDraft = useUIStore((state) => state.removeEditorDraft);\n const paneEditorDraft = useUIStore((state) =>\n draftKey ? (state.editorDrafts[draftKey] ?? '') : ''\n );\n const isIOSBrowser = useMemo(() => isIOSMobileBrowser(), []);\n const shouldDockEditor = isMobile && inputMode === 'editor' && isIOSBrowser && isEditorFocused;\n\n const windows = snapshot?.session?.windows;\n const terminalTheme = uiTheme === 'light' ? XTERM_THEME_LIGHT : XTERM_THEME_DARK;\n\n const { data: devicesData } = useQuery({\n queryKey: ['devices'],\n queryFn: async () => {\n const res = await fetch('/api/devices');\n if (!res.ok) {\n throw new Error('Failed to fetch devices');\n }\n return res.json() as Promise<{ devices: Device[] }>;\n },\n throwOnError: false,\n });\n\n const currentDevice = useMemo(() => {\n if (!deviceId) {\n return undefined;\n }\n return devicesData?.devices.find((device) => device.id === deviceId);\n }, [deviceId, devicesData?.devices]);\n\n const selectedWindow = useMemo(() => {\n if (!windowId || !windows) return undefined;\n return windows.find((win) => win.id === windowId);\n }, [windowId, windows]);\n\n const selectedPane = useMemo(() => {\n if (!resolvedPaneId || !selectedWindow) return undefined;\n return selectedWindow.panes.find((pane) => pane.id === resolvedPaneId);\n }, [resolvedPaneId, selectedWindow]);\n\n const hasWindowSnapshot = Boolean(windows);\n const isWindowMissing = hasWindowSnapshot && Boolean(windowId) && !selectedWindow;\n const isPaneMissing =\n hasWindowSnapshot &&\n Boolean(windowId) &&\n Boolean(resolvedPaneId) &&\n Boolean(selectedWindow) &&\n !selectedPane;\n\n const invalidSelectionMessage = isWindowMissing\n ? t('wsError.checkGateway')\n : isPaneMissing\n ? t('wsError.checkGateway')\n : null;\n\n const isSelectionInvalid = Boolean(invalidSelectionMessage);\n const canInteractWithPane = Boolean(deviceConnected && resolvedPaneId && !isSelectionInvalid);\n\n const terminalTopbarLabel = useMemo(() => {\n if (!selectedWindow || !selectedPane) {\n return null;\n }\n const deviceName = currentDevice?.name ?? deviceId;\n return buildTerminalLabel({\n paneIdx: selectedPane.index,\n windowIdx: selectedWindow.index,\n paneTitle: selectedPane.title,\n windowName: selectedWindow.name,\n deviceName,\n });\n }, [currentDevice?.name, deviceId, selectedPane, selectedWindow]);\n\n const snapshotActiveSelection = useMemo(() => {\n if (!windows || windows.length === 0) {\n return null;\n }\n const activeWindow = windows.find((win) => win.active);\n const activePane = activeWindow?.panes.find((pane) => pane.active);\n if (!activeWindow || !activePane) {\n return null;\n }\n return { windowId: activeWindow.id, paneId: activePane.id };\n }, [windows]);\n\n // Handle resize from terminal - use store directly to avoid unstable callback deps\n const handleResize = useCallback(\n (cols: number, rows: number) => {\n if (!deviceId || !resolvedPaneId) return;\n useTmuxStore.getState().resizePane(deviceId, resolvedPaneId, cols, rows);\n },\n [deviceId, resolvedPaneId]\n );\n\n // Handle sync from terminal\n const handleSync = useCallback(\n (cols: number, rows: number) => {\n if (!deviceId || !resolvedPaneId) return;\n useTmuxStore.getState().syncPaneSize(deviceId, resolvedPaneId, cols, rows);\n },\n [deviceId, resolvedPaneId]\n );\n\n const getSelectSize = useCallback(\n (targetWindowId?: string, targetPaneId?: string) => {\n const terminal = terminalRef.current;\n const terminalSize =\n terminal?.calculateSizeFromContainer() ?? terminal?.getSize() ?? undefined;\n if (terminalSize) {\n return terminalSize;\n }\n\n if (!targetWindowId || !targetPaneId || !windows) {\n return undefined;\n }\n\n const targetWindow = windows.find((window) => window.id === targetWindowId);\n const targetPane = targetWindow?.panes.find((pane) => pane.id === targetPaneId);\n if (!targetPane || targetPane.width <= 1 || targetPane.height <= 1) {\n return undefined;\n }\n\n return {\n cols: targetPane.width,\n rows: targetPane.height,\n };\n },\n [windows]\n );\n\n // Mobile detection\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768 || 'ontouchstart' in window);\n };\n\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // iOS address bar collapse\n useEffect(() => {\n if (!isMobile || !isIOSBrowser || iosAddressBarCollapseTried.current) {\n return;\n }\n\n iosAddressBarCollapseTried.current = true;\n const collapseAddressBar = () => {\n window.scrollTo(0, 1);\n };\n\n const rafId = window.requestAnimationFrame(collapseAddressBar);\n const timerA = window.setTimeout(collapseAddressBar, 120);\n const timerB = window.setTimeout(collapseAddressBar, 420);\n\n return () => {\n window.cancelAnimationFrame(rafId);\n window.clearTimeout(timerA);\n window.clearTimeout(timerB);\n };\n }, [isIOSBrowser, isMobile]);\n\n // Reset editor focus when switching modes\n useEffect(() => {\n if (inputMode !== 'editor') {\n setIsEditorFocused(false);\n }\n }, [inputMode]);\n\n // iOS keyboard inset handling\n useEffect(() => {\n if (!(isMobile && isIOSBrowser && inputMode === 'editor' && isEditorFocused)) {\n setKeyboardInsetBottom(0);\n return;\n }\n\n let frameId: number | null = null;\n const updateKeyboardInset = () => {\n const viewport = window.visualViewport;\n const viewportHeight = viewport?.height ?? window.innerHeight;\n const offsetTop = viewport?.offsetTop ?? 0;\n const nextInset = Math.max(0, Math.round(window.innerHeight - viewportHeight - offsetTop));\n setKeyboardInsetBottom(nextInset);\n };\n\n const scheduleUpdate = () => {\n if (frameId !== null) {\n return;\n }\n\n frameId = window.requestAnimationFrame(() => {\n frameId = null;\n updateKeyboardInset();\n });\n };\n\n updateKeyboardInset();\n\n window.visualViewport?.addEventListener('resize', scheduleUpdate);\n window.visualViewport?.addEventListener('scroll', scheduleUpdate);\n window.addEventListener('resize', scheduleUpdate);\n\n return () => {\n window.visualViewport?.removeEventListener('resize', scheduleUpdate);\n window.visualViewport?.removeEventListener('scroll', scheduleUpdate);\n window.removeEventListener('resize', scheduleUpdate);\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n };\n }, [inputMode, isEditorFocused, isIOSBrowser, isMobile]);\n\n // Editor dock height handling\n useEffect(() => {\n if (!shouldDockEditor) {\n setEditorDockHeight(0);\n return;\n }\n\n const editorContainer = editorContainerRef.current;\n if (!editorContainer) {\n return;\n }\n\n const updateEditorHeight = () => {\n setEditorDockHeight(Math.ceil(editorContainer.getBoundingClientRect().height));\n };\n\n updateEditorHeight();\n const observer = new ResizeObserver(updateEditorHeight);\n observer.observe(editorContainer);\n\n return () => observer.disconnect();\n }, [shouldDockEditor]);\n\n // Ensure device is connected when viewing (GlobalDeviceProvider handles actual connection)\n // This effect resets auto-selection logic and related refs when deviceId changes\n useEffect(() => {\n if (!deviceId) return;\n autoSelected.current = false;\n lastHandledActiveRef.current = null;\n lastSnapshotActiveRef.current = null;\n userInitiatedSelectionRef.current = null;\n recentSelectRequestsRef.current = [];\n }, [deviceId]);\n\n // Reset autoSelected when device connection changes\n useEffect(() => {\n if (!deviceConnected) {\n autoSelected.current = false;\n }\n }, [deviceConnected]);\n\n // Handle window/pane changes - both external and from sidebar navigation\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windowId) return;\n\n // If snapshot not yet arrived, don't navigate (loading state)\n if (!windows) {\n return;\n }\n\n // If no windows left (all closed), navigate to fallback\n if (windows.length === 0) {\n navigate('/devices', { replace: true });\n return;\n }\n\n // Find the target window\n const targetWindow = windows.find((w) => w.id === windowId);\n if (!targetWindow) {\n // Window doesn't exist in snapshot yet.\n // Wait for snapshot to arrive. Don't redirect to another window,\n // as the user may have explicitly navigated to this specific window.\n return;\n }\n\n // If no paneId in URL, select the active pane in this window\n if (!resolvedPaneId) {\n const targetPane = targetWindow.panes.find((p) => p.active) ?? targetWindow.panes[0];\n if (targetPane) {\n navigate(\n `/devices/${deviceId}/windows/${windowId}/panes/${encodePaneIdForUrl(targetPane.id)}`,\n { replace: true }\n );\n }\n return;\n }\n\n // Check if current pane exists in the window\n const currentPane = targetWindow.panes.find((p) => p.id === resolvedPaneId);\n if (!currentPane) {\n // Pane was closed, navigate to active pane in same window\n const activePane = targetWindow.panes.find((p) => p.active) ?? targetWindow.panes[0];\n if (activePane) {\n navigate(\n `/devices/${deviceId}/windows/${windowId}/panes/${encodePaneIdForUrl(activePane.id)}`,\n { replace: true }\n );\n }\n return;\n }\n }, [deviceId, deviceConnected, windows, windowId, resolvedPaneId, navigate]);\n\n // Auto-select pane on initial load only\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windows || windows.length === 0) return;\n // If we already have window and pane selected, skip\n if (windowId && resolvedPaneId) return;\n // If autoSelect already done, skip\n if (autoSelected.current) return;\n\n // Select the active window's active pane (initial load)\n const activeWindow = windows.find((win) => win.active) ?? windows[0];\n const activePane = activeWindow.panes.find((pane) => pane.active) ?? activeWindow.panes[0];\n if (!activePane) return;\n\n autoSelected.current = true;\n navigate(\n `/devices/${deviceId}/windows/${activeWindow.id}/panes/${encodePaneIdForUrl(activePane.id)}`,\n { replace: true }\n );\n }, [deviceConnected, deviceId, navigate, resolvedPaneId, windowId, windows]);\n\n // Select pane when ready\n useEffect(() => {\n if (!deviceId || !windowId || !resolvedPaneId) return;\n // Allow sending TMUX_SELECT before WS is READY: borsh client will queue messages and flush on READY.\n // Note: We don't check isSelectionInvalid here because when user navigates via URL,\n // the snapshot may not yet reflect the new window, but we should still send the select command.\n if (isLoading || !deviceConnected) return;\n\n // Short-circuit: if already selected, don't send again\n const currentSelected = useTmuxStore.getState().selectedPanes[deviceId];\n if (\n currentSelected &&\n currentSelected.windowId === windowId &&\n currentSelected.paneId === resolvedPaneId\n ) {\n return;\n }\n\n const size = getSelectSize(windowId, resolvedPaneId);\n recordSelectRequest(windowId, resolvedPaneId);\n selectPane(deviceId, windowId, resolvedPaneId, size);\n }, [deviceConnected, deviceId, getSelectSize, isLoading, resolvedPaneId, selectPane, windowId]);\n\n // Treat explicit route selection as authoritative until snapshot/runtime catches up.\n useEffect(() => {\n if (!deviceId || !deviceConnected || !windowId || !resolvedPaneId) {\n return;\n }\n\n const routeTarget = { windowId, paneId: resolvedPaneId };\n if (\n !shouldTrackPendingRouteSelection({\n routeTarget,\n snapshotActive: snapshotActiveSelection,\n pendingUserSelection: userInitiatedSelectionRef.current,\n })\n ) {\n return;\n }\n\n userInitiatedSelectionRef.current = {\n windowId: routeTarget.windowId,\n paneId: routeTarget.paneId,\n at: Date.now(),\n };\n }, [deviceConnected, deviceId, resolvedPaneId, snapshotActiveSelection, windowId]);\n\n const recentSelectRequestsRef = useRef<Array<{ windowId: string; paneId: string; at: number }>>(\n []\n );\n const recordSelectRequest = useCallback((windowId: string, paneId: string) => {\n const now = Date.now();\n const next = [\n ...recentSelectRequestsRef.current.filter((r) => now - r.at < 2000),\n { windowId, paneId, at: now },\n ];\n recentSelectRequestsRef.current = next.slice(-8);\n }, []);\n\n // Subscribe to activePaneFromEvent for this device\n const activePaneFromEvent = useTmuxStore((state) =>\n deviceId ? state.activePaneFromEvent[deviceId] : undefined\n );\n\n // Follow active pane from event/tmux pane-active\n const lastHandledActiveRef = useRef<{ windowId: string; paneId: string } | null>(null);\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windowId || !resolvedPaneId) return;\n if (!activePaneFromEvent) return;\n\n const now = Date.now();\n const pendingUserSelection = resolvePendingUserSelection(\n userInitiatedSelectionRef.current,\n now\n );\n userInitiatedSelectionRef.current = pendingUserSelection;\n\n if (\n shouldIgnoreActivePaneEvent({\n now,\n pendingUserSelection,\n activePaneFromEvent,\n currentRoute: { windowId, paneId: resolvedPaneId },\n recentSelectRequests: recentSelectRequestsRef.current,\n lastHandledActive: lastHandledActiveRef.current,\n })\n ) {\n return;\n }\n\n lastHandledActiveRef.current = { ...activePaneFromEvent };\n if (\n pendingUserSelection &&\n pendingUserSelection.windowId === activePaneFromEvent.windowId &&\n pendingUserSelection.paneId === activePaneFromEvent.paneId\n ) {\n userInitiatedSelectionRef.current = null;\n }\n\n // Send selectPane to gateway first\n const size = getSelectSize(activePaneFromEvent.windowId, activePaneFromEvent.paneId);\n recordSelectRequest(activePaneFromEvent.windowId, activePaneFromEvent.paneId);\n selectPane(deviceId, activePaneFromEvent.windowId, activePaneFromEvent.paneId, size);\n\n // Navigate to new URL\n navigate(\n `/devices/${deviceId}/windows/${activePaneFromEvent.windowId}/panes/${encodePaneIdForUrl(activePaneFromEvent.paneId)}`,\n { replace: true }\n );\n }, [\n deviceId,\n deviceConnected,\n windowId,\n resolvedPaneId,\n activePaneFromEvent,\n recordSelectRequest,\n getSelectSize,\n selectPane,\n navigate,\n ]);\n\n // Fallback: follow active from snapshot (for environments without pane-active event)\n const lastSnapshotActiveRef = useRef<{ windowId: string; paneId: string } | null>(null);\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windows || windows.length === 0) return;\n\n // Avoid snapshot-driven \"bounce back\" shortly after we send TMUX_SELECT.\n const recentRequests = recentSelectRequestsRef.current;\n const activeWindow = windows.find((w) => w.active);\n if (!activeWindow) return;\n\n const activePane = activeWindow.panes.find((p) => p.active);\n if (!activePane) return;\n\n const currentActive = { windowId: activeWindow.id, paneId: activePane.id };\n const now = Date.now();\n const pendingUserSelection = resolvePendingUserSelection(\n userInitiatedSelectionRef.current,\n now\n );\n userInitiatedSelectionRef.current = pendingUserSelection;\n\n if (\n shouldSkipSnapshotFollow({\n now,\n pendingUserSelection,\n snapshotActive: currentActive,\n recentSelectRequests: recentRequests,\n })\n ) {\n return;\n }\n\n // Only follow when active actually changes\n if (\n lastSnapshotActiveRef.current &&\n lastSnapshotActiveRef.current.windowId === currentActive.windowId &&\n lastSnapshotActiveRef.current.paneId === currentActive.paneId\n ) {\n return;\n }\n\n // Update ref\n lastSnapshotActiveRef.current = { ...currentActive };\n if (\n pendingUserSelection &&\n pendingUserSelection.windowId === currentActive.windowId &&\n pendingUserSelection.paneId === currentActive.paneId\n ) {\n userInitiatedSelectionRef.current = null;\n }\n\n // If current URL matches, no need to navigate\n if (windowId === currentActive.windowId && resolvedPaneId === currentActive.paneId) {\n return;\n }\n\n // Send selectPane and navigate\n const size = getSelectSize(currentActive.windowId, currentActive.paneId);\n recordSelectRequest(currentActive.windowId, currentActive.paneId);\n selectPane(deviceId, currentActive.windowId, currentActive.paneId, size);\n navigate(\n `/devices/${deviceId}/windows/${currentActive.windowId}/panes/${encodePaneIdForUrl(currentActive.paneId)}`,\n { replace: true }\n );\n }, [\n deviceId,\n deviceConnected,\n windows,\n windowId,\n resolvedPaneId,\n recordSelectRequest,\n getSelectSize,\n selectPane,\n navigate,\n ]);\n\n // Force-follow snapshot active after a user-initiated createWindow.\n // Wait for a snapshot whose active differs from the URL (proving the new\n // window is reflected), then navigate there.\n const pendingCreateWindowAt = useTmuxStore((state) =>\n deviceId ? state.pendingCreateWindowAt[deviceId] : undefined\n );\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!pendingCreateWindowAt) return;\n\n const ttlMs = 5000;\n const elapsed = Date.now() - pendingCreateWindowAt;\n if (elapsed > ttlMs) {\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n return;\n }\n\n if (!snapshotActiveSelection) {\n const timer = window.setTimeout(() => {\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n }, ttlMs - elapsed);\n return () => window.clearTimeout(timer);\n }\n\n const target = snapshotActiveSelection;\n if (windowId === target.windowId && resolvedPaneId === target.paneId) {\n const timer = window.setTimeout(() => {\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n }, ttlMs - elapsed);\n return () => window.clearTimeout(timer);\n }\n\n userInitiatedSelectionRef.current = {\n windowId: target.windowId,\n paneId: target.paneId,\n at: Date.now(),\n };\n const size = getSelectSize(target.windowId, target.paneId);\n recordSelectRequest(target.windowId, target.paneId);\n selectPane(deviceId, target.windowId, target.paneId, size);\n navigate(\n `/devices/${deviceId}/windows/${target.windowId}/panes/${encodePaneIdForUrl(target.paneId)}`,\n { replace: true }\n );\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n }, [\n deviceId,\n deviceConnected,\n pendingCreateWindowAt,\n snapshotActiveSelection,\n windowId,\n resolvedPaneId,\n recordSelectRequest,\n getSelectSize,\n selectPane,\n navigate,\n ]);\n\n // Sync pane size from remote\n useEffect(() => {\n if (!canInteractWithPane || !selectedPane || isLoading) return;\n\n const terminal = terminalRef.current;\n const term = terminal?.getTerminal();\n if (!term) return;\n\n const remoteCols = Math.max(2, Math.floor(selectedPane.width || 0));\n const remoteRows = Math.max(2, Math.floor(selectedPane.height || 0));\n if (!remoteCols || !remoteRows) return;\n\n const now = Date.now();\n const remoteSize = { cols: remoteCols, rows: remoteRows };\n const pendingLocalSize = terminal?.getPendingLocalSize() ?? null;\n if (\n !shouldApplyRemotePaneSize({\n now,\n remoteSize,\n pendingLocalSize,\n })\n ) {\n return;\n }\n\n if (term.cols === remoteCols && term.rows === remoteRows) {\n return;\n }\n\n term.resize(remoteCols, remoteRows);\n }, [canInteractWithPane, isLoading, selectedPane]);\n\n // Scroll to bottom on input mode change\n useEffect(() => {\n void inputMode;\n const rafId = window.requestAnimationFrame(() => {\n terminalRef.current?.scrollToBottom();\n });\n const timerId = window.setTimeout(() => {\n terminalRef.current?.scrollToBottom();\n }, 120);\n\n return () => {\n window.cancelAnimationFrame(rafId);\n window.clearTimeout(timerId);\n };\n }, [inputMode]);\n\n // Device error toast\n useEffect(() => {\n if (!deviceError?.message) {\n return;\n }\n\n toast.error(deviceError.message);\n }, [deviceError?.message]);\n\n // Page title\n useEffect(() => {\n document.title = buildBrowserTitle(terminalTopbarLabel);\n return () => {\n document.title = siteName;\n };\n }, [siteName, terminalTopbarLabel]);\n\n // Jump to latest event\n useEffect(() => {\n const handler = () => {\n terminalRef.current?.scrollToBottom();\n };\n\n window.addEventListener('tmex:jump-to-latest', handler as EventListener);\n return () => {\n window.removeEventListener('tmex:jump-to-latest', handler as EventListener);\n };\n }, []);\n\n // Listen for user-initiated selection from sidebar\n useEffect(() => {\n const handler = (\n event: CustomEvent<{ deviceId: string; windowId: string; paneId: string }>\n ) => {\n const { deviceId: eventDeviceId, windowId, paneId } = event.detail;\n // Only track if it's for the current device\n // Note: when switching devices, refs are reset in the deviceId effect above\n if (eventDeviceId === deviceId) {\n userInitiatedSelectionRef.current = { windowId, paneId, at: Date.now() };\n }\n };\n\n window.addEventListener('tmex:user-initiated-selection', handler as EventListener);\n return () => {\n window.removeEventListener('tmex:user-initiated-selection', handler as EventListener);\n };\n }, [deviceId]);\n\n // Sync editor draft\n useEffect(() => {\n setEditorText(paneEditorDraft);\n }, [paneEditorDraft]);\n\n const handleSendShortcut = useCallback(\n (payload: string) => {\n if (!deviceId || !resolvedPaneId || !canInteractWithPane) {\n return;\n }\n\n // Send directly to the terminal's input handler\n const store = useTmuxStore.getState();\n store.sendInput(deviceId, resolvedPaneId, payload, false);\n },\n [canInteractWithPane, deviceId, resolvedPaneId]\n );\n\n const handleEditorSend = useCallback(() => {\n if (!canInteractWithPane) {\n toast.error(t('wsError.checkGateway'));\n return;\n }\n if (!deviceId || !resolvedPaneId) return;\n if (!editorText.trim()) return;\n\n setIsSending(true);\n window.setTimeout(() => setIsSending(false), 150);\n\n const payload = editorSendWithEnter ? `${editorText}\\r` : editorText;\n const store = useTmuxStore.getState();\n store.sendInput(deviceId, resolvedPaneId, payload, false);\n addEditorHistory(editorText);\n if (draftKey) {\n removeEditorDraft(draftKey);\n }\n setEditorText('');\n }, [\n addEditorHistory,\n canInteractWithPane,\n deviceId,\n draftKey,\n editorSendWithEnter,\n editorText,\n removeEditorDraft,\n resolvedPaneId,\n t,\n ]);\n\n const handleEditorSendLineByLine = useCallback(() => {\n if (!canInteractWithPane) {\n toast.error(t('wsError.checkGateway'));\n return;\n }\n if (!deviceId || !resolvedPaneId) return;\n if (!editorText.trim()) return;\n\n setIsSending(true);\n window.setTimeout(() => setIsSending(false), 150);\n\n const lines = editorText.split(/\\r?\\n/);\n const store = useTmuxStore.getState();\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n store.sendInput(deviceId, resolvedPaneId, `${line}\\r`, false);\n }\n\n addEditorHistory(editorText);\n if (draftKey) {\n removeEditorDraft(draftKey);\n }\n setEditorText('');\n }, [\n addEditorHistory,\n canInteractWithPane,\n deviceId,\n draftKey,\n editorText,\n removeEditorDraft,\n resolvedPaneId,\n t,\n ]);\n\n const handleEditorFocus = useCallback(\n (event: FocusEvent<HTMLTextAreaElement>) => {\n setIsEditorFocused(true);\n\n if (!(isMobile && isIOSBrowser)) {\n return;\n }\n\n const target = event.currentTarget;\n window.requestAnimationFrame(() => {\n target.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n });\n window.setTimeout(() => {\n window.scrollTo(0, 1);\n }, 60);\n },\n [isIOSBrowser, isMobile]\n );\n\n const handleEditorBlur = useCallback(() => {\n setIsEditorFocused(false);\n }, []);\n\n // 聚焦编辑器回调 - 必须在所有早期 return 之前定义\n const handleFocusEditor = useCallback(() => {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }, []);\n\n if (!deviceId) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <div className=\"rounded-lg border border-dashed border-border px-4 py-3 text-sm text-muted-foreground\">\n {t('device.noDevices')}\n </div>\n </div>\n );\n }\n\n const showConnecting = !deviceConnected && !deviceError;\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-background\" data-testid=\"device-page\">\n <div\n className={`flex-1 relative overflow-hidden min-h-0 min-w-0 ${\n isMobile && inputMode === 'editor' && !shouldDockEditor ? 'pb-1' : ''\n }`}\n style={{\n paddingBottom: shouldDockEditor ? `${editorDockHeight + 60}px` : undefined,\n }}\n >\n <div\n className=\"h-full px-3 py-1 min-h-0 min-w-0 w-full relative flex rounded-xl\"\n style={{ backgroundColor: terminalTheme.background }}\n >\n {deviceConnected && resolvedPaneId ? (\n <div ref={terminalContainerRef} className=\"flex-1 h-full min-h-0 w-full\">\n <TerminalComponent\n key={`${deviceId}:${resolvedPaneId}`}\n ref={terminalRef}\n deviceId={deviceId}\n paneId={resolvedPaneId}\n theme={uiTheme}\n inputMode={inputMode}\n deviceConnected={deviceConnected}\n isSelectionInvalid={isSelectionInvalid}\n onResize={handleResize}\n onSync={handleSync}\n />\n </div>\n ) : (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center p-8 text-center\">\n <div className=\"max-w-sm space-y-4\">\n {!deviceConnected ? (\n <>\n <div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mx-auto\">\n <span className=\"text-2xl text-muted-foreground\">🔌</span>\n </div>\n <h3 className=\"text-lg font-medium\">{t('device.disconnected')}</h3>\n <p className=\"text-sm text-muted-foreground\">{t('device.connectToStart')}</p>\n </>\n ) : !windowId ? (\n <>\n <div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mx-auto\">\n <span className=\"text-2xl text-muted-foreground\">📋</span>\n </div>\n <h3 className=\"text-lg font-medium\">{t('window.noWindowSelected')}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {t('window.selectWindowToStart')}\n </p>\n </>\n ) : (\n <>\n <div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mx-auto\">\n <Loader2 className=\"h-6 w-6 text-muted-foreground animate-spin\" />\n </div>\n <h3 className=\"text-lg font-medium\">{t('terminal.connecting')}</h3>\n </>\n )}\n </div>\n </div>\n )}\n </div>\n\n {showConnecting && (\n <div\n className=\"absolute inset-0 flex items-center justify-center bg-background/85 backdrop-blur-sm\"\n data-testid=\"terminal-status-overlay\"\n >\n <div className=\"flex flex-col items-center gap-2 rounded-lg border border-border bg-card/90 px-4 py-3 shadow-sm\">\n <div className=\"h-7 w-7 rounded-full border-2 border-primary border-t-transparent animate-spin\" />\n <span className=\"text-xs text-muted-foreground\" data-testid=\"terminal-status-text\">\n {t('terminal.connecting')}\n </span>\n </div>\n </div>\n )}\n </div>\n\n {/* 快捷键栏:PC端和移动端 direct 模式都在终端下方 */}\n {inputMode === 'direct' && (\n <div className=\"\">\n <ShortcutsBar\n onSend={handleSendShortcut}\n disabled={!canInteractWithPane}\n isMobile={isMobile}\n inputMode={inputMode}\n />\n </div>\n )}\n\n {inputMode === 'editor' && (\n <div\n ref={editorContainerRef}\n className={`editor-mode-input bg-card/85 backdrop-blur-sm ${\n shouldDockEditor ? 'fixed left-0 right-0 z-50' : ''\n }`}\n style={shouldDockEditor ? { bottom: `${keyboardInsetBottom}px` } : undefined}\n >\n {/* 移动端 editor 模式:快捷键栏在编辑器上方 */}\n {isMobile && (\n <ShortcutsBar\n onSend={handleSendShortcut}\n onFocusEditor={handleFocusEditor}\n disabled={!canInteractWithPane}\n isMobile={isMobile}\n inputMode={inputMode}\n />\n )}\n <textarea\n ref={editorTextareaRef}\n data-testid=\"editor-input\"\n className=\"min-h-[88px] max-h-[28vh] w-full resize-y rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground shadow-xs outline-none transition-colors focus:border-ring\"\n value={editorText}\n onChange={(e) => {\n const nextText = e.target.value;\n setEditorText(nextText);\n if (!draftKey) {\n return;\n }\n if (nextText) {\n setEditorDraft(draftKey, nextText);\n return;\n }\n removeEditorDraft(draftKey);\n }}\n placeholder={t('terminal.inputPlaceholder')}\n onFocus={handleEditorFocus}\n onBlur={handleEditorBlur}\n onCompositionStart={() => {\n isComposingRef.current = true;\n }}\n onCompositionEnd={() => {\n isComposingRef.current = false;\n }}\n />\n <div className=\"actions mt-2\">\n <div\n className=\"send-row flex flex-wrap items-center justify-end gap-2\"\n data-testid=\"editor-send-row\"\n >\n <div\n className=\"send-with-enter-toggle mr-auto flex items-center gap-2 text-xs text-muted-foreground\"\n data-testid=\"editor-send-with-enter-toggle\"\n >\n <Switch\n size=\"sm\"\n checked={editorSendWithEnter}\n onCheckedChange={(checked) => setEditorSendWithEnter(Boolean(checked))}\n />\n <span>{t('terminal.editorSendWithEnter')}</span>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n data-testid=\"editor-clear\"\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n setEditorText('');\n if (draftKey) {\n removeEditorDraft(draftKey);\n }\n if (isMobile && inputMode === 'editor') {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }\n }}\n title={t('terminal.clear')}\n >\n <Trash2 className=\"h-4 w-4\" />\n {t('terminal.clear')}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n data-testid=\"editor-send-line-by-line\"\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n handleEditorSendLineByLine();\n if (isMobile && inputMode === 'editor') {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }\n }}\n disabled={!canInteractWithPane || isSending}\n >\n {isSending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n {t('terminal.editorSendLineByLine')}\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n data-testid=\"editor-send\"\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n handleEditorSend();\n if (isMobile && inputMode === 'editor') {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }\n }}\n disabled={!canInteractWithPane || isSending}\n >\n {isSending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n {t('common.send')}\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// Page title component - shows terminal label\nexport function PageTitle() {\n const { deviceId, windowId, paneId } = useParams();\n const resolvedPaneId = paneId ? decodePaneIdFromUrlParam(paneId) : undefined;\n const snapshots = useTmuxStore((state) => state.snapshots);\n const siteName = useSiteStore((state) => state.settings?.siteName ?? 'tmex');\n\n const snapshot = deviceId ? snapshots[deviceId] : undefined;\n const selectedWindow = useMemo(() => {\n if (!windowId || !snapshot?.session?.windows) return undefined;\n return snapshot.session.windows.find((w) => w.id === windowId);\n }, [windowId, snapshot]);\n\n const selectedPane = useMemo(() => {\n if (!resolvedPaneId || !selectedWindow) return undefined;\n return selectedWindow.panes.find((p) => p.id === resolvedPaneId);\n }, [resolvedPaneId, selectedWindow]);\n\n const title = useMemo(() => {\n if (selectedWindow && selectedPane) {\n return buildTerminalLabel({\n paneIdx: selectedPane.index,\n windowIdx: selectedWindow.index,\n paneTitle: selectedPane.title,\n windowName: selectedWindow.name,\n deviceName: siteName,\n });\n }\n return deviceId ?? '';\n }, [selectedWindow, selectedPane, siteName, deviceId]);\n\n return <>{title}</>;\n}\n\n// Page actions component - shows input mode toggle, jump to latest and refresh page\nexport function PageActions() {\n const { t } = useTranslation();\n const { deviceId, paneId } = useParams();\n const resolvedPaneId = paneId ? decodePaneIdFromUrlParam(paneId) : undefined;\n const inputMode = useUIStore((state) => state.inputMode);\n const setInputMode = useUIStore((state) => state.setInputMode);\n const deviceConnected = useTmuxStore((state) =>\n deviceId ? (state.deviceConnected?.[deviceId] ?? false) : false\n );\n\n const [showRefreshConfirm, setShowRefreshConfirm] = useState(false);\n\n const canInteract = Boolean(resolvedPaneId && deviceConnected);\n\n const handleToggleInputMode = () => {\n const newMode = inputMode === 'direct' ? 'editor' : 'direct';\n setInputMode(newMode);\n };\n\n const handleJumpToLatest = () => {\n window.dispatchEvent(new CustomEvent('tmex:jump-to-latest'));\n };\n\n const handleRefreshClick = () => {\n setShowRefreshConfirm(true);\n };\n\n const handleConfirmRefresh = () => {\n window.location.reload();\n };\n\n return (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleRefreshClick}\n aria-label={t('nav.refreshPage')}\n title={t('nav.refreshPage')}\n >\n <RefreshCw className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleToggleInputMode}\n disabled={!canInteract}\n data-testid=\"terminal-input-mode-toggle\"\n aria-label={inputMode === 'direct' ? t('nav.switchToEditor') : t('nav.switchToDirect')}\n title={inputMode === 'direct' ? t('nav.switchToEditor') : t('nav.switchToDirect')}\n >\n {inputMode === 'direct' ? (\n <Keyboard className=\"h-4 w-4\" />\n ) : (\n <Smartphone className=\"h-4 w-4\" />\n )}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleJumpToLatest}\n disabled={!canInteract}\n aria-label={t('nav.jumpToLatest')}\n title={t('nav.jumpToLatest')}\n >\n <ArrowDownToLine className=\"h-4 w-4\" />\n </Button>\n\n <AlertDialog open={showRefreshConfirm} onOpenChange={setShowRefreshConfirm}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{t('nav.refreshPage')}</AlertDialogTitle>\n <AlertDialogDescription>{t('nav.refreshPageConfirm')}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel onClick={() => setShowRefreshConfirm(false)}>\n {t('common.cancel')}\n </AlertDialogCancel>\n <AlertDialogAction onClick={handleConfirmRefresh}>\n {t('common.confirm')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n"],"names":["__iconNode","ArrowDownToLine","createLucideIcon","Keyboard","RefreshCw","Smartphone","colorToCss","color","ensureContext","canvas","context","CanvasRenderer","options","__publicField","layer","theme","frame","targetRows","row","cols","rows","nextCols","nextRows","width","height","dpr","cssWidth","cssHeight","rects","rect","colors","y","defaultBackground","cell","x","bg","fg","cellWidth","meta","cursor","previous","cursorColor","cssColor","style","key","cached","font","css","KEY_UNIDENTIFIED","KEY_CODE_MAP","UNSHIFTED_CODEPOINTS","index","uppercase","lowercase","getGhosttyKeyCode","code","getUnshiftedCodepoint","value","GHOSTTY_SUCCESS","GHOSTTY_INVALID_VALUE","GHOSTTY_RENDER_STATE_DATA_COLS","GHOSTTY_RENDER_STATE_DATA_ROWS","GHOSTTY_RENDER_STATE_DATA_DIRTY","GHOSTTY_RENDER_STATE_DATA_CURSOR_VISUAL_STYLE","GHOSTTY_RENDER_STATE_DATA_CURSOR_VISIBLE","GHOSTTY_RENDER_STATE_DATA_CURSOR_BLINKING","GHOSTTY_RENDER_STATE_DATA_CURSOR_PASSWORD_INPUT","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_X","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_Y","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_WIDE_TAIL","GHOSTTY_RENDER_STATE_ROW_DATA_DIRTY","GHOSTTY_RENDER_STATE_ROW_DATA_RAW","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_RAW","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_STYLE","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_LEN","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_BUF","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_BG_COLOR","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_FG_COLOR","GHOSTTY_ROW_DATA_WRAP","GHOSTTY_ROW_DATA_WRAP_CONTINUATION","GHOSTTY_CELL_DATA_WIDE","GHOSTTY_CELL_DATA_HAS_TEXT","ensureActive","resources","resultToDirtyState","resultToCursorStyle","resultToCellWidthKind","readColorAt","bindings","ptr","readOptionalColor","read","result","readBool","readU16","readU32","readEnumI32","readU64","readStyle","field","name","readCodepoints","graphemeLen","bufPtr","codepoints","codepointsToText","buildRowText","cells","text","readMeta","paletteOffset","palette","colorOffset","cursorHasValue","cursorViewportHasValue","readRow","rowIndex","rawRow","rawCell","widthKind","createRenderState","updateRenderState","terminalHandle","readRenderSnapshotMeta","iterateRows","disposeRenderStateResources","clampColumn","lineText","col","normalizeRange","anchor","focus","expandWord","line","safeCol","isWordChar","cursorChar","start","end","expandLine","lastCol","pointForMode","point","mode","getLineText","createEmptySelectionState","hasSelection","state","clearSelection","resolvePointerSelection","_previous","expanded","updateSelectionFocus","getSelectionRange","serializeSelectionText","range","segments","projectSelectionRects","viewportStartLine","viewportRows","viewportEndLine","lineWidth","middleWidth","hasCopyModifier","event","isCopyShortcut","writeSelectionToClipboard","_a","writeSelectionToCopyEvent","ghosttyWasmUrl","GHOSTTY_OUT_OF_SPACE","GHOSTTY_TERMINAL_OPT_COLOR_FOREGROUND","GHOSTTY_TERMINAL_OPT_COLOR_BACKGROUND","GHOSTTY_TERMINAL_OPT_COLOR_CURSOR","GHOSTTY_TERMINAL_OPT_COLOR_PALETTE","GHOSTTY_TERMINAL_DATA_COLS","GHOSTTY_TERMINAL_DATA_ROWS","GHOSTTY_TERMINAL_DATA_SCROLLBAR","GHOSTTY_POINT_TAG_VIEWPORT","GHOSTTY_SCROLL_VIEWPORT_TOP","GHOSTTY_SCROLL_VIEWPORT_BOTTOM","GHOSTTY_SCROLL_VIEWPORT_DELTA","GHOSTTY_KEY_ACTION_RELEASE","GHOSTTY_KEY_ACTION_PRESS","GHOSTTY_KEY_ACTION_REPEAT","GHOSTTY_MOUSE_ENCODER_OPT_TRACK_LAST_CELL","GHOSTTY_MODE_BRACKETED_PASTE","GHOSTTY_MODE_X10_MOUSE","GHOSTTY_MODE_NORMAL_MOUSE","GHOSTTY_MODE_BUTTON_MOUSE","GHOSTTY_MODE_ANY_MOUSE","GHOSTTY_MODE_UTF8_MOUSE","GHOSTTY_MODE_SGR_MOUSE","GHOSTTY_MODE_URXVT_MOUSE","GHOSTTY_MODE_SGR_PIXELS_MOUSE","bindingsPromise","assertResult","action","parseHexRgb","hex","normalized","createAnsi256Palette","cube","red","green","blue","encodeMouseModifierBits","mods","encoded","encodeX10Byte","mouseButtonCode","button","keyboardEventToGhosttyMods","_b","StructAllocation","typeName","GhosttyBindings","exports","layout","len","type","fieldName","target","offset","data","scrollback","termPtrPtr","terminal","bytes","allocation","delta","behavior","foreground","background","paletteColors","palettePtr","assignRgb","paletteBytes","colsPtr","rowsPtr","scrollbar","valuePtr","enabled","emit","formatterOptions","extraOffset","extraView","screenOffset","screenView","outFormatterPtr","selectionOffset","formatter","outRef","coordOffset","coordView","safeCols","safeRows","selection","startOffset","endOffset","viewport","terminalSize","outPtrPtr","outLenPtr","outPtr","outLen","memoryByteLength","outStatePtr","option","outColorsPtr","outIteratorPtr","iterator","outCellsPtr","outEncoderPtr","encoder","trackLastCellPtr","trackingAny","trackingButton","trackingNormal","trackingX10","baseCode","column","pixelX","pixelY","suffix","encodedCode","encodedColumn","encodedRow","eventPtrPtr","eventHandle","utf8Allocation","requiredPtr","sizeResult","required","bufferPtr","writtenPtr","written","input","bracketed","outputPtr","loadGhosttyWasmBytes","source","response","getGhosttyBindings","wasmBytes","typeJsonPtr","DEFAULT_COLS","DEFAULT_ROWS","DEFAULT_CELL_WIDTH","DEFAULT_CELL_HEIGHT","AUTO_SCROLL_INTERVAL_MS","TERMINAL_ENGINE","GHOSTTY_MODE_ALT_SCROLL","GHOSTTY_MODE_ALT_SCREEN","GHOSTTY_MODE_ALT_SCREEN_SAVE","MOUSE_TRACKING_MODES","GHOSTTY_MOUSE_BUTTON_LEFT","GHOSTTY_MOUSE_BUTTON_MIDDLE","GHOSTTY_MOUSE_BUTTON_RIGHT","GHOSTTY_MOUSE_BUTTON_FOUR","GHOSTTY_MOUSE_BUTTON_FIVE","BufferLine","content","trimRight","TerminalBuffer","relativeIndex","viewportY","baseY","length","lines","shouldEncodeOnKeyDown","normalizeVisibleLines","expectedRows","pointerLikeEventToGhosttyMods","FitAddon","GhosttyTerminalController","proposed","keyEncoderHandle","mouseEncoderHandle","renderState","error","container","root","screen","textarea","scrollbarTrack","scrollbarThumb","measured","addon","callback","prevAltScreen","nextAltScreen","amount","snapshot","gesture","routing","consumed","disabled","element","dragEventTarget","moveListener","upListener","selectionText","payload","finalData","recentCompositionCommit","keyCode","utf8","mouseReporting","altScreen","cellHeight","pageLines","scaled","buttons","clientX","clientY","position","listener","cursorX","cursorY","left","top","selectionRects","visibleLines","thumb","trackHeight","ratio","thumbHeight","thumbTop","probe","repaint","resetSelectionData","shouldClear","_c","_d","detail","relativeX","relativeY","maxCol","maxRow","visibleIndex","visibleRow","dispose","createTerminalController","XTERM_THEME_LIGHT","XTERM_THEME_DARK","XTERM_FONT_FAMILY","normalizeHistoryForTerminal","canonical","ALT_SCREEN_HISTORY_PREAMBLE","wrapAlternateScreenHistory","normalizeLiveOutputForTerminal","previousEndedWithCR","prevWasCR","extraCRCount","byte","endedWithCR","writeIndex","TOUCH_SCROLL_GAIN","SCROLLBAR_TOUCH_HOTZONE_PX","useMobileTouch","containerRef","getTerminal","isActiveRef","useRef","useEffect","lastTouchY","touchId","bypassCustomScroll","pendingPixelDelta","isScrollbarElement","shouldBypassCustomScroll","eventTarget","directTarget","pointTarget","xtermRoot","insideX","insideY","findScrollTargets","el","findTouchById","touchList","i","touch","handleTouchStart","handleTouchMove","currentY","deltaY","didScroll","atTopWhilePullingDown","core","lineHeight","linesToScroll","beforeViewportY","_f","_e","afterViewportY","_h","_g","scrollTargets","previousScrollTop","nextScrollTop","wheelEvent","dispatched","handleTouchEnd","shouldApplyRemotePaneSize","now","remoteSize","pendingLocalSize","ttlMs","shouldSyncOnViewportRestore","currentSize","containerSize","force","useTerminalResize","deviceId","paneId","deviceConnected","isSelectionInvalid","onResize","onSync","getContainerRect","resizeRaf","resizeTimer","lastReportedSize","suppressLocalResizeUntil","postSelectResizeTimers","fitAddonRef","terminalRef","getContainerRectRef","viewportRestorePendingRef","onResizeRef","onSyncRef","measureTerminalSize","useCallback","term","fitAddon","containerRect","_j","_i","applyTerminalSize","reportSize","kind","measuredSize","lastSize","scheduleResize","immediate","run","clearPostSelectResizeTimers","id","runPostSelectResize","retryId","rafId","handleWindowResize","handleViewportRestore","handleVisibilityChange","handleWindowBlur","handleWindowFocus","setFitAddon","setTerminal","TERMINAL_CONFIG","TERMINAL_MODE_CACHE_KEY","readTerminalModeCache","raw","writeTerminalModeCache","parsed","createAlternateScreenFallbackSnapshot","reconcileRecoveredModes","alternateScreen","fallback","hasTrackingMode","setE2eTerminalProbe","g","clearE2eTerminalProbe","Terminal","forwardRef","inputMode","ref","instance","setInstance","useState","sendInput","useTmuxStore","terminalTheme","useMemo","mountRef","currentDeviceIdRef","currentPaneIdRef","attachedDeviceIdRef","attachedPaneIdRef","canWriteRef","currentInputModeRef","currentTerminalThemeRef","liveOutputEndedWithCR","keepShortHistoryVisibleRef","lastTerminalInstanceRef","skipNextDetachPersistRef","persistTerminalModes","targetDeviceId","targetPaneId","getTerminalForTouch","sendTerminalInput","activeDeviceId","activePaneId","cancelled","createdTerminal","callbacks","recoveredModes","buffer","chunk","getSelectStateMachine","ro","disposable","domEvent","useImperativeHandle","dims","_l","_k","_p","_o","_n","_m","jsxDEV","this","RECENT_SELECT_REQUEST_TTL_MS","PENDING_USER_SELECTION_TTL_MS","matchesPaneSelection","right","getLatestRecentSelectRequest","recentSelectRequests","recentRequests","request","latest","resolvePendingUserSelection","pendingUserSelection","shouldIgnoreActivePaneEvent","params","latestRecentSelectRequest","shouldSkipSnapshotFollow","shouldTrackPendingRouteSelection","getSiteNameFallback","settings","useSiteStore","toSafeText","trimmed","buildTerminalLabel","paneIdx","windowIdx","paneTitle","windowName","deviceName","safeWindowIdx","safePaneIdx","safePaneTitle","safeDeviceName","buildBrowserTitle","label","siteName","isIOSMobileBrowser","userAgent","isIOSDevice","isTouchMac","EDITOR_SHORTCUTS","ShortcutsBar","memo","onSend","onFocusEditor","isMobile","shortcut","Button","e","DevicePage","t","useTranslation","windowId","useParams","navigate","useNavigate","terminalContainerRef","editorContainerRef","editorTextareaRef","autoSelected","iosAddressBarCollapseTried","userInitiatedSelectionRef","selectPane","deviceError","resolvedPaneId","decodePaneIdFromUrlParam","draftKey","setIsMobile","editorText","setEditorText","isEditorFocused","setIsEditorFocused","isComposingRef","isLoading","keyboardInsetBottom","setKeyboardInsetBottom","editorDockHeight","setEditorDockHeight","isSending","setIsSending","useUIStore","uiTheme","editorSendWithEnter","setEditorSendWithEnter","addEditorHistory","setEditorDraft","removeEditorDraft","paneEditorDraft","isIOSBrowser","shouldDockEditor","windows","devicesData","useQuery","res","currentDevice","device","selectedWindow","win","selectedPane","pane","hasWindowSnapshot","canInteractWithPane","terminalTopbarLabel","snapshotActiveSelection","activeWindow","activePane","handleResize","handleSync","getSelectSize","targetWindowId","targetWindow","window","targetPane","checkMobile","collapseAddressBar","timerA","timerB","frameId","updateKeyboardInset","viewportHeight","offsetTop","nextInset","scheduleUpdate","editorContainer","updateEditorHeight","observer","lastHandledActiveRef","lastSnapshotActiveRef","recentSelectRequestsRef","w","p","encodePaneIdForUrl","currentSelected","size","recordSelectRequest","routeTarget","next","r","activePaneFromEvent","currentActive","pendingCreateWindowAt","elapsed","timer","remoteCols","remoteRows","timerId","toast","handler","eventDeviceId","handleSendShortcut","handleEditorSend","handleEditorSendLineByLine","store","handleEditorFocus","handleEditorBlur","handleFocusEditor","showConnecting","TerminalComponent","Fragment","Loader2","nextText","Switch","checked","Trash2","Send","PageTitle","snapshots","title","PageActions","setInputMode","showRefreshConfirm","setShowRefreshConfirm","canInteract","handleToggleInputMode","handleJumpToLatest","handleRefreshClick","handleConfirmRefresh","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|
|
1
|
+
{"version":3,"file":"DevicePage-CKaPUo7L.js","sources":["../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/arrow-down-to-line.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/keyboard.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/refresh-cw.js","../../../../node_modules/.bun/lucide-react@0.564.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/smartphone.js","../../../../packages/ghostty-terminal/src/canvas-renderer.ts","../../../../packages/ghostty-terminal/src/ghostty-keycodes.ts","../../../../packages/ghostty-terminal/src/render-state.ts","../../../../packages/ghostty-terminal/src/selection-model.ts","../../../../packages/ghostty-terminal/src/selection-clipboard.ts","../../../../packages/ghostty-terminal/src/assets/ghostty-vt.wasm?url","../../../../packages/ghostty-terminal/src/ghostty-wasm.ts","../../../../packages/ghostty-terminal/src/terminal.ts","../../src/components/terminal/theme.ts","../../src/components/terminal/normalization.ts","../../src/components/terminal/useMobileTouch.ts","../../src/utils/resizeSyncGuards.ts","../../src/components/terminal/useTerminalResize.ts","../../src/components/terminal/Terminal.tsx","../../src/utils/selectionGuards.ts","../../src/utils/site.ts","../../src/utils/terminalMeta.ts","../../src/pages/DevicePage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 17V3\", key: \"1cwfxf\" }],\n [\"path\", { d: \"m6 11 6 6 6-6\", key: \"12ii2o\" }],\n [\"path\", { d: \"M19 21H5\", key: \"150jfl\" }]\n];\nconst ArrowDownToLine = createLucideIcon(\"arrow-down-to-line\", __iconNode);\n\nexport { __iconNode, ArrowDownToLine as default };\n//# sourceMappingURL=arrow-down-to-line.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 8h.01\", key: \"1r9ogq\" }],\n [\"path\", { d: \"M12 12h.01\", key: \"1mp3jc\" }],\n [\"path\", { d: \"M14 8h.01\", key: \"1primd\" }],\n [\"path\", { d: \"M16 12h.01\", key: \"1l6xoz\" }],\n [\"path\", { d: \"M18 8h.01\", key: \"emo2bl\" }],\n [\"path\", { d: \"M6 8h.01\", key: \"x9i8wu\" }],\n [\"path\", { d: \"M7 16h10\", key: \"wp8him\" }],\n [\"path\", { d: \"M8 12h.01\", key: \"czm47f\" }],\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }]\n];\nconst Keyboard = createLucideIcon(\"keyboard\", __iconNode);\n\nexport { __iconNode, Keyboard as default };\n//# sourceMappingURL=keyboard.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.564.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"20\", x: \"5\", y: \"2\", rx: \"2\", ry: \"2\", key: \"1yt0o3\" }],\n [\"path\", { d: \"M12 18h.01\", key: \"mhygvu\" }]\n];\nconst Smartphone = createLucideIcon(\"smartphone\", __iconNode);\n\nexport { __iconNode, Smartphone as default };\n//# sourceMappingURL=smartphone.js.map\n","import type {\n GhosttyCellDimensions,\n GhosttyColorRgb,\n GhosttyRenderRow,\n GhosttyRenderSnapshotMeta,\n GhosttySelectionRect,\n GhosttyTheme,\n} from './types';\n\ntype CanvasRendererOptions = {\n screenElement: HTMLElement;\n theme: GhosttyTheme;\n fontFamily: string;\n fontSize: number;\n};\n\ntype CanvasRendererFrame = {\n meta: GhosttyRenderSnapshotMeta;\n rows: GhosttyRenderRow[];\n cellDimensions: GhosttyCellDimensions;\n selectionRects?: GhosttySelectionRect[];\n selectionColor?: string;\n};\n\ntype CanvasRendererDebugState = {\n kind: 'canvas';\n frameCount: number;\n lastDrawnRows: number[];\n};\n\ntype CursorCell = {\n x: number;\n y: number;\n style: GhosttyRenderSnapshotMeta['cursor']['style'];\n};\n\nfunction colorToCss(color: GhosttyColorRgb): string {\n return `rgb(${color.r} ${color.g} ${color.b})`;\n}\n\nfunction ensureContext(canvas: HTMLCanvasElement): CanvasRenderingContext2D {\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('2d canvas context unavailable');\n }\n\n return context;\n}\n\nexport class CanvasRenderer {\n readonly kind = 'canvas';\n\n private readonly mainCanvas: HTMLCanvasElement;\n private readonly selectionCanvas: HTMLCanvasElement;\n private readonly cursorCanvas: HTMLCanvasElement;\n private readonly mainContext: CanvasRenderingContext2D;\n private readonly selectionContext: CanvasRenderingContext2D;\n private readonly cursorContext: CanvasRenderingContext2D;\n private theme: GhosttyTheme;\n private readonly fontFamily: string;\n private readonly fontSize: number;\n private cellDimensions: GhosttyCellDimensions = { width: 9, height: 17 };\n private cols = 0;\n private rows = 0;\n private lastCursor: CursorCell | null = null;\n private frameCount = 0;\n private lastDrawnRows: number[] = [];\n private readonly colorCache = new Map<string, string>();\n private readonly fontCache = new Map<string, string>();\n private cursorBlinkVisible = true;\n private cursorBlinkTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: CanvasRendererOptions) {\n this.theme = options.theme;\n this.fontFamily = options.fontFamily;\n this.fontSize = options.fontSize;\n\n options.screenElement.style.position = 'relative';\n options.screenElement.style.overflow = 'hidden';\n\n this.mainCanvas = document.createElement('canvas');\n this.selectionCanvas = document.createElement('canvas');\n this.cursorCanvas = document.createElement('canvas');\n\n for (const [canvas, layer] of [\n [this.mainCanvas, 'main'],\n [this.selectionCanvas, 'selection'],\n [this.cursorCanvas, 'cursor'],\n ] as const) {\n canvas.dataset.layer = layer;\n canvas.style.position = 'absolute';\n canvas.style.inset = '0';\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n canvas.style.pointerEvents = 'none';\n options.screenElement.appendChild(canvas);\n }\n\n this.mainContext = ensureContext(this.mainCanvas);\n this.selectionContext = ensureContext(this.selectionCanvas);\n this.cursorContext = ensureContext(this.cursorCanvas);\n }\n\n setTheme(theme: GhosttyTheme): void {\n this.theme = theme;\n this.colorCache.clear();\n }\n\n render(frame: CanvasRendererFrame): void {\n this.frameCount += 1;\n this.lastDrawnRows = [];\n this.cellDimensions = frame.cellDimensions;\n this.resize(frame.meta.cols, frame.meta.rows);\n this.drawSelection(frame.selectionRects ?? [], frame.selectionColor ?? this.theme.selectionBackground);\n\n if (frame.meta.dirty === 'clean') {\n this.drawCursor(frame.meta);\n return;\n }\n\n const drawAllRows = frame.meta.dirty === 'full';\n const targetRows = drawAllRows ? frame.rows : frame.rows.filter((row) => row.dirty);\n\n for (const row of targetRows) {\n this.drawRow(row, frame.meta.colors);\n this.lastDrawnRows.push(row.y);\n }\n\n this.drawCursor(frame.meta);\n }\n\n getDebugState(): CanvasRendererDebugState {\n return {\n kind: this.kind,\n frameCount: this.frameCount,\n lastDrawnRows: [...this.lastDrawnRows],\n };\n }\n\n dispose(): void {\n this.mainCanvas.remove();\n this.selectionCanvas.remove();\n this.cursorCanvas.remove();\n this.colorCache.clear();\n this.fontCache.clear();\n this.lastCursor = null;\n this.stopCursorBlink();\n }\n\n private startCursorBlink(): void {\n if (this.cursorBlinkTimer) {\n return;\n }\n this.cursorBlinkTimer = setInterval(() => {\n this.cursorBlinkVisible = !this.cursorBlinkVisible;\n this.cursorCanvas.style.opacity = this.cursorBlinkVisible ? '1' : '0';\n }, 1000);\n }\n\n private stopCursorBlink(): void {\n if (this.cursorBlinkTimer) {\n clearInterval(this.cursorBlinkTimer);\n this.cursorBlinkTimer = null;\n }\n this.cursorBlinkVisible = true;\n this.cursorCanvas.style.opacity = '1';\n }\n\n private resize(cols: number, rows: number): void {\n const nextCols = Math.max(1, cols);\n const nextRows = Math.max(1, rows);\n const width = nextCols * this.cellDimensions.width;\n const height = nextRows * this.cellDimensions.height;\n const dpr = Math.max(1, globalThis.devicePixelRatio ?? 1);\n\n if (this.cols === nextCols && this.rows === nextRows) {\n const cssWidth = `${width}px`;\n const cssHeight = `${height}px`;\n if (this.mainCanvas.style.width === cssWidth && this.mainCanvas.style.height === cssHeight) {\n return;\n }\n }\n\n this.cols = nextCols;\n this.rows = nextRows;\n\n for (const canvas of [this.mainCanvas, this.selectionCanvas, this.cursorCanvas]) {\n canvas.width = Math.max(1, Math.ceil(width * dpr));\n canvas.height = Math.max(1, Math.ceil(height * dpr));\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n }\n\n for (const context of [this.mainContext, this.selectionContext, this.cursorContext]) {\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.textBaseline = 'top';\n context.imageSmoothingEnabled = false;\n }\n }\n\n private drawSelection(rects: GhosttySelectionRect[], color: string): void {\n this.selectionContext.clearRect(\n 0,\n 0,\n this.cols * this.cellDimensions.width,\n this.rows * this.cellDimensions.height\n );\n\n if (rects.length === 0) {\n return;\n }\n\n this.selectionContext.fillStyle = color;\n for (const rect of rects) {\n this.selectionContext.fillRect(\n rect.x * this.cellDimensions.width,\n rect.row * this.cellDimensions.height,\n rect.width * this.cellDimensions.width,\n this.cellDimensions.height\n );\n }\n }\n\n private drawRow(row: GhosttyRenderRow, colors: GhosttyRenderSnapshotMeta['colors']): void {\n const y = row.y * this.cellDimensions.height;\n const width = this.cols * this.cellDimensions.width;\n const defaultBackground = this.toCss(colors.background);\n\n this.mainContext.clearRect(0, y, width, this.cellDimensions.height);\n this.mainContext.fillStyle = defaultBackground;\n this.mainContext.fillRect(0, y, width, this.cellDimensions.height);\n\n for (const cell of row.cells) {\n if (cell.widthKind === 'spacer-tail' || cell.widthKind === 'spacer-head') {\n continue;\n }\n\n const x = cell.x * this.cellDimensions.width;\n const bg = cell.style.inverse\n ? cell.fgColor ?? colors.foreground\n : cell.bgColor ?? colors.background;\n const fg = cell.style.inverse\n ? cell.bgColor ?? colors.background\n : cell.fgColor ?? colors.foreground;\n const cellWidth = cell.widthKind === 'wide' ? this.cellDimensions.width * 2 : this.cellDimensions.width;\n\n if (bg.r !== colors.background.r || bg.g !== colors.background.g || bg.b !== colors.background.b) {\n this.mainContext.fillStyle = this.toCss(bg);\n this.mainContext.fillRect(x, y, cellWidth, this.cellDimensions.height);\n }\n\n if (!cell.text || cell.style.invisible) {\n continue;\n }\n\n this.mainContext.font = this.resolveFont(cell.style);\n this.mainContext.fillStyle = this.toCss(fg);\n this.mainContext.fillText(cell.text, x, y);\n\n if (cell.style.underline > 0) {\n this.mainContext.fillRect(\n x,\n y + this.cellDimensions.height - 2,\n Math.max(cellWidth - 1, 1),\n 1\n );\n }\n\n if (cell.style.strikethrough) {\n this.mainContext.fillRect(\n x,\n y + this.cellDimensions.height * 0.55,\n Math.max(cellWidth - 1, 1),\n 1\n );\n }\n\n if (cell.style.overline) {\n this.mainContext.fillRect(x, y + 1, Math.max(cellWidth - 1, 1), 1);\n }\n }\n }\n\n private drawCursor(meta: GhosttyRenderSnapshotMeta): void {\n const colors = meta.colors;\n const cursor = meta.cursor;\n const previous = this.lastCursor;\n this.cursorContext.clearRect(\n 0,\n 0,\n this.cols * this.cellDimensions.width,\n this.rows * this.cellDimensions.height\n );\n\n if (!cursor.visible || cursor.x === null || cursor.y === null) {\n this.lastCursor = null;\n this.stopCursorBlink();\n return;\n }\n\n const x = cursor.x * this.cellDimensions.width;\n const y = cursor.y * this.cellDimensions.height;\n const width = cursor.wideTail ? this.cellDimensions.width * 2 : this.cellDimensions.width;\n const cursorColor = colors.cursor ?? colors.foreground;\n const cssColor = this.toCss(cursorColor);\n\n this.cursorContext.fillStyle = cssColor;\n this.cursorContext.strokeStyle = cssColor;\n this.cursorContext.globalAlpha = 0.7;\n this.cursorContext.fillRect(\n x,\n y + this.cellDimensions.height - 2,\n Math.max(width - 1, 1),\n 2\n );\n this.cursorContext.globalAlpha = 1;\n\n this.startCursorBlink();\n\n this.lastCursor = {\n x: cursor.x,\n y: cursor.y,\n style: cursor.style,\n };\n\n if (\n previous &&\n (previous.x !== this.lastCursor.x ||\n previous.y !== this.lastCursor.y ||\n previous.style !== this.lastCursor.style)\n ) {\n this.lastDrawnRows.push(previous.y);\n }\n }\n\n private resolveFont(style: GhosttyRenderRow['cells'][number]['style']): string {\n const key = [\n style.italic ? 'italic' : 'normal',\n style.bold ? '700' : '400',\n `${this.fontSize}px`,\n this.fontFamily,\n ].join('|');\n\n const cached = this.fontCache.get(key);\n if (cached) {\n return cached;\n }\n\n const font = `${style.italic ? 'italic ' : ''}${style.bold ? '700 ' : ''}${this.fontSize}px ${this.fontFamily}`;\n this.fontCache.set(key, font);\n return font;\n }\n\n private toCss(color: GhosttyColorRgb): string {\n const key = `${color.r},${color.g},${color.b}`;\n const cached = this.colorCache.get(key);\n if (cached) {\n return cached;\n }\n\n const css = colorToCss(color);\n this.colorCache.set(key, css);\n return css;\n }\n}\n\nexport type { CanvasRendererDebugState, CanvasRendererFrame, CanvasRendererOptions };\n","const KEY_UNIDENTIFIED = 0;\n\nconst KEY_CODE_MAP: Record<string, number> = {\n Backquote: 1,\n Backslash: 2,\n BracketLeft: 3,\n BracketRight: 4,\n Comma: 5,\n Digit0: 6,\n Digit1: 7,\n Digit2: 8,\n Digit3: 9,\n Digit4: 10,\n Digit5: 11,\n Digit6: 12,\n Digit7: 13,\n Digit8: 14,\n Digit9: 15,\n Equal: 16,\n IntlBackslash: 17,\n IntlRo: 18,\n IntlYen: 19,\n KeyA: 20,\n KeyB: 21,\n KeyC: 22,\n KeyD: 23,\n KeyE: 24,\n KeyF: 25,\n KeyG: 26,\n KeyH: 27,\n KeyI: 28,\n KeyJ: 29,\n KeyK: 30,\n KeyL: 31,\n KeyM: 32,\n KeyN: 33,\n KeyO: 34,\n KeyP: 35,\n KeyQ: 36,\n KeyR: 37,\n KeyS: 38,\n KeyT: 39,\n KeyU: 40,\n KeyV: 41,\n KeyW: 42,\n KeyX: 43,\n KeyY: 44,\n KeyZ: 45,\n Minus: 46,\n Period: 47,\n Quote: 48,\n Semicolon: 49,\n Slash: 50,\n AltLeft: 51,\n AltRight: 52,\n Backspace: 53,\n CapsLock: 54,\n ContextMenu: 55,\n ControlLeft: 56,\n ControlRight: 57,\n Enter: 58,\n MetaLeft: 59,\n MetaRight: 60,\n ShiftLeft: 61,\n ShiftRight: 62,\n Space: 63,\n Tab: 64,\n Convert: 65,\n KanaMode: 66,\n NonConvert: 67,\n Delete: 68,\n End: 69,\n Help: 70,\n Home: 71,\n Insert: 72,\n PageDown: 73,\n PageUp: 74,\n ArrowDown: 75,\n ArrowLeft: 76,\n ArrowRight: 77,\n ArrowUp: 78,\n NumLock: 79,\n Numpad0: 80,\n Numpad1: 81,\n Numpad2: 82,\n Numpad3: 83,\n Numpad4: 84,\n Numpad5: 85,\n Numpad6: 86,\n Numpad7: 87,\n Numpad8: 88,\n Numpad9: 89,\n NumpadAdd: 90,\n NumpadBackspace: 91,\n NumpadClear: 92,\n NumpadClearEntry: 93,\n NumpadComma: 94,\n NumpadDecimal: 95,\n NumpadDivide: 96,\n NumpadEnter: 97,\n NumpadEqual: 98,\n NumpadMemoryAdd: 99,\n NumpadMemoryClear: 100,\n NumpadMemoryRecall: 101,\n NumpadMemoryStore: 102,\n NumpadMemorySubtract: 103,\n NumpadMultiply: 104,\n NumpadParenLeft: 105,\n NumpadParenRight: 106,\n NumpadSubtract: 107,\n NumpadSeparator: 108,\n NumpadUp: 109,\n NumpadDown: 110,\n NumpadRight: 111,\n NumpadLeft: 112,\n NumpadBegin: 113,\n NumpadHome: 114,\n NumpadEnd: 115,\n NumpadInsert: 116,\n NumpadDelete: 117,\n NumpadPageUp: 118,\n NumpadPageDown: 119,\n Escape: 120,\n F1: 121,\n F2: 122,\n F3: 123,\n F4: 124,\n F5: 125,\n F6: 126,\n F7: 127,\n F8: 128,\n F9: 129,\n F10: 130,\n F11: 131,\n F12: 132,\n F13: 133,\n F14: 134,\n F15: 135,\n F16: 136,\n F17: 137,\n F18: 138,\n F19: 139,\n F20: 140,\n F21: 141,\n F22: 142,\n F23: 143,\n F24: 144,\n F25: 145,\n Fn: 146,\n FnLock: 147,\n PrintScreen: 148,\n ScrollLock: 149,\n Pause: 150,\n BrowserBack: 151,\n BrowserFavorites: 152,\n BrowserForward: 153,\n BrowserHome: 154,\n BrowserRefresh: 155,\n BrowserSearch: 156,\n BrowserStop: 157,\n Eject: 158,\n LaunchApp1: 159,\n LaunchApp2: 160,\n LaunchMail: 161,\n MediaPlayPause: 162,\n MediaSelect: 163,\n MediaStop: 164,\n MediaTrackNext: 165,\n MediaTrackPrevious: 166,\n Power: 167,\n Sleep: 168,\n AudioVolumeDown: 169,\n AudioVolumeMute: 170,\n AudioVolumeUp: 171,\n WakeUp: 172,\n Copy: 173,\n Cut: 174,\n Paste: 175,\n};\n\nconst UNSHIFTED_CODEPOINTS: Record<string, string> = {\n Backquote: '`',\n Backslash: '\\\\',\n BracketLeft: '[',\n BracketRight: ']',\n Comma: ',',\n Equal: '=',\n Minus: '-',\n Period: '.',\n Quote: \"'\",\n Semicolon: ';',\n Slash: '/',\n Space: ' ',\n IntlBackslash: '\\\\',\n IntlYen: '¥',\n IntlRo: '\\\\',\n};\n\nfor (let index = 0; index <= 9; index += 1) {\n UNSHIFTED_CODEPOINTS[`Digit${index}`] = String(index);\n}\n\nfor (let index = 0; index < 26; index += 1) {\n const uppercase = String.fromCharCode(65 + index);\n const lowercase = String.fromCharCode(97 + index);\n UNSHIFTED_CODEPOINTS[`Key${uppercase}`] = lowercase;\n}\n\nexport function getGhosttyKeyCode(code: string): number {\n return KEY_CODE_MAP[code] ?? KEY_UNIDENTIFIED;\n}\n\nexport function getUnshiftedCodepoint(code: string): number | null {\n const value = UNSHIFTED_CODEPOINTS[code];\n return value ? value.codePointAt(0) ?? null : null;\n}\n","import type { GhosttyBindings } from './ghostty-wasm';\nimport type {\n GhosttyCellWidthKind,\n GhosttyColorRgb,\n GhosttyCursorVisualStyle,\n GhosttyRenderCell,\n GhosttyRenderCellStyle,\n GhosttyRenderDirtyState,\n GhosttyRenderRow,\n GhosttyRenderSnapshotMeta,\n} from './types';\n\nconst GHOSTTY_SUCCESS = 0;\nconst GHOSTTY_INVALID_VALUE = -2;\n\nconst GHOSTTY_RENDER_STATE_DATA_COLS = 1;\nconst GHOSTTY_RENDER_STATE_DATA_ROWS = 2;\nconst GHOSTTY_RENDER_STATE_DATA_DIRTY = 3;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VISUAL_STYLE = 10;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VISIBLE = 11;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_BLINKING = 12;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_PASSWORD_INPUT = 13;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE = 14;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_X = 15;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_Y = 16;\nconst GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_WIDE_TAIL = 17;\n\nconst GHOSTTY_RENDER_STATE_ROW_DATA_DIRTY = 1;\nconst GHOSTTY_RENDER_STATE_ROW_DATA_RAW = 2;\n\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_RAW = 1;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_STYLE = 2;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_LEN = 3;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_BUF = 4;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_BG_COLOR = 5;\nconst GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_FG_COLOR = 6;\n\nconst GHOSTTY_ROW_DATA_WRAP = 1;\nconst GHOSTTY_ROW_DATA_WRAP_CONTINUATION = 2;\n\nconst GHOSTTY_CELL_DATA_WIDE = 3;\nconst GHOSTTY_CELL_DATA_HAS_TEXT = 4;\n\ntype GhosttyRenderStateResources = {\n bindings: GhosttyBindings;\n renderStateHandle: number;\n rowIteratorHandle: number;\n rowCellsHandle: number;\n snapshotVersion: number;\n disposed: boolean;\n cachedMeta: GhosttyRenderSnapshotMeta | null;\n};\n\nfunction ensureActive(resources: GhosttyRenderStateResources): void {\n if (resources.disposed || resources.renderStateHandle === 0) {\n throw new Error('render state resources already disposed');\n }\n}\n\nfunction resultToDirtyState(value: number): GhosttyRenderDirtyState {\n switch (value) {\n case 2:\n return 'full';\n case 1:\n return 'partial';\n default:\n return 'clean';\n }\n}\n\nfunction resultToCursorStyle(value: number): GhosttyCursorVisualStyle {\n switch (value) {\n case 0:\n return 'bar';\n case 2:\n return 'underline';\n case 3:\n return 'block-hollow';\n default:\n return 'block';\n }\n}\n\nfunction resultToCellWidthKind(value: number): GhosttyCellWidthKind {\n switch (value) {\n case 1:\n return 'wide';\n case 2:\n return 'spacer-tail';\n case 3:\n return 'spacer-head';\n default:\n return 'narrow';\n }\n}\n\nfunction readColorAt(bindings: GhosttyBindings, ptr: number): GhosttyColorRgb {\n return {\n r: bindings.view().getUint8(ptr),\n g: bindings.view().getUint8(ptr + 1),\n b: bindings.view().getUint8(ptr + 2),\n };\n}\n\nfunction readOptionalColor(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number\n): GhosttyColorRgb | null {\n const color = resources.bindings.allocStruct('GhosttyColorRgb');\n\n try {\n const result = read(color.ptr);\n if (result === GHOSTTY_INVALID_VALUE) {\n return null;\n }\n\n if (result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty optional color read failed with result ${result}`);\n }\n\n return readColorAt(resources.bindings, color.ptr);\n } finally {\n color.free();\n }\n}\n\nfunction readBool(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): boolean {\n const ptr = resources.bindings.allocU8();\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty bool read failed with result ${result}`);\n }\n\n return resources.bindings.readU8(ptr) !== 0;\n } finally {\n resources.bindings.freeU8(ptr);\n }\n}\n\nfunction readU16(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): number {\n const ptr = resources.bindings.allocBytes(2);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty u16 read failed with result ${result}`);\n }\n\n return resources.bindings.view().getUint16(ptr, true);\n } finally {\n resources.bindings.freeBytes(ptr, 2);\n }\n}\n\nfunction readU32(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): number {\n const ptr = resources.bindings.allocBytes(4);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty u32 read failed with result ${result}`);\n }\n\n return resources.bindings.view().getUint32(ptr, true);\n } finally {\n resources.bindings.freeBytes(ptr, 4);\n }\n}\n\nfunction readEnumI32(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): number {\n const ptr = resources.bindings.allocBytes(4);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty enum read failed with result ${result}`);\n }\n\n return resources.bindings.view().getInt32(ptr, true);\n } finally {\n resources.bindings.freeBytes(ptr, 4);\n }\n}\n\nfunction readU64(\n resources: GhosttyRenderStateResources,\n read: (ptr: number) => number | void\n): bigint {\n const ptr = resources.bindings.allocBytes(8);\n\n try {\n const result = read(ptr);\n if (typeof result === 'number' && result !== GHOSTTY_SUCCESS) {\n throw new Error(`ghostty u64 read failed with result ${result}`);\n }\n\n return resources.bindings.readU64(ptr);\n } finally {\n resources.bindings.freeBytes(ptr, 8);\n }\n}\n\nfunction readStyle(resources: GhosttyRenderStateResources): GhosttyRenderCellStyle {\n const style = resources.bindings.allocStruct('GhosttyStyle');\n\n try {\n resources.bindings.setField(\n style.view,\n 'GhosttyStyle',\n 'size',\n resources.bindings.typeSize('GhosttyStyle')\n );\n resources.bindings.getRenderStateRowCellValue(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_STYLE,\n style.ptr\n );\n\n const field = (name: string) => resources.bindings.field('GhosttyStyle', name).offset;\n return {\n bold: style.view.getUint8(field('bold')) !== 0,\n italic: style.view.getUint8(field('italic')) !== 0,\n faint: style.view.getUint8(field('faint')) !== 0,\n blink: style.view.getUint8(field('blink')) !== 0,\n inverse: style.view.getUint8(field('inverse')) !== 0,\n invisible: style.view.getUint8(field('invisible')) !== 0,\n strikethrough: style.view.getUint8(field('strikethrough')) !== 0,\n overline: style.view.getUint8(field('overline')) !== 0,\n underline: style.view.getInt32(field('underline'), true),\n };\n } finally {\n style.free();\n }\n}\n\nfunction readCodepoints(resources: GhosttyRenderStateResources): number[] {\n const graphemeLen = readU32(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_LEN,\n ptr\n )\n );\n\n if (graphemeLen === 0) {\n return [];\n }\n\n const bufPtr = resources.bindings.allocBytes(graphemeLen * 4);\n\n try {\n resources.bindings.getRenderStateRowCellValue(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_BUF,\n bufPtr\n );\n\n const codepoints: number[] = [];\n for (let index = 0; index < graphemeLen; index += 1) {\n codepoints.push(resources.bindings.view().getUint32(bufPtr + index * 4, true));\n }\n\n return codepoints;\n } finally {\n resources.bindings.freeBytes(bufPtr, graphemeLen * 4);\n }\n}\n\nfunction codepointsToText(codepoints: number[]): string {\n if (codepoints.length === 0) {\n return '';\n }\n\n try {\n return String.fromCodePoint(...codepoints);\n } catch {\n return '';\n }\n}\n\nfunction buildRowText(cells: GhosttyRenderCell[]): string {\n let text = '';\n\n for (const cell of cells) {\n if (cell.widthKind === 'spacer-tail' || cell.widthKind === 'spacer-head') {\n continue;\n }\n\n if (cell.text) {\n text += cell.text;\n continue;\n }\n\n if (cell.widthKind === 'narrow') {\n text += ' ';\n }\n }\n\n return text;\n}\n\nfunction readMeta(resources: GhosttyRenderStateResources): GhosttyRenderSnapshotMeta {\n const colors = resources.bindings.allocStruct('GhosttyRenderStateColors');\n\n try {\n resources.bindings.setField(\n colors.view,\n 'GhosttyRenderStateColors',\n 'size',\n resources.bindings.typeSize('GhosttyRenderStateColors')\n );\n resources.bindings.getRenderStateColors(resources.renderStateHandle, colors.ptr);\n\n const paletteOffset = resources.bindings.field('GhosttyRenderStateColors', 'palette').offset;\n const palette: GhosttyColorRgb[] = [];\n for (let index = 0; index < 256; index += 1) {\n const colorOffset = colors.ptr + paletteOffset + index * 3;\n palette.push(readColorAt(resources.bindings, colorOffset));\n }\n\n const cursorHasValue =\n colors.view.getUint8(\n resources.bindings.field('GhosttyRenderStateColors', 'cursor_has_value').offset\n ) !== 0;\n\n const cursorViewportHasValue = readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE,\n ptr\n )\n );\n\n return {\n cols: readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_COLS,\n ptr\n )\n ),\n rows: readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_ROWS,\n ptr\n )\n ),\n dirty: resultToDirtyState(\n readEnumI32(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_DIRTY,\n ptr\n )\n )\n ),\n colors: {\n background: readColorAt(\n resources.bindings,\n colors.ptr + resources.bindings.field('GhosttyRenderStateColors', 'background').offset\n ),\n foreground: readColorAt(\n resources.bindings,\n colors.ptr + resources.bindings.field('GhosttyRenderStateColors', 'foreground').offset\n ),\n cursor: cursorHasValue\n ? readColorAt(\n resources.bindings,\n colors.ptr + resources.bindings.field('GhosttyRenderStateColors', 'cursor').offset\n )\n : null,\n palette,\n },\n cursor: {\n style: resultToCursorStyle(\n readEnumI32(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VISUAL_STYLE,\n ptr\n )\n )\n ),\n visible: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VISIBLE,\n ptr\n )\n ),\n blinking: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_BLINKING,\n ptr\n )\n ),\n passwordInput: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_PASSWORD_INPUT,\n ptr\n )\n ),\n x: cursorViewportHasValue\n ? readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_X,\n ptr\n )\n )\n : null,\n y: cursorViewportHasValue\n ? readU16(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_Y,\n ptr\n )\n )\n : null,\n wideTail: cursorViewportHasValue\n ? readBool(resources, (ptr) =>\n resources.bindings.getRenderStateValueResult(\n resources.renderStateHandle,\n GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_WIDE_TAIL,\n ptr\n )\n )\n : false,\n },\n };\n } finally {\n colors.free();\n }\n}\n\nfunction readRow(resources: GhosttyRenderStateResources, rowIndex: number): GhosttyRenderRow {\n const rawRow = readU64(resources, (ptr) =>\n resources.bindings.getRenderStateRowValueResult(\n resources.rowIteratorHandle,\n GHOSTTY_RENDER_STATE_ROW_DATA_RAW,\n ptr\n )\n );\n resources.bindings.bindRenderStateRowCells(resources.rowIteratorHandle, resources.rowCellsHandle);\n\n const cells: GhosttyRenderCell[] = [];\n let x = 0;\n while (resources.bindings.nextRenderStateRowCell(resources.rowCellsHandle)) {\n const rawCell = readU64(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_RAW,\n ptr\n )\n );\n const codepoints = readCodepoints(resources);\n const widthKind = resultToCellWidthKind(\n readEnumI32(resources, (ptr) =>\n resources.bindings.getRawCellValueResult(rawCell, GHOSTTY_CELL_DATA_WIDE, ptr)\n )\n );\n const cell: GhosttyRenderCell = {\n x,\n text: codepointsToText(codepoints),\n codepoints,\n widthKind,\n hasText: readBool(resources, (ptr) =>\n resources.bindings.getRawCellValueResult(rawCell, GHOSTTY_CELL_DATA_HAS_TEXT, ptr)\n ),\n style: readStyle(resources),\n fgColor: readOptionalColor(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_FG_COLOR,\n ptr\n )\n ),\n bgColor: readOptionalColor(resources, (ptr) =>\n resources.bindings.getRenderStateRowCellValueResult(\n resources.rowCellsHandle,\n GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_BG_COLOR,\n ptr\n )\n ),\n };\n cells.push(cell);\n x += 1;\n }\n\n return {\n y: rowIndex,\n dirty: readBool(resources, (ptr) =>\n resources.bindings.getRenderStateRowValueResult(\n resources.rowIteratorHandle,\n GHOSTTY_RENDER_STATE_ROW_DATA_DIRTY,\n ptr\n )\n ),\n wrap: readBool(resources, (ptr) =>\n resources.bindings.getRawRowValueResult(rawRow, GHOSTTY_ROW_DATA_WRAP, ptr)\n ),\n wrapContinuation: readBool(resources, (ptr) =>\n resources.bindings.getRawRowValueResult(rawRow, GHOSTTY_ROW_DATA_WRAP_CONTINUATION, ptr)\n ),\n text: buildRowText(cells),\n cells,\n };\n}\n\nexport function createRenderState(bindings: GhosttyBindings): GhosttyRenderStateResources {\n return {\n bindings,\n renderStateHandle: bindings.createRenderState(),\n rowIteratorHandle: bindings.createRenderStateRowIterator(),\n rowCellsHandle: bindings.createRenderStateRowCells(),\n snapshotVersion: 0,\n disposed: false,\n cachedMeta: null,\n };\n}\n\nexport function updateRenderState(\n resources: GhosttyRenderStateResources,\n terminalHandle: number\n): void {\n ensureActive(resources);\n resources.bindings.updateRenderState(resources.renderStateHandle, terminalHandle);\n resources.bindings.bindRenderStateRowIterator(\n resources.renderStateHandle,\n resources.rowIteratorHandle\n );\n resources.snapshotVersion += 1;\n resources.cachedMeta = null;\n}\n\nexport function readRenderSnapshotMeta(\n resources: GhosttyRenderStateResources\n): GhosttyRenderSnapshotMeta {\n ensureActive(resources);\n if (!resources.cachedMeta) {\n resources.cachedMeta = readMeta(resources);\n }\n\n return resources.cachedMeta;\n}\n\nexport function* iterateRows(\n resources: GhosttyRenderStateResources\n): Generator<GhosttyRenderRow, void, undefined> {\n ensureActive(resources);\n const meta = readRenderSnapshotMeta(resources);\n resources.bindings.bindRenderStateRowIterator(\n resources.renderStateHandle,\n resources.rowIteratorHandle\n );\n\n let rowIndex = 0;\n while (\n rowIndex < meta.rows &&\n resources.bindings.nextRenderStateRowIterator(resources.rowIteratorHandle)\n ) {\n yield readRow(resources, rowIndex);\n rowIndex += 1;\n }\n}\n\nexport function disposeRenderStateResources(resources: GhosttyRenderStateResources): void {\n if (resources.disposed) {\n return;\n }\n\n resources.disposed = true;\n if (resources.rowCellsHandle !== 0) {\n resources.bindings.freeRenderStateRowCells(resources.rowCellsHandle);\n resources.rowCellsHandle = 0;\n }\n if (resources.rowIteratorHandle !== 0) {\n resources.bindings.freeRenderStateRowIterator(resources.rowIteratorHandle);\n resources.rowIteratorHandle = 0;\n }\n if (resources.renderStateHandle !== 0) {\n resources.bindings.freeRenderState(resources.renderStateHandle);\n resources.renderStateHandle = 0;\n }\n resources.cachedMeta = null;\n}\n\nexport type { GhosttyRenderStateResources };\n","import type { GhosttySelectionRect } from './types';\n\nexport type SelectionMode = 'character' | 'word' | 'line';\n\nexport type SelectionPoint = {\n line: number;\n col: number;\n};\n\nexport type SelectionState = {\n anchor: SelectionPoint | null;\n focus: SelectionPoint | null;\n mode: SelectionMode;\n};\n\ntype SelectionRange = {\n start: SelectionPoint;\n end: SelectionPoint;\n};\n\nfunction clampColumn(lineText: string, col: number): number {\n return Math.max(0, Math.min(Math.max(lineText.length - 1, 0), Math.floor(col)));\n}\n\nfunction normalizeRange(anchor: SelectionPoint, focus: SelectionPoint): SelectionRange {\n if (anchor.line < focus.line) {\n return { start: anchor, end: focus };\n }\n\n if (anchor.line > focus.line) {\n return { start: focus, end: anchor };\n }\n\n if (anchor.col <= focus.col) {\n return { start: anchor, end: focus };\n }\n\n return { start: focus, end: anchor };\n}\n\nfunction expandWord(line: number, col: number, lineText: string): SelectionRange {\n if (!lineText) {\n return {\n start: { line, col: 0 },\n end: { line, col: 0 },\n };\n }\n\n const safeCol = clampColumn(lineText, col);\n const isWordChar = (value: string) => /[\\p{L}\\p{N}_-]/u.test(value);\n const cursorChar = lineText[safeCol] ?? '';\n\n if (!isWordChar(cursorChar)) {\n return {\n start: { line, col: safeCol },\n end: { line, col: safeCol },\n };\n }\n\n let start = safeCol;\n let end = safeCol;\n while (start > 0 && isWordChar(lineText[start - 1] ?? '')) {\n start -= 1;\n }\n while (end + 1 < lineText.length && isWordChar(lineText[end + 1] ?? '')) {\n end += 1;\n }\n\n return {\n start: { line, col: start },\n end: { line, col: end },\n };\n}\n\nfunction expandLine(line: number, lineText: string): SelectionRange {\n const lastCol = Math.max(lineText.length - 1, 0);\n return {\n start: { line, col: 0 },\n end: { line, col: lastCol },\n };\n}\n\nfunction pointForMode(\n point: SelectionPoint,\n mode: SelectionMode,\n getLineText: (line: number) => string\n): SelectionRange {\n const lineText = getLineText(point.line);\n\n switch (mode) {\n case 'word':\n return expandWord(point.line, point.col, lineText);\n case 'line':\n return expandLine(point.line, lineText);\n default: {\n const safeCol = clampColumn(lineText, point.col);\n return {\n start: { line: point.line, col: safeCol },\n end: { line: point.line, col: safeCol },\n };\n }\n }\n}\n\nexport function createEmptySelectionState(): SelectionState {\n return {\n anchor: null,\n focus: null,\n mode: 'character',\n };\n}\n\nexport function hasSelection(state: SelectionState): boolean {\n return Boolean(state.anchor && state.focus);\n}\n\nexport function clearSelection(): SelectionState {\n return createEmptySelectionState();\n}\n\nexport function resolvePointerSelection(\n _previous: SelectionState,\n point: SelectionPoint & { mode: SelectionMode },\n getLineText: (line: number) => string\n): SelectionState {\n const expanded = pointForMode(point, point.mode, getLineText);\n return {\n anchor: expanded.start,\n focus: expanded.end,\n mode: point.mode,\n };\n}\n\nexport function updateSelectionFocus(\n state: SelectionState,\n point: SelectionPoint,\n getLineText: (line: number) => string\n): SelectionState {\n if (!state.anchor) {\n return state;\n }\n\n if (state.mode === 'line') {\n return {\n ...state,\n focus: expandLine(point.line, getLineText(point.line)).end,\n };\n }\n\n if (state.mode === 'word') {\n return {\n ...state,\n focus: pointForMode(point, 'word', getLineText).end,\n };\n }\n\n return {\n ...state,\n focus: {\n line: point.line,\n col: clampColumn(getLineText(point.line), point.col),\n },\n };\n}\n\nexport function getSelectionRange(state: SelectionState): SelectionRange | null {\n if (!state.anchor || !state.focus) {\n return null;\n }\n\n return normalizeRange(state.anchor, state.focus);\n}\n\nexport function serializeSelectionText(\n state: SelectionState,\n getLineText: (line: number) => string\n): string | null {\n const range = getSelectionRange(state);\n if (!range) {\n return null;\n }\n\n const segments: string[] = [];\n for (let line = range.start.line; line <= range.end.line; line += 1) {\n const text = getLineText(line);\n if (line === range.start.line && line === range.end.line) {\n segments.push(text.slice(range.start.col, range.end.col + 1));\n continue;\n }\n\n if (line === range.start.line) {\n segments.push(text.slice(range.start.col));\n continue;\n }\n\n if (line === range.end.line) {\n segments.push(text.slice(0, range.end.col + 1));\n continue;\n }\n\n segments.push(text);\n }\n\n return segments.join('\\n');\n}\n\nexport function projectSelectionRects(\n state: SelectionState,\n viewportStartLine: number,\n viewportRows: number,\n getLineText?: (line: number) => string\n): GhosttySelectionRect[] {\n const range = getSelectionRange(state);\n if (!range) {\n return [];\n }\n\n const viewportEndLine = viewportStartLine + viewportRows - 1;\n const rects: GhosttySelectionRect[] = [];\n for (\n let line = Math.max(range.start.line, viewportStartLine);\n line <= Math.min(range.end.line, viewportEndLine);\n line += 1\n ) {\n const row = line - viewportStartLine;\n if (line === range.start.line && line === range.end.line) {\n rects.push({\n row,\n x: range.start.col,\n width: range.end.col - range.start.col + 1,\n });\n continue;\n }\n\n if (line === range.start.line) {\n const lineWidth = getLineText ? Math.max(getLineText(line).length - range.start.col, 0) : Number.MAX_SAFE_INTEGER;\n rects.push({\n row,\n x: range.start.col,\n width: lineWidth,\n });\n continue;\n }\n\n if (line === range.end.line) {\n rects.push({\n row,\n x: 0,\n width: range.end.col + 1,\n });\n continue;\n }\n\n const middleWidth = getLineText ? getLineText(line).length : Number.MAX_SAFE_INTEGER;\n rects.push({\n row,\n x: 0,\n width: middleWidth,\n });\n }\n\n return rects;\n}\n","export function hasCopyModifier(event: KeyboardEvent): boolean {\n return (event.metaKey || event.ctrlKey) && !event.altKey;\n}\n\nexport function isCopyShortcut(event: KeyboardEvent): boolean {\n return hasCopyModifier(event) && event.key.toLowerCase() === 'c';\n}\n\nexport async function writeSelectionToClipboard(text: string): Promise<void> {\n if (!text) {\n return;\n }\n\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n }\n}\n\nexport function writeSelectionToCopyEvent(event: ClipboardEvent, text: string): boolean {\n if (!text || !event.clipboardData) {\n return false;\n }\n\n event.clipboardData.setData('text/plain', text);\n event.preventDefault();\n return true;\n}\n","export default \"__VITE_ASSET__D7nLG8tf__\"","import ghosttyWasmUrl from './assets/ghostty-vt.wasm?url';\nimport type { GhosttyCellDimensions, GhosttyTheme } from './types';\n\nconst GHOSTTY_SUCCESS = 0;\nconst GHOSTTY_OUT_OF_SPACE = -3;\n\nconst GHOSTTY_TERMINAL_OPT_COLOR_FOREGROUND = 11;\nconst GHOSTTY_TERMINAL_OPT_COLOR_BACKGROUND = 12;\nconst GHOSTTY_TERMINAL_OPT_COLOR_CURSOR = 13;\nconst GHOSTTY_TERMINAL_OPT_COLOR_PALETTE = 14;\n\nconst GHOSTTY_TERMINAL_DATA_COLS = 1;\nconst GHOSTTY_TERMINAL_DATA_ROWS = 2;\nconst GHOSTTY_TERMINAL_DATA_SCROLLBAR = 9;\nconst GHOSTTY_POINT_TAG_VIEWPORT = 1;\n\nconst GHOSTTY_SCROLL_VIEWPORT_TOP = 0;\nconst GHOSTTY_SCROLL_VIEWPORT_BOTTOM = 1;\nconst GHOSTTY_SCROLL_VIEWPORT_DELTA = 2;\n\nconst GHOSTTY_KEY_ACTION_RELEASE = 0;\nconst GHOSTTY_KEY_ACTION_PRESS = 1;\nconst GHOSTTY_KEY_ACTION_REPEAT = 2;\n\nconst GHOSTTY_MOUSE_ENCODER_OPT_TRACK_LAST_CELL = 4;\n\nconst GHOSTTY_MODE_BRACKETED_PASTE = 2004;\nconst GHOSTTY_MODE_X10_MOUSE = 9;\nconst GHOSTTY_MODE_NORMAL_MOUSE = 1000;\nconst GHOSTTY_MODE_BUTTON_MOUSE = 1002;\nconst GHOSTTY_MODE_ANY_MOUSE = 1003;\nconst GHOSTTY_MODE_UTF8_MOUSE = 1005;\nconst GHOSTTY_MODE_SGR_MOUSE = 1006;\nconst GHOSTTY_MODE_URXVT_MOUSE = 1015;\nconst GHOSTTY_MODE_SGR_PIXELS_MOUSE = 1016;\n\nconst GHOSTTY_FORMATTER_FORMAT_PLAIN = 0;\nconst GHOSTTY_FORMATTER_FORMAT_HTML = 2;\nconst WASM_USIZE_BYTES = 4;\n\ntype LayoutField = {\n offset: number;\n size: number;\n type: string;\n};\n\ntype LayoutType = {\n size: number;\n align: number;\n fields: Record<string, LayoutField>;\n};\n\ntype LayoutMap = Record<string, LayoutType>;\n\ntype GhosttyMouseEncodeOptions = {\n action: 'press' | 'release' | 'motion';\n button?: number | null;\n mods: number;\n x: number;\n y: number;\n anyButtonPressed: boolean;\n screenWidth: number;\n screenHeight: number;\n cellWidth: number;\n cellHeight: number;\n};\n\ntype GhosttyExports = WebAssembly.Exports & {\n memory: WebAssembly.Memory;\n ghostty_type_json: () => number;\n ghostty_alloc: (allocatorPtr: number, size: number, alignment: number) => number;\n ghostty_free: (allocatorPtr: number, ptr: number, len: number) => void;\n ghostty_wasm_alloc_opaque: () => number;\n ghostty_wasm_free_opaque: (ptr: number) => void;\n ghostty_wasm_alloc_u8: () => number;\n ghostty_wasm_free_u8: (ptr: number) => void;\n ghostty_wasm_alloc_u8_array: (len: number) => number;\n ghostty_wasm_free_u8_array: (ptr: number, len: number) => void;\n ghostty_wasm_alloc_usize: () => number;\n ghostty_wasm_free_usize: (ptr: number) => void;\n ghostty_terminal_new: (allocatorPtr: number, outTerminalPtr: number, optionsPtr: number) => number;\n ghostty_terminal_free: (terminal: number) => void;\n ghostty_terminal_reset: (terminal: number) => void;\n ghostty_terminal_resize: (\n terminal: number,\n cols: number,\n rows: number,\n cellWidthPx: number,\n cellHeightPx: number\n ) => number;\n ghostty_terminal_vt_write: (terminal: number, dataPtr: number, len: number) => void;\n ghostty_terminal_scroll_viewport: (terminal: number, behaviorPtr: number) => void;\n ghostty_terminal_set: (terminal: number, option: number, valuePtr: number) => number;\n ghostty_terminal_get: (terminal: number, data: number, outPtr: number) => number;\n ghostty_terminal_mode_get: (terminal: number, mode: number, outValuePtr: number) => number;\n ghostty_terminal_mode_set: (terminal: number, mode: number, enabled: number) => number;\n ghostty_terminal_grid_ref: (terminal: number, pointPtr: number, outRefPtr: number) => number;\n ghostty_render_state_new: (allocatorPtr: number, outStatePtr: number) => number;\n ghostty_render_state_free: (state: number) => void;\n ghostty_render_state_update: (state: number, terminal: number) => number;\n ghostty_render_state_get: (state: number, data: number, outPtr: number) => number;\n ghostty_render_state_set: (state: number, option: number, valuePtr: number) => number;\n ghostty_render_state_colors_get: (state: number, outColorsPtr: number) => number;\n ghostty_render_state_row_iterator_new: (allocatorPtr: number, outIteratorPtr: number) => number;\n ghostty_render_state_row_iterator_free: (iterator: number) => void;\n ghostty_render_state_row_iterator_next: (iterator: number) => number;\n ghostty_render_state_row_get: (iterator: number, data: number, outPtr: number) => number;\n ghostty_render_state_row_set: (iterator: number, option: number, valuePtr: number) => number;\n ghostty_render_state_row_cells_new: (allocatorPtr: number, outCellsPtr: number) => number;\n ghostty_render_state_row_cells_free: (cells: number) => void;\n ghostty_render_state_row_cells_next: (cells: number) => number;\n ghostty_render_state_row_cells_select: (cells: number, x: number) => number;\n ghostty_render_state_row_cells_get: (cells: number, data: number, outPtr: number) => number;\n ghostty_row_get: (row: bigint, data: number, outPtr: number) => number;\n ghostty_cell_get: (cell: bigint, data: number, outPtr: number) => number;\n ghostty_formatter_terminal_new: (\n allocatorPtr: number,\n outFormatterPtr: number,\n terminal: number,\n optionsPtr: number\n ) => number;\n ghostty_formatter_format_alloc: (\n formatter: number,\n allocatorPtr: number,\n outPtrPtr: number,\n outLenPtr: number\n ) => number;\n ghostty_formatter_free: (formatter: number) => void;\n ghostty_key_encoder_new: (allocatorPtr: number, outEncoderPtr: number) => number;\n ghostty_key_encoder_free: (encoder: number) => void;\n ghostty_key_encoder_setopt_from_terminal: (encoder: number, terminal: number) => void;\n ghostty_mouse_encoder_new: (allocatorPtr: number, outEncoderPtr: number) => number;\n ghostty_mouse_encoder_free: (encoder: number) => void;\n ghostty_mouse_encoder_reset: (encoder: number) => void;\n ghostty_mouse_encoder_setopt: (encoder: number, option: number, valuePtr: number) => void;\n ghostty_mouse_encoder_setopt_from_terminal: (encoder: number, terminal: number) => void;\n ghostty_mouse_encoder_encode: (\n encoder: number,\n event: number,\n outBufPtr: number,\n outBufLen: number,\n outWrittenPtr: number\n ) => number;\n ghostty_mouse_event_new: (allocatorPtr: number, outEventPtr: number) => number;\n ghostty_mouse_event_free: (event: number) => void;\n ghostty_mouse_event_set_action: (event: number, action: number) => void;\n ghostty_mouse_event_set_button: (event: number, button: number) => void;\n ghostty_mouse_event_clear_button: (event: number) => void;\n ghostty_mouse_event_set_mods: (event: number, mods: number) => void;\n ghostty_mouse_event_set_position: (event: number, positionPtr: number) => void;\n ghostty_key_event_new: (allocatorPtr: number, outEventPtr: number) => number;\n ghostty_key_event_free: (event: number) => void;\n ghostty_key_event_set_action: (event: number, action: number) => void;\n ghostty_key_event_set_key: (event: number, key: number) => void;\n ghostty_key_event_set_mods: (event: number, mods: number) => void;\n ghostty_key_event_set_consumed_mods: (event: number, consumedMods: number) => void;\n ghostty_key_event_set_composing: (event: number, composing: number) => void;\n ghostty_key_event_set_utf8: (event: number, utf8Ptr: number, len: number) => void;\n ghostty_key_event_set_unshifted_codepoint: (event: number, codepoint: number) => void;\n ghostty_key_encoder_encode: (\n encoder: number,\n event: number,\n outBufPtr: number,\n outBufLen: number,\n outWrittenPtr: number\n ) => number;\n ghostty_paste_encode: (\n dataPtr: number,\n dataLen: number,\n bracketed: number,\n outBufPtr: number,\n outBufLen: number,\n outWrittenPtr: number\n ) => number;\n};\n\nlet bindingsPromise: Promise<GhosttyBindings> | null = null;\n\nfunction assertResult(result: number, action: string): void {\n if (result === GHOSTTY_SUCCESS) {\n return;\n }\n\n throw new Error(`${action} failed with result ${result}`);\n}\n\nfunction parseHexRgb(hex: string): [number, number, number] {\n const normalized = hex.trim().replace(/^#/, '');\n if (normalized.length !== 6) {\n throw new Error(`expected #RRGGBB color, received: ${hex}`);\n }\n\n return [\n Number.parseInt(normalized.slice(0, 2), 16),\n Number.parseInt(normalized.slice(2, 4), 16),\n Number.parseInt(normalized.slice(4, 6), 16),\n ];\n}\n\nfunction createAnsi256Palette(theme: GhosttyTheme): Array<[number, number, number]> {\n const base16 = [\n theme.black,\n theme.red,\n theme.green,\n theme.yellow,\n theme.blue,\n theme.magenta,\n theme.cyan,\n theme.white,\n theme.brightBlack,\n theme.brightRed,\n theme.brightGreen,\n theme.brightYellow,\n theme.brightBlue,\n theme.brightMagenta,\n theme.brightCyan,\n theme.brightWhite,\n ].map(parseHexRgb);\n\n const palette = [...base16];\n const cube = [0, 95, 135, 175, 215, 255];\n\n for (const red of cube) {\n for (const green of cube) {\n for (const blue of cube) {\n palette.push([red, green, blue]);\n }\n }\n }\n\n for (let index = 0; index < 24; index += 1) {\n const value = 8 + index * 10;\n palette.push([value, value, value]);\n }\n\n return palette;\n}\n\nfunction encodeMouseModifierBits(mods: number): number {\n let encoded = 0;\n if (mods & (1 << 0)) encoded += 4;\n if (mods & (1 << 2)) encoded += 8;\n if (mods & (1 << 1)) encoded += 16;\n return encoded;\n}\n\nfunction encodeX10Byte(value: number): string | null {\n if (value < 0 || value > 223) {\n return null;\n }\n\n return String.fromCharCode(value + 32);\n}\n\nfunction mouseButtonCode(button: number | null | undefined): number | null {\n switch (button) {\n case 1:\n return 0;\n case 3:\n return 1;\n case 2:\n return 2;\n case 4:\n return 64;\n case 5:\n return 65;\n case 6:\n return 66;\n case 7:\n return 67;\n case 8:\n return 128;\n case 9:\n return 129;\n case null:\n case undefined:\n return 3;\n default:\n return null;\n }\n}\n\nexport function keyboardEventToGhosttyMods(event: KeyboardEvent): number {\n let mods = 0;\n\n if (event.shiftKey) mods |= 1 << 0;\n if (event.ctrlKey) mods |= 1 << 1;\n if (event.altKey) mods |= 1 << 2;\n if (event.metaKey) mods |= 1 << 3;\n if (event.getModifierState?.('CapsLock')) mods |= 1 << 4;\n if (event.getModifierState?.('NumLock')) mods |= 1 << 5;\n\n return mods;\n}\n\nclass StructAllocation {\n constructor(\n private readonly bindings: GhosttyBindings,\n readonly typeName: string,\n readonly ptr: number\n ) {}\n\n get view(): DataView {\n return this.bindings.view(this.ptr, this.bindings.typeSize(this.typeName));\n }\n\n free(): void {\n this.bindings.freeBytes(this.ptr, this.bindings.typeSize(this.typeName));\n }\n}\n\nexport class GhosttyBindings {\n readonly exports: GhosttyExports;\n readonly layout: LayoutMap;\n\n private readonly decoder = new TextDecoder();\n private readonly encoder = new TextEncoder();\n\n constructor(exports: GhosttyExports, layout: LayoutMap) {\n this.exports = exports;\n this.layout = layout;\n }\n\n buffer(): ArrayBuffer {\n return this.exports.memory.buffer;\n }\n\n bytes(ptr = 0, len = this.buffer().byteLength - ptr): Uint8Array {\n return new Uint8Array(this.buffer(), ptr, len);\n }\n\n view(ptr = 0, len = this.buffer().byteLength - ptr): DataView {\n return new DataView(this.buffer(), ptr, len);\n }\n\n typeSize(typeName: string): number {\n const type = this.layout[typeName];\n if (!type) {\n throw new Error(`unknown ghostty type: ${typeName}`);\n }\n\n return type.size;\n }\n\n field(typeName: string, fieldName: string): LayoutField {\n const type = this.layout[typeName];\n const field = type?.fields[fieldName];\n if (!type || !field) {\n throw new Error(`unknown ghostty field: ${typeName}.${fieldName}`);\n }\n\n return field;\n }\n\n allocStruct(typeName: string): StructAllocation {\n const ptr = this.allocBytes(this.typeSize(typeName));\n this.bytes(ptr, this.typeSize(typeName)).fill(0);\n return new StructAllocation(this, typeName, ptr);\n }\n\n allocBytes(len: number): number {\n return this.exports.ghostty_wasm_alloc_u8_array(len);\n }\n\n freeBytes(ptr: number, len: number): void {\n this.exports.ghostty_wasm_free_u8_array(ptr, len);\n }\n\n allocOpaque(): number {\n return this.exports.ghostty_wasm_alloc_opaque();\n }\n\n freeOpaque(ptr: number): void {\n this.exports.ghostty_wasm_free_opaque(ptr);\n }\n\n allocU8(): number {\n return this.exports.ghostty_wasm_alloc_u8();\n }\n\n freeU8(ptr: number): void {\n this.exports.ghostty_wasm_free_u8(ptr);\n }\n\n allocUsize(): number {\n return this.exports.ghostty_wasm_alloc_usize();\n }\n\n freeUsize(ptr: number): void {\n this.exports.ghostty_wasm_free_usize(ptr);\n }\n\n readPointer(ptr: number): number {\n return this.view().getUint32(ptr, true);\n }\n\n readU8(ptr: number): number {\n return this.view().getUint8(ptr);\n }\n\n readUsize(ptr: number): number {\n if (WASM_USIZE_BYTES === 4) {\n return this.view().getUint32(ptr, true);\n }\n\n return Number(this.view().getBigUint64(ptr, true));\n }\n\n readU64(ptr: number): bigint {\n return this.view().getBigUint64(ptr, true);\n }\n\n setField(target: DataView, typeName: string, fieldName: string, value: number | boolean): void {\n const field = this.field(typeName, fieldName);\n const offset = field.offset;\n\n switch (field.type) {\n case 'u8':\n case 'bool':\n target.setUint8(offset, Number(value));\n return;\n case 'u16':\n target.setUint16(offset, Number(value), true);\n return;\n case 'u32':\n target.setUint32(offset, Number(value), true);\n return;\n case 'u64':\n target.setBigUint64(offset, BigInt(value), true);\n return;\n case 'usize':\n if (WASM_USIZE_BYTES === 4) {\n target.setUint32(offset, Number(value), true);\n return;\n }\n\n target.setBigUint64(offset, BigInt(value), true);\n return;\n case 'i32':\n case 'enum':\n target.setInt32(offset, Number(value), true);\n return;\n default:\n throw new Error(`unsupported field type ${typeName}.${fieldName}: ${field.type}`);\n }\n }\n\n writeString(data: string): { ptr: number; len: number; free: () => void } {\n const encoded = this.encoder.encode(data);\n const ptr = this.allocBytes(encoded.length);\n this.bytes(ptr, encoded.length).set(encoded);\n\n return {\n ptr,\n len: encoded.length,\n free: () => this.freeBytes(ptr, encoded.length),\n };\n }\n\n writeBytes(data: Uint8Array): { ptr: number; len: number; free: () => void } {\n const ptr = this.allocBytes(data.length);\n this.bytes(ptr, data.length).set(data);\n\n return {\n ptr,\n len: data.length,\n free: () => this.freeBytes(ptr, data.length),\n };\n }\n\n readOwnedUtf8(ptr: number, len: number): string {\n return this.decoder.decode(this.bytes(ptr, len));\n }\n\n createTerminal(cols: number, rows: number, scrollback: number): number {\n const options = this.allocStruct('GhosttyTerminalOptions');\n this.setField(options.view, 'GhosttyTerminalOptions', 'cols', cols);\n this.setField(options.view, 'GhosttyTerminalOptions', 'rows', rows);\n this.setField(options.view, 'GhosttyTerminalOptions', 'max_scrollback', scrollback);\n\n const termPtrPtr = this.allocOpaque();\n\n try {\n assertResult(\n this.exports.ghostty_terminal_new(0, termPtrPtr, options.ptr),\n 'ghostty_terminal_new'\n );\n return this.readPointer(termPtrPtr);\n } finally {\n options.free();\n this.freeOpaque(termPtrPtr);\n }\n }\n\n freeTerminal(terminal: number): void {\n this.exports.ghostty_terminal_free(terminal);\n }\n\n writeVt(terminal: number, data: string | Uint8Array): void {\n const bytes = typeof data === 'string' ? this.encoder.encode(data) : data;\n const allocation = this.writeBytes(bytes);\n\n try {\n this.exports.ghostty_terminal_vt_write(terminal, allocation.ptr, allocation.len);\n } finally {\n allocation.free();\n }\n }\n\n resetTerminal(terminal: number): void {\n this.exports.ghostty_terminal_reset(terminal);\n }\n\n resizeTerminal(\n terminal: number,\n cols: number,\n rows: number,\n cell: GhosttyCellDimensions\n ): void {\n assertResult(\n this.exports.ghostty_terminal_resize(\n terminal,\n cols,\n rows,\n Math.max(1, Math.round(cell.width)),\n Math.max(1, Math.round(cell.height))\n ),\n 'ghostty_terminal_resize'\n );\n }\n\n scrollViewportDelta(terminal: number, delta: number): void {\n const behavior = this.allocStruct('GhosttyTerminalScrollViewport');\n\n try {\n this.setField(\n behavior.view,\n 'GhosttyTerminalScrollViewport',\n 'tag',\n GHOSTTY_SCROLL_VIEWPORT_DELTA\n );\n behavior.view.setBigInt64(\n this.field('GhosttyTerminalScrollViewport', 'value').offset,\n BigInt(delta),\n true\n );\n this.exports.ghostty_terminal_scroll_viewport(terminal, behavior.ptr);\n } finally {\n behavior.free();\n }\n }\n\n scrollViewportTop(terminal: number): void {\n const behavior = this.allocStruct('GhosttyTerminalScrollViewport');\n\n try {\n this.setField(\n behavior.view,\n 'GhosttyTerminalScrollViewport',\n 'tag',\n GHOSTTY_SCROLL_VIEWPORT_TOP\n );\n this.exports.ghostty_terminal_scroll_viewport(terminal, behavior.ptr);\n } finally {\n behavior.free();\n }\n }\n\n scrollViewportBottom(terminal: number): void {\n const behavior = this.allocStruct('GhosttyTerminalScrollViewport');\n\n try {\n this.setField(\n behavior.view,\n 'GhosttyTerminalScrollViewport',\n 'tag',\n GHOSTTY_SCROLL_VIEWPORT_BOTTOM\n );\n this.exports.ghostty_terminal_scroll_viewport(terminal, behavior.ptr);\n } finally {\n behavior.free();\n }\n }\n\n setTerminalTheme(terminal: number, theme: GhosttyTheme): void {\n const foreground = this.allocStruct('GhosttyColorRgb');\n const background = this.allocStruct('GhosttyColorRgb');\n const cursor = this.allocStruct('GhosttyColorRgb');\n const paletteColors = createAnsi256Palette(theme);\n const palettePtr = this.allocBytes(paletteColors.length * 3);\n\n const assignRgb = (target: StructAllocation, value: string) => {\n const [red, green, blue] = parseHexRgb(value);\n this.setField(target.view, 'GhosttyColorRgb', 'r', red);\n this.setField(target.view, 'GhosttyColorRgb', 'g', green);\n this.setField(target.view, 'GhosttyColorRgb', 'b', blue);\n };\n\n assignRgb(foreground, theme.foreground);\n assignRgb(background, theme.background);\n assignRgb(cursor, theme.cursor);\n\n const paletteBytes = this.bytes(palettePtr, paletteColors.length * 3);\n paletteColors.forEach(([red, green, blue], index) => {\n const offset = index * 3;\n paletteBytes[offset] = red;\n paletteBytes[offset + 1] = green;\n paletteBytes[offset + 2] = blue;\n });\n\n try {\n assertResult(\n this.exports.ghostty_terminal_set(\n terminal,\n GHOSTTY_TERMINAL_OPT_COLOR_FOREGROUND,\n foreground.ptr\n ),\n 'ghostty_terminal_set(foreground)'\n );\n assertResult(\n this.exports.ghostty_terminal_set(\n terminal,\n GHOSTTY_TERMINAL_OPT_COLOR_BACKGROUND,\n background.ptr\n ),\n 'ghostty_terminal_set(background)'\n );\n assertResult(\n this.exports.ghostty_terminal_set(terminal, GHOSTTY_TERMINAL_OPT_COLOR_CURSOR, cursor.ptr),\n 'ghostty_terminal_set(cursor)'\n );\n assertResult(\n this.exports.ghostty_terminal_set(\n terminal,\n GHOSTTY_TERMINAL_OPT_COLOR_PALETTE,\n palettePtr\n ),\n 'ghostty_terminal_set(palette)'\n );\n } finally {\n foreground.free();\n background.free();\n cursor.free();\n this.freeBytes(palettePtr, paletteColors.length * 3);\n }\n }\n\n readTerminalSize(terminal: number): { cols: number; rows: number } {\n const colsPtr = this.allocBytes(2);\n const rowsPtr = this.allocBytes(2);\n\n try {\n assertResult(\n this.exports.ghostty_terminal_get(terminal, GHOSTTY_TERMINAL_DATA_COLS, colsPtr),\n 'ghostty_terminal_get(cols)'\n );\n assertResult(\n this.exports.ghostty_terminal_get(terminal, GHOSTTY_TERMINAL_DATA_ROWS, rowsPtr),\n 'ghostty_terminal_get(rows)'\n );\n return {\n cols: this.view().getUint16(colsPtr, true),\n rows: this.view().getUint16(rowsPtr, true),\n };\n } finally {\n this.freeBytes(colsPtr, 2);\n this.freeBytes(rowsPtr, 2);\n }\n }\n\n readScrollbar(terminal: number): { total: number; offset: number; len: number } {\n const scrollbar = this.allocStruct('GhosttyTerminalScrollbar');\n\n try {\n assertResult(\n this.exports.ghostty_terminal_get(terminal, GHOSTTY_TERMINAL_DATA_SCROLLBAR, scrollbar.ptr),\n 'ghostty_terminal_get(scrollbar)'\n );\n\n return {\n total: Number(\n scrollbar.view.getBigUint64(\n this.field('GhosttyTerminalScrollbar', 'total').offset,\n true\n )\n ),\n offset: Number(\n scrollbar.view.getBigUint64(\n this.field('GhosttyTerminalScrollbar', 'offset').offset,\n true\n )\n ),\n len: Number(\n scrollbar.view.getBigUint64(this.field('GhosttyTerminalScrollbar', 'len').offset, true)\n ),\n };\n } finally {\n scrollbar.free();\n }\n }\n\n isTerminalModeEnabled(terminal: number, mode: number): boolean {\n const valuePtr = this.allocU8();\n\n try {\n assertResult(\n this.exports.ghostty_terminal_mode_get(terminal, mode, valuePtr),\n 'ghostty_terminal_mode_get'\n );\n return this.readU8(valuePtr) !== 0;\n } finally {\n this.freeU8(valuePtr);\n }\n }\n\n setTerminalMode(terminal: number, mode: number, enabled: boolean): void {\n assertResult(\n this.exports.ghostty_terminal_mode_set(terminal, mode, enabled ? 1 : 0),\n 'ghostty_terminal_mode_set'\n );\n }\n\n createFormatter(\n terminal: number,\n emit: number,\n options: { trim: boolean; unwrap: boolean; includePalette: boolean; selectionPtr?: number | null }\n ): number {\n const formatterOptions = this.allocStruct('GhosttyFormatterTerminalOptions');\n const extraOffset = this.field('GhosttyFormatterTerminalOptions', 'extra').offset;\n const extraView = this.view(\n formatterOptions.ptr + extraOffset,\n this.typeSize('GhosttyFormatterTerminalExtra')\n );\n const screenOffset = this.field('GhosttyFormatterTerminalExtra', 'screen').offset;\n const screenView = this.view(\n formatterOptions.ptr + extraOffset + screenOffset,\n this.typeSize('GhosttyFormatterScreenExtra')\n );\n const outFormatterPtr = this.allocOpaque();\n\n try {\n this.setField(\n formatterOptions.view,\n 'GhosttyFormatterTerminalOptions',\n 'size',\n this.typeSize('GhosttyFormatterTerminalOptions')\n );\n this.setField(formatterOptions.view, 'GhosttyFormatterTerminalOptions', 'emit', emit);\n this.setField(\n formatterOptions.view,\n 'GhosttyFormatterTerminalOptions',\n 'unwrap',\n options.unwrap\n );\n this.setField(\n formatterOptions.view,\n 'GhosttyFormatterTerminalOptions',\n 'trim',\n options.trim\n );\n this.setField(\n extraView,\n 'GhosttyFormatterTerminalExtra',\n 'size',\n this.typeSize('GhosttyFormatterTerminalExtra')\n );\n this.setField(\n extraView,\n 'GhosttyFormatterTerminalExtra',\n 'palette',\n options.includePalette\n );\n this.setField(\n screenView,\n 'GhosttyFormatterScreenExtra',\n 'size',\n this.typeSize('GhosttyFormatterScreenExtra')\n );\n const selectionOffset = this.field('GhosttyFormatterTerminalOptions', 'selection').offset;\n formatterOptions.view.setUint32(selectionOffset, options.selectionPtr ?? 0, true);\n\n assertResult(\n this.exports.ghostty_formatter_terminal_new(\n 0,\n outFormatterPtr,\n terminal,\n formatterOptions.ptr\n ),\n 'ghostty_formatter_terminal_new'\n );\n\n return this.readPointer(outFormatterPtr);\n } finally {\n formatterOptions.free();\n this.freeOpaque(outFormatterPtr);\n }\n }\n\n freeFormatter(formatter: number): void {\n this.exports.ghostty_formatter_free(formatter);\n }\n\n private resolveViewportGridRef(\n terminal: number,\n x: number,\n y: number\n ): StructAllocation | null {\n const point = this.allocStruct('GhosttyPoint');\n const outRef = this.allocStruct('GhosttyGridRef');\n\n try {\n this.setField(point.view, 'GhosttyPoint', 'tag', GHOSTTY_POINT_TAG_VIEWPORT);\n const coordOffset = this.field('GhosttyPoint', 'value').offset;\n const coordView = this.view(\n point.ptr + coordOffset,\n this.typeSize('GhosttyPointCoordinate')\n );\n this.setField(coordView, 'GhosttyPointCoordinate', 'x', x);\n this.setField(coordView, 'GhosttyPointCoordinate', 'y', y);\n\n const result = this.exports.ghostty_terminal_grid_ref(terminal, point.ptr, outRef.ptr);\n if (result !== GHOSTTY_SUCCESS) {\n outRef.free();\n return null;\n }\n\n return outRef;\n } finally {\n point.free();\n }\n }\n\n private createViewportSelection(\n terminal: number,\n cols: number,\n rows: number\n ): StructAllocation | null {\n const safeCols = Math.max(1, Math.floor(cols));\n const safeRows = Math.max(1, Math.floor(rows));\n const start = this.resolveViewportGridRef(terminal, 0, 0);\n if (!start) {\n return null;\n }\n\n let end: StructAllocation | null = null;\n for (let row = safeRows - 1; row >= 0; row -= 1) {\n end = this.resolveViewportGridRef(terminal, safeCols - 1, row);\n if (end) {\n break;\n }\n }\n\n if (!end) {\n start.free();\n return null;\n }\n\n const selection = this.allocStruct('GhosttySelection');\n try {\n this.setField(selection.view, 'GhosttySelection', 'size', this.typeSize('GhosttySelection'));\n this.setField(selection.view, 'GhosttySelection', 'rectangle', false);\n\n const startOffset = this.field('GhosttySelection', 'start').offset;\n const endOffset = this.field('GhosttySelection', 'end').offset;\n this.bytes(selection.ptr + startOffset, this.typeSize('GhosttyGridRef')).set(\n this.bytes(start.ptr, this.typeSize('GhosttyGridRef'))\n );\n this.bytes(selection.ptr + endOffset, this.typeSize('GhosttyGridRef')).set(\n this.bytes(end.ptr, this.typeSize('GhosttyGridRef'))\n );\n\n return selection;\n } finally {\n start.free();\n end.free();\n }\n }\n\n formatViewport(\n terminal: number,\n emit: number,\n options: { trim: boolean; unwrap: boolean; includePalette: boolean },\n viewport: { cols: number; rows: number }\n ): string {\n const terminalSize = this.readTerminalSize(terminal);\n const selection = this.createViewportSelection(\n terminal,\n Math.max(1, Math.min(terminalSize.cols, viewport.cols)),\n Math.max(1, Math.min(terminalSize.rows, viewport.rows))\n );\n const formatter = this.createFormatter(terminal, emit, {\n ...options,\n selectionPtr: selection?.ptr ?? null,\n });\n\n try {\n return this.formatFormatter(formatter);\n } finally {\n this.freeFormatter(formatter);\n selection?.free();\n }\n }\n\n formatFormatter(formatter: number): string {\n const outPtrPtr = this.allocOpaque();\n const outLenPtr = this.allocUsize();\n\n try {\n assertResult(\n this.exports.ghostty_formatter_format_alloc(formatter, 0, outPtrPtr, outLenPtr),\n 'ghostty_formatter_format_alloc'\n );\n\n const outPtr = this.readPointer(outPtrPtr);\n const outLen = this.readUsize(outLenPtr);\n const memoryByteLength = this.buffer().byteLength;\n\n try {\n if (outLen === 0 || outPtr === 0) {\n return '';\n }\n\n if (outPtr < 0 || outPtr > memoryByteLength || outLen > memoryByteLength - outPtr) {\n throw new Error(\n `ghostty_formatter_format_alloc returned invalid slice ptr=${outPtr} len=${outLen} mem=${memoryByteLength}`\n );\n }\n\n return this.readOwnedUtf8(outPtr, outLen);\n } finally {\n if (outLen > 0 && outPtr !== 0) {\n this.exports.ghostty_free(0, outPtr, outLen);\n }\n }\n } finally {\n this.freeOpaque(outPtrPtr);\n this.freeUsize(outLenPtr);\n }\n }\n\n createRenderState(): number {\n const outStatePtr = this.allocOpaque();\n\n try {\n assertResult(this.exports.ghostty_render_state_new(0, outStatePtr), 'ghostty_render_state_new');\n return this.readPointer(outStatePtr);\n } finally {\n this.freeOpaque(outStatePtr);\n }\n }\n\n freeRenderState(state: number): void {\n this.exports.ghostty_render_state_free(state);\n }\n\n updateRenderState(state: number, terminal: number): void {\n assertResult(\n this.exports.ghostty_render_state_update(state, terminal),\n 'ghostty_render_state_update'\n );\n }\n\n getRenderStateValueResult(state: number, data: number, outPtr: number): number {\n return this.exports.ghostty_render_state_get(state, data, outPtr);\n }\n\n getRenderStateValue(state: number, data: number, outPtr: number): void {\n assertResult(this.getRenderStateValueResult(state, data, outPtr), 'ghostty_render_state_get');\n }\n\n setRenderStateValue(state: number, option: number, valuePtr: number): void {\n assertResult(this.exports.ghostty_render_state_set(state, option, valuePtr), 'ghostty_render_state_set');\n }\n\n getRenderStateColors(state: number, outColorsPtr: number): void {\n assertResult(\n this.exports.ghostty_render_state_colors_get(state, outColorsPtr),\n 'ghostty_render_state_colors_get'\n );\n }\n\n createRenderStateRowIterator(): number {\n const outIteratorPtr = this.allocOpaque();\n\n try {\n assertResult(\n this.exports.ghostty_render_state_row_iterator_new(0, outIteratorPtr),\n 'ghostty_render_state_row_iterator_new'\n );\n return this.readPointer(outIteratorPtr);\n } finally {\n this.freeOpaque(outIteratorPtr);\n }\n }\n\n freeRenderStateRowIterator(iterator: number): void {\n this.exports.ghostty_render_state_row_iterator_free(iterator);\n }\n\n bindRenderStateRowIterator(state: number, iterator: number): void {\n const outPtr = this.allocOpaque();\n\n try {\n this.view(outPtr, 4).setUint32(0, iterator, true);\n this.getRenderStateValue(state, 4, outPtr);\n } finally {\n this.freeOpaque(outPtr);\n }\n }\n\n nextRenderStateRowIterator(iterator: number): boolean {\n return this.exports.ghostty_render_state_row_iterator_next(iterator) !== 0;\n }\n\n getRenderStateRowValueResult(iterator: number, data: number, outPtr: number): number {\n return this.exports.ghostty_render_state_row_get(iterator, data, outPtr);\n }\n\n getRenderStateRowValue(iterator: number, data: number, outPtr: number): void {\n assertResult(this.getRenderStateRowValueResult(iterator, data, outPtr), 'ghostty_render_state_row_get');\n }\n\n setRenderStateRowValue(iterator: number, option: number, valuePtr: number): void {\n assertResult(\n this.exports.ghostty_render_state_row_set(iterator, option, valuePtr),\n 'ghostty_render_state_row_set'\n );\n }\n\n createRenderStateRowCells(): number {\n const outCellsPtr = this.allocOpaque();\n\n try {\n assertResult(\n this.exports.ghostty_render_state_row_cells_new(0, outCellsPtr),\n 'ghostty_render_state_row_cells_new'\n );\n return this.readPointer(outCellsPtr);\n } finally {\n this.freeOpaque(outCellsPtr);\n }\n }\n\n freeRenderStateRowCells(cells: number): void {\n this.exports.ghostty_render_state_row_cells_free(cells);\n }\n\n bindRenderStateRowCells(iterator: number, cells: number): void {\n const outPtr = this.allocOpaque();\n\n try {\n this.view(outPtr, 4).setUint32(0, cells, true);\n this.getRenderStateRowValue(iterator, 3, outPtr);\n } finally {\n this.freeOpaque(outPtr);\n }\n }\n\n nextRenderStateRowCell(cells: number): boolean {\n return this.exports.ghostty_render_state_row_cells_next(cells) !== 0;\n }\n\n selectRenderStateRowCell(cells: number, x: number): void {\n assertResult(\n this.exports.ghostty_render_state_row_cells_select(cells, x),\n 'ghostty_render_state_row_cells_select'\n );\n }\n\n getRenderStateRowCellValueResult(cells: number, data: number, outPtr: number): number {\n return this.exports.ghostty_render_state_row_cells_get(cells, data, outPtr);\n }\n\n getRenderStateRowCellValue(cells: number, data: number, outPtr: number): void {\n assertResult(\n this.getRenderStateRowCellValueResult(cells, data, outPtr),\n 'ghostty_render_state_row_cells_get'\n );\n }\n\n getRawRowValueResult(row: bigint, data: number, outPtr: number): number {\n return this.exports.ghostty_row_get(row, data, outPtr);\n }\n\n getRawRowValue(row: bigint, data: number, outPtr: number): void {\n assertResult(this.getRawRowValueResult(row, data, outPtr), 'ghostty_row_get');\n }\n\n getRawCellValueResult(cell: bigint, data: number, outPtr: number): number {\n return this.exports.ghostty_cell_get(cell, data, outPtr);\n }\n\n getRawCellValue(cell: bigint, data: number, outPtr: number): void {\n assertResult(this.getRawCellValueResult(cell, data, outPtr), 'ghostty_cell_get');\n }\n\n createKeyEncoder(): number {\n const outEncoderPtr = this.allocOpaque();\n\n try {\n assertResult(this.exports.ghostty_key_encoder_new(0, outEncoderPtr), 'ghostty_key_encoder_new');\n return this.readPointer(outEncoderPtr);\n } finally {\n this.freeOpaque(outEncoderPtr);\n }\n }\n\n freeKeyEncoder(encoder: number): void {\n this.exports.ghostty_key_encoder_free(encoder);\n }\n\n createMouseEncoder(): number {\n const outEncoderPtr = this.allocOpaque();\n const trackLastCellPtr = this.allocU8();\n\n try {\n assertResult(\n this.exports.ghostty_mouse_encoder_new(0, outEncoderPtr),\n 'ghostty_mouse_encoder_new'\n );\n const encoder = this.readPointer(outEncoderPtr);\n this.view().setUint8(trackLastCellPtr, 1);\n this.exports.ghostty_mouse_encoder_setopt(\n encoder,\n GHOSTTY_MOUSE_ENCODER_OPT_TRACK_LAST_CELL,\n trackLastCellPtr\n );\n return encoder;\n } finally {\n this.freeU8(trackLastCellPtr);\n this.freeOpaque(outEncoderPtr);\n }\n }\n\n freeMouseEncoder(encoder: number): void {\n this.exports.ghostty_mouse_encoder_free(encoder);\n }\n\n resetMouseEncoder(encoder: number): void {\n this.exports.ghostty_mouse_encoder_reset(encoder);\n }\n\n encodeMouseEvent(\n encoder: number,\n terminal: number,\n options: GhosttyMouseEncodeOptions\n ): string | null {\n void encoder;\n\n const trackingAny = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_ANY_MOUSE);\n const trackingButton = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_BUTTON_MOUSE);\n const trackingNormal = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_NORMAL_MOUSE);\n const trackingX10 = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_X10_MOUSE);\n\n if (!trackingAny && !trackingButton && !trackingNormal && !trackingX10) {\n return null;\n }\n\n if (options.action === 'motion' && !(trackingAny || (trackingButton && options.anyButtonPressed))) {\n return null;\n }\n\n if (trackingX10 && options.action !== 'press') {\n return null;\n }\n\n if (!trackingAny && !trackingButton && !trackingX10 && options.action === 'motion') {\n return null;\n }\n\n const baseCode = mouseButtonCode(options.button);\n if (baseCode === null) {\n return null;\n }\n\n const column = Math.max(1, Math.floor(options.x / Math.max(1, options.cellWidth)) + 1);\n const row = Math.max(1, Math.floor(options.y / Math.max(1, options.cellHeight)) + 1);\n const pixelX = Math.round(options.x + 1);\n const pixelY = Math.round(options.y + 1);\n\n let code =\n options.action === 'release' &&\n !this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_MOUSE) &&\n !this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_PIXELS_MOUSE)\n ? 3\n : baseCode;\n\n if (options.action === 'motion') {\n code += 32;\n }\n\n code += encodeMouseModifierBits(options.mods);\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_PIXELS_MOUSE)) {\n const suffix = options.action === 'release' ? 'm' : 'M';\n return `\\u001b[<${code};${pixelX};${pixelY}${suffix}`;\n }\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_SGR_MOUSE)) {\n const suffix = options.action === 'release' ? 'm' : 'M';\n return `\\u001b[<${code};${column};${row}${suffix}`;\n }\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_URXVT_MOUSE)) {\n return `\\u001b[${code};${column};${row}M`;\n }\n\n if (this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_UTF8_MOUSE) || trackingNormal || trackingButton || trackingAny || trackingX10) {\n const encodedCode = encodeX10Byte(code);\n const encodedColumn = encodeX10Byte(column);\n const encodedRow = encodeX10Byte(row);\n if (!encodedCode || !encodedColumn || !encodedRow) {\n return null;\n }\n return `\\u001b[M${encodedCode}${encodedColumn}${encodedRow}`;\n }\n\n return null;\n }\n\n encodeKeyEvent(\n encoder: number,\n terminal: number,\n options: {\n action: 'press' | 'repeat' | 'release';\n keyCode: number;\n mods: number;\n composing: boolean;\n utf8?: string | null;\n unshiftedCodepoint?: number | null;\n }\n ): string | null {\n if (options.keyCode <= 0) {\n return null;\n }\n\n const eventPtrPtr = this.allocOpaque();\n let eventHandle = 0;\n let utf8Allocation: { ptr: number; len: number; free: () => void } | null = null;\n\n try {\n assertResult(this.exports.ghostty_key_event_new(0, eventPtrPtr), 'ghostty_key_event_new');\n eventHandle = this.readPointer(eventPtrPtr);\n this.exports.ghostty_key_encoder_setopt_from_terminal(encoder, terminal);\n this.exports.ghostty_key_event_set_action(\n eventHandle,\n options.action === 'release'\n ? GHOSTTY_KEY_ACTION_RELEASE\n : options.action === 'repeat'\n ? GHOSTTY_KEY_ACTION_REPEAT\n : GHOSTTY_KEY_ACTION_PRESS\n );\n this.exports.ghostty_key_event_set_key(eventHandle, options.keyCode);\n this.exports.ghostty_key_event_set_mods(eventHandle, options.mods);\n this.exports.ghostty_key_event_set_consumed_mods(eventHandle, 0);\n this.exports.ghostty_key_event_set_composing(eventHandle, options.composing ? 1 : 0);\n\n if (options.utf8) {\n utf8Allocation = this.writeString(options.utf8);\n this.exports.ghostty_key_event_set_utf8(\n eventHandle,\n utf8Allocation.ptr,\n utf8Allocation.len\n );\n }\n\n if (typeof options.unshiftedCodepoint === 'number') {\n this.exports.ghostty_key_event_set_unshifted_codepoint(\n eventHandle,\n options.unshiftedCodepoint\n );\n }\n\n return this.encodeKeyHandle(encoder, eventHandle);\n } finally {\n utf8Allocation?.free();\n if (eventHandle !== 0) {\n this.exports.ghostty_key_event_free(eventHandle);\n }\n this.freeOpaque(eventPtrPtr);\n }\n }\n\n private encodeKeyHandle(encoder: number, eventHandle: number): string | null {\n const requiredPtr = this.allocUsize();\n\n try {\n const sizeResult = this.exports.ghostty_key_encoder_encode(encoder, eventHandle, 0, 0, requiredPtr);\n if (sizeResult !== GHOSTTY_OUT_OF_SPACE && sizeResult !== GHOSTTY_SUCCESS) {\n assertResult(sizeResult, 'ghostty_key_encoder_encode(size)');\n }\n\n const required = Math.max(0, this.readUsize(requiredPtr));\n if (required === 0) {\n return null;\n }\n\n const bufferPtr = this.allocBytes(required);\n const writtenPtr = this.allocUsize();\n\n try {\n assertResult(\n this.exports.ghostty_key_encoder_encode(\n encoder,\n eventHandle,\n bufferPtr,\n required,\n writtenPtr\n ),\n 'ghostty_key_encoder_encode'\n );\n\n const written = this.readUsize(writtenPtr);\n if (written === 0) {\n return null;\n }\n\n return this.readOwnedUtf8(bufferPtr, written);\n } finally {\n this.freeBytes(bufferPtr, required);\n this.freeUsize(writtenPtr);\n }\n } finally {\n this.freeUsize(requiredPtr);\n }\n }\n\n encodePaste(terminal: number, data: string): string {\n const input = this.writeString(data);\n const requiredPtr = this.allocUsize();\n\n try {\n const bracketed = this.isTerminalModeEnabled(terminal, GHOSTTY_MODE_BRACKETED_PASTE);\n const sizeResult = this.exports.ghostty_paste_encode(\n input.ptr,\n input.len,\n bracketed ? 1 : 0,\n 0,\n 0,\n requiredPtr\n );\n if (sizeResult !== GHOSTTY_OUT_OF_SPACE && sizeResult !== GHOSTTY_SUCCESS) {\n assertResult(sizeResult, 'ghostty_paste_encode(size)');\n }\n\n const required = Math.max(0, this.readUsize(requiredPtr));\n if (required === 0) {\n return '';\n }\n\n const outputPtr = this.allocBytes(required);\n const writtenPtr = this.allocUsize();\n\n try {\n assertResult(\n this.exports.ghostty_paste_encode(\n input.ptr,\n input.len,\n bracketed ? 1 : 0,\n outputPtr,\n required,\n writtenPtr\n ),\n 'ghostty_paste_encode'\n );\n\n return this.readOwnedUtf8(outputPtr, this.readUsize(writtenPtr));\n } finally {\n this.freeBytes(outputPtr, required);\n this.freeUsize(writtenPtr);\n }\n } finally {\n input.free();\n this.freeUsize(requiredPtr);\n }\n }\n}\n\nasync function loadGhosttyWasmBytes(source: string): Promise<ArrayBuffer> {\n const isFilePath =\n source.startsWith('/') ||\n source.startsWith('./') ||\n source.startsWith('../') ||\n /^[A-Za-z]:[\\\\/]/.test(source);\n\n if (isFilePath && typeof Bun !== 'undefined') {\n return Bun.file(source).arrayBuffer();\n }\n\n const response = await fetch(source);\n if (!response.ok) {\n throw new Error(`failed to load ghostty wasm: ${response.status} ${response.statusText}`);\n }\n\n return response.arrayBuffer();\n}\n\nexport async function getGhosttyBindings(): Promise<GhosttyBindings> {\n if (!bindingsPromise) {\n bindingsPromise = (async () => {\n const wasmBytes = await loadGhosttyWasmBytes(ghosttyWasmUrl);\n const wasmModule = await WebAssembly.instantiate(wasmBytes, {\n env: {\n log() {\n // ignore wasm logs in production usage\n },\n },\n });\n\n const exports = wasmModule.instance.exports as GhosttyExports;\n const bytes = new Uint8Array(exports.memory.buffer);\n const typeJsonPtr = exports.ghostty_type_json();\n let end = typeJsonPtr;\n\n while (bytes[end] !== 0) {\n end += 1;\n }\n\n const layout = JSON.parse(\n new TextDecoder().decode(bytes.subarray(typeJsonPtr, end))\n ) as LayoutMap;\n\n return new GhosttyBindings(exports, layout);\n })();\n }\n\n return bindingsPromise;\n}\n\nexport {\n GHOSTTY_FORMATTER_FORMAT_HTML,\n GHOSTTY_FORMATTER_FORMAT_PLAIN,\n GHOSTTY_KEY_ACTION_PRESS,\n GHOSTTY_KEY_ACTION_RELEASE,\n GHOSTTY_KEY_ACTION_REPEAT,\n};\n","import { CanvasRenderer } from './canvas-renderer';\nimport { getGhosttyKeyCode, getUnshiftedCodepoint } from './ghostty-keycodes';\nimport {\n createRenderState,\n disposeRenderStateResources,\n iterateRows,\n readRenderSnapshotMeta,\n updateRenderState,\n type GhosttyRenderStateResources,\n} from './render-state';\nimport {\n clearSelection as resetSelectionData,\n createEmptySelectionState,\n hasSelection,\n projectSelectionRects,\n resolvePointerSelection,\n serializeSelectionText,\n updateSelectionFocus,\n type SelectionMode,\n type SelectionPoint,\n type SelectionState,\n} from './selection-model';\nimport {\n isCopyShortcut,\n writeSelectionToClipboard,\n writeSelectionToCopyEvent,\n} from './selection-clipboard';\nimport {\n getGhosttyBindings,\n keyboardEventToGhosttyMods,\n type GhosttyBindings,\n} from './ghostty-wasm';\nimport type {\n CompatibleBufferLine,\n CompatibleTerminalBuffer,\n CompatibleTerminalLike,\n GhosttyCellDimensions,\n GhosttyRenderRow,\n GhosttyTerminalModeSnapshot,\n GhosttyTerminalInitOptions,\n GhosttyTerminalSize,\n GhosttyViewportGesture,\n TerminalDisposable,\n} from './types';\n\nconst DEFAULT_COLS = 80;\nconst DEFAULT_ROWS = 24;\nconst DEFAULT_CELL_WIDTH = 9;\nconst DEFAULT_CELL_HEIGHT = 17;\nconst AUTO_SCROLL_INTERVAL_MS = 48;\nconst TERMINAL_ENGINE = 'ghostty-official';\n\nconst GHOSTTY_MODE_X10_MOUSE = 9;\nconst GHOSTTY_MODE_NORMAL_MOUSE = 1000;\nconst GHOSTTY_MODE_BUTTON_MOUSE = 1002;\nconst GHOSTTY_MODE_ANY_MOUSE = 1003;\nconst GHOSTTY_MODE_ALT_SCROLL = 1007;\nconst GHOSTTY_MODE_ALT_SCREEN = 1047;\nconst GHOSTTY_MODE_ALT_SCREEN_SAVE = 1049;\n\nconst MOUSE_TRACKING_MODES: readonly number[] = [\n GHOSTTY_MODE_X10_MOUSE,\n GHOSTTY_MODE_NORMAL_MOUSE,\n GHOSTTY_MODE_BUTTON_MOUSE,\n GHOSTTY_MODE_ANY_MOUSE,\n];\n\nconst GHOSTTY_MOUSE_BUTTON_LEFT = 1;\nconst GHOSTTY_MOUSE_BUTTON_MIDDLE = 3;\nconst GHOSTTY_MOUSE_BUTTON_RIGHT = 2;\nconst GHOSTTY_MOUSE_BUTTON_FOUR = 4;\nconst GHOSTTY_MOUSE_BUTTON_FIVE = 5;\n\ntype PointerDragState = {\n active: boolean;\n moved: boolean;\n mode: SelectionMode;\n lastClientX: number | null;\n lastClientY: number | null;\n};\n\ntype InputRoutingState = {\n mouseReporting: boolean;\n altScroll: boolean;\n};\n\nclass BufferLine implements CompatibleBufferLine {\n constructor(private readonly content: string) {}\n\n translateToString(trimRight: boolean): string {\n return trimRight ? this.content.replace(/\\s+$/u, '') : this.content;\n }\n}\n\nclass TerminalBuffer implements CompatibleTerminalBuffer {\n active = {\n baseY: 0,\n viewportY: 0,\n length: DEFAULT_ROWS,\n getLine: (index: number): CompatibleBufferLine | null => {\n const relativeIndex = index - this.active.viewportY;\n const line = this.visibleLines[relativeIndex];\n return typeof line === 'string' ? new BufferLine(line) : null;\n },\n };\n\n private visibleLines: string[] = Array.from({ length: DEFAULT_ROWS }, () => '');\n\n setViewport(viewportY: number, baseY: number, length: number, lines: string[]): void {\n this.active.viewportY = viewportY;\n this.active.baseY = baseY;\n this.active.length = length;\n this.visibleLines = lines;\n }\n}\n\nfunction shouldEncodeOnKeyDown(event: KeyboardEvent): boolean {\n const isPlainText = event.key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey;\n if (isPlainText) {\n return false;\n }\n\n return true;\n}\n\nfunction normalizeVisibleLines(rows: GhosttyRenderRow[], expectedRows: number): string[] {\n const lines = rows.slice(0, expectedRows).map((row) => row.text);\n while (lines.length < expectedRows) {\n lines.push('');\n }\n return lines;\n}\n\nfunction pointerLikeEventToGhosttyMods(event: {\n shiftKey?: boolean;\n ctrlKey?: boolean;\n altKey?: boolean;\n metaKey?: boolean;\n}): number {\n return keyboardEventToGhosttyMods({\n shiftKey: Boolean(event.shiftKey),\n ctrlKey: Boolean(event.ctrlKey),\n altKey: Boolean(event.altKey),\n metaKey: Boolean(event.metaKey),\n getModifierState: () => false,\n } as unknown as KeyboardEvent);\n}\n\nexport class FitAddon {\n private terminal: GhosttyTerminalController | null = null;\n\n activate(terminal: CompatibleTerminalLike): void {\n this.terminal = terminal instanceof GhosttyTerminalController ? terminal : null;\n }\n\n fit(): void {\n const proposed = this.proposeDimensions();\n if (!this.terminal || !proposed) {\n return;\n }\n\n this.terminal.resize(proposed.cols, proposed.rows);\n }\n\n proposeDimensions(): GhosttyTerminalSize | null {\n return this.terminal?.measureSizeFromElement() ?? null;\n }\n\n dispose(): void {\n this.terminal = null;\n }\n}\n\nexport class GhosttyTerminalController implements CompatibleTerminalLike {\n readonly buffer = new TerminalBuffer();\n readonly _core = {\n _renderService: {\n dimensions: {\n css: {\n cell: {\n width: DEFAULT_CELL_WIDTH,\n height: DEFAULT_CELL_HEIGHT,\n },\n },\n },\n },\n };\n\n readonly options: GhosttyTerminalInitOptions;\n\n element: HTMLElement | null = null;\n textarea: HTMLElement | null = null;\n cols = DEFAULT_COLS;\n rows = DEFAULT_ROWS;\n\n private readonly bindings: GhosttyBindings;\n private readonly terminalHandle: number;\n private readonly keyEncoderHandle: number;\n private readonly mouseEncoderHandle: number;\n private readonly renderState: GhosttyRenderStateResources;\n private readonly dataListeners = new Set<(data: string) => void>();\n private readonly addons = new Set<{ dispose: () => void }>();\n private screenElement: HTMLDivElement | null = null;\n private renderer: CanvasRenderer | null = null;\n private renderRaf: number | null = null;\n private disposed = false;\n private disableStdin: boolean;\n private customKeyEventHandler: (event: KeyboardEvent) => boolean = () => true;\n private imeIsComposing = false;\n private lastCompositionCommit: { data: string; at: number } | null = null;\n private selectionState: SelectionState = createEmptySelectionState();\n private readonly lineCache = new Map<number, string>();\n private lastViewportOffset = 0;\n private lastViewportRows = DEFAULT_ROWS;\n private lastRenderedRows: GhosttyRenderRow[] = [];\n private pointerDrag: PointerDragState = {\n active: false,\n moved: false,\n mode: 'character',\n lastClientX: null,\n lastClientY: null,\n };\n private autoScrollTimer: ReturnType<typeof setInterval> | null = null;\n private readonly domEventDisposers: Array<() => void> = [];\n private copyShortcutSuppressed = false;\n private scrollbarThumb: HTMLDivElement | null = null;\n private scrollbarFadeTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly pressedMouseButtons = new Set<number>();\n private wheelPixelDelta = 0;\n private mouseDragActive = false;\n\n private constructor(\n bindings: GhosttyBindings,\n terminalHandle: number,\n keyEncoderHandle: number,\n mouseEncoderHandle: number,\n renderState: GhosttyRenderStateResources,\n options: GhosttyTerminalInitOptions\n ) {\n this.bindings = bindings;\n this.terminalHandle = terminalHandle;\n this.keyEncoderHandle = keyEncoderHandle;\n this.mouseEncoderHandle = mouseEncoderHandle;\n this.renderState = renderState;\n this.options = options;\n this.disableStdin = Boolean(options.disableStdin);\n }\n\n static async create(options: GhosttyTerminalInitOptions): Promise<GhosttyTerminalController> {\n const bindings = await getGhosttyBindings();\n const terminalHandle = bindings.createTerminal(DEFAULT_COLS, DEFAULT_ROWS, options.scrollback);\n let keyEncoderHandle = 0;\n let mouseEncoderHandle = 0;\n let renderState: GhosttyRenderStateResources | null = null;\n\n try {\n bindings.setTerminalTheme(terminalHandle, options.theme);\n keyEncoderHandle = bindings.createKeyEncoder();\n mouseEncoderHandle = bindings.createMouseEncoder();\n renderState = createRenderState(bindings);\n\n return new GhosttyTerminalController(\n bindings,\n terminalHandle,\n keyEncoderHandle,\n mouseEncoderHandle,\n renderState,\n options\n );\n } catch (error) {\n if (renderState) {\n disposeRenderStateResources(renderState);\n }\n if (keyEncoderHandle !== 0) {\n bindings.freeKeyEncoder(keyEncoderHandle);\n }\n if (mouseEncoderHandle !== 0) {\n bindings.freeMouseEncoder(mouseEncoderHandle);\n }\n bindings.freeTerminal(terminalHandle);\n throw error;\n }\n }\n\n open(container: HTMLElement): void {\n if (this.disposed || this.element) {\n return;\n }\n\n const root = document.createElement('div');\n root.className = 'xterm';\n root.style.position = 'absolute';\n root.style.inset = '0';\n root.style.overflow = 'hidden';\n root.style.width = '100%';\n root.style.height = '100%';\n root.style.backgroundColor = this.options.theme.background;\n root.style.color = this.options.theme.foreground;\n root.style.fontFamily = this.options.fontFamily;\n root.style.fontSize = `${this.options.fontSize}px`;\n root.style.lineHeight = '1.2';\n\n const viewport = document.createElement('div');\n viewport.className = 'xterm-viewport';\n viewport.style.width = '100%';\n viewport.style.height = '100%';\n viewport.style.overflow = 'hidden';\n viewport.style.position = 'relative';\n\n const screen = document.createElement('div');\n screen.className = 'xterm-screen';\n screen.style.width = '100%';\n screen.style.height = '100%';\n screen.style.position = 'relative';\n screen.style.userSelect = 'none';\n screen.style.webkitUserSelect = 'none';\n screen.style.backgroundColor = this.options.theme.background;\n\n const textarea = document.createElement('div');\n textarea.className = 'xterm-helper-textarea';\n textarea.setAttribute('aria-label', 'Terminal Input');\n textarea.setAttribute('role', 'textbox');\n textarea.setAttribute('contenteditable', 'true');\n textarea.setAttribute('autocorrect', 'off');\n textarea.setAttribute('autocapitalize', 'off');\n textarea.setAttribute('spellcheck', 'false');\n textarea.style.position = 'absolute';\n textarea.style.opacity = '1';\n textarea.style.pointerEvents = 'none';\n textarea.style.left = '0';\n textarea.style.top = '0';\n textarea.style.minWidth = '1px';\n textarea.style.minHeight = '1px';\n textarea.style.whiteSpace = 'pre';\n textarea.style.border = '0';\n textarea.style.padding = '0';\n textarea.style.margin = '0';\n textarea.style.color = this.options.theme.foreground;\n textarea.style.backgroundColor = 'transparent';\n textarea.style.caretColor = 'transparent';\n textarea.style.overflow = 'visible';\n textarea.style.outline = 'none';\n textarea.style.boxShadow = 'none';\n textarea.style.fontFamily = this.options.fontFamily;\n textarea.style.fontSize = `${this.options.fontSize}px`;\n textarea.style.userSelect = 'text';\n textarea.style.webkitUserSelect = 'text';\n\n const scrollbarTrack = document.createElement('div');\n scrollbarTrack.className = 'xterm-scrollbar-track';\n scrollbarTrack.style.position = 'absolute';\n scrollbarTrack.style.top = '0';\n scrollbarTrack.style.right = '0';\n scrollbarTrack.style.width = '8px';\n scrollbarTrack.style.height = '100%';\n scrollbarTrack.style.backgroundColor = 'transparent';\n scrollbarTrack.style.pointerEvents = 'none';\n\n const scrollbarThumb = document.createElement('div');\n scrollbarThumb.className = 'xterm-scrollbar-thumb';\n scrollbarThumb.style.position = 'absolute';\n scrollbarThumb.style.top = '0';\n scrollbarThumb.style.right = '0';\n scrollbarThumb.style.width = '6px';\n scrollbarThumb.style.marginRight = '1px';\n scrollbarThumb.style.borderRadius = '3px';\n scrollbarThumb.style.backgroundColor = 'rgba(128, 128, 128, 0.5)';\n scrollbarThumb.style.pointerEvents = 'none';\n scrollbarThumb.style.transition = 'opacity 0.15s ease';\n scrollbarThumb.style.opacity = '0';\n\n scrollbarTrack.appendChild(scrollbarThumb);\n\n viewport.appendChild(screen);\n root.appendChild(viewport);\n root.appendChild(textarea);\n root.appendChild(scrollbarTrack);\n container.appendChild(root);\n\n this.element = root;\n this.screenElement = screen;\n this.textarea = textarea;\n this.scrollbarThumb = scrollbarThumb;\n this.renderer = new CanvasRenderer({\n screenElement: screen,\n theme: this.options.theme,\n fontFamily: this.options.fontFamily,\n fontSize: this.options.fontSize,\n });\n\n this.syncInputState();\n this.bindDomEvents();\n this.updateCellDimensions();\n\n const measured = this.measureSizeFromElement();\n if (measured) {\n this.resize(measured.cols, measured.rows);\n } else {\n this.render();\n }\n }\n\n loadAddon(addon: { activate: (terminal: CompatibleTerminalLike) => void; dispose: () => void }): void {\n addon.activate(this);\n this.addons.add(addon);\n }\n\n onData(callback: (data: string) => void): TerminalDisposable {\n this.dataListeners.add(callback);\n return {\n dispose: () => {\n this.dataListeners.delete(callback);\n },\n };\n }\n\n attachCustomKeyEventHandler(callback: (event: KeyboardEvent) => boolean): void {\n this.customKeyEventHandler = callback;\n }\n\n write(data: string | Uint8Array): void {\n if (this.disposed) {\n return;\n }\n\n const prevAltScreen = this.isAltScreenActive();\n this.bindings.writeVt(this.terminalHandle, data);\n const nextAltScreen = this.isAltScreenActive();\n if (prevAltScreen && !nextAltScreen) {\n this.clearMouseTrackingModes();\n }\n this.scheduleRender();\n }\n\n clearMouseTrackingModes(): void {\n if (this.disposed) {\n return;\n }\n for (const mode of MOUSE_TRACKING_MODES) {\n this.bindings.setTerminalMode(this.terminalHandle, mode, false);\n }\n this.bindings.resetMouseEncoder(this.mouseEncoderHandle);\n this.pressedMouseButtons.clear();\n this.mouseDragActive = false;\n }\n\n private isAltScreenActive(): boolean {\n return (\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN) ||\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN_SAVE)\n );\n }\n\n reset(): void {\n if (this.disposed) {\n return;\n }\n\n this.lineCache.clear();\n this.clearSelectionState(false);\n this.bindings.resetTerminal(this.terminalHandle);\n this.scheduleRender();\n }\n\n refresh(): void {\n if (this.disposed) {\n return;\n }\n\n this.render();\n }\n\n resize(cols: number, rows: number): void {\n if (this.disposed) {\n return;\n }\n\n const nextCols = Math.max(2, Math.floor(cols));\n const nextRows = Math.max(2, Math.floor(rows));\n this.cols = nextCols;\n this.rows = nextRows;\n this.clearSelectionState(false);\n this.bindings.resizeTerminal(this.terminalHandle, nextCols, nextRows, this.cellDimensions());\n this.bindings.resetMouseEncoder(this.mouseEncoderHandle);\n this.scheduleRender();\n }\n\n scrollLines(amount: number): void {\n if (this.disposed || amount === 0) {\n return;\n }\n\n this.bindings.scrollViewportDelta(this.terminalHandle, amount);\n this.render();\n }\n\n scrollToTop(): void {\n if (this.disposed) {\n return;\n }\n\n this.bindings.scrollViewportTop(this.terminalHandle);\n this.render();\n }\n\n scrollToBottom(): void {\n if (this.disposed) {\n return;\n }\n\n this.bindings.scrollViewportBottom(this.terminalHandle);\n this.render();\n }\n\n exportModeSnapshot(): GhosttyTerminalModeSnapshot {\n return {\n mouseX10: this.isModeEnabled(GHOSTTY_MODE_X10_MOUSE),\n mouseNormal: this.isModeEnabled(GHOSTTY_MODE_NORMAL_MOUSE),\n mouseButton: this.isModeEnabled(GHOSTTY_MODE_BUTTON_MOUSE),\n mouseAny: this.isModeEnabled(GHOSTTY_MODE_ANY_MOUSE),\n mouseUtf8: this.isModeEnabled(1005),\n mouseSgr: this.isModeEnabled(1006),\n mouseSgrPixels: this.isModeEnabled(1016),\n mouseUrxvt: this.isModeEnabled(1015),\n altScroll: this.isModeEnabled(GHOSTTY_MODE_ALT_SCROLL),\n altScreen1047: this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN),\n altScreen1049: this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN_SAVE),\n };\n }\n\n restoreModeSnapshot(snapshot: GhosttyTerminalModeSnapshot): void {\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_X10_MOUSE, snapshot.mouseX10);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_NORMAL_MOUSE, snapshot.mouseNormal);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_BUTTON_MOUSE, snapshot.mouseButton);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ANY_MOUSE, snapshot.mouseAny);\n this.bindings.setTerminalMode(this.terminalHandle, 1005, snapshot.mouseUtf8);\n this.bindings.setTerminalMode(this.terminalHandle, 1006, snapshot.mouseSgr);\n this.bindings.setTerminalMode(this.terminalHandle, 1016, snapshot.mouseSgrPixels);\n this.bindings.setTerminalMode(this.terminalHandle, 1015, snapshot.mouseUrxvt);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ALT_SCROLL, snapshot.altScroll);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ALT_SCREEN, snapshot.altScreen1047);\n this.bindings.setTerminalMode(this.terminalHandle, GHOSTTY_MODE_ALT_SCREEN_SAVE, snapshot.altScreen1049);\n this.bindings.resetMouseEncoder(this.mouseEncoderHandle);\n }\n\n handleViewportGesture(gesture: GhosttyViewportGesture): boolean {\n if (this.disposed || gesture.deltaY === 0) {\n return false;\n }\n\n const lines = this.gestureToLines(gesture);\n if (lines === 0) {\n return false;\n }\n\n const routing = this.getInputRoutingState();\n if (routing.mouseReporting) {\n const button = lines < 0 ? GHOSTTY_MOUSE_BUTTON_FOUR : GHOSTTY_MOUSE_BUTTON_FIVE;\n let consumed = false;\n for (let index = 0; index < Math.abs(lines); index += 1) {\n consumed =\n this.emitMouseInput({\n action: 'press',\n button,\n clientX: gesture.clientX,\n clientY: gesture.clientY,\n mods: pointerLikeEventToGhosttyMods(gesture),\n anyButtonPressed: this.pressedMouseButtons.size > 0,\n }) || consumed;\n }\n return consumed;\n }\n\n if (routing.altScroll) {\n return this.emitAltScrollInput(lines);\n }\n\n this.scrollLines(lines);\n return true;\n }\n\n paste(data: string): void {\n if (this.disposed || this.disableStdin || !data) {\n return;\n }\n\n const encoded = this.bindings.encodePaste(this.terminalHandle, data);\n if (!encoded) {\n return;\n }\n\n this.emitData(encoded);\n }\n\n focus(): void {\n this.textarea?.focus({ preventScroll: true });\n }\n\n getRendererKind(): string {\n return this.renderer?.kind ?? 'unknown';\n }\n\n setTheme(theme: GhosttyTerminalInitOptions['theme']): void {\n this.bindings.setTerminalTheme(this.terminalHandle, theme);\n this.options.theme = theme;\n\n if (this.element) {\n this.element.style.backgroundColor = theme.background;\n this.element.style.color = theme.foreground;\n }\n\n if (this.screenElement) {\n this.screenElement.style.backgroundColor = theme.background;\n }\n\n this.renderer?.setTheme(theme);\n this.scheduleRender();\n }\n\n setDisableStdin(disabled: boolean): void {\n this.disableStdin = disabled;\n this.syncInputState();\n }\n\n measureSizeFromElement(): GhosttyTerminalSize | null {\n const element = this.element;\n if (!element) {\n return null;\n }\n\n const rect = element.getBoundingClientRect();\n const { width, height } = this.cellDimensions();\n if (rect.width === 0 || rect.height === 0 || width <= 0 || height <= 0) {\n return null;\n }\n\n return {\n cols: Math.max(2, Math.floor(rect.width / width)),\n rows: Math.max(2, Math.floor(rect.height / height)),\n };\n }\n\n dispose(): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (this.renderRaf !== null) {\n cancelAnimationFrame(this.renderRaf);\n this.renderRaf = null;\n }\n\n this.stopAutoScroll();\n this.updateSelectionTextProbe(null);\n this.clearDomEventListeners();\n\n if (this.scrollbarFadeTimer) {\n clearTimeout(this.scrollbarFadeTimer);\n this.scrollbarFadeTimer = null;\n }\n\n for (const addon of this.addons) {\n addon.dispose();\n }\n this.addons.clear();\n\n this.renderer?.dispose();\n this.renderer = null;\n\n this.element?.remove();\n this.element = null;\n this.screenElement = null;\n this.textarea = null;\n this.scrollbarThumb = null;\n\n disposeRenderStateResources(this.renderState);\n this.bindings.freeMouseEncoder(this.mouseEncoderHandle);\n this.bindings.freeKeyEncoder(this.keyEncoderHandle);\n this.bindings.freeTerminal(this.terminalHandle);\n }\n\n private cellDimensions(): GhosttyCellDimensions {\n return this._core._renderService.dimensions.css.cell;\n }\n\n private syncInputState(): void {\n if (!this.textarea) {\n return;\n }\n\n (this.textarea as any).readOnly = this.disableStdin;\n this.textarea.tabIndex = this.disableStdin ? -1 : 0;\n if (this.disableStdin && document.activeElement === this.textarea) {\n this.textarea.blur();\n }\n }\n\n private bindDomEvents(): void {\n const root = this.element;\n const textarea = this.textarea;\n if (!root || !textarea) {\n return;\n }\n\n root.addEventListener('click', () => {\n if (!this.disableStdin) {\n this.focus();\n }\n });\n\n const selectSurface = this.screenElement ?? root;\n selectSurface.addEventListener('mousedown', (event) => {\n if (!(event instanceof MouseEvent)) {\n return;\n }\n\n if (!this.disableStdin) {\n this.focus();\n }\n\n if (this.getInputRoutingState().mouseReporting) {\n const button = this.mouseButtonFromEvent(event);\n if (button === null) {\n return;\n }\n this.clearSelectionState();\n this.pressedMouseButtons.add(button);\n this.mouseDragActive = true;\n this.emitMouseInput({\n action: 'press',\n button,\n clientX: event.clientX,\n clientY: event.clientY,\n mods: pointerLikeEventToGhosttyMods(event),\n anyButtonPressed: true,\n });\n event.preventDefault();\n return;\n }\n\n if (event.button !== 0) {\n return;\n }\n\n this.mouseDragActive = true;\n this.beginPointerSelection(event);\n event.preventDefault();\n });\n\n root.addEventListener(\n 'wheel',\n (event) => {\n if (\n this.handleViewportGesture({\n source: 'wheel',\n deltaY: event.deltaY,\n deltaMode: event.deltaMode,\n clientX: event.clientX,\n clientY: event.clientY,\n shiftKey: event.shiftKey,\n ctrlKey: event.ctrlKey,\n altKey: event.altKey,\n metaKey: event.metaKey,\n })\n ) {\n event.preventDefault();\n }\n },\n { passive: false }\n );\n\n const dragEventTarget =\n typeof window !== 'undefined' && typeof window.addEventListener === 'function'\n ? window\n : null;\n if (dragEventTarget) {\n const moveListener = (event: MouseEvent) => {\n if (!this.mouseDragActive) {\n return;\n }\n if (this.getInputRoutingState().mouseReporting) {\n this.emitMouseInput({\n action: 'motion',\n button: this.mouseButtonFromButtons(event.buttons),\n clientX: event.clientX,\n clientY: event.clientY,\n mods: pointerLikeEventToGhosttyMods(event),\n anyButtonPressed: this.pressedMouseButtons.size > 0 || event.buttons > 0,\n });\n return;\n }\n this.updatePointerSelection(event);\n };\n const upListener = (event: MouseEvent) => {\n if (!this.mouseDragActive) {\n return;\n }\n this.mouseDragActive = false;\n if (this.getInputRoutingState().mouseReporting) {\n const button = this.mouseButtonFromEvent(event);\n if (button !== null) {\n this.pressedMouseButtons.delete(button);\n }\n this.emitMouseInput({\n action: 'release',\n button,\n clientX: event.clientX,\n clientY: event.clientY,\n mods: pointerLikeEventToGhosttyMods(event),\n anyButtonPressed: this.pressedMouseButtons.size > 0,\n });\n return;\n }\n this.finishPointerSelection(event);\n };\n dragEventTarget.addEventListener('mousemove', moveListener);\n dragEventTarget.addEventListener('mouseup', upListener);\n this.domEventDisposers.push(() => {\n dragEventTarget.removeEventListener('mousemove', moveListener);\n dragEventTarget.removeEventListener('mouseup', upListener);\n });\n }\n\n textarea.addEventListener('keydown', (event) => {\n const selectionText = this.getSelectionText();\n if (selectionText && isCopyShortcut(event)) {\n this.copyShortcutSuppressed = true;\n event.preventDefault();\n void writeSelectionToClipboard(selectionText).catch(() => {});\n this.clearTextarea();\n return;\n }\n\n if (!this.customKeyEventHandler(event)) {\n return;\n }\n\n if (this.disableStdin || this.imeIsComposing) {\n return;\n }\n\n if (event.keyCode === 229) {\n return;\n }\n\n if (!shouldEncodeOnKeyDown(event)) {\n return;\n }\n\n const payload = this.encodeKeyboardEvent(event, event.repeat ? 'repeat' : 'press');\n if (!payload) {\n return;\n }\n\n event.preventDefault();\n this.emitData(payload);\n this.clearTextarea();\n });\n\n textarea.addEventListener('keyup', (event) => {\n if (this.copyShortcutSuppressed) {\n const key = event.key.toLowerCase();\n if (key === 'c') {\n event.preventDefault();\n return;\n }\n\n if (key === 'control' || key === 'meta' || key === 'os') {\n this.copyShortcutSuppressed = false;\n event.preventDefault();\n return;\n }\n }\n\n if (this.disableStdin || this.imeIsComposing) {\n return;\n }\n\n const payload = this.encodeKeyboardEvent(event, 'release');\n if (!payload) {\n return;\n }\n\n event.preventDefault();\n this.emitData(payload);\n this.clearTextarea();\n });\n\n textarea.addEventListener('compositionstart', () => {\n this.imeIsComposing = true;\n this.lastCompositionCommit = null;\n this.syncTextareaPositionToCursor();\n });\n\n textarea.addEventListener('compositionupdate', () => {\n this.syncTextareaPositionToCursor();\n });\n\n textarea.addEventListener('compositionend', (event) => {\n this.imeIsComposing = false;\n const finalData = event.data ?? '';\n if (finalData) {\n this.lastCompositionCommit = { data: finalData, at: Date.now() };\n this.emitData(finalData);\n this.clearTextarea();\n }\n });\n\n textarea.addEventListener('beforeinput', (event) => {\n if (this.disableStdin) {\n return;\n }\n\n if (event.inputType === 'insertFromPaste') {\n return;\n }\n\n const data = event.data ?? '';\n if (!data) {\n return;\n }\n\n if (event.isComposing || this.imeIsComposing) {\n return;\n }\n\n const recentCompositionCommit = this.lastCompositionCommit;\n if (\n recentCompositionCommit &&\n recentCompositionCommit.data === data &&\n Date.now() - recentCompositionCommit.at < 40\n ) {\n this.lastCompositionCommit = null;\n event.preventDefault();\n this.clearTextarea();\n return;\n }\n\n this.lastCompositionCommit = null;\n\n event.preventDefault();\n this.emitData(data);\n this.clearTextarea();\n });\n\n textarea.addEventListener('paste', (event) => {\n if (this.disableStdin) {\n return;\n }\n\n const text = event.clipboardData?.getData('text/plain') ?? '';\n if (!text) {\n return;\n }\n\n event.preventDefault();\n this.paste(text);\n this.clearTextarea();\n });\n\n textarea.addEventListener('copy', (event) => {\n const selectionText = this.getSelectionText();\n if (!selectionText) {\n return;\n }\n\n writeSelectionToCopyEvent(event, selectionText);\n });\n\n textarea.addEventListener('input', () => {\n if (this.disableStdin || this.imeIsComposing) {\n return;\n }\n\n const data = textarea.textContent ?? '';\n if (!data) {\n this.clearTextarea();\n return;\n }\n\n const recentCompositionCommit = this.lastCompositionCommit;\n if (\n recentCompositionCommit &&\n recentCompositionCommit.data === data &&\n Date.now() - recentCompositionCommit.at < 40\n ) {\n this.lastCompositionCommit = null;\n this.clearTextarea();\n return;\n }\n\n this.lastCompositionCommit = null;\n this.emitData(data);\n this.clearTextarea();\n });\n }\n\n private encodeKeyboardEvent(\n event: KeyboardEvent,\n action: 'press' | 'repeat' | 'release'\n ): string | null {\n const keyCode = getGhosttyKeyCode(event.code);\n if (keyCode === 0) {\n return null;\n }\n\n const utf8 =\n event.key.length === 1 && !event.ctrlKey && !event.metaKey ? event.key : null;\n\n return this.bindings.encodeKeyEvent(this.keyEncoderHandle, this.terminalHandle, {\n action,\n keyCode,\n mods: keyboardEventToGhosttyMods(event),\n composing: event.isComposing,\n utf8,\n unshiftedCodepoint: getUnshiftedCodepoint(event.code),\n });\n }\n\n private getInputRoutingState(): InputRoutingState {\n const mouseReporting =\n this.isModeEnabled(GHOSTTY_MODE_X10_MOUSE) ||\n this.isModeEnabled(GHOSTTY_MODE_NORMAL_MOUSE) ||\n this.isModeEnabled(GHOSTTY_MODE_BUTTON_MOUSE) ||\n this.isModeEnabled(GHOSTTY_MODE_ANY_MOUSE);\n const altScreen =\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN) ||\n this.isModeEnabled(GHOSTTY_MODE_ALT_SCREEN_SAVE);\n\n return {\n mouseReporting,\n altScroll: !mouseReporting && altScreen && this.isModeEnabled(GHOSTTY_MODE_ALT_SCROLL),\n };\n }\n\n private gestureToLines(gesture: GhosttyViewportGesture): number {\n const cellHeight = this.cellDimensions().height || DEFAULT_CELL_HEIGHT;\n\n if (gesture.source === 'wheel') {\n if (gesture.deltaMode === 1) {\n this.wheelPixelDelta = 0;\n return gesture.deltaY > 0 ? Math.ceil(gesture.deltaY) : Math.floor(gesture.deltaY);\n }\n\n if (gesture.deltaMode === 2) {\n this.wheelPixelDelta = 0;\n const pageLines = Math.max(1, this.rows);\n const scaled = gesture.deltaY * pageLines;\n return scaled > 0 ? Math.ceil(scaled) : Math.floor(scaled);\n }\n\n this.wheelPixelDelta += gesture.deltaY;\n const lines =\n this.wheelPixelDelta > 0\n ? Math.floor(this.wheelPixelDelta / cellHeight)\n : Math.ceil(this.wheelPixelDelta / cellHeight);\n if (lines !== 0) {\n this.wheelPixelDelta -= lines * cellHeight;\n }\n return lines;\n }\n\n return gesture.deltaY > 0\n ? Math.ceil(gesture.deltaY / cellHeight)\n : Math.floor(gesture.deltaY / cellHeight);\n }\n\n private isModeEnabled(mode: number): boolean {\n return this.bindings.isTerminalModeEnabled(this.terminalHandle, mode);\n }\n\n private mouseButtonFromEvent(event: MouseEvent): number | null {\n switch (event.button) {\n case 0:\n return GHOSTTY_MOUSE_BUTTON_LEFT;\n case 1:\n return GHOSTTY_MOUSE_BUTTON_MIDDLE;\n case 2:\n return GHOSTTY_MOUSE_BUTTON_RIGHT;\n default:\n return null;\n }\n }\n\n private mouseButtonFromButtons(buttons: number): number | null {\n if (buttons & 1) {\n return GHOSTTY_MOUSE_BUTTON_LEFT;\n }\n if (buttons & 4) {\n return GHOSTTY_MOUSE_BUTTON_MIDDLE;\n }\n if (buttons & 2) {\n return GHOSTTY_MOUSE_BUTTON_RIGHT;\n }\n\n return null;\n }\n\n private pointerPositionFromClient(clientX: number, clientY: number): { x: number; y: number } | null {\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n\n const width = Math.max(1, rect.width);\n const height = Math.max(1, rect.height);\n return {\n x: Math.max(0, Math.min(width - 1, clientX - rect.left)),\n y: Math.max(0, Math.min(height - 1, clientY - rect.top)),\n };\n }\n\n private emitMouseInput(options: {\n action: 'press' | 'release' | 'motion';\n button?: number | null;\n clientX: number;\n clientY: number;\n mods: number;\n anyButtonPressed: boolean;\n }): boolean {\n if (this.disableStdin) {\n return false;\n }\n\n const position = this.pointerPositionFromClient(options.clientX, options.clientY);\n if (!position) {\n return false;\n }\n\n const cell = this.cellDimensions();\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n return false;\n }\n\n const payload = this.bindings.encodeMouseEvent(this.mouseEncoderHandle, this.terminalHandle, {\n action: options.action,\n button: options.button,\n mods: options.mods,\n x: position.x,\n y: position.y,\n anyButtonPressed: options.anyButtonPressed,\n screenWidth: Math.max(1, Math.round(rect.width)),\n screenHeight: Math.max(1, Math.round(rect.height)),\n cellWidth: Math.max(1, Math.round(cell.width || DEFAULT_CELL_WIDTH)),\n cellHeight: Math.max(1, Math.round(cell.height || DEFAULT_CELL_HEIGHT)),\n });\n if (!payload) {\n return false;\n }\n\n this.emitData(payload);\n return true;\n }\n\n private emitAltScrollInput(lines: number): boolean {\n const keyCode = getGhosttyKeyCode(lines < 0 ? 'ArrowUp' : 'ArrowDown');\n if (keyCode === 0) {\n return false;\n }\n\n let consumed = false;\n for (let index = 0; index < Math.abs(lines); index += 1) {\n const payload = this.bindings.encodeKeyEvent(this.keyEncoderHandle, this.terminalHandle, {\n action: 'press',\n keyCode,\n mods: 0,\n composing: false,\n utf8: null,\n unshiftedCodepoint: null,\n });\n if (!payload) {\n continue;\n }\n this.emitData(payload);\n consumed = true;\n }\n\n return consumed;\n }\n\n private emitData(data: string): void {\n for (const listener of this.dataListeners) {\n listener(data);\n }\n }\n\n private clearTextarea(): void {\n if (this.textarea) {\n this.textarea.textContent = '';\n }\n }\n\n private syncTextareaPositionToCursor(): void {\n const textarea = this.textarea;\n const screen = this.screenElement;\n if (!textarea || !screen) {\n return;\n }\n\n const { width, height } = this.cellDimensions();\n if (width <= 0 || height <= 0) {\n return;\n }\n\n const renderState = createRenderState(this.bindings);\n let cursorX = 0;\n let cursorY = 0;\n try {\n updateRenderState(renderState, this.terminalHandle);\n const meta = readRenderSnapshotMeta(renderState);\n if (meta.cursor.x !== null && meta.cursor.y !== null) {\n cursorX = meta.cursor.x;\n cursorY = meta.cursor.y;\n }\n } finally {\n disposeRenderStateResources(renderState);\n }\n\n const left = cursorX * width;\n const top = cursorY * height;\n\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.width = `${Math.max(1, width)}px`;\n textarea.style.height = `${Math.max(1, height)}px`;\n textarea.style.lineHeight = `${height}px`;\n textarea.style.fontFamily = this.options.fontFamily;\n textarea.style.fontSize = `${this.options.fontSize}px`;\n }\n\n private scheduleRender(): void {\n if (this.renderRaf !== null) {\n return;\n }\n\n this.renderRaf = requestAnimationFrame(() => {\n this.renderRaf = null;\n this.render();\n });\n }\n\n private render(): void {\n if (this.disposed || !this.screenElement || !this.renderer) {\n return;\n }\n\n const scrollbar = this.bindings.readScrollbar(this.terminalHandle);\n const viewportRows = Math.max(1, scrollbar.len || this.rows);\n\n updateRenderState(this.renderState, this.terminalHandle);\n const meta = readRenderSnapshotMeta(this.renderState);\n const rows = Array.from(iterateRows(this.renderState));\n\n this.cols = Math.max(2, meta.cols);\n this.rows = Math.max(2, meta.rows || viewportRows);\n this.lastViewportOffset = scrollbar.offset;\n this.lastViewportRows = this.rows;\n this.lastRenderedRows = rows;\n\n for (const row of rows) {\n this.lineCache.set(scrollbar.offset + row.y, row.text);\n }\n\n const selectionRects = projectSelectionRects(\n this.selectionState,\n this.lastViewportOffset,\n this.lastViewportRows,\n (line) => this.getLineText(line)\n );\n const selectionText = this.getSelectionText();\n\n this.renderer.render({\n meta,\n rows,\n cellDimensions: this.cellDimensions(),\n selectionRects,\n selectionColor: this.options.theme.selectionBackground,\n });\n\n const visibleLines = normalizeVisibleLines(rows, this.rows);\n const baseY = Math.max(0, scrollbar.total - scrollbar.len);\n this.buffer.setViewport(scrollbar.offset, baseY, scrollbar.total, visibleLines);\n this.updateSelectionTextProbe(selectionText);\n this.updateScrollbar(scrollbar);\n }\n\n private updateScrollbar(scrollbar: { total: number; offset: number; len: number }): void {\n const thumb = this.scrollbarThumb;\n if (!thumb) {\n return;\n }\n\n const trackHeight = this.screenElement?.clientHeight ?? 0;\n if (trackHeight === 0 || scrollbar.total <= scrollbar.len) {\n thumb.style.opacity = '0';\n return;\n }\n\n const ratio = scrollbar.len / scrollbar.total;\n const thumbHeight = Math.max(20, ratio * trackHeight);\n const scrollRatio = scrollbar.offset / Math.max(1, scrollbar.total - scrollbar.len);\n const thumbTop = scrollRatio * (trackHeight - thumbHeight);\n\n thumb.style.height = `${thumbHeight}px`;\n thumb.style.transform = `translateY(${thumbTop}px)`;\n thumb.style.opacity = '1';\n\n if (this.scrollbarFadeTimer) {\n clearTimeout(this.scrollbarFadeTimer);\n }\n this.scrollbarFadeTimer = setTimeout(() => {\n thumb.style.opacity = '0';\n }, 800);\n }\n\n private updateCellDimensions(): void {\n if (!this.element) {\n return;\n }\n\n const probe = document.createElement('span');\n probe.textContent = 'WWWWWWWWWW';\n probe.style.position = 'absolute';\n probe.style.visibility = 'hidden';\n probe.style.whiteSpace = 'pre';\n probe.style.fontFamily = this.options.fontFamily;\n probe.style.fontSize = `${this.options.fontSize}px`;\n probe.style.lineHeight = '1.2';\n\n this.element.appendChild(probe);\n const rect = probe.getBoundingClientRect();\n probe.remove();\n\n this._core._renderService.dimensions.css.cell.width =\n rect.width > 0 ? rect.width / 10 : DEFAULT_CELL_WIDTH;\n this._core._renderService.dimensions.css.cell.height =\n rect.height > 0 ? rect.height : DEFAULT_CELL_HEIGHT;\n }\n\n private clearSelectionState(repaint = true): void {\n this.selectionState = resetSelectionData();\n this.pressedMouseButtons.clear();\n this.wheelPixelDelta = 0;\n this.pointerDrag = {\n active: false,\n moved: false,\n mode: 'character',\n lastClientX: null,\n lastClientY: null,\n };\n this.copyShortcutSuppressed = false;\n this.stopAutoScroll();\n this.updateSelectionTextProbe(null);\n\n if (repaint && this.screenElement && this.renderer) {\n this.render();\n }\n }\n\n private beginPointerSelection(event: MouseEvent): void {\n const point = this.hitTest(event.clientX, event.clientY);\n if (!point) {\n return;\n }\n\n const mode = this.selectionModeFromClickDetail(event.detail);\n this.pointerDrag = {\n active: true,\n moved: false,\n mode,\n lastClientX: event.clientX,\n lastClientY: event.clientY,\n };\n this.selectionState = resolvePointerSelection(\n this.selectionState,\n {\n ...point,\n mode,\n },\n (line) => this.getLineText(line)\n );\n this.updateAutoScroll();\n this.render();\n }\n\n private updatePointerSelection(event: MouseEvent): void {\n if (!this.pointerDrag.active) {\n return;\n }\n\n const point = this.hitTest(event.clientX, event.clientY);\n this.pointerDrag.lastClientX = event.clientX;\n this.pointerDrag.lastClientY = event.clientY;\n\n if (point) {\n this.pointerDrag.moved = true;\n this.selectionState = updateSelectionFocus(this.selectionState, point, (line) =>\n this.getLineText(line)\n );\n this.render();\n }\n\n this.updateAutoScroll();\n }\n\n private finishPointerSelection(event: MouseEvent): void {\n if (!this.pointerDrag.active || event.button !== 0) {\n return;\n }\n\n this.pointerDrag.lastClientX = event.clientX;\n this.pointerDrag.lastClientY = event.clientY;\n this.stopAutoScroll();\n\n const shouldClear =\n this.pointerDrag.mode === 'character' &&\n !this.pointerDrag.moved &&\n this.selectionState.anchor?.line === this.selectionState.focus?.line &&\n this.selectionState.anchor?.col === this.selectionState.focus?.col;\n this.pointerDrag.active = false;\n\n if (shouldClear) {\n this.clearSelectionState();\n return;\n }\n\n this.render();\n }\n\n private selectionModeFromClickDetail(detail: number): SelectionMode {\n if (detail >= 3) {\n return 'line';\n }\n if (detail === 2) {\n return 'word';\n }\n return 'character';\n }\n\n private hitTest(clientX: number, clientY: number): SelectionPoint | null {\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n\n const { width, height } = this.cellDimensions();\n if (width <= 0 || height <= 0) {\n return null;\n }\n\n const relativeX = clientX - rect.left;\n const relativeY = clientY - rect.top;\n const maxCol = Math.max(this.cols - 1, 0);\n const maxRow = Math.max(this.lastViewportRows - 1, 0);\n const col = Math.max(0, Math.min(maxCol, Math.floor(relativeX / width)));\n const row = Math.max(0, Math.min(maxRow, Math.floor(relativeY / height)));\n\n return {\n line: this.lastViewportOffset + row,\n col,\n };\n }\n\n private getLineText(line: number): string {\n const cached = this.lineCache.get(line);\n if (typeof cached === 'string') {\n return cached;\n }\n\n const visibleIndex = line - this.lastViewportOffset;\n const visibleRow = this.lastRenderedRows[visibleIndex];\n return visibleRow?.text ?? '';\n }\n\n private getSelectionText(): string | null {\n if (!hasSelection(this.selectionState)) {\n return null;\n }\n\n return serializeSelectionText(this.selectionState, (line) => this.getLineText(line));\n }\n\n private updateSelectionTextProbe(value: string | null): void {\n (globalThis as { __tmexE2eTerminalSelectionText?: string | null }).__tmexE2eTerminalSelectionText =\n value;\n }\n\n private updateAutoScroll(): void {\n if (!this.pointerDrag.active || this.pointerDrag.lastClientY === null) {\n this.stopAutoScroll();\n return;\n }\n\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n this.stopAutoScroll();\n return;\n }\n\n const outsideViewport =\n this.pointerDrag.lastClientY < rect.top || this.pointerDrag.lastClientY > rect.bottom;\n if (!outsideViewport) {\n this.stopAutoScroll();\n return;\n }\n\n if (this.autoScrollTimer !== null) {\n return;\n }\n\n this.autoScrollTimer = setInterval(() => {\n this.stepAutoScroll();\n }, AUTO_SCROLL_INTERVAL_MS);\n }\n\n private stepAutoScroll(): void {\n if (!this.pointerDrag.active || this.pointerDrag.lastClientX === null || this.pointerDrag.lastClientY === null) {\n this.stopAutoScroll();\n return;\n }\n\n const rect = this.screenElement?.getBoundingClientRect();\n if (!rect) {\n this.stopAutoScroll();\n return;\n }\n\n let delta = 0;\n if (this.pointerDrag.lastClientY < rect.top) {\n delta = -1;\n } else if (this.pointerDrag.lastClientY > rect.bottom) {\n delta = 1;\n }\n\n if (delta === 0) {\n this.stopAutoScroll();\n return;\n }\n\n this.bindings.scrollViewportDelta(this.terminalHandle, delta);\n this.render();\n\n const point = this.hitTest(this.pointerDrag.lastClientX, this.pointerDrag.lastClientY);\n if (!point) {\n return;\n }\n\n this.selectionState = updateSelectionFocus(this.selectionState, point, (line) =>\n this.getLineText(line)\n );\n this.pointerDrag.moved = true;\n this.render();\n }\n\n private stopAutoScroll(): void {\n if (this.autoScrollTimer === null) {\n return;\n }\n\n clearInterval(this.autoScrollTimer);\n this.autoScrollTimer = null;\n }\n\n private clearDomEventListeners(): void {\n while (this.domEventDisposers.length > 0) {\n const dispose = this.domEventDisposers.pop();\n dispose?.();\n }\n }\n}\n\nexport async function createTerminalController(\n options: GhosttyTerminalInitOptions\n): Promise<GhosttyTerminalController> {\n return GhosttyTerminalController.create(options);\n}\n\nexport { TERMINAL_ENGINE };\n","/**\n * seoul256.vim color scheme\n * https://github.com/junegunn/seoul256.vim\n * https://github.com/mikker/seoul256-iTerm\n *\n * Dark theme uses seoul256-iTerm colors\n * Light theme uses seoul256.vim colors\n */\n\n/**\n * seoul256-light - Seoul Colors Light\n * From seoul256.vim: Background 253 (#E1E1E1), Foreground 239 (#616161)\n */\nexport const XTERM_THEME_LIGHT = {\n background: '#e1e1e1',\n foreground: '#616161',\n cursor: '#616161',\n selectionBackground: 'rgba(97, 97, 97, 0.25)',\n // ANSI colors\n black: '#171717',\n red: '#bf2172',\n green: '#009799',\n yellow: '#9a7200',\n blue: '#007299',\n magenta: '#9b1d72',\n cyan: '#007173',\n white: '#d9d9d9',\n // Bright colors\n brightBlack: '#4e4e4e',\n brightRed: '#e12672',\n brightGreen: '#00bddf',\n brightYellow: '#ffdd00',\n brightBlue: '#7299bc',\n brightMagenta: '#e17899',\n brightCyan: '#6fbcbd',\n brightWhite: '#f1f1f1',\n};\n\n/**\n * seoul256-dark - Seoul Colors Dark\n * From seoul256-iTerm: https://github.com/mikker/seoul256-iTerm\n */\nexport const XTERM_THEME_DARK = {\n background: '#262626',\n foreground: '#d0d0d0',\n cursor: '#c5c5c5',\n selectionBackground: 'rgba(197, 197, 197, 0.25)',\n // ANSI colors (from iTerm colors)\n black: '#000000',\n red: '#ba3c3c',\n green: '#5d876d',\n yellow: '#d5a54e',\n blue: '#887c8d',\n magenta: '#cd6d6d',\n cyan: '#618484',\n white: '#cfcdc3',\n // Bright colors (from iTerm colors)\n brightBlack: '#000000',\n brightRed: '#ea7171',\n brightGreen: '#7aab7a',\n brightYellow: '#d1d194',\n brightBlue: '#afa3b5',\n brightMagenta: '#e29f9f',\n brightCyan: '#a0aea3',\n brightWhite: '#d0d0d0',\n};\n\nexport const XTERM_FONT_FAMILY =\n '\"JetBrains Mono\", \"SF Mono\", Menlo, Monaco, Consolas, \"Liberation Mono\", \"Noto Sans Mono CJK SC\", \"Source Han Mono SC\", \"Sarasa Mono SC\", \"Noto Color Emoji\", \"Apple Color Emoji\", \"Segoe UI Emoji\", monospace';\n\n// 别名导出,保持兼容性\nexport const XTERM_THEME_MIDNIGHT_AMETHYST = XTERM_THEME_DARK;\nexport const XTERM_THEME_DAWN_AMETHYST = XTERM_THEME_LIGHT;\n","export function normalizeHistoryForTerminal(data: string): string {\n if (!data) return data;\n const canonical = data.replace(/\\r\\n/g, '\\n');\n const trimmed = canonical.endsWith('\\n') ? canonical.slice(0, -1) : canonical;\n return trimmed.replace(/\\n/g, '\\r\\n');\n}\n\nconst ALT_SCREEN_HISTORY_PREAMBLE = '\\x1b[?1049h\\x1b[H\\x1b[2J';\n\nexport function wrapAlternateScreenHistory(data: string): string {\n return ALT_SCREEN_HISTORY_PREAMBLE + normalizeHistoryForTerminal(data);\n}\n\nexport function normalizeLiveOutputForTerminal(\n data: Uint8Array,\n previousEndedWithCR: boolean\n): { normalized: Uint8Array; endedWithCR: boolean } {\n let prevWasCR = previousEndedWithCR;\n let extraCRCount = 0;\n\n for (const byte of data) {\n if (byte === 0x0a && !prevWasCR) {\n extraCRCount += 1;\n }\n prevWasCR = byte === 0x0d;\n }\n\n const endedWithCR = prevWasCR;\n if (extraCRCount === 0) {\n return { normalized: data, endedWithCR };\n }\n\n const normalized = new Uint8Array(data.length + extraCRCount);\n let writeIndex = 0;\n prevWasCR = previousEndedWithCR;\n\n for (const byte of data) {\n if (byte === 0x0a && !prevWasCR) {\n normalized[writeIndex] = 0x0d;\n writeIndex += 1;\n }\n normalized[writeIndex] = byte;\n writeIndex += 1;\n prevWasCR = byte === 0x0d;\n }\n\n return { normalized, endedWithCR };\n}\n","import { useEffect, useRef } from 'react';\n\ninterface TerminalScroller {\n scrollLines: (amount: number) => void;\n handleViewportGesture?: (gesture: {\n source: 'touch';\n deltaY: number;\n clientX: number;\n clientY: number;\n }) => boolean;\n buffer?: {\n active?: {\n viewportY?: number;\n };\n };\n}\n\nconst TOUCH_SCROLL_GAIN = 1.3;\nconst SCROLLBAR_TOUCH_HOTZONE_PX = 36;\n\nexport function useMobileTouch(\n containerRef: React.RefObject<HTMLElement | null>,\n getTerminal?: () => TerminalScroller | null\n) {\n const isActiveRef = useRef(false);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const isMobile =\n window.innerWidth < 768 || navigator.maxTouchPoints > 0 || 'ontouchstart' in window;\n if (!isMobile) return;\n\n isActiveRef.current = true;\n let lastTouchY = 0;\n let touchId: number | null = null;\n let bypassCustomScroll = false;\n let pendingPixelDelta = 0;\n\n const isScrollbarElement = (target: Element | null): boolean => {\n if (!target) return false;\n return Boolean(\n target.closest('.scrollbar') ||\n target.closest('.slider') ||\n target.closest('.xterm-scroll-area')\n );\n };\n\n const shouldBypassCustomScroll = (\n clientX: number,\n clientY: number,\n eventTarget: EventTarget | null\n ): boolean => {\n const directTarget = eventTarget instanceof Element ? eventTarget : null;\n if (isScrollbarElement(directTarget)) {\n return true;\n }\n\n const pointTarget = document.elementFromPoint(clientX, clientY);\n if (isScrollbarElement(pointTarget)) {\n return true;\n }\n\n const xtermRoot = container.querySelector('.xterm');\n if (!(xtermRoot instanceof HTMLElement)) {\n return false;\n }\n\n const rect = xtermRoot.getBoundingClientRect();\n const insideX = clientX >= rect.left && clientX <= rect.right;\n const insideY = clientY >= rect.top && clientY <= rect.bottom;\n if (!insideX || !insideY) {\n return false;\n }\n\n return clientX >= rect.right - SCROLLBAR_TOUCH_HOTZONE_PX;\n };\n\n const findScrollTargets = (): HTMLElement[] => {\n const candidates = [\n container.querySelector('.xterm-viewport'),\n container.querySelector('.xterm-scrollable-element'),\n ];\n\n return candidates.filter((el): el is HTMLElement => el instanceof HTMLElement);\n };\n\n const findTouchById = (touchList: TouchList): Touch | null => {\n if (touchId === null) return null;\n for (let i = 0; i < touchList.length; i += 1) {\n const touch = touchList.item(i);\n if (touch && touch.identifier === touchId) {\n return touch;\n }\n }\n return null;\n };\n\n const handleTouchStart = (event: TouchEvent) => {\n if (event.touches.length !== 1) return;\n const touch = event.touches.item(0);\n if (!touch) return;\n\n touchId = touch.identifier;\n lastTouchY = touch.clientY;\n pendingPixelDelta = 0;\n bypassCustomScroll = shouldBypassCustomScroll(touch.clientX, touch.clientY, event.target);\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n const touch = findTouchById(event.touches) ?? event.touches.item(0);\n if (!touch) return;\n if (!bypassCustomScroll) {\n bypassCustomScroll = shouldBypassCustomScroll(touch.clientX, touch.clientY, event.target);\n if (bypassCustomScroll) {\n pendingPixelDelta = 0;\n }\n }\n if (bypassCustomScroll) return;\n\n const currentY = touch.clientY;\n const deltaY = lastTouchY - currentY;\n lastTouchY = currentY;\n\n if (deltaY === 0) return;\n\n let didScroll = false;\n let atTopWhilePullingDown = false;\n const terminal = getTerminal?.() ?? null;\n\n if (terminal) {\n const core = (terminal as any)?._core;\n const lineHeight = core?._renderService?.dimensions?.css?.cell?.height ?? 18;\n pendingPixelDelta += deltaY * TOUCH_SCROLL_GAIN;\n const linesToScroll =\n pendingPixelDelta > 0\n ? Math.floor(pendingPixelDelta / lineHeight)\n : Math.ceil(pendingPixelDelta / lineHeight);\n\n if (typeof terminal.handleViewportGesture === 'function') {\n if (linesToScroll !== 0) {\n didScroll = terminal.handleViewportGesture({\n source: 'touch',\n deltaY: linesToScroll * lineHeight,\n clientX: touch.clientX,\n clientY: touch.clientY,\n });\n pendingPixelDelta -= linesToScroll * lineHeight;\n }\n } else {\n if (linesToScroll !== 0) {\n const beforeViewportY = terminal.buffer?.active?.viewportY ?? 0;\n terminal.scrollLines(linesToScroll);\n const afterViewportY = terminal.buffer?.active?.viewportY ?? 0;\n didScroll = beforeViewportY !== afterViewportY;\n atTopWhilePullingDown = linesToScroll < 0 && beforeViewportY <= 0 && afterViewportY <= 0;\n pendingPixelDelta -= linesToScroll * lineHeight;\n }\n }\n } else {\n const scrollTargets = findScrollTargets();\n if (scrollTargets.length === 0) return;\n\n for (const target of scrollTargets) {\n const previousScrollTop = target.scrollTop;\n target.scrollTop += deltaY;\n const nextScrollTop = target.scrollTop;\n\n if (Math.abs(nextScrollTop - previousScrollTop) > 0) {\n didScroll = true;\n }\n if (deltaY < 0 && nextScrollTop <= 0) {\n atTopWhilePullingDown = true;\n }\n }\n if (!didScroll) {\n const xtermRoot = container.querySelector('.xterm');\n if (xtermRoot instanceof HTMLElement) {\n const wheelEvent = new WheelEvent('wheel', {\n bubbles: true,\n cancelable: true,\n deltaMode: WheelEvent.DOM_DELTA_PIXEL,\n deltaY,\n });\n const dispatched = xtermRoot.dispatchEvent(wheelEvent);\n didScroll = wheelEvent.defaultPrevented || !dispatched;\n }\n }\n }\n\n if (!event.cancelable) return;\n if (didScroll || atTopWhilePullingDown) {\n event.preventDefault();\n }\n };\n\n const handleTouchEnd = (event: TouchEvent) => {\n if (touchId === null) return;\n const endedTouch = findTouchById(event.changedTouches);\n if (!endedTouch) return;\n touchId = null;\n pendingPixelDelta = 0;\n bypassCustomScroll = false;\n };\n\n container.addEventListener('touchstart', handleTouchStart, { passive: true });\n container.addEventListener('touchmove', handleTouchMove, { passive: false });\n container.addEventListener('touchend', handleTouchEnd, { passive: true });\n container.addEventListener('touchcancel', handleTouchEnd, { passive: true });\n\n return () => {\n isActiveRef.current = false;\n container.removeEventListener('touchstart', handleTouchStart);\n container.removeEventListener('touchmove', handleTouchMove);\n container.removeEventListener('touchend', handleTouchEnd);\n container.removeEventListener('touchcancel', handleTouchEnd);\n };\n }, [containerRef, getTerminal]);\n\n return isActiveRef;\n}\n","export interface TerminalSizeSnapshot {\n cols: number;\n rows: number;\n}\n\nexport interface TimedTerminalSizeSnapshot extends TerminalSizeSnapshot {\n at: number;\n}\n\ninterface ViewportRestoreSyncInput {\n currentSize: TerminalSizeSnapshot;\n containerSize: TerminalSizeSnapshot;\n force?: boolean;\n}\n\ninterface RemotePaneSizeGuardInput {\n now: number;\n remoteSize: TerminalSizeSnapshot;\n pendingLocalSize: TimedTerminalSizeSnapshot | null;\n ttlMs?: number;\n}\n\nexport function shouldApplyRemotePaneSize({\n now,\n remoteSize,\n pendingLocalSize,\n ttlMs = 2000,\n}: RemotePaneSizeGuardInput): boolean {\n if (!pendingLocalSize) {\n return true;\n }\n\n if (now - pendingLocalSize.at > ttlMs) {\n return true;\n }\n\n return pendingLocalSize.cols === remoteSize.cols && pendingLocalSize.rows === remoteSize.rows;\n}\n\ninterface ForceLocalSizeSyncInput extends RemotePaneSizeGuardInput {\n containerSize: TerminalSizeSnapshot | null;\n}\n\nexport function shouldForceLocalSizeSync({\n now: _now,\n remoteSize: _remoteSize,\n pendingLocalSize: _pendingLocalSize,\n containerSize: _containerSize,\n ttlMs: _ttlMs = 2000,\n}: ForceLocalSizeSyncInput): boolean {\n return false;\n}\n\nexport function shouldSyncOnViewportRestore({\n currentSize,\n containerSize,\n force = false,\n}: ViewportRestoreSyncInput): boolean {\n if (force) {\n return true;\n }\n\n return currentSize.cols !== containerSize.cols || currentSize.rows !== containerSize.rows;\n}\n","import { shouldSyncOnViewportRestore } from '@/utils/resizeSyncGuards';\nimport type { CompatibleTerminalLike } from 'ghostty-terminal';\nimport type { FitAddon } from 'ghostty-terminal';\nimport { useCallback, useEffect, useRef } from 'react';\n\ninterface UseTerminalResizeOptions {\n deviceId: string;\n paneId: string;\n deviceConnected: boolean;\n isSelectionInvalid: boolean;\n onResize: (cols: number, rows: number) => void;\n onSync: (cols: number, rows: number) => void;\n /** 获取容器尺寸的回调函数,用于 fitAddon 失败时的回退计算 */\n getContainerRect?: () => { width: number; height: number } | null;\n}\n\nexport function useTerminalResize({\n deviceId,\n paneId,\n deviceConnected,\n isSelectionInvalid,\n onResize,\n onSync,\n getContainerRect,\n}: UseTerminalResizeOptions) {\n const resizeRaf = useRef<number | null>(null);\n const resizeTimer = useRef<number | null>(null);\n const lastReportedSize = useRef<{ cols: number; rows: number } | null>(null);\n const pendingLocalSize = useRef<{ cols: number; rows: number; at: number } | null>(null);\n const suppressLocalResizeUntil = useRef(0);\n const postSelectResizeTimers = useRef<number[]>([]);\n const fitAddonRef = useRef<FitAddon | null>(null);\n const terminalRef = useRef<CompatibleTerminalLike | null>(null);\n const getContainerRectRef = useRef(getContainerRect);\n const viewportRestorePendingRef = useRef(false);\n\n // Use refs to store callbacks to avoid dependency cycles\n const onResizeRef = useRef(onResize);\n const onSyncRef = useRef(onSync);\n\n // Update refs when callbacks change\n useEffect(() => {\n onResizeRef.current = onResize;\n }, [onResize]);\n\n useEffect(() => {\n onSyncRef.current = onSync;\n }, [onSync]);\n\n useEffect(() => {\n getContainerRectRef.current = getContainerRect;\n }, [getContainerRect]);\n\n const measureTerminalSize = useCallback((): { cols: number; rows: number } | null => {\n const term = terminalRef.current;\n const fitAddon = fitAddonRef.current;\n if (!term || !fitAddon || !term.element) {\n return null;\n }\n\n let cols: number;\n\n try {\n const proposed = fitAddon.proposeDimensions();\n if (!proposed) {\n throw new Error('fitAddon.proposeDimensions() returned null');\n }\n cols = Math.max(2, proposed.cols);\n } catch {\n const core = (term as any)._core;\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n const rect = getContainerRectRef.current?.();\n if (!rect || rect.width === 0) {\n return null;\n }\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n\n const containerRect = getContainerRectRef.current?.();\n if (!containerRect || containerRect.height === 0) {\n return null;\n }\n const core = (term as any)._core;\n const cellHeight = core?._renderService?.dimensions?.css?.cell?.height ?? 17;\n const rows = Math.max(2, Math.floor(containerRect.height / cellHeight));\n\n return { cols, rows };\n }, []);\n\n const applyTerminalSize = useCallback((cols: number, rows: number): void => {\n const term = terminalRef.current;\n if (!term) {\n return;\n }\n if (term.cols === cols && term.rows === rows) {\n return;\n }\n term.resize(cols, rows);\n }, []);\n\n const reportSize = useCallback(\n (kind: 'resize' | 'sync', force = false) => {\n // sync 操作即使在 isSelectionInvalid 时也应该执行,因为尺寸同步是基础功能\n // isSelectionInvalid 主要影响用户输入,不应该阻止终端尺寸同步\n if (!deviceId || !paneId || !deviceConnected) {\n return false;\n }\n if (isSelectionInvalid && kind !== 'sync') {\n return false;\n }\n\n if (!force && Date.now() < suppressLocalResizeUntil.current) {\n return false;\n }\n\n const term = terminalRef.current;\n if (!term) {\n return false;\n }\n\n const measuredSize = measureTerminalSize();\n if (!measuredSize) {\n return false;\n }\n const { cols, rows } = measuredSize;\n // Debug: console.log('[resize] success:', { kind, cols, rows, force });\n const lastSize = lastReportedSize.current;\n\n if (!force && lastSize && lastSize.cols === cols && lastSize.rows === rows) {\n applyTerminalSize(cols, rows);\n return true;\n }\n\n applyTerminalSize(cols, rows);\n\n if (kind === 'sync') {\n onSyncRef.current(cols, rows);\n } else {\n onResizeRef.current(cols, rows);\n }\n\n lastReportedSize.current = { cols, rows };\n pendingLocalSize.current = { cols, rows, at: Date.now() };\n return true;\n },\n // Only depend on stable values, not the callbacks\n [applyTerminalSize, deviceConnected, deviceId, isSelectionInvalid, measureTerminalSize, paneId]\n );\n\n const scheduleResize = useCallback(\n (\n kind: 'resize' | 'sync' = 'resize',\n options: { immediate?: boolean; force?: boolean } = {}\n ) => {\n const { immediate = false, force = false } = options;\n\n if (resizeTimer.current !== null) {\n window.clearTimeout(resizeTimer.current);\n resizeTimer.current = null;\n }\n\n if (resizeRaf.current !== null) {\n cancelAnimationFrame(resizeRaf.current);\n resizeRaf.current = null;\n }\n\n const run = () => {\n resizeRaf.current = requestAnimationFrame(() => {\n resizeRaf.current = null;\n reportSize(kind, force);\n });\n };\n\n if (immediate) {\n run();\n return;\n }\n\n resizeTimer.current = window.setTimeout(() => {\n resizeTimer.current = null;\n run();\n }, 150);\n },\n [reportSize]\n );\n\n const clearPostSelectResizeTimers = useCallback(() => {\n for (const id of postSelectResizeTimers.current) {\n window.clearTimeout(id);\n }\n postSelectResizeTimers.current = [];\n }, []);\n\n const runPostSelectResize = useCallback(() => {\n clearPostSelectResizeTimers();\n scheduleResize('sync', { immediate: true, force: true });\n\n const retryId = window.setTimeout(() => {\n scheduleResize('sync', { immediate: true, force: true });\n }, 60);\n postSelectResizeTimers.current.push(retryId);\n\n if (typeof document !== 'undefined' && 'fonts' in document && document.fonts?.ready) {\n document.fonts.ready\n .then(() => {\n scheduleResize('sync', { immediate: true, force: true });\n })\n .catch(() => {\n // ignore\n });\n }\n }, [clearPostSelectResizeTimers, scheduleResize]);\n\n // 浏览器窗口 resize 处理 - 共享 scheduleResize 的防抖\n useEffect(() => {\n let rafId: number | null = null;\n const handleWindowResize = () => {\n // 使用 RAF 确保在布局完成后执行,并与 ResizeObserver 协调\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n rafId = requestAnimationFrame(() => {\n rafId = null;\n scheduleResize('resize');\n });\n };\n\n window.addEventListener('resize', handleWindowResize);\n return () => {\n window.removeEventListener('resize', handleWindowResize);\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n };\n }, [scheduleResize]);\n\n useEffect(() => {\n const handleViewportRestore = () => {\n const term = terminalRef.current;\n const containerSize = measureTerminalSize();\n if (!term || !containerSize) {\n return;\n }\n\n const shouldSync = shouldSyncOnViewportRestore({\n currentSize: { cols: Math.max(2, term.cols), rows: Math.max(2, term.rows) },\n containerSize,\n });\n if (!shouldSync) {\n term.refresh?.();\n return;\n }\n\n scheduleResize('sync', { force: true });\n };\n\n const handleVisibilityChange = () => {\n if (document.visibilityState !== 'visible') {\n viewportRestorePendingRef.current = true;\n return;\n }\n if (!viewportRestorePendingRef.current) {\n return;\n }\n viewportRestorePendingRef.current = false;\n handleViewportRestore();\n };\n\n const handleWindowBlur = () => {\n viewportRestorePendingRef.current = true;\n };\n\n const handleWindowFocus = () => {\n if (!viewportRestorePendingRef.current) {\n return;\n }\n viewportRestorePendingRef.current = false;\n handleViewportRestore();\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n window.addEventListener('blur', handleWindowBlur);\n window.addEventListener('focus', handleWindowFocus);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n window.removeEventListener('blur', handleWindowBlur);\n window.removeEventListener('focus', handleWindowFocus);\n };\n }, [measureTerminalSize, scheduleResize]);\n\n // 清理\n useEffect(() => {\n return () => {\n clearPostSelectResizeTimers();\n if (resizeTimer.current !== null) {\n window.clearTimeout(resizeTimer.current);\n }\n if (resizeRaf.current !== null) {\n cancelAnimationFrame(resizeRaf.current);\n }\n };\n }, [clearPostSelectResizeTimers]);\n\n const setFitAddon = useCallback((addon: FitAddon | null) => {\n fitAddonRef.current = addon;\n }, []);\n\n const setTerminal = useCallback((terminal: CompatibleTerminalLike | null) => {\n terminalRef.current = terminal;\n }, []);\n\n return {\n scheduleResize,\n runPostSelectResize,\n clearPostSelectResizeTimers,\n setFitAddon,\n setTerminal,\n lastReportedSize,\n pendingLocalSize,\n suppressLocalResizeUntil,\n };\n}\n","import {\n FitAddon,\n TERMINAL_ENGINE,\n createTerminalController,\n type CompatibleTerminalLike,\n type GhosttyTerminalModeSnapshot,\n} from 'ghostty-terminal';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTmuxStore } from '@/stores/tmux';\nimport { type SelectCallbacks, getSelectStateMachine } from '@/ws-borsh';\nimport { XTERM_FONT_FAMILY, XTERM_THEME_DARK, XTERM_THEME_LIGHT } from './theme';\nimport {\n normalizeHistoryForTerminal,\n normalizeLiveOutputForTerminal,\n wrapAlternateScreenHistory,\n} from './normalization';\nimport type { TerminalProps, TerminalRef } from './types';\nimport { useMobileTouch } from './useMobileTouch';\nimport { useTerminalResize } from './useTerminalResize';\n\nconst TERMINAL_CONFIG = {\n fontFamily: XTERM_FONT_FAMILY,\n fontSize: 13,\n scrollback: 10000,\n};\n\nconst TERMINAL_MODE_CACHE_KEY = 'tmex:terminal-mode-cache';\n\nfunction readTerminalModeCache(\n deviceId: string,\n paneId: string\n): GhosttyTerminalModeSnapshot | null {\n try {\n const raw = sessionStorage.getItem(TERMINAL_MODE_CACHE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Record<string, GhosttyTerminalModeSnapshot | undefined>;\n return parsed[`${deviceId}:${paneId}`] ?? null;\n } catch {\n return null;\n }\n}\n\nfunction writeTerminalModeCache(\n deviceId: string,\n paneId: string,\n snapshot: GhosttyTerminalModeSnapshot | null\n): void {\n try {\n const raw = sessionStorage.getItem(TERMINAL_MODE_CACHE_KEY);\n const parsed = raw ? (JSON.parse(raw) as Record<string, GhosttyTerminalModeSnapshot | undefined>) : {};\n const key = `${deviceId}:${paneId}`;\n if (snapshot) {\n parsed[key] = snapshot;\n } else {\n delete parsed[key];\n }\n sessionStorage.setItem(TERMINAL_MODE_CACHE_KEY, JSON.stringify(parsed));\n } catch {\n // ignore storage failures\n }\n}\n\nfunction createAlternateScreenFallbackSnapshot(): GhosttyTerminalModeSnapshot {\n return {\n mouseX10: false,\n mouseNormal: true,\n mouseButton: false,\n mouseAny: false,\n mouseUtf8: false,\n mouseSgr: true,\n mouseSgrPixels: false,\n mouseUrxvt: false,\n altScroll: true,\n altScreen1047: false,\n altScreen1049: false,\n };\n}\n\nfunction reconcileRecoveredModes(\n cached: GhosttyTerminalModeSnapshot | null,\n alternateScreen: boolean\n): GhosttyTerminalModeSnapshot | null {\n if (!alternateScreen) {\n if (!cached) return null;\n return {\n ...cached,\n mouseX10: false,\n mouseNormal: false,\n mouseButton: false,\n mouseAny: false,\n mouseUtf8: false,\n mouseSgrPixels: false,\n mouseUrxvt: false,\n altScreen1047: false,\n altScreen1049: false,\n };\n }\n\n const fallback = createAlternateScreenFallbackSnapshot();\n if (!cached) {\n return fallback;\n }\n\n const hasTrackingMode = cached.mouseNormal || cached.mouseButton || cached.mouseAny;\n\n return {\n ...cached,\n mouseX10: false,\n mouseUtf8: false,\n mouseSgr: true,\n mouseSgrPixels: false,\n mouseUrxvt: false,\n altScroll: true,\n altScreen1047: false,\n altScreen1049: false,\n mouseNormal: hasTrackingMode ? cached.mouseNormal : fallback.mouseNormal,\n };\n}\n\nfunction setE2eTerminalProbe(terminal: CompatibleTerminalLike): void {\n const g = globalThis as any;\n g.__tmexE2eXterm = terminal;\n g.__tmexE2eTerminal = terminal;\n g.__tmexE2eTerminalEngine = TERMINAL_ENGINE;\n g.__tmexE2eTerminalRenderer = terminal.getRendererKind?.() ?? null;\n}\n\nfunction clearE2eTerminalProbe(terminal: CompatibleTerminalLike | null): void {\n if (!terminal) {\n return;\n }\n\n const g = globalThis as any;\n if (g.__tmexE2eTerminal !== terminal && g.__tmexE2eXterm !== terminal) {\n return;\n }\n\n g.__tmexE2eXterm = null;\n g.__tmexE2eTerminal = null;\n g.__tmexE2eTerminalEngine = null;\n g.__tmexE2eTerminalRenderer = null;\n g.__tmexE2eTerminalSelectionText = null;\n}\n\nexport const Terminal = forwardRef<TerminalRef, TerminalProps>(\n (\n { deviceId, paneId, theme, inputMode, deviceConnected, isSelectionInvalid, onResize, onSync },\n ref\n ) => {\n const [instance, setInstance] = useState<CompatibleTerminalLike | null>(null);\n const sendInput = useTmuxStore((state) => state.sendInput);\n\n const terminalTheme = useMemo(() => {\n switch (theme) {\n case 'light':\n return XTERM_THEME_LIGHT;\n default:\n return XTERM_THEME_DARK;\n }\n }, [theme]);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const mountRef = useRef<HTMLDivElement>(null);\n const fitAddonRef = useRef<FitAddon | null>(null);\n const currentDeviceIdRef = useRef(deviceId);\n const currentPaneIdRef = useRef(paneId);\n const attachedDeviceIdRef = useRef(deviceId);\n const attachedPaneIdRef = useRef(paneId);\n const canWriteRef = useRef(deviceConnected && !isSelectionInvalid);\n const currentInputModeRef = useRef(inputMode);\n const currentTerminalThemeRef = useRef(terminalTheme);\n const liveOutputEndedWithCR = useRef(false);\n const keepShortHistoryVisibleRef = useRef(false);\n const lastTerminalInstanceRef = useRef<CompatibleTerminalLike | null>(null);\n const skipNextDetachPersistRef = useRef(false);\n\n const persistTerminalModes = useCallback(\n (terminal: CompatibleTerminalLike | null, targetDeviceId: string, targetPaneId: string) => {\n if (!terminal?.exportModeSnapshot || !targetDeviceId || !targetPaneId) {\n return;\n }\n writeTerminalModeCache(targetDeviceId, targetPaneId, terminal.exportModeSnapshot());\n },\n []\n );\n\n const getTerminalForTouch = useCallback(() => instance, [instance]);\n useMobileTouch(containerRef, getTerminalForTouch);\n\n useEffect(() => {\n currentDeviceIdRef.current = deviceId;\n currentPaneIdRef.current = paneId;\n keepShortHistoryVisibleRef.current = false;\n }, [deviceId, paneId]);\n\n useEffect(() => {\n canWriteRef.current = deviceConnected && !isSelectionInvalid;\n }, [deviceConnected, isSelectionInvalid]);\n\n useEffect(() => {\n currentInputModeRef.current = inputMode;\n }, [inputMode]);\n\n useEffect(() => {\n currentTerminalThemeRef.current = terminalTheme;\n }, [terminalTheme]);\n\n const sendTerminalInput = useCallback(\n (data: string) => {\n if (!data || inputMode !== 'direct') {\n return;\n }\n if (!canWriteRef.current) {\n return;\n }\n\n const activeDeviceId = currentDeviceIdRef.current;\n const activePaneId = currentPaneIdRef.current;\n if (!activeDeviceId || !activePaneId) {\n return;\n }\n\n sendInput(activeDeviceId, activePaneId, data, false);\n },\n [inputMode, sendInput]\n );\n\n const { pendingLocalSize, scheduleResize, runPostSelectResize, setFitAddon, setTerminal } =\n useTerminalResize({\n deviceId,\n paneId,\n deviceConnected,\n isSelectionInvalid,\n onResize,\n onSync,\n getContainerRect: () => {\n const el = containerRef.current;\n if (!el) return null;\n const rect = el.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n },\n });\n\n useEffect(() => {\n let cancelled = false;\n let createdTerminal: Awaited<ReturnType<typeof createTerminalController>> | null = null;\n\n void createTerminalController({\n ...TERMINAL_CONFIG,\n theme: currentTerminalThemeRef.current,\n disableStdin: currentInputModeRef.current === 'editor',\n }).then((terminal) => {\n if (cancelled) {\n terminal.dispose();\n return;\n }\n\n createdTerminal = terminal;\n if (mountRef.current) {\n terminal.open(mountRef.current);\n }\n setE2eTerminalProbe(terminal);\n setInstance(terminal);\n });\n\n return () => {\n cancelled = true;\n setInstance(null);\n clearE2eTerminalProbe(createdTerminal);\n createdTerminal?.dispose();\n };\n }, []);\n\n useEffect(() => {\n if (!instance || !('setTheme' in instance)) {\n return;\n }\n\n (instance as any).setTheme(terminalTheme);\n }, [instance, terminalTheme]);\n\n useEffect(() => {\n if (!instance || !('setDisableStdin' in instance)) {\n return;\n }\n\n (instance as any).setDisableStdin(inputMode === 'editor');\n }, [instance, inputMode]);\n\n const callbacks: SelectCallbacks = useMemo(() => {\n if (!instance) {\n return {};\n }\n\n return {\n onResetTerminal: (targetDeviceId) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n persistTerminalModes(instance, attachedDeviceIdRef.current, attachedPaneIdRef.current);\n skipNextDetachPersistRef.current = true;\n instance.reset();\n liveOutputEndedWithCR.current = false;\n runPostSelectResize();\n },\n onApplyHistory: (targetDeviceId, data, alternateScreen) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n const recoveredModes = reconcileRecoveredModes(\n readTerminalModeCache(currentDeviceIdRef.current, currentPaneIdRef.current),\n alternateScreen\n );\n if (recoveredModes) {\n instance.restoreModeSnapshot?.(recoveredModes);\n }\n const payload = alternateScreen\n ? wrapAlternateScreenHistory(data)\n : normalizeHistoryForTerminal(data);\n keepShortHistoryVisibleRef.current = true;\n instance.write(payload);\n skipNextDetachPersistRef.current = false;\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n persistTerminalModes(instance, currentDeviceIdRef.current, currentPaneIdRef.current);\n },\n onFlushBuffer: (targetDeviceId, buffer) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n for (const chunk of buffer) {\n const normalized = normalizeLiveOutputForTerminal(chunk, liveOutputEndedWithCR.current);\n liveOutputEndedWithCR.current = normalized.endedWithCR;\n instance.write(normalized.normalized);\n }\n if (keepShortHistoryVisibleRef.current) {\n if (instance.buffer.active.baseY <= 1) {\n instance.scrollToTop();\n }\n keepShortHistoryVisibleRef.current = false;\n }\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n persistTerminalModes(instance, currentDeviceIdRef.current, currentPaneIdRef.current);\n },\n onOutput: (targetDeviceId, targetPaneId, data) => {\n if (currentDeviceIdRef.current !== targetDeviceId) return;\n if (currentPaneIdRef.current !== targetPaneId) return;\n const normalized = normalizeLiveOutputForTerminal(data, liveOutputEndedWithCR.current);\n liveOutputEndedWithCR.current = normalized.endedWithCR;\n instance.write(normalized.normalized);\n if (keepShortHistoryVisibleRef.current) {\n if (instance.buffer.active.baseY <= 1) {\n instance.scrollToTop();\n }\n keepShortHistoryVisibleRef.current = false;\n }\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n persistTerminalModes(instance, currentDeviceIdRef.current, currentPaneIdRef.current);\n },\n };\n }, [instance, persistTerminalModes, runPostSelectResize]);\n\n useEffect(() => {\n if (!instance) {\n lastTerminalInstanceRef.current = null;\n } else if (lastTerminalInstanceRef.current !== instance) {\n liveOutputEndedWithCR.current = false;\n attachedDeviceIdRef.current = currentDeviceIdRef.current;\n attachedPaneIdRef.current = currentPaneIdRef.current;\n lastTerminalInstanceRef.current = instance;\n }\n }, [instance]);\n\n useEffect(() => {\n if (!instance || !deviceId || !paneId) {\n return;\n }\n\n return () => {\n if (skipNextDetachPersistRef.current) {\n skipNextDetachPersistRef.current = false;\n return;\n }\n persistTerminalModes(instance, attachedDeviceIdRef.current, attachedPaneIdRef.current);\n };\n }, [deviceId, instance, paneId, persistTerminalModes]);\n\n useEffect(() => {\n getSelectStateMachine(callbacks);\n }, [callbacks]);\n\n useEffect(() => {\n return () => {\n getSelectStateMachine({});\n };\n }, []);\n\n useEffect(() => {\n if (!instance) {\n fitAddonRef.current = null;\n setFitAddon(null);\n setTerminal(null);\n return;\n }\n\n const fitAddon = new FitAddon();\n instance.loadAddon(fitAddon);\n fitAddonRef.current = fitAddon;\n setFitAddon(fitAddon);\n setTerminal(instance);\n\n runPostSelectResize();\n\n return () => {\n try {\n fitAddon.dispose();\n } finally {\n fitAddonRef.current = null;\n setFitAddon(null);\n setTerminal(null);\n }\n };\n }, [instance, runPostSelectResize, setFitAddon, setTerminal]);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n let rafId: number | null = null;\n const ro = new ResizeObserver(() => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n rafId = requestAnimationFrame(() => {\n rafId = null;\n scheduleResize('resize');\n });\n });\n ro.observe(el);\n return () => {\n ro.disconnect();\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n };\n }, [scheduleResize]);\n\n useEffect(() => {\n if (!instance || !deviceId || !paneId) return;\n\n const disposable = instance.onData((data) => {\n if (!deviceConnected || isSelectionInvalid) return;\n sendTerminalInput(data);\n });\n\n instance.attachCustomKeyEventHandler((domEvent) => {\n if (!deviceConnected || isSelectionInvalid) return true;\n if (domEvent.type !== 'keydown') return true;\n if (inputMode !== 'direct') return true;\n\n if (domEvent.shiftKey && domEvent.key === 'Enter') {\n domEvent.preventDefault();\n sendTerminalInput('\\x1b[13;2u');\n return false;\n }\n\n return true;\n });\n\n return () => {\n disposable.dispose();\n instance.attachCustomKeyEventHandler(() => true);\n };\n }, [\n instance,\n deviceConnected,\n isSelectionInvalid,\n inputMode,\n sendTerminalInput,\n deviceId,\n paneId,\n ]);\n\n useImperativeHandle(\n ref,\n () => ({\n write: (data) => instance?.write(data),\n reset: () => {\n instance?.reset();\n liveOutputEndedWithCR.current = false;\n },\n scrollToBottom: () => instance?.scrollToBottom(),\n resize: (cols, rows) => instance?.resize(cols, rows),\n getTerminal: () => instance ?? null,\n getSize: () => {\n if (!instance) return null;\n return { cols: Math.max(2, instance.cols), rows: Math.max(2, instance.rows) };\n },\n runPostSelectResize: () => runPostSelectResize(),\n scheduleResize: (kind, options) => scheduleResize(kind, options),\n calculateSizeFromContainer: () => {\n const container = containerRef.current;\n const term = instance;\n const fitAddon = fitAddonRef.current;\n if (!container || !term) return null;\n\n const rect = container.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n\n const core = term._core;\n let cols: number;\n if (fitAddon) {\n try {\n const dims = fitAddon.proposeDimensions();\n if (dims) {\n cols = Math.max(2, dims.cols);\n } else {\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n } catch {\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n } else {\n const cellWidth = core?._renderService?.dimensions?.css?.cell?.width ?? 9;\n cols = Math.max(2, Math.floor(rect.width / cellWidth));\n }\n\n const cellHeight = core?._renderService?.dimensions?.css?.cell?.height ?? 17;\n const rows = Math.max(2, Math.floor(rect.height / cellHeight));\n\n return { cols, rows };\n },\n getPendingLocalSize: () => pendingLocalSize.current,\n }),\n [instance, pendingLocalSize, runPostSelectResize, scheduleResize]\n );\n\n return (\n <div\n ref={containerRef}\n className=\"h-full w-full relative\"\n style={{ backgroundColor: terminalTheme.background }}\n data-terminal-engine={TERMINAL_ENGINE}\n >\n <div ref={mountRef} className=\"absolute inset-0\" />\n </div>\n );\n }\n);\n\nTerminal.displayName = 'Terminal';\n","export interface PaneSelection {\n windowId: string;\n paneId: string;\n}\n\nexport interface TimedPaneSelection extends PaneSelection {\n at: number;\n}\n\nexport const RECENT_SELECT_REQUEST_TTL_MS = 1200;\nexport const PENDING_USER_SELECTION_TTL_MS = 2000;\n\nfunction matchesPaneSelection(\n left: PaneSelection | null | undefined,\n right: PaneSelection | null | undefined\n): boolean {\n if (!left || !right) {\n return false;\n }\n return left.windowId === right.windowId && left.paneId === right.paneId;\n}\n\nfunction getLatestRecentSelectRequest(\n recentSelectRequests: TimedPaneSelection[],\n now: number\n): TimedPaneSelection | null {\n const recentRequests = recentSelectRequests.filter(\n (request) => now - request.at < RECENT_SELECT_REQUEST_TTL_MS\n );\n if (recentRequests.length === 0) {\n return null;\n }\n return recentRequests.reduce((latest, request) => (request.at > latest.at ? request : latest));\n}\n\nexport function resolvePendingUserSelection(\n pendingUserSelection: TimedPaneSelection | null | undefined,\n now = Date.now()\n): TimedPaneSelection | null {\n if (!pendingUserSelection) {\n return null;\n }\n if (now - pendingUserSelection.at > PENDING_USER_SELECTION_TTL_MS) {\n return null;\n }\n return pendingUserSelection;\n}\n\nexport function shouldIgnoreActivePaneEvent(params: {\n now?: number;\n pendingUserSelection: TimedPaneSelection | null | undefined;\n activePaneFromEvent: PaneSelection;\n currentRoute: PaneSelection | null | undefined;\n recentSelectRequests: TimedPaneSelection[];\n lastHandledActive: PaneSelection | null | undefined;\n}): boolean {\n const now = params.now ?? Date.now();\n const latestRecentSelectRequest = getLatestRecentSelectRequest(params.recentSelectRequests, now);\n\n if (\n latestRecentSelectRequest &&\n !matchesPaneSelection(latestRecentSelectRequest, params.activePaneFromEvent)\n ) {\n return true;\n }\n\n if (matchesPaneSelection(params.currentRoute, params.activePaneFromEvent)) {\n return true;\n }\n\n if (matchesPaneSelection(params.lastHandledActive, params.activePaneFromEvent)) {\n return true;\n }\n\n const pendingUserSelection = resolvePendingUserSelection(params.pendingUserSelection, now);\n if (\n pendingUserSelection &&\n !matchesPaneSelection(pendingUserSelection, params.activePaneFromEvent)\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function shouldSkipSnapshotFollow(params: {\n now?: number;\n pendingUserSelection: TimedPaneSelection | null | undefined;\n snapshotActive: PaneSelection;\n recentSelectRequests: TimedPaneSelection[];\n}): boolean {\n const now = params.now ?? Date.now();\n const latestRecentSelectRequest = getLatestRecentSelectRequest(params.recentSelectRequests, now);\n\n const pendingUserSelection = resolvePendingUserSelection(params.pendingUserSelection, now);\n if (pendingUserSelection && !matchesPaneSelection(pendingUserSelection, params.snapshotActive)) {\n return true;\n }\n\n if (\n latestRecentSelectRequest &&\n !matchesPaneSelection(latestRecentSelectRequest, params.snapshotActive)\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function shouldTrackPendingRouteSelection(params: {\n now?: number;\n routeTarget: PaneSelection;\n snapshotActive: PaneSelection | null | undefined;\n pendingUserSelection: TimedPaneSelection | null | undefined;\n}): boolean {\n const now = params.now ?? Date.now();\n const pendingUserSelection = resolvePendingUserSelection(params.pendingUserSelection, now);\n\n if (pendingUserSelection && matchesPaneSelection(pendingUserSelection, params.routeTarget)) {\n return false;\n }\n\n if (params.snapshotActive && matchesPaneSelection(params.snapshotActive, params.routeTarget)) {\n return false;\n }\n\n return true;\n}\n","import { useSiteStore } from '../stores/site';\n\nexport function getSiteNameFallback(): string {\n const settings = useSiteStore.getState().settings;\n return settings?.siteName || 'tmex';\n}\n\nexport function getSiteUrlFallback(): string {\n const settings = useSiteStore.getState().settings;\n return settings?.siteUrl || window.location.origin;\n}\n","import { getSiteNameFallback } from './site';\n\ninterface TerminalLabelInput {\n paneIdx?: number | null;\n windowIdx?: number | null;\n paneTitle?: string | null;\n windowName?: string | null;\n deviceName?: string | null;\n}\n\nfunction toSafeText(value: string | null | undefined): string {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : '?';\n}\n\nexport function buildTerminalLabel({\n paneIdx,\n windowIdx,\n paneTitle,\n windowName,\n deviceName,\n}: TerminalLabelInput): string {\n const safeWindowIdx = windowIdx ?? '?';\n const safePaneIdx = paneIdx ?? '?';\n const safePaneTitle = toSafeText(paneTitle ?? windowName);\n const safeDeviceName = toSafeText(deviceName);\n return `${safeWindowIdx}/${safePaneIdx}: ${safePaneTitle}@${safeDeviceName}`;\n}\n\nexport function buildBrowserTitle(label?: string | null): string {\n const siteName = getSiteNameFallback();\n if (!label?.trim()) {\n return siteName;\n }\n return `[${siteName}]${label}`;\n}\n","import { Terminal as TerminalComponent, type TerminalRef } from '@/components/terminal';\nimport { XTERM_THEME_DARK, XTERM_THEME_LIGHT } from '@/components/terminal/theme';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@/components/ui/alert-dialog';\nimport { Button } from '@/components/ui/button';\nimport { Switch } from '@/components/ui/switch';\nimport { useQuery } from '@tanstack/react-query';\nimport type { Device } from '@tmex/shared';\nimport {\n ArrowDownToLine,\n Keyboard,\n Loader2,\n RefreshCw,\n Send,\n Smartphone,\n Trash2,\n} from 'lucide-react';\nimport { type FocusEvent, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate, useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useSiteStore } from '../stores/site';\nimport { useTmuxStore } from '../stores/tmux';\nimport { useUIStore } from '../stores/ui';\nimport { shouldApplyRemotePaneSize } from '../utils/resizeSyncGuards';\nimport {\n type TimedPaneSelection,\n resolvePendingUserSelection,\n shouldIgnoreActivePaneEvent,\n shouldSkipSnapshotFollow,\n shouldTrackPendingRouteSelection,\n} from '../utils/selectionGuards';\nimport { buildBrowserTitle, buildTerminalLabel } from '../utils/terminalMeta';\nimport { decodePaneIdFromUrlParam, encodePaneIdForUrl } from '../utils/tmuxUrl';\n\ninterface EditorShortcut {\n key: string;\n label: string;\n payload: string;\n}\n\nfunction isIOSMobileBrowser(): boolean {\n if (typeof navigator === 'undefined') {\n return false;\n }\n\n const userAgent = navigator.userAgent;\n const isIOSDevice = /iPad|iPhone|iPod/.test(userAgent);\n const isTouchMac = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n return isIOSDevice || isTouchMac;\n}\n\nconst EDITOR_SHORTCUTS: EditorShortcut[] = [\n { key: 'enter', label: 'ENTER', payload: '\\r' },\n { key: 'ctrl-c', label: 'CTRL-C', payload: '\\u0003' },\n { key: 'ctrl-d', label: 'CTRL-D', payload: '\\u0004' },\n { key: 'up', label: '↑', payload: '\\u001b[A' },\n { key: 'down', label: '↓', payload: '\\u001b[B' },\n { key: 'left', label: '←', payload: '\\u001b[D' },\n { key: 'right', label: '→', payload: '\\u001b[C' },\n { key: 'shift-enter', label: 'SHIFT+ENTER', payload: '\\x1b[13;2u' },\n { key: 'tab', label: 'TAB', payload: '\\u0009' },\n { key: 'backspace', label: 'BACKSPACE', payload: '\\u0008' },\n { key: 'esc', label: 'ESC', payload: '\\u001b' },\n { key: 'delete', label: 'DELETE', payload: '\\u007f' },\n { key: ':', label: ':', payload: ':' },\n { key: '/', label: '/', payload: '/' },\n { key: \"'\", label: \"'\", payload: \"'\" },\n { key: '\"', label: '\"', payload: '\"' },\n { key: '`', label: '`', payload: '`' },\n];\n\n// ShortcutsBar 组件 - 使用 memo 避免不必要的重绘\ninterface ShortcutsBarProps {\n onSend: (payload: string) => void;\n onFocusEditor?: () => void;\n disabled: boolean;\n isMobile: boolean;\n inputMode: 'direct' | 'editor';\n}\n\nconst ShortcutsBar = memo(function ShortcutsBar({\n onSend,\n onFocusEditor,\n disabled,\n isMobile,\n inputMode,\n}: ShortcutsBarProps) {\n return (\n <div\n className=\"terminal-shortcuts-strip my-2 bg-muted rounded-xl\"\n data-testid=\"terminal-shortcuts-strip\"\n >\n <div\n className=\"shortcut-row flex items-center gap-1.5 p-2 overflow-x-auto scrollbar-thin\"\n data-testid=\"editor-shortcuts-row\"\n >\n {EDITOR_SHORTCUTS.map((shortcut) => (\n <Button\n key={shortcut.key}\n variant=\"secondary\"\n size=\"sm\"\n className=\"h-7 min-w-9 px-2.5 rounded-full text-[11px] font-medium tracking-wide shrink-0 [@media(any-pointer:coarse)]:h-9 [@media(any-pointer:coarse)]:min-w-10 [@media(any-pointer:coarse)]:px-3\"\n title={shortcut.label}\n aria-label={shortcut.label}\n data-testid={`editor-shortcut-${shortcut.key}`}\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n onSend(shortcut.payload);\n if (isMobile && inputMode === 'editor') {\n onFocusEditor?.();\n }\n }}\n disabled={disabled}\n >\n {shortcut.label}\n </Button>\n ))}\n </div>\n </div>\n );\n});\n\nexport default function DevicePage() {\n const { t } = useTranslation();\n const { deviceId, windowId, paneId } = useParams();\n const navigate = useNavigate();\n const terminalContainerRef = useRef<HTMLDivElement>(null);\n const editorContainerRef = useRef<HTMLDivElement | null>(null);\n const editorTextareaRef = useRef<HTMLTextAreaElement | null>(null);\n const terminalRef = useRef<TerminalRef>(null);\n const autoSelected = useRef(false);\n const iosAddressBarCollapseTried = useRef(false);\n // Track user-initiated navigation to prevent auto-redirect overwriting it\n const userInitiatedSelectionRef = useRef<TimedPaneSelection | null>(null);\n\n const selectPane = useTmuxStore((state) => state.selectPane);\n\n const snapshot = useTmuxStore((state) => (deviceId ? state.snapshots[deviceId] : undefined));\n const deviceError = useTmuxStore((state) =>\n deviceId ? state.deviceErrors?.[deviceId] : undefined\n );\n const deviceConnected = useTmuxStore((state) =>\n deviceId ? (state.deviceConnected?.[deviceId] ?? false) : false\n );\n const siteName = useSiteStore((state) => state.settings?.siteName ?? 'tmex');\n\n const resolvedPaneId = useMemo(() => decodePaneIdFromUrlParam(paneId), [paneId]);\n const draftKey = useMemo(\n () => (deviceId && resolvedPaneId ? `${deviceId}:${resolvedPaneId}` : null),\n [deviceId, resolvedPaneId]\n );\n\n const [isMobile, setIsMobile] = useState(false);\n const [editorText, setEditorText] = useState('');\n const [isEditorFocused, setIsEditorFocused] = useState(false);\n const isComposingRef = useRef(false);\n // Loading state - false when connected and has pane\n const isLoading = !deviceConnected || !resolvedPaneId;\n const [keyboardInsetBottom, setKeyboardInsetBottom] = useState(0);\n const [editorDockHeight, setEditorDockHeight] = useState(0);\n const [isSending, setIsSending] = useState(false);\n const inputMode = useUIStore((state) => state.inputMode);\n const uiTheme = useUIStore((state) => state.theme);\n const editorSendWithEnter = useUIStore((state) => state.editorSendWithEnter);\n const setEditorSendWithEnter = useUIStore((state) => state.setEditorSendWithEnter);\n const addEditorHistory = useUIStore((state) => state.addEditorHistory);\n const setEditorDraft = useUIStore((state) => state.setEditorDraft);\n const removeEditorDraft = useUIStore((state) => state.removeEditorDraft);\n const paneEditorDraft = useUIStore((state) =>\n draftKey ? (state.editorDrafts[draftKey] ?? '') : ''\n );\n const isIOSBrowser = useMemo(() => isIOSMobileBrowser(), []);\n const shouldDockEditor = isMobile && inputMode === 'editor' && isIOSBrowser && isEditorFocused;\n\n const windows = snapshot?.session?.windows;\n const terminalTheme = uiTheme === 'light' ? XTERM_THEME_LIGHT : XTERM_THEME_DARK;\n\n const { data: devicesData } = useQuery({\n queryKey: ['devices'],\n queryFn: async () => {\n const res = await fetch('/api/devices');\n if (!res.ok) {\n throw new Error('Failed to fetch devices');\n }\n return res.json() as Promise<{ devices: Device[] }>;\n },\n throwOnError: false,\n });\n\n const currentDevice = useMemo(() => {\n if (!deviceId) {\n return undefined;\n }\n return devicesData?.devices.find((device) => device.id === deviceId);\n }, [deviceId, devicesData?.devices]);\n\n const selectedWindow = useMemo(() => {\n if (!windowId || !windows) return undefined;\n return windows.find((win) => win.id === windowId);\n }, [windowId, windows]);\n\n const selectedPane = useMemo(() => {\n if (!resolvedPaneId || !selectedWindow) return undefined;\n return selectedWindow.panes.find((pane) => pane.id === resolvedPaneId);\n }, [resolvedPaneId, selectedWindow]);\n\n const hasWindowSnapshot = Boolean(windows);\n const isWindowMissing = hasWindowSnapshot && Boolean(windowId) && !selectedWindow;\n const isPaneMissing =\n hasWindowSnapshot &&\n Boolean(windowId) &&\n Boolean(resolvedPaneId) &&\n Boolean(selectedWindow) &&\n !selectedPane;\n\n const invalidSelectionMessage = isWindowMissing\n ? t('wsError.checkGateway')\n : isPaneMissing\n ? t('wsError.checkGateway')\n : null;\n\n const isSelectionInvalid = Boolean(invalidSelectionMessage);\n const canInteractWithPane = Boolean(deviceConnected && resolvedPaneId && !isSelectionInvalid);\n\n const terminalTopbarLabel = useMemo(() => {\n if (!selectedWindow || !selectedPane) {\n return null;\n }\n const deviceName = currentDevice?.name ?? deviceId;\n return buildTerminalLabel({\n paneIdx: selectedPane.index,\n windowIdx: selectedWindow.index,\n paneTitle: selectedPane.title,\n windowName: selectedWindow.name,\n deviceName,\n });\n }, [currentDevice?.name, deviceId, selectedPane, selectedWindow]);\n\n const snapshotActiveSelection = useMemo(() => {\n if (!windows || windows.length === 0) {\n return null;\n }\n const activeWindow = windows.find((win) => win.active);\n const activePane = activeWindow?.panes.find((pane) => pane.active);\n if (!activeWindow || !activePane) {\n return null;\n }\n return { windowId: activeWindow.id, paneId: activePane.id };\n }, [windows]);\n\n // Handle resize from terminal - use store directly to avoid unstable callback deps\n const handleResize = useCallback(\n (cols: number, rows: number) => {\n if (!deviceId || !resolvedPaneId) return;\n useTmuxStore.getState().resizePane(deviceId, resolvedPaneId, cols, rows);\n },\n [deviceId, resolvedPaneId]\n );\n\n // Handle sync from terminal\n const handleSync = useCallback(\n (cols: number, rows: number) => {\n if (!deviceId || !resolvedPaneId) return;\n useTmuxStore.getState().syncPaneSize(deviceId, resolvedPaneId, cols, rows);\n },\n [deviceId, resolvedPaneId]\n );\n\n const getSelectSize = useCallback(\n (targetWindowId?: string, targetPaneId?: string) => {\n const terminal = terminalRef.current;\n const terminalSize =\n terminal?.calculateSizeFromContainer() ?? terminal?.getSize() ?? undefined;\n if (terminalSize) {\n return terminalSize;\n }\n\n if (!targetWindowId || !targetPaneId || !windows) {\n return undefined;\n }\n\n const targetWindow = windows.find((window) => window.id === targetWindowId);\n const targetPane = targetWindow?.panes.find((pane) => pane.id === targetPaneId);\n if (!targetPane || targetPane.width <= 1 || targetPane.height <= 1) {\n return undefined;\n }\n\n return {\n cols: targetPane.width,\n rows: targetPane.height,\n };\n },\n [windows]\n );\n\n // Mobile detection\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768 || 'ontouchstart' in window);\n };\n\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // iOS address bar collapse\n useEffect(() => {\n if (!isMobile || !isIOSBrowser || iosAddressBarCollapseTried.current) {\n return;\n }\n\n iosAddressBarCollapseTried.current = true;\n const collapseAddressBar = () => {\n window.scrollTo(0, 1);\n };\n\n const rafId = window.requestAnimationFrame(collapseAddressBar);\n const timerA = window.setTimeout(collapseAddressBar, 120);\n const timerB = window.setTimeout(collapseAddressBar, 420);\n\n return () => {\n window.cancelAnimationFrame(rafId);\n window.clearTimeout(timerA);\n window.clearTimeout(timerB);\n };\n }, [isIOSBrowser, isMobile]);\n\n // Reset editor focus when switching modes\n useEffect(() => {\n if (inputMode !== 'editor') {\n setIsEditorFocused(false);\n }\n }, [inputMode]);\n\n // iOS keyboard inset handling\n useEffect(() => {\n if (!(isMobile && isIOSBrowser && inputMode === 'editor' && isEditorFocused)) {\n setKeyboardInsetBottom(0);\n return;\n }\n\n let frameId: number | null = null;\n const updateKeyboardInset = () => {\n const viewport = window.visualViewport;\n const viewportHeight = viewport?.height ?? window.innerHeight;\n const offsetTop = viewport?.offsetTop ?? 0;\n const nextInset = Math.max(0, Math.round(window.innerHeight - viewportHeight - offsetTop));\n setKeyboardInsetBottom(nextInset);\n };\n\n const scheduleUpdate = () => {\n if (frameId !== null) {\n return;\n }\n\n frameId = window.requestAnimationFrame(() => {\n frameId = null;\n updateKeyboardInset();\n });\n };\n\n updateKeyboardInset();\n\n window.visualViewport?.addEventListener('resize', scheduleUpdate);\n window.visualViewport?.addEventListener('scroll', scheduleUpdate);\n window.addEventListener('resize', scheduleUpdate);\n\n return () => {\n window.visualViewport?.removeEventListener('resize', scheduleUpdate);\n window.visualViewport?.removeEventListener('scroll', scheduleUpdate);\n window.removeEventListener('resize', scheduleUpdate);\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n };\n }, [inputMode, isEditorFocused, isIOSBrowser, isMobile]);\n\n // Editor dock height handling\n useEffect(() => {\n if (!shouldDockEditor) {\n setEditorDockHeight(0);\n return;\n }\n\n const editorContainer = editorContainerRef.current;\n if (!editorContainer) {\n return;\n }\n\n const updateEditorHeight = () => {\n setEditorDockHeight(Math.ceil(editorContainer.getBoundingClientRect().height));\n };\n\n updateEditorHeight();\n const observer = new ResizeObserver(updateEditorHeight);\n observer.observe(editorContainer);\n\n return () => observer.disconnect();\n }, [shouldDockEditor]);\n\n // Ensure device is connected when viewing (GlobalDeviceProvider handles actual connection)\n // This effect resets auto-selection logic and related refs when deviceId changes\n useEffect(() => {\n if (!deviceId) return;\n autoSelected.current = false;\n lastHandledActiveRef.current = null;\n lastSnapshotActiveRef.current = null;\n userInitiatedSelectionRef.current = null;\n recentSelectRequestsRef.current = [];\n }, [deviceId]);\n\n // Reset autoSelected when device connection changes\n useEffect(() => {\n if (!deviceConnected) {\n autoSelected.current = false;\n }\n }, [deviceConnected]);\n\n // Handle window/pane changes - both external and from sidebar navigation\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windowId) return;\n\n // If snapshot not yet arrived, don't navigate (loading state)\n if (!windows) {\n return;\n }\n\n // If no windows left (all closed), navigate to fallback\n if (windows.length === 0) {\n navigate('/devices', { replace: true });\n return;\n }\n\n // Find the target window\n const targetWindow = windows.find((w) => w.id === windowId);\n if (!targetWindow) {\n // Window doesn't exist in snapshot yet.\n // Wait for snapshot to arrive. Don't redirect to another window,\n // as the user may have explicitly navigated to this specific window.\n return;\n }\n\n // If no paneId in URL, select the active pane in this window\n if (!resolvedPaneId) {\n const targetPane = targetWindow.panes.find((p) => p.active) ?? targetWindow.panes[0];\n if (targetPane) {\n navigate(\n `/devices/${deviceId}/windows/${windowId}/panes/${encodePaneIdForUrl(targetPane.id)}`,\n { replace: true }\n );\n }\n return;\n }\n\n // Check if current pane exists in the window\n const currentPane = targetWindow.panes.find((p) => p.id === resolvedPaneId);\n if (!currentPane) {\n // Pane was closed, navigate to active pane in same window\n const activePane = targetWindow.panes.find((p) => p.active) ?? targetWindow.panes[0];\n if (activePane) {\n navigate(\n `/devices/${deviceId}/windows/${windowId}/panes/${encodePaneIdForUrl(activePane.id)}`,\n { replace: true }\n );\n }\n return;\n }\n }, [deviceId, deviceConnected, windows, windowId, resolvedPaneId, navigate]);\n\n // Auto-select pane on initial load only\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windows || windows.length === 0) return;\n // If we already have window and pane selected, skip\n if (windowId && resolvedPaneId) return;\n // If autoSelect already done, skip\n if (autoSelected.current) return;\n\n // Select the active window's active pane (initial load)\n const activeWindow = windows.find((win) => win.active) ?? windows[0];\n const activePane = activeWindow.panes.find((pane) => pane.active) ?? activeWindow.panes[0];\n if (!activePane) return;\n\n autoSelected.current = true;\n navigate(\n `/devices/${deviceId}/windows/${activeWindow.id}/panes/${encodePaneIdForUrl(activePane.id)}`,\n { replace: true }\n );\n }, [deviceConnected, deviceId, navigate, resolvedPaneId, windowId, windows]);\n\n // Select pane when ready\n useEffect(() => {\n if (!deviceId || !windowId || !resolvedPaneId) return;\n // Allow sending TMUX_SELECT before WS is READY: borsh client will queue messages and flush on READY.\n // Note: We don't check isSelectionInvalid here because when user navigates via URL,\n // the snapshot may not yet reflect the new window, but we should still send the select command.\n if (isLoading || !deviceConnected) return;\n\n // Short-circuit: if already selected, don't send again\n const currentSelected = useTmuxStore.getState().selectedPanes[deviceId];\n if (\n currentSelected &&\n currentSelected.windowId === windowId &&\n currentSelected.paneId === resolvedPaneId\n ) {\n return;\n }\n\n const size = getSelectSize(windowId, resolvedPaneId);\n recordSelectRequest(windowId, resolvedPaneId);\n selectPane(deviceId, windowId, resolvedPaneId, size);\n }, [deviceConnected, deviceId, getSelectSize, isLoading, resolvedPaneId, selectPane, windowId]);\n\n // Treat explicit route selection as authoritative until snapshot/runtime catches up.\n useEffect(() => {\n if (!deviceId || !deviceConnected || !windowId || !resolvedPaneId) {\n return;\n }\n\n const routeTarget = { windowId, paneId: resolvedPaneId };\n if (\n !shouldTrackPendingRouteSelection({\n routeTarget,\n snapshotActive: snapshotActiveSelection,\n pendingUserSelection: userInitiatedSelectionRef.current,\n })\n ) {\n return;\n }\n\n userInitiatedSelectionRef.current = {\n windowId: routeTarget.windowId,\n paneId: routeTarget.paneId,\n at: Date.now(),\n };\n }, [deviceConnected, deviceId, resolvedPaneId, snapshotActiveSelection, windowId]);\n\n const recentSelectRequestsRef = useRef<Array<{ windowId: string; paneId: string; at: number }>>(\n []\n );\n const recordSelectRequest = useCallback((windowId: string, paneId: string) => {\n const now = Date.now();\n const next = [\n ...recentSelectRequestsRef.current.filter((r) => now - r.at < 2000),\n { windowId, paneId, at: now },\n ];\n recentSelectRequestsRef.current = next.slice(-8);\n }, []);\n\n // Subscribe to activePaneFromEvent for this device\n const activePaneFromEvent = useTmuxStore((state) =>\n deviceId ? state.activePaneFromEvent[deviceId] : undefined\n );\n\n // Follow active pane from event/tmux pane-active\n const lastHandledActiveRef = useRef<{ windowId: string; paneId: string } | null>(null);\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windowId || !resolvedPaneId) return;\n if (!activePaneFromEvent) return;\n\n const now = Date.now();\n const pendingUserSelection = resolvePendingUserSelection(\n userInitiatedSelectionRef.current,\n now\n );\n userInitiatedSelectionRef.current = pendingUserSelection;\n\n if (\n shouldIgnoreActivePaneEvent({\n now,\n pendingUserSelection,\n activePaneFromEvent,\n currentRoute: { windowId, paneId: resolvedPaneId },\n recentSelectRequests: recentSelectRequestsRef.current,\n lastHandledActive: lastHandledActiveRef.current,\n })\n ) {\n return;\n }\n\n lastHandledActiveRef.current = { ...activePaneFromEvent };\n if (\n pendingUserSelection &&\n pendingUserSelection.windowId === activePaneFromEvent.windowId &&\n pendingUserSelection.paneId === activePaneFromEvent.paneId\n ) {\n userInitiatedSelectionRef.current = null;\n }\n\n // Send selectPane to gateway first\n const size = getSelectSize(activePaneFromEvent.windowId, activePaneFromEvent.paneId);\n recordSelectRequest(activePaneFromEvent.windowId, activePaneFromEvent.paneId);\n selectPane(deviceId, activePaneFromEvent.windowId, activePaneFromEvent.paneId, size);\n\n // Navigate to new URL\n navigate(\n `/devices/${deviceId}/windows/${activePaneFromEvent.windowId}/panes/${encodePaneIdForUrl(activePaneFromEvent.paneId)}`,\n { replace: true }\n );\n }, [\n deviceId,\n deviceConnected,\n windowId,\n resolvedPaneId,\n activePaneFromEvent,\n recordSelectRequest,\n getSelectSize,\n selectPane,\n navigate,\n ]);\n\n // Fallback: follow active from snapshot (for environments without pane-active event)\n const lastSnapshotActiveRef = useRef<{ windowId: string; paneId: string } | null>(null);\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!windows || windows.length === 0) return;\n\n // Avoid snapshot-driven \"bounce back\" shortly after we send TMUX_SELECT.\n const recentRequests = recentSelectRequestsRef.current;\n const activeWindow = windows.find((w) => w.active);\n if (!activeWindow) return;\n\n const activePane = activeWindow.panes.find((p) => p.active);\n if (!activePane) return;\n\n const currentActive = { windowId: activeWindow.id, paneId: activePane.id };\n const now = Date.now();\n const pendingUserSelection = resolvePendingUserSelection(\n userInitiatedSelectionRef.current,\n now\n );\n userInitiatedSelectionRef.current = pendingUserSelection;\n\n if (\n shouldSkipSnapshotFollow({\n now,\n pendingUserSelection,\n snapshotActive: currentActive,\n recentSelectRequests: recentRequests,\n })\n ) {\n return;\n }\n\n // Only follow when active actually changes\n if (\n lastSnapshotActiveRef.current &&\n lastSnapshotActiveRef.current.windowId === currentActive.windowId &&\n lastSnapshotActiveRef.current.paneId === currentActive.paneId\n ) {\n return;\n }\n\n // Update ref\n lastSnapshotActiveRef.current = { ...currentActive };\n if (\n pendingUserSelection &&\n pendingUserSelection.windowId === currentActive.windowId &&\n pendingUserSelection.paneId === currentActive.paneId\n ) {\n userInitiatedSelectionRef.current = null;\n }\n\n // If current URL matches, no need to navigate\n if (windowId === currentActive.windowId && resolvedPaneId === currentActive.paneId) {\n return;\n }\n\n // Send selectPane and navigate\n const size = getSelectSize(currentActive.windowId, currentActive.paneId);\n recordSelectRequest(currentActive.windowId, currentActive.paneId);\n selectPane(deviceId, currentActive.windowId, currentActive.paneId, size);\n navigate(\n `/devices/${deviceId}/windows/${currentActive.windowId}/panes/${encodePaneIdForUrl(currentActive.paneId)}`,\n { replace: true }\n );\n }, [\n deviceId,\n deviceConnected,\n windows,\n windowId,\n resolvedPaneId,\n recordSelectRequest,\n getSelectSize,\n selectPane,\n navigate,\n ]);\n\n // Force-follow snapshot active after a user-initiated createWindow.\n // Wait for a snapshot whose active differs from the URL (proving the new\n // window is reflected), then navigate there.\n const pendingCreateWindowAt = useTmuxStore((state) =>\n deviceId ? state.pendingCreateWindowAt[deviceId] : undefined\n );\n useEffect(() => {\n if (!deviceId) return;\n if (!deviceConnected) return;\n if (!pendingCreateWindowAt) return;\n\n const ttlMs = 5000;\n const elapsed = Date.now() - pendingCreateWindowAt;\n if (elapsed > ttlMs) {\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n return;\n }\n\n if (!snapshotActiveSelection) {\n const timer = window.setTimeout(() => {\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n }, ttlMs - elapsed);\n return () => window.clearTimeout(timer);\n }\n\n const target = snapshotActiveSelection;\n if (windowId === target.windowId && resolvedPaneId === target.paneId) {\n const timer = window.setTimeout(() => {\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n }, ttlMs - elapsed);\n return () => window.clearTimeout(timer);\n }\n\n userInitiatedSelectionRef.current = {\n windowId: target.windowId,\n paneId: target.paneId,\n at: Date.now(),\n };\n const size = getSelectSize(target.windowId, target.paneId);\n recordSelectRequest(target.windowId, target.paneId);\n selectPane(deviceId, target.windowId, target.paneId, size);\n navigate(\n `/devices/${deviceId}/windows/${target.windowId}/panes/${encodePaneIdForUrl(target.paneId)}`,\n { replace: true }\n );\n useTmuxStore.getState().clearPendingCreateWindow(deviceId);\n }, [\n deviceId,\n deviceConnected,\n pendingCreateWindowAt,\n snapshotActiveSelection,\n windowId,\n resolvedPaneId,\n recordSelectRequest,\n getSelectSize,\n selectPane,\n navigate,\n ]);\n\n // Sync pane size from remote\n useEffect(() => {\n if (!canInteractWithPane || !selectedPane || isLoading) return;\n\n const terminal = terminalRef.current;\n const term = terminal?.getTerminal();\n if (!term) return;\n\n const remoteCols = Math.max(2, Math.floor(selectedPane.width || 0));\n const remoteRows = Math.max(2, Math.floor(selectedPane.height || 0));\n if (!remoteCols || !remoteRows) return;\n\n const now = Date.now();\n const remoteSize = { cols: remoteCols, rows: remoteRows };\n const pendingLocalSize = terminal?.getPendingLocalSize() ?? null;\n if (\n !shouldApplyRemotePaneSize({\n now,\n remoteSize,\n pendingLocalSize,\n })\n ) {\n return;\n }\n\n if (term.cols === remoteCols && term.rows === remoteRows) {\n return;\n }\n\n term.resize(remoteCols, remoteRows);\n }, [canInteractWithPane, isLoading, selectedPane]);\n\n // Scroll to bottom on input mode change\n useEffect(() => {\n void inputMode;\n const rafId = window.requestAnimationFrame(() => {\n terminalRef.current?.scrollToBottom();\n });\n const timerId = window.setTimeout(() => {\n terminalRef.current?.scrollToBottom();\n }, 120);\n\n return () => {\n window.cancelAnimationFrame(rafId);\n window.clearTimeout(timerId);\n };\n }, [inputMode]);\n\n // Device error toast\n useEffect(() => {\n if (!deviceError?.message) {\n return;\n }\n\n toast.error(deviceError.message);\n }, [deviceError?.message]);\n\n // Page title\n useEffect(() => {\n document.title = buildBrowserTitle(terminalTopbarLabel);\n return () => {\n document.title = siteName;\n };\n }, [siteName, terminalTopbarLabel]);\n\n // Jump to latest event\n useEffect(() => {\n const handler = () => {\n terminalRef.current?.scrollToBottom();\n };\n\n window.addEventListener('tmex:jump-to-latest', handler as EventListener);\n return () => {\n window.removeEventListener('tmex:jump-to-latest', handler as EventListener);\n };\n }, []);\n\n // Listen for user-initiated selection from sidebar\n useEffect(() => {\n const handler = (\n event: CustomEvent<{ deviceId: string; windowId: string; paneId: string }>\n ) => {\n const { deviceId: eventDeviceId, windowId, paneId } = event.detail;\n // Only track if it's for the current device\n // Note: when switching devices, refs are reset in the deviceId effect above\n if (eventDeviceId === deviceId) {\n userInitiatedSelectionRef.current = { windowId, paneId, at: Date.now() };\n }\n };\n\n window.addEventListener('tmex:user-initiated-selection', handler as EventListener);\n return () => {\n window.removeEventListener('tmex:user-initiated-selection', handler as EventListener);\n };\n }, [deviceId]);\n\n // Sync editor draft\n useEffect(() => {\n setEditorText(paneEditorDraft);\n }, [paneEditorDraft]);\n\n const handleSendShortcut = useCallback(\n (payload: string) => {\n if (!deviceId || !resolvedPaneId || !canInteractWithPane) {\n return;\n }\n\n // Send directly to the terminal's input handler\n const store = useTmuxStore.getState();\n store.sendInput(deviceId, resolvedPaneId, payload, false);\n },\n [canInteractWithPane, deviceId, resolvedPaneId]\n );\n\n const handleEditorSend = useCallback(() => {\n if (!canInteractWithPane) {\n toast.error(t('wsError.checkGateway'));\n return;\n }\n if (!deviceId || !resolvedPaneId) return;\n if (!editorText.trim()) return;\n\n setIsSending(true);\n window.setTimeout(() => setIsSending(false), 150);\n\n const payload = editorSendWithEnter ? `${editorText}\\r` : editorText;\n const store = useTmuxStore.getState();\n store.sendInput(deviceId, resolvedPaneId, payload, false);\n addEditorHistory(editorText);\n if (draftKey) {\n removeEditorDraft(draftKey);\n }\n setEditorText('');\n }, [\n addEditorHistory,\n canInteractWithPane,\n deviceId,\n draftKey,\n editorSendWithEnter,\n editorText,\n removeEditorDraft,\n resolvedPaneId,\n t,\n ]);\n\n const handleEditorSendLineByLine = useCallback(() => {\n if (!canInteractWithPane) {\n toast.error(t('wsError.checkGateway'));\n return;\n }\n if (!deviceId || !resolvedPaneId) return;\n if (!editorText.trim()) return;\n\n setIsSending(true);\n window.setTimeout(() => setIsSending(false), 150);\n\n const lines = editorText.split(/\\r?\\n/);\n const store = useTmuxStore.getState();\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n store.sendInput(deviceId, resolvedPaneId, `${line}\\r`, false);\n }\n\n addEditorHistory(editorText);\n if (draftKey) {\n removeEditorDraft(draftKey);\n }\n setEditorText('');\n }, [\n addEditorHistory,\n canInteractWithPane,\n deviceId,\n draftKey,\n editorText,\n removeEditorDraft,\n resolvedPaneId,\n t,\n ]);\n\n const handleEditorFocus = useCallback(\n (event: FocusEvent<HTMLTextAreaElement>) => {\n setIsEditorFocused(true);\n\n if (!(isMobile && isIOSBrowser)) {\n return;\n }\n\n const target = event.currentTarget;\n window.requestAnimationFrame(() => {\n target.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n });\n window.setTimeout(() => {\n window.scrollTo(0, 1);\n }, 60);\n },\n [isIOSBrowser, isMobile]\n );\n\n const handleEditorBlur = useCallback(() => {\n setIsEditorFocused(false);\n }, []);\n\n // 聚焦编辑器回调 - 必须在所有早期 return 之前定义\n const handleFocusEditor = useCallback(() => {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }, []);\n\n if (!deviceId) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <div className=\"rounded-lg border border-dashed border-border px-4 py-3 text-sm text-muted-foreground\">\n {t('device.noDevices')}\n </div>\n </div>\n );\n }\n\n const showConnecting = !deviceConnected && !deviceError;\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-background\" data-testid=\"device-page\">\n <div\n className={`flex-1 relative overflow-hidden min-h-0 min-w-0 ${\n isMobile && inputMode === 'editor' && !shouldDockEditor ? 'pb-1' : ''\n }`}\n style={{\n paddingBottom: shouldDockEditor ? `${editorDockHeight + 60}px` : undefined,\n }}\n >\n <div\n className=\"h-full px-3 py-1 min-h-0 min-w-0 w-full relative flex rounded-xl\"\n style={{ backgroundColor: terminalTheme.background }}\n >\n {deviceConnected && resolvedPaneId ? (\n <div ref={terminalContainerRef} className=\"flex-1 h-full min-h-0 w-full\">\n <TerminalComponent\n key={`${deviceId}:${resolvedPaneId}`}\n ref={terminalRef}\n deviceId={deviceId}\n paneId={resolvedPaneId}\n theme={uiTheme}\n inputMode={inputMode}\n deviceConnected={deviceConnected}\n isSelectionInvalid={isSelectionInvalid}\n onResize={handleResize}\n onSync={handleSync}\n />\n </div>\n ) : (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center p-8 text-center\">\n <div className=\"max-w-sm space-y-4\">\n {!deviceConnected ? (\n <>\n <div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mx-auto\">\n <span className=\"text-2xl text-muted-foreground\">🔌</span>\n </div>\n <h3 className=\"text-lg font-medium\">{t('device.disconnected')}</h3>\n <p className=\"text-sm text-muted-foreground\">{t('device.connectToStart')}</p>\n </>\n ) : !windowId ? (\n <>\n <div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mx-auto\">\n <span className=\"text-2xl text-muted-foreground\">📋</span>\n </div>\n <h3 className=\"text-lg font-medium\">{t('window.noWindowSelected')}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {t('window.selectWindowToStart')}\n </p>\n </>\n ) : (\n <>\n <div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mx-auto\">\n <Loader2 className=\"h-6 w-6 text-muted-foreground animate-spin\" />\n </div>\n <h3 className=\"text-lg font-medium\">{t('terminal.connecting')}</h3>\n </>\n )}\n </div>\n </div>\n )}\n </div>\n\n {showConnecting && (\n <div\n className=\"absolute inset-0 flex items-center justify-center bg-background/85 backdrop-blur-sm\"\n data-testid=\"terminal-status-overlay\"\n >\n <div className=\"flex flex-col items-center gap-2 rounded-lg border border-border bg-card/90 px-4 py-3 shadow-sm\">\n <div className=\"h-7 w-7 rounded-full border-2 border-primary border-t-transparent animate-spin\" />\n <span className=\"text-xs text-muted-foreground\" data-testid=\"terminal-status-text\">\n {t('terminal.connecting')}\n </span>\n </div>\n </div>\n )}\n </div>\n\n {/* 快捷键栏:PC端和移动端 direct 模式都在终端下方 */}\n {inputMode === 'direct' && (\n <div className=\"\">\n <ShortcutsBar\n onSend={handleSendShortcut}\n disabled={!canInteractWithPane}\n isMobile={isMobile}\n inputMode={inputMode}\n />\n </div>\n )}\n\n {inputMode === 'editor' && (\n <div\n ref={editorContainerRef}\n className={`editor-mode-input bg-card/85 backdrop-blur-sm ${\n shouldDockEditor ? 'fixed left-0 right-0 z-50' : ''\n }`}\n style={shouldDockEditor ? { bottom: `${keyboardInsetBottom}px` } : undefined}\n >\n {/* 移动端 editor 模式:快捷键栏在编辑器上方 */}\n {isMobile && (\n <ShortcutsBar\n onSend={handleSendShortcut}\n onFocusEditor={handleFocusEditor}\n disabled={!canInteractWithPane}\n isMobile={isMobile}\n inputMode={inputMode}\n />\n )}\n <textarea\n ref={editorTextareaRef}\n data-testid=\"editor-input\"\n className=\"min-h-[88px] max-h-[28vh] w-full resize-y rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground shadow-xs outline-none transition-colors focus:border-ring\"\n value={editorText}\n onChange={(e) => {\n const nextText = e.target.value;\n setEditorText(nextText);\n if (!draftKey) {\n return;\n }\n if (nextText) {\n setEditorDraft(draftKey, nextText);\n return;\n }\n removeEditorDraft(draftKey);\n }}\n placeholder={t('terminal.inputPlaceholder')}\n onFocus={handleEditorFocus}\n onBlur={handleEditorBlur}\n onCompositionStart={() => {\n isComposingRef.current = true;\n }}\n onCompositionEnd={() => {\n isComposingRef.current = false;\n }}\n />\n <div className=\"actions mt-2\">\n <div\n className=\"send-row flex flex-wrap items-center justify-end gap-2\"\n data-testid=\"editor-send-row\"\n >\n <div\n className=\"send-with-enter-toggle mr-auto flex items-center gap-2 text-xs text-muted-foreground\"\n data-testid=\"editor-send-with-enter-toggle\"\n >\n <Switch\n size=\"sm\"\n checked={editorSendWithEnter}\n onCheckedChange={(checked) => setEditorSendWithEnter(Boolean(checked))}\n />\n <span>{t('terminal.editorSendWithEnter')}</span>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n data-testid=\"editor-clear\"\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n setEditorText('');\n if (draftKey) {\n removeEditorDraft(draftKey);\n }\n if (isMobile && inputMode === 'editor') {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }\n }}\n title={t('terminal.clear')}\n >\n <Trash2 className=\"h-4 w-4\" />\n {t('terminal.clear')}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n data-testid=\"editor-send-line-by-line\"\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n handleEditorSendLineByLine();\n if (isMobile && inputMode === 'editor') {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }\n }}\n disabled={!canInteractWithPane || isSending}\n >\n {isSending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n {t('terminal.editorSendLineByLine')}\n </Button>\n <Button\n variant=\"default\"\n size=\"sm\"\n data-testid=\"editor-send\"\n onPointerDown={(e) => e.preventDefault()}\n onClick={() => {\n handleEditorSend();\n if (isMobile && inputMode === 'editor') {\n editorTextareaRef.current?.focus({ preventScroll: true });\n }\n }}\n disabled={!canInteractWithPane || isSending}\n >\n {isSending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n {t('common.send')}\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// Page title component - shows terminal label\nexport function PageTitle() {\n const { deviceId, windowId, paneId } = useParams();\n const resolvedPaneId = paneId ? decodePaneIdFromUrlParam(paneId) : undefined;\n const snapshots = useTmuxStore((state) => state.snapshots);\n const siteName = useSiteStore((state) => state.settings?.siteName ?? 'tmex');\n\n const snapshot = deviceId ? snapshots[deviceId] : undefined;\n const selectedWindow = useMemo(() => {\n if (!windowId || !snapshot?.session?.windows) return undefined;\n return snapshot.session.windows.find((w) => w.id === windowId);\n }, [windowId, snapshot]);\n\n const selectedPane = useMemo(() => {\n if (!resolvedPaneId || !selectedWindow) return undefined;\n return selectedWindow.panes.find((p) => p.id === resolvedPaneId);\n }, [resolvedPaneId, selectedWindow]);\n\n const title = useMemo(() => {\n if (selectedWindow && selectedPane) {\n return buildTerminalLabel({\n paneIdx: selectedPane.index,\n windowIdx: selectedWindow.index,\n paneTitle: selectedPane.title,\n windowName: selectedWindow.name,\n deviceName: siteName,\n });\n }\n return deviceId ?? '';\n }, [selectedWindow, selectedPane, siteName, deviceId]);\n\n return <>{title}</>;\n}\n\n// Page actions component - shows input mode toggle, jump to latest and refresh page\nexport function PageActions() {\n const { t } = useTranslation();\n const { deviceId, paneId } = useParams();\n const resolvedPaneId = paneId ? decodePaneIdFromUrlParam(paneId) : undefined;\n const inputMode = useUIStore((state) => state.inputMode);\n const setInputMode = useUIStore((state) => state.setInputMode);\n const deviceConnected = useTmuxStore((state) =>\n deviceId ? (state.deviceConnected?.[deviceId] ?? false) : false\n );\n\n const [showRefreshConfirm, setShowRefreshConfirm] = useState(false);\n\n const canInteract = Boolean(resolvedPaneId && deviceConnected);\n\n const handleToggleInputMode = () => {\n const newMode = inputMode === 'direct' ? 'editor' : 'direct';\n setInputMode(newMode);\n };\n\n const handleJumpToLatest = () => {\n window.dispatchEvent(new CustomEvent('tmex:jump-to-latest'));\n };\n\n const handleRefreshClick = () => {\n setShowRefreshConfirm(true);\n };\n\n const handleConfirmRefresh = () => {\n window.location.reload();\n };\n\n return (\n <>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleRefreshClick}\n aria-label={t('nav.refreshPage')}\n title={t('nav.refreshPage')}\n >\n <RefreshCw className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleToggleInputMode}\n disabled={!canInteract}\n data-testid=\"terminal-input-mode-toggle\"\n aria-label={inputMode === 'direct' ? t('nav.switchToEditor') : t('nav.switchToDirect')}\n title={inputMode === 'direct' ? t('nav.switchToEditor') : t('nav.switchToDirect')}\n >\n {inputMode === 'direct' ? (\n <Keyboard className=\"h-4 w-4\" />\n ) : (\n <Smartphone className=\"h-4 w-4\" />\n )}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleJumpToLatest}\n disabled={!canInteract}\n aria-label={t('nav.jumpToLatest')}\n title={t('nav.jumpToLatest')}\n >\n <ArrowDownToLine className=\"h-4 w-4\" />\n </Button>\n\n <AlertDialog open={showRefreshConfirm} onOpenChange={setShowRefreshConfirm}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{t('nav.refreshPage')}</AlertDialogTitle>\n <AlertDialogDescription>{t('nav.refreshPageConfirm')}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel onClick={() => setShowRefreshConfirm(false)}>\n {t('common.cancel')}\n </AlertDialogCancel>\n <AlertDialogAction onClick={handleConfirmRefresh}>\n {t('common.confirm')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n"],"names":["__iconNode","ArrowDownToLine","createLucideIcon","Keyboard","RefreshCw","Smartphone","colorToCss","color","ensureContext","canvas","context","CanvasRenderer","options","__publicField","layer","theme","frame","targetRows","row","cols","rows","nextCols","nextRows","width","height","dpr","cssWidth","cssHeight","rects","rect","colors","y","defaultBackground","cell","x","bg","fg","cellWidth","meta","cursor","previous","cursorColor","cssColor","style","key","cached","font","css","KEY_UNIDENTIFIED","KEY_CODE_MAP","UNSHIFTED_CODEPOINTS","index","uppercase","lowercase","getGhosttyKeyCode","code","getUnshiftedCodepoint","value","GHOSTTY_SUCCESS","GHOSTTY_INVALID_VALUE","GHOSTTY_RENDER_STATE_DATA_COLS","GHOSTTY_RENDER_STATE_DATA_ROWS","GHOSTTY_RENDER_STATE_DATA_DIRTY","GHOSTTY_RENDER_STATE_DATA_CURSOR_VISUAL_STYLE","GHOSTTY_RENDER_STATE_DATA_CURSOR_VISIBLE","GHOSTTY_RENDER_STATE_DATA_CURSOR_BLINKING","GHOSTTY_RENDER_STATE_DATA_CURSOR_PASSWORD_INPUT","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_HAS_VALUE","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_X","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_Y","GHOSTTY_RENDER_STATE_DATA_CURSOR_VIEWPORT_WIDE_TAIL","GHOSTTY_RENDER_STATE_ROW_DATA_DIRTY","GHOSTTY_RENDER_STATE_ROW_DATA_RAW","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_RAW","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_STYLE","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_LEN","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_GRAPHEMES_BUF","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_BG_COLOR","GHOSTTY_RENDER_STATE_ROW_CELLS_DATA_FG_COLOR","GHOSTTY_ROW_DATA_WRAP","GHOSTTY_ROW_DATA_WRAP_CONTINUATION","GHOSTTY_CELL_DATA_WIDE","GHOSTTY_CELL_DATA_HAS_TEXT","ensureActive","resources","resultToDirtyState","resultToCursorStyle","resultToCellWidthKind","readColorAt","bindings","ptr","readOptionalColor","read","result","readBool","readU16","readU32","readEnumI32","readU64","readStyle","field","name","readCodepoints","graphemeLen","bufPtr","codepoints","codepointsToText","buildRowText","cells","text","readMeta","paletteOffset","palette","colorOffset","cursorHasValue","cursorViewportHasValue","readRow","rowIndex","rawRow","rawCell","widthKind","createRenderState","updateRenderState","terminalHandle","readRenderSnapshotMeta","iterateRows","disposeRenderStateResources","clampColumn","lineText","col","normalizeRange","anchor","focus","expandWord","line","safeCol","isWordChar","cursorChar","start","end","expandLine","lastCol","pointForMode","point","mode","getLineText","createEmptySelectionState","hasSelection","state","clearSelection","resolvePointerSelection","_previous","expanded","updateSelectionFocus","getSelectionRange","serializeSelectionText","range","segments","projectSelectionRects","viewportStartLine","viewportRows","viewportEndLine","lineWidth","middleWidth","hasCopyModifier","event","isCopyShortcut","writeSelectionToClipboard","_a","writeSelectionToCopyEvent","ghosttyWasmUrl","GHOSTTY_OUT_OF_SPACE","GHOSTTY_TERMINAL_OPT_COLOR_FOREGROUND","GHOSTTY_TERMINAL_OPT_COLOR_BACKGROUND","GHOSTTY_TERMINAL_OPT_COLOR_CURSOR","GHOSTTY_TERMINAL_OPT_COLOR_PALETTE","GHOSTTY_TERMINAL_DATA_COLS","GHOSTTY_TERMINAL_DATA_ROWS","GHOSTTY_TERMINAL_DATA_SCROLLBAR","GHOSTTY_POINT_TAG_VIEWPORT","GHOSTTY_SCROLL_VIEWPORT_TOP","GHOSTTY_SCROLL_VIEWPORT_BOTTOM","GHOSTTY_SCROLL_VIEWPORT_DELTA","GHOSTTY_KEY_ACTION_RELEASE","GHOSTTY_KEY_ACTION_PRESS","GHOSTTY_KEY_ACTION_REPEAT","GHOSTTY_MOUSE_ENCODER_OPT_TRACK_LAST_CELL","GHOSTTY_MODE_BRACKETED_PASTE","GHOSTTY_MODE_X10_MOUSE","GHOSTTY_MODE_NORMAL_MOUSE","GHOSTTY_MODE_BUTTON_MOUSE","GHOSTTY_MODE_ANY_MOUSE","GHOSTTY_MODE_UTF8_MOUSE","GHOSTTY_MODE_SGR_MOUSE","GHOSTTY_MODE_URXVT_MOUSE","GHOSTTY_MODE_SGR_PIXELS_MOUSE","bindingsPromise","assertResult","action","parseHexRgb","hex","normalized","createAnsi256Palette","cube","red","green","blue","encodeMouseModifierBits","mods","encoded","encodeX10Byte","mouseButtonCode","button","keyboardEventToGhosttyMods","_b","StructAllocation","typeName","GhosttyBindings","exports","layout","len","type","fieldName","target","offset","data","scrollback","termPtrPtr","terminal","bytes","allocation","delta","behavior","foreground","background","paletteColors","palettePtr","assignRgb","paletteBytes","colsPtr","rowsPtr","scrollbar","valuePtr","enabled","emit","formatterOptions","extraOffset","extraView","screenOffset","screenView","outFormatterPtr","selectionOffset","formatter","outRef","coordOffset","coordView","safeCols","safeRows","selection","startOffset","endOffset","viewport","terminalSize","outPtrPtr","outLenPtr","outPtr","outLen","memoryByteLength","outStatePtr","option","outColorsPtr","outIteratorPtr","iterator","outCellsPtr","outEncoderPtr","encoder","trackLastCellPtr","trackingAny","trackingButton","trackingNormal","trackingX10","baseCode","column","pixelX","pixelY","suffix","encodedCode","encodedColumn","encodedRow","eventPtrPtr","eventHandle","utf8Allocation","requiredPtr","sizeResult","required","bufferPtr","writtenPtr","written","input","bracketed","outputPtr","loadGhosttyWasmBytes","source","response","getGhosttyBindings","wasmBytes","typeJsonPtr","DEFAULT_COLS","DEFAULT_ROWS","DEFAULT_CELL_WIDTH","DEFAULT_CELL_HEIGHT","AUTO_SCROLL_INTERVAL_MS","TERMINAL_ENGINE","GHOSTTY_MODE_ALT_SCROLL","GHOSTTY_MODE_ALT_SCREEN","GHOSTTY_MODE_ALT_SCREEN_SAVE","MOUSE_TRACKING_MODES","GHOSTTY_MOUSE_BUTTON_LEFT","GHOSTTY_MOUSE_BUTTON_MIDDLE","GHOSTTY_MOUSE_BUTTON_RIGHT","GHOSTTY_MOUSE_BUTTON_FOUR","GHOSTTY_MOUSE_BUTTON_FIVE","BufferLine","content","trimRight","TerminalBuffer","relativeIndex","viewportY","baseY","length","lines","shouldEncodeOnKeyDown","normalizeVisibleLines","expectedRows","pointerLikeEventToGhosttyMods","FitAddon","GhosttyTerminalController","proposed","keyEncoderHandle","mouseEncoderHandle","renderState","error","container","root","screen","textarea","scrollbarTrack","scrollbarThumb","measured","addon","callback","prevAltScreen","nextAltScreen","amount","snapshot","gesture","routing","consumed","disabled","element","dragEventTarget","moveListener","upListener","selectionText","payload","finalData","recentCompositionCommit","keyCode","utf8","mouseReporting","altScreen","cellHeight","pageLines","scaled","buttons","clientX","clientY","position","listener","cursorX","cursorY","left","top","selectionRects","visibleLines","thumb","trackHeight","ratio","thumbHeight","thumbTop","probe","repaint","resetSelectionData","shouldClear","_c","_d","detail","relativeX","relativeY","maxCol","maxRow","visibleIndex","visibleRow","dispose","createTerminalController","XTERM_THEME_LIGHT","XTERM_THEME_DARK","XTERM_FONT_FAMILY","normalizeHistoryForTerminal","canonical","ALT_SCREEN_HISTORY_PREAMBLE","wrapAlternateScreenHistory","normalizeLiveOutputForTerminal","previousEndedWithCR","prevWasCR","extraCRCount","byte","endedWithCR","writeIndex","TOUCH_SCROLL_GAIN","SCROLLBAR_TOUCH_HOTZONE_PX","useMobileTouch","containerRef","getTerminal","isActiveRef","useRef","useEffect","lastTouchY","touchId","bypassCustomScroll","pendingPixelDelta","isScrollbarElement","shouldBypassCustomScroll","eventTarget","directTarget","pointTarget","xtermRoot","insideX","insideY","findScrollTargets","el","findTouchById","touchList","i","touch","handleTouchStart","handleTouchMove","currentY","deltaY","didScroll","atTopWhilePullingDown","core","lineHeight","linesToScroll","beforeViewportY","_f","_e","afterViewportY","_h","_g","scrollTargets","previousScrollTop","nextScrollTop","wheelEvent","dispatched","handleTouchEnd","shouldApplyRemotePaneSize","now","remoteSize","pendingLocalSize","ttlMs","shouldSyncOnViewportRestore","currentSize","containerSize","force","useTerminalResize","deviceId","paneId","deviceConnected","isSelectionInvalid","onResize","onSync","getContainerRect","resizeRaf","resizeTimer","lastReportedSize","suppressLocalResizeUntil","postSelectResizeTimers","fitAddonRef","terminalRef","getContainerRectRef","viewportRestorePendingRef","onResizeRef","onSyncRef","measureTerminalSize","useCallback","term","fitAddon","containerRect","_j","_i","applyTerminalSize","reportSize","kind","measuredSize","lastSize","scheduleResize","immediate","run","clearPostSelectResizeTimers","id","runPostSelectResize","retryId","rafId","handleWindowResize","handleViewportRestore","handleVisibilityChange","handleWindowBlur","handleWindowFocus","setFitAddon","setTerminal","TERMINAL_CONFIG","TERMINAL_MODE_CACHE_KEY","readTerminalModeCache","raw","writeTerminalModeCache","parsed","createAlternateScreenFallbackSnapshot","reconcileRecoveredModes","alternateScreen","fallback","hasTrackingMode","setE2eTerminalProbe","g","clearE2eTerminalProbe","Terminal","forwardRef","inputMode","ref","instance","setInstance","useState","sendInput","useTmuxStore","terminalTheme","useMemo","mountRef","currentDeviceIdRef","currentPaneIdRef","attachedDeviceIdRef","attachedPaneIdRef","canWriteRef","currentInputModeRef","currentTerminalThemeRef","liveOutputEndedWithCR","keepShortHistoryVisibleRef","lastTerminalInstanceRef","skipNextDetachPersistRef","persistTerminalModes","targetDeviceId","targetPaneId","getTerminalForTouch","sendTerminalInput","activeDeviceId","activePaneId","cancelled","createdTerminal","callbacks","recoveredModes","buffer","chunk","getSelectStateMachine","ro","disposable","domEvent","useImperativeHandle","dims","_l","_k","_p","_o","_n","_m","jsxDEV","this","RECENT_SELECT_REQUEST_TTL_MS","PENDING_USER_SELECTION_TTL_MS","matchesPaneSelection","right","getLatestRecentSelectRequest","recentSelectRequests","recentRequests","request","latest","resolvePendingUserSelection","pendingUserSelection","shouldIgnoreActivePaneEvent","params","latestRecentSelectRequest","shouldSkipSnapshotFollow","shouldTrackPendingRouteSelection","getSiteNameFallback","settings","useSiteStore","toSafeText","trimmed","buildTerminalLabel","paneIdx","windowIdx","paneTitle","windowName","deviceName","safeWindowIdx","safePaneIdx","safePaneTitle","safeDeviceName","buildBrowserTitle","label","siteName","isIOSMobileBrowser","userAgent","isIOSDevice","isTouchMac","EDITOR_SHORTCUTS","ShortcutsBar","memo","onSend","onFocusEditor","isMobile","shortcut","Button","e","DevicePage","t","useTranslation","windowId","useParams","navigate","useNavigate","terminalContainerRef","editorContainerRef","editorTextareaRef","autoSelected","iosAddressBarCollapseTried","userInitiatedSelectionRef","selectPane","deviceError","resolvedPaneId","decodePaneIdFromUrlParam","draftKey","setIsMobile","editorText","setEditorText","isEditorFocused","setIsEditorFocused","isComposingRef","isLoading","keyboardInsetBottom","setKeyboardInsetBottom","editorDockHeight","setEditorDockHeight","isSending","setIsSending","useUIStore","uiTheme","editorSendWithEnter","setEditorSendWithEnter","addEditorHistory","setEditorDraft","removeEditorDraft","paneEditorDraft","isIOSBrowser","shouldDockEditor","windows","devicesData","useQuery","res","currentDevice","device","selectedWindow","win","selectedPane","pane","hasWindowSnapshot","canInteractWithPane","terminalTopbarLabel","snapshotActiveSelection","activeWindow","activePane","handleResize","handleSync","getSelectSize","targetWindowId","targetWindow","window","targetPane","checkMobile","collapseAddressBar","timerA","timerB","frameId","updateKeyboardInset","viewportHeight","offsetTop","nextInset","scheduleUpdate","editorContainer","updateEditorHeight","observer","lastHandledActiveRef","lastSnapshotActiveRef","recentSelectRequestsRef","w","p","encodePaneIdForUrl","currentSelected","size","recordSelectRequest","routeTarget","next","r","activePaneFromEvent","currentActive","pendingCreateWindowAt","elapsed","timer","remoteCols","remoteRows","timerId","toast","handler","eventDeviceId","handleSendShortcut","handleEditorSend","handleEditorSendLineByLine","store","handleEditorFocus","handleEditorBlur","handleFocusEditor","showConnecting","TerminalComponent","Fragment","Loader2","nextText","Switch","checked","Trash2","Send","PageTitle","snapshots","title","PageActions","setInputMode","showRefreshConfirm","setShowRefreshConfirm","canInteract","handleToggleInputMode","handleJumpToLatest","handleRefreshClick","handleConfirmRefresh","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|