From 8c02b065cd8a9e4cf7ea711f5a2cb3ed61a15ca5 Mon Sep 17 00:00:00 2001 From: alice Date: Mon, 13 Apr 2026 18:58:26 +0000 Subject: [PATCH] Render blank bootstrap state until first output --- dist/__vite-browser-external-2447137e.js | 4 + dist/ghostty-vt.wasm | Bin 0 -> 423910 bytes dist/ghostty-web.js | 3508 ++++++++++++++++++++++ dist/ghostty-web.umd.cjs | 13 + dist/index.d.ts | 2036 +++++++++++++ ghostty-vt.wasm | Bin 0 -> 423910 bytes lib/terminal.ts | 127 +- 7 files changed, 5684 insertions(+), 4 deletions(-) create mode 100644 dist/__vite-browser-external-2447137e.js create mode 100755 dist/ghostty-vt.wasm create mode 100644 dist/ghostty-web.js create mode 100644 dist/ghostty-web.umd.cjs create mode 100644 dist/index.d.ts create mode 100755 ghostty-vt.wasm diff --git a/dist/__vite-browser-external-2447137e.js b/dist/__vite-browser-external-2447137e.js new file mode 100644 index 0000000..a935c1d --- /dev/null +++ b/dist/__vite-browser-external-2447137e.js @@ -0,0 +1,4 @@ +const e = {}; +export { + e as default +}; diff --git a/dist/ghostty-vt.wasm b/dist/ghostty-vt.wasm new file mode 100755 index 0000000000000000000000000000000000000000..128d46f41a290e529234857d5a76234c3b23d323 GIT binary patch literal 423910 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

>PUx`j0AGD1YH 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 F{{!-vZ%zOJ literal 0 HcmV?d00001 diff --git a/dist/ghostty-web.js b/dist/ghostty-web.js new file mode 100644 index 0000000..f942c11 --- /dev/null +++ b/dist/ghostty-web.js @@ -0,0 +1,3508 @@ +var N = /* @__PURE__ */ ((i) => (i[i.CURSOR_KEY_APPLICATION = 0] = "CURSOR_KEY_APPLICATION", i[i.KEYPAD_KEY_APPLICATION = 1] = "KEYPAD_KEY_APPLICATION", i[i.IGNORE_KEYPAD_WITH_NUMLOCK = 2] = "IGNORE_KEYPAD_WITH_NUMLOCK", i[i.ALT_ESC_PREFIX = 3] = "ALT_ESC_PREFIX", i[i.MODIFY_OTHER_KEYS_STATE_2 = 4] = "MODIFY_OTHER_KEYS_STATE_2", i[i.KITTY_KEYBOARD_FLAGS = 5] = "KITTY_KEYBOARD_FLAGS", i))(N || {}), G = /* @__PURE__ */ ((i) => (i[i.RELEASE = 0] = "RELEASE", i[i.PRESS = 1] = "PRESS", i[i.REPEAT = 2] = "REPEAT", i))(G || {}), h = /* @__PURE__ */ ((i) => (i[i.UNIDENTIFIED = 0] = "UNIDENTIFIED", i[i.GRAVE = 1] = "GRAVE", i[i.BACKSLASH = 2] = "BACKSLASH", i[i.BRACKET_LEFT = 3] = "BRACKET_LEFT", i[i.BRACKET_RIGHT = 4] = "BRACKET_RIGHT", i[i.COMMA = 5] = "COMMA", i[i.ZERO = 6] = "ZERO", i[i.ONE = 7] = "ONE", i[i.TWO = 8] = "TWO", i[i.THREE = 9] = "THREE", i[i.FOUR = 10] = "FOUR", i[i.FIVE = 11] = "FIVE", i[i.SIX = 12] = "SIX", i[i.SEVEN = 13] = "SEVEN", i[i.EIGHT = 14] = "EIGHT", i[i.NINE = 15] = "NINE", i[i.EQUAL = 16] = "EQUAL", i[i.INTL_BACKSLASH = 17] = "INTL_BACKSLASH", i[i.INTL_RO = 18] = "INTL_RO", i[i.INTL_YEN = 19] = "INTL_YEN", i[i.A = 20] = "A", i[i.B = 21] = "B", i[i.C = 22] = "C", i[i.D = 23] = "D", i[i.E = 24] = "E", i[i.F = 25] = "F", i[i.G = 26] = "G", i[i.H = 27] = "H", i[i.I = 28] = "I", i[i.J = 29] = "J", i[i.K = 30] = "K", i[i.L = 31] = "L", i[i.M = 32] = "M", i[i.N = 33] = "N", i[i.O = 34] = "O", i[i.P = 35] = "P", i[i.Q = 36] = "Q", i[i.R = 37] = "R", i[i.S = 38] = "S", i[i.T = 39] = "T", i[i.U = 40] = "U", i[i.V = 41] = "V", i[i.W = 42] = "W", i[i.X = 43] = "X", i[i.Y = 44] = "Y", i[i.Z = 45] = "Z", i[i.MINUS = 46] = "MINUS", i[i.PERIOD = 47] = "PERIOD", i[i.QUOTE = 48] = "QUOTE", i[i.SEMICOLON = 49] = "SEMICOLON", i[i.SLASH = 50] = "SLASH", i[i.ALT_LEFT = 51] = "ALT_LEFT", i[i.ALT_RIGHT = 52] = "ALT_RIGHT", i[i.BACKSPACE = 53] = "BACKSPACE", i[i.CAPS_LOCK = 54] = "CAPS_LOCK", i[i.CONTEXT_MENU = 55] = "CONTEXT_MENU", i[i.CONTROL_LEFT = 56] = "CONTROL_LEFT", i[i.CONTROL_RIGHT = 57] = "CONTROL_RIGHT", i[i.ENTER = 58] = "ENTER", i[i.META_LEFT = 59] = "META_LEFT", i[i.META_RIGHT = 60] = "META_RIGHT", i[i.SHIFT_LEFT = 61] = "SHIFT_LEFT", i[i.SHIFT_RIGHT = 62] = "SHIFT_RIGHT", i[i.SPACE = 63] = "SPACE", i[i.TAB = 64] = "TAB", i[i.CONVERT = 65] = "CONVERT", i[i.KANA_MODE = 66] = "KANA_MODE", i[i.NON_CONVERT = 67] = "NON_CONVERT", i[i.DELETE = 68] = "DELETE", i[i.END = 69] = "END", i[i.HELP = 70] = "HELP", i[i.HOME = 71] = "HOME", i[i.INSERT = 72] = "INSERT", i[i.PAGE_DOWN = 73] = "PAGE_DOWN", i[i.PAGE_UP = 74] = "PAGE_UP", i[i.DOWN = 75] = "DOWN", i[i.LEFT = 76] = "LEFT", i[i.RIGHT = 77] = "RIGHT", i[i.UP = 78] = "UP", i[i.NUM_LOCK = 79] = "NUM_LOCK", i[i.KP_0 = 80] = "KP_0", i[i.KP_1 = 81] = "KP_1", i[i.KP_2 = 82] = "KP_2", i[i.KP_3 = 83] = "KP_3", i[i.KP_4 = 84] = "KP_4", i[i.KP_5 = 85] = "KP_5", i[i.KP_6 = 86] = "KP_6", i[i.KP_7 = 87] = "KP_7", i[i.KP_8 = 88] = "KP_8", i[i.KP_9 = 89] = "KP_9", i[i.KP_PLUS = 90] = "KP_PLUS", i[i.KP_BACKSPACE = 91] = "KP_BACKSPACE", i[i.KP_CLEAR = 92] = "KP_CLEAR", i[i.KP_CLEAR_ENTRY = 93] = "KP_CLEAR_ENTRY", i[i.KP_COMMA = 94] = "KP_COMMA", i[i.KP_PERIOD = 95] = "KP_PERIOD", i[i.KP_DIVIDE = 96] = "KP_DIVIDE", i[i.KP_ENTER = 97] = "KP_ENTER", i[i.KP_EQUAL = 98] = "KP_EQUAL", i[i.KP_MEMORY_ADD = 99] = "KP_MEMORY_ADD", i[i.KP_MEMORY_CLEAR = 100] = "KP_MEMORY_CLEAR", i[i.KP_MEMORY_RECALL = 101] = "KP_MEMORY_RECALL", i[i.KP_MEMORY_STORE = 102] = "KP_MEMORY_STORE", i[i.KP_MEMORY_SUBTRACT = 103] = "KP_MEMORY_SUBTRACT", i[i.KP_MULTIPLY = 104] = "KP_MULTIPLY", i[i.KP_PAREN_LEFT = 105] = "KP_PAREN_LEFT", i[i.KP_PAREN_RIGHT = 106] = "KP_PAREN_RIGHT", i[i.KP_MINUS = 107] = "KP_MINUS", i[i.KP_SEPARATOR = 108] = "KP_SEPARATOR", i[i.NUMPAD_UP = 109] = "NUMPAD_UP", i[i.NUMPAD_DOWN = 110] = "NUMPAD_DOWN", i[i.NUMPAD_RIGHT = 111] = "NUMPAD_RIGHT", i[i.NUMPAD_LEFT = 112] = "NUMPAD_LEFT", i[i.NUMPAD_BEGIN = 113] = "NUMPAD_BEGIN", i[i.NUMPAD_HOME = 114] = "NUMPAD_HOME", i[i.NUMPAD_END = 115] = "NUMPAD_END", i[i.NUMPAD_INSERT = 116] = "NUMPAD_INSERT", i[i.NUMPAD_DELETE = 117] = "NUMPAD_DELETE", i[i.NUMPAD_PAGE_UP = 118] = "NUMPAD_PAGE_UP", i[i.NUMPAD_PAGE_DOWN = 119] = "NUMPAD_PAGE_DOWN", i[i.ESCAPE = 120] = "ESCAPE", i[i.F1 = 121] = "F1", i[i.F2 = 122] = "F2", i[i.F3 = 123] = "F3", i[i.F4 = 124] = "F4", i[i.F5 = 125] = "F5", i[i.F6 = 126] = "F6", i[i.F7 = 127] = "F7", i[i.F8 = 128] = "F8", i[i.F9 = 129] = "F9", i[i.F10 = 130] = "F10", i[i.F11 = 131] = "F11", i[i.F12 = 132] = "F12", i[i.F13 = 133] = "F13", i[i.F14 = 134] = "F14", i[i.F15 = 135] = "F15", i[i.F16 = 136] = "F16", i[i.F17 = 137] = "F17", i[i.F18 = 138] = "F18", i[i.F19 = 139] = "F19", i[i.F20 = 140] = "F20", i[i.F21 = 141] = "F21", i[i.F22 = 142] = "F22", i[i.F23 = 143] = "F23", i[i.F24 = 144] = "F24", i[i.F25 = 145] = "F25", i[i.FN_LOCK = 146] = "FN_LOCK", i[i.PRINT_SCREEN = 147] = "PRINT_SCREEN", i[i.SCROLL_LOCK = 148] = "SCROLL_LOCK", i[i.PAUSE = 149] = "PAUSE", i[i.BROWSER_BACK = 150] = "BROWSER_BACK", i[i.BROWSER_FAVORITES = 151] = "BROWSER_FAVORITES", i[i.BROWSER_FORWARD = 152] = "BROWSER_FORWARD", i[i.BROWSER_HOME = 153] = "BROWSER_HOME", i[i.BROWSER_REFRESH = 154] = "BROWSER_REFRESH", i[i.BROWSER_SEARCH = 155] = "BROWSER_SEARCH", i[i.BROWSER_STOP = 156] = "BROWSER_STOP", i[i.EJECT = 157] = "EJECT", i[i.LAUNCH_APP_1 = 158] = "LAUNCH_APP_1", i[i.LAUNCH_APP_2 = 159] = "LAUNCH_APP_2", i[i.LAUNCH_MAIL = 160] = "LAUNCH_MAIL", i[i.MEDIA_PLAY_PAUSE = 161] = "MEDIA_PLAY_PAUSE", i[i.MEDIA_SELECT = 162] = "MEDIA_SELECT", i[i.MEDIA_STOP = 163] = "MEDIA_STOP", i[i.MEDIA_TRACK_NEXT = 164] = "MEDIA_TRACK_NEXT", i[i.MEDIA_TRACK_PREVIOUS = 165] = "MEDIA_TRACK_PREVIOUS", i[i.POWER = 166] = "POWER", i[i.SLEEP = 167] = "SLEEP", i[i.AUDIO_VOLUME_DOWN = 168] = "AUDIO_VOLUME_DOWN", i[i.AUDIO_VOLUME_MUTE = 169] = "AUDIO_VOLUME_MUTE", i[i.AUDIO_VOLUME_UP = 170] = "AUDIO_VOLUME_UP", i[i.WAKE_UP = 171] = "WAKE_UP", i[i.COPY = 172] = "COPY", i[i.CUT = 173] = "CUT", i[i.PASTE = 174] = "PASTE", i))(h || {}), C = /* @__PURE__ */ ((i) => (i[i.NONE = 0] = "NONE", i[i.SHIFT = 1] = "SHIFT", i[i.CTRL = 2] = "CTRL", i[i.ALT = 4] = "ALT", i[i.SUPER = 8] = "SUPER", i[i.CAPSLOCK = 16] = "CAPSLOCK", i[i.NUMLOCK = 32] = "NUMLOCK", i))(C || {}), I = /* @__PURE__ */ ((i) => (i[i.NONE = 0] = "NONE", i[i.PARTIAL = 1] = "PARTIAL", i[i.FULL = 2] = "FULL", i))(I || {}); +const Y = 80; +var E = /* @__PURE__ */ ((i) => (i[i.BOLD = 1] = "BOLD", i[i.ITALIC = 2] = "ITALIC", i[i.UNDERLINE = 4] = "UNDERLINE", i[i.STRIKETHROUGH = 8] = "STRIKETHROUGH", i[i.INVERSE = 16] = "INVERSE", i[i.INVISIBLE = 32] = "INVISIBLE", i[i.BLINK = 64] = "BLINK", i[i.FAINT = 128] = "FAINT", i))(E || {}); +class k { + constructor(t) { + this.exports = t.exports, this.memory = this.exports.memory; + } + createKeyEncoder() { + return new q(this.exports); + } + createTerminal(t = 80, e = 24, s) { + return new Z(this.exports, this.memory, t, e, s); + } + static async load(t) { + if (t) + return k.loadFromPath(t); + const e = new URL("../ghostty-vt.wasm", self.location), s = []; + if (e.protocol === "file:") { + let o = e.pathname; + o.match(/^\/[A-Za-z]:\//) && (o = o.slice(1)), s.push(o); + } + s.push(e.href, "./ghostty-vt.wasm", "/ghostty-vt.wasm"); + let r = null; + for (const o of s) + try { + return await k.loadFromPath(o); + } catch (n) { + r = n instanceof Error ? n : new Error(String(n)); + } + throw r || new Error("Failed to load Ghostty WASM"); + } + static async loadFromPath(t) { + let e; + if (typeof Bun < "u" && typeof Bun.file == "function") + try { + const o = Bun.file(t); + await o.exists() && (e = await o.arrayBuffer()); + } catch { + } + if (!e) + try { + const n = await (await import("./__vite-browser-external-2447137e.js")).readFile(t); + e = n.buffer.slice(n.byteOffset, n.byteOffset + n.byteLength); + } catch { + } + if (!e) { + const o = await fetch(t); + if (!o.ok) + throw new Error(`Failed to fetch WASM: ${o.status} ${o.statusText}`); + if (e = await o.arrayBuffer(), e.byteLength === 0) + throw new Error(`WASM file is empty (0 bytes). Check path: ${t}`); + } + if (!e) + throw new Error(`Could not load WASM from path: ${t}`); + const s = await WebAssembly.compile(e), r = await WebAssembly.instantiate(s, { + env: { + log: (o, n) => { + const a = new Uint8Array( + r.exports.memory.buffer, + o, + n + ); + console.log("[ghostty-vt]", new TextDecoder().decode(a)); + } + } + }); + return new k(r); + } +} +class q { + constructor(t) { + this.encoder = 0, this.exports = t; + const e = this.exports.ghostty_wasm_alloc_opaque(), s = this.exports.ghostty_key_encoder_new(0, e); + if (s !== 0) + throw new Error(`Failed to create key encoder: ${s}`); + const r = new DataView(this.exports.memory.buffer); + this.encoder = r.getUint32(e, !0), this.exports.ghostty_wasm_free_opaque(e); + } + setOption(t, e) { + const s = this.exports.ghostty_wasm_alloc_u8(); + new DataView(this.exports.memory.buffer).setUint8(s, typeof e == "boolean" ? e ? 1 : 0 : e), this.exports.ghostty_key_encoder_setopt(this.encoder, t, s), this.exports.ghostty_wasm_free_u8(s); + } + setKittyFlags(t) { + this.setOption(N.KITTY_KEYBOARD_FLAGS, t); + } + encode(t) { + const e = this.exports.ghostty_wasm_alloc_opaque(), s = this.exports.ghostty_key_event_new(0, e); + if (s !== 0) + throw new Error(`Failed to create key event: ${s}`); + const r = new DataView(this.exports.memory.buffer), o = r.getUint32(e, !0); + if (this.exports.ghostty_wasm_free_opaque(e), this.exports.ghostty_key_event_set_action(o, t.action), this.exports.ghostty_key_event_set_key(o, t.key), this.exports.ghostty_key_event_set_mods(o, t.mods), t.utf8) { + const w = new TextEncoder().encode(t.utf8), d = this.exports.ghostty_wasm_alloc_u8_array(w.length); + new Uint8Array(this.exports.memory.buffer).set(w, d), this.exports.ghostty_key_event_set_utf8(o, d, w.length), this.exports.ghostty_wasm_free_u8_array(d, w.length); + } + const n = 32, a = this.exports.ghostty_wasm_alloc_u8_array(n), l = this.exports.ghostty_wasm_alloc_usize(), c = this.exports.ghostty_key_encoder_encode( + this.encoder, + o, + a, + n, + l + ); + if (c !== 0) + throw this.exports.ghostty_wasm_free_u8_array(a, n), this.exports.ghostty_wasm_free_usize(l), this.exports.ghostty_key_event_free(o), new Error(`Failed to encode key: ${c}`); + const u = r.getUint32(l, !0), m = new Uint8Array(this.exports.memory.buffer, a, u).slice(); + return this.exports.ghostty_wasm_free_u8_array(a, n), this.exports.ghostty_wasm_free_usize(l), this.exports.ghostty_key_event_free(o), m; + } + dispose() { + this.encoder && (this.exports.ghostty_key_encoder_free(this.encoder), this.encoder = 0); + } +} +const z = class L { + constructor(t, e, s = 80, r = 24, o) { + var n; + if (this.viewportBufferPtr = 0, this.viewportBufferSize = 0, this.cellPool = [], this.graphemeBuffer = null, this.graphemeBufferPtr = 0, this.exports = t, this.memory = e, this._cols = s, this._rows = r, o) { + const a = this.exports.ghostty_wasm_alloc_u8_array(Y); + if (a === 0) + throw new Error("Failed to allocate config (out of memory)"); + try { + const l = new DataView(this.memory.buffer); + let c = a; + l.setUint32(c, o.scrollbackLimit ?? 1e4, !0), c += 4, l.setUint32(c, o.fgColor ?? 0, !0), c += 4, l.setUint32(c, o.bgColor ?? 0, !0), c += 4, l.setUint32(c, o.cursorColor ?? 0, !0), c += 4; + for (let u = 0; u < 16; u++) + l.setUint32(c, ((n = o.palette) == null ? void 0 : n[u]) ?? 0, !0), c += 4; + this.handle = this.exports.ghostty_terminal_new_with_config(s, r, a); + } finally { + this.exports.ghostty_wasm_free_u8_array(a, Y); + } + } else + this.handle = this.exports.ghostty_terminal_new(s, r); + if (!this.handle) + throw new Error("Failed to create terminal"); + this.initCellPool(); + } + get cols() { + return this._cols; + } + get rows() { + return this._rows; + } + // ========================================================================== + // Lifecycle + // ========================================================================== + write(t) { + const e = typeof t == "string" ? new TextEncoder().encode(t) : t, s = this.exports.ghostty_wasm_alloc_u8_array(e.length); + new Uint8Array(this.memory.buffer).set(e, s), this.exports.ghostty_terminal_write(this.handle, s, e.length), this.exports.ghostty_wasm_free_u8_array(s, e.length); + } + resize(t, e) { + t === this._cols && e === this._rows || (this._cols = t, this._rows = e, this.exports.ghostty_terminal_resize(this.handle, t, e), this.invalidateBuffers(), this.initCellPool()); + } + free() { + this.viewportBufferPtr && (this.exports.ghostty_wasm_free_u8_array(this.viewportBufferPtr, this.viewportBufferSize), this.viewportBufferPtr = 0), this.exports.ghostty_terminal_free(this.handle); + } + // ========================================================================== + // RenderState API - The key performance optimization + // ========================================================================== + /** + * Update render state from terminal. + * + * This syncs the RenderState with the current Terminal state. + * The dirty state (full/partial/none) is stored in the WASM RenderState + * and can be queried via isRowDirty(). When dirty==full, isRowDirty() + * returns true for ALL rows. + * + * The WASM layer automatically detects screen switches (normal <-> alternate) + * and returns FULL dirty state when switching screens (e.g., vim exit). + * + * Safe to call multiple times - dirty state persists until markClean(). + */ + update() { + return this.exports.ghostty_render_state_update(this.handle); + } + /** + * Get cursor state from render state. + * Ensures render state is fresh by calling update(). + */ + getCursor() { + return this.update(), { + x: this.exports.ghostty_render_state_get_cursor_x(this.handle), + y: this.exports.ghostty_render_state_get_cursor_y(this.handle), + viewportX: this.exports.ghostty_render_state_get_cursor_x(this.handle), + viewportY: this.exports.ghostty_render_state_get_cursor_y(this.handle), + visible: this.exports.ghostty_render_state_get_cursor_visible(this.handle), + blinking: !1, + // TODO: Add blinking support + style: "block" + // TODO: Add style support + }; + } + /** + * Get default colors from render state + */ + getColors() { + const t = this.exports.ghostty_render_state_get_bg_color(this.handle), e = this.exports.ghostty_render_state_get_fg_color(this.handle); + return { + background: { + r: t >> 16 & 255, + g: t >> 8 & 255, + b: t & 255 + }, + foreground: { + r: e >> 16 & 255, + g: e >> 8 & 255, + b: e & 255 + }, + cursor: null + // TODO: Add cursor color support + }; + } + /** + * Check if a specific row is dirty + */ + isRowDirty(t) { + return this.exports.ghostty_render_state_is_row_dirty(this.handle, t); + } + /** + * Mark render state as clean (call after rendering) + */ + markClean() { + this.exports.ghostty_render_state_mark_clean(this.handle); + } + /** + * Get ALL viewport cells in ONE WASM call - the key performance optimization! + * Returns a reusable cell array (zero allocation after warmup). + */ + getViewport() { + const t = this._cols * this._rows, e = t * L.CELL_SIZE; + return (!this.viewportBufferPtr || this.viewportBufferSize < e) && (this.viewportBufferPtr && this.exports.ghostty_wasm_free_u8_array(this.viewportBufferPtr, this.viewportBufferSize), this.viewportBufferPtr = this.exports.ghostty_wasm_alloc_u8_array(e), this.viewportBufferSize = e), this.exports.ghostty_render_state_get_viewport( + this.handle, + this.viewportBufferPtr, + t + ) < 0 ? this.cellPool : (this.parseCellsIntoPool(this.viewportBufferPtr, t), this.cellPool); + } + // ========================================================================== + // Compatibility methods (delegate to render state) + // ========================================================================== + /** + * Get line - for compatibility, extracts from viewport. + * Ensures render state is fresh by calling update(). + * Returns a COPY of the cells to avoid pool reference issues. + */ + getLine(t) { + if (t < 0 || t >= this._rows) + return null; + this.update(); + const e = this.getViewport(), s = t * this._cols; + return e.slice(s, s + this._cols).map((r) => ({ ...r })); + } + /** For compatibility with old API */ + isDirty() { + return this.update() !== I.NONE; + } + /** + * Check if a full redraw is needed (screen change, resize, etc.) + * Note: This calls update() to ensure fresh state. Safe to call multiple times. + */ + needsFullRedraw() { + return this.update() === I.FULL; + } + /** Mark render state as clean after rendering */ + clearDirty() { + this.markClean(); + } + // ========================================================================== + // Terminal modes + // ========================================================================== + isAlternateScreen() { + return !!this.exports.ghostty_terminal_is_alternate_screen(this.handle); + } + hasBracketedPaste() { + return this.getMode(2004, !1); + } + hasFocusEvents() { + return this.getMode(1004, !1); + } + hasMouseTracking() { + return this.exports.ghostty_terminal_has_mouse_tracking(this.handle) !== 0; + } + // ========================================================================== + // Extended API (scrollback, modes, etc.) + // ========================================================================== + /** Get dimensions - for compatibility */ + getDimensions() { + return { cols: this._cols, rows: this._rows }; + } + /** Get number of scrollback lines (history, not including active screen) */ + getScrollbackLength() { + return this.exports.ghostty_terminal_get_scrollback_length(this.handle); + } + /** + * Get a line from the scrollback buffer. + * Ensures render state is fresh by calling update(). + * @param offset 0 = oldest line, (length-1) = most recent scrollback line + */ + getScrollbackLine(t) { + const e = this._cols * L.CELL_SIZE; + (!this.viewportBufferPtr || this.viewportBufferSize < e) && (this.viewportBufferPtr && this.exports.ghostty_wasm_free_u8_array(this.viewportBufferPtr, this.viewportBufferSize), this.viewportBufferPtr = this.exports.ghostty_wasm_alloc_u8_array(e), this.viewportBufferSize = e), this.update(); + const s = this.exports.ghostty_terminal_get_scrollback_line( + this.handle, + t, + this.viewportBufferPtr, + this._cols + ); + if (s < 0) + return null; + const r = [], o = this.memory.buffer, n = new Uint8Array(o, this.viewportBufferPtr, s * L.CELL_SIZE), a = new DataView(o, this.viewportBufferPtr, s * L.CELL_SIZE); + for (let l = 0; l < s; l++) { + const c = l * L.CELL_SIZE; + r.push({ + codepoint: a.getUint32(c, !0), + fg_r: n[c + 4], + fg_g: n[c + 5], + fg_b: n[c + 6], + bg_r: n[c + 7], + bg_g: n[c + 8], + bg_b: n[c + 9], + flags: n[c + 10], + width: n[c + 11], + hyperlink_id: a.getUint16(c + 12, !0), + grapheme_len: n[c + 14] + }); + } + return r; + } + /** Check if a row in the active screen is wrapped (soft-wrapped to next line) */ + isRowWrapped(t) { + return this.exports.ghostty_terminal_is_row_wrapped(this.handle, t) !== 0; + } + /** + * Get the hyperlink URI for a cell at the given position. + * @param row Row index (0-based, in active viewport) + * @param col Column index (0-based) + * @returns The URI string, or null if no hyperlink at that position + */ + getHyperlinkUri(t, e) { + if (!this.exports.ghostty_terminal_get_hyperlink_uri) + return null; + const s = [2048, 8192, 32768]; + for (const r of s) { + const o = this.exports.ghostty_wasm_alloc_u8_array(r); + try { + const n = this.exports.ghostty_terminal_get_hyperlink_uri( + this.handle, + t, + e, + o, + r + ); + if (n === 0) + return null; + if (n === -1) + continue; + if (n < 0) + return null; + const a = new Uint8Array(this.memory.buffer, o, n); + return new TextDecoder().decode(a.slice()); + } finally { + this.exports.ghostty_wasm_free_u8_array(o, r); + } + } + return null; + } + /** + * Get the hyperlink URI for a cell in the scrollback buffer. + * @param offset Scrollback line offset (0 = oldest, scrollback_len-1 = newest) + * @param col Column index (0-based) + * @returns The URI string, or null if no hyperlink at that position + */ + getScrollbackHyperlinkUri(t, e) { + if (!this.exports.ghostty_terminal_get_scrollback_hyperlink_uri) + return null; + const s = [2048, 8192, 32768]; + for (const r of s) { + const o = this.exports.ghostty_wasm_alloc_u8_array(r); + try { + const n = this.exports.ghostty_terminal_get_scrollback_hyperlink_uri( + this.handle, + t, + e, + o, + r + ); + if (n === 0) + return null; + if (n === -1) + continue; + if (n < 0) + return null; + const a = new Uint8Array(this.memory.buffer, o, n); + return new TextDecoder().decode(a.slice()); + } finally { + this.exports.ghostty_wasm_free_u8_array(o, r); + } + } + return null; + } + /** + * Check if there are pending responses from the terminal. + * Responses are generated by escape sequences like DSR (Device Status Report). + */ + hasResponse() { + return this.exports.ghostty_terminal_has_response(this.handle); + } + /** + * Read pending responses from the terminal. + * Returns the response string, or null if no responses pending. + * + * Responses are generated by escape sequences that require replies: + * - DSR 6 (cursor position): Returns \x1b[row;colR + * - DSR 5 (operating status): Returns \x1b[0n + */ + readResponse() { + if (!this.hasResponse()) + return null; + const t = 256, e = this.exports.ghostty_wasm_alloc_u8_array(t); + try { + const s = this.exports.ghostty_terminal_read_response(this.handle, e, t); + if (s <= 0) + return null; + const r = new Uint8Array(this.memory.buffer, e, s); + return new TextDecoder().decode(r.slice()); + } finally { + this.exports.ghostty_wasm_free_u8_array(e, t); + } + } + /** + * Query arbitrary terminal mode by number + * @param mode Mode number (e.g., 25 for cursor visibility, 2004 for bracketed paste) + * @param isAnsi True for ANSI modes, false for DEC modes (default: false) + */ + getMode(t, e = !1) { + return this.exports.ghostty_terminal_get_mode(this.handle, t, e) !== 0; + } + // ========================================================================== + // Private helpers + // ========================================================================== + initCellPool() { + const t = this._cols * this._rows; + if (this.cellPool.length < t) + for (let e = this.cellPool.length; e < t; e++) + this.cellPool.push({ + codepoint: 0, + fg_r: 204, + fg_g: 204, + fg_b: 204, + bg_r: 0, + bg_g: 0, + bg_b: 0, + flags: 0, + width: 1, + hyperlink_id: 0, + grapheme_len: 0 + }); + } + parseCellsIntoPool(t, e) { + const s = this.memory.buffer, r = new Uint8Array(s, t, e * L.CELL_SIZE), o = new DataView(s, t, e * L.CELL_SIZE); + for (let n = 0; n < e; n++) { + const a = n * L.CELL_SIZE, l = this.cellPool[n]; + l.codepoint = o.getUint32(a, !0), l.fg_r = r[a + 4], l.fg_g = r[a + 5], l.fg_b = r[a + 6], l.bg_r = r[a + 7], l.bg_g = r[a + 8], l.bg_b = r[a + 9], l.flags = r[a + 10], l.width = r[a + 11], l.hyperlink_id = o.getUint16(a + 12, !0), l.grapheme_len = r[a + 14]; + } + } + /** + * Get all codepoints for a grapheme cluster at the given position. + * For most cells this returns a single codepoint, but for complex scripts + * (Hindi, emoji with ZWJ, etc.) it returns multiple codepoints. + * @returns Array of codepoints, or null on error + */ + getGrapheme(t, e) { + this.graphemeBuffer || (this.graphemeBufferPtr = this.exports.ghostty_wasm_alloc_u8_array(16 * 4), this.graphemeBuffer = new Uint32Array(this.memory.buffer, this.graphemeBufferPtr, 16)); + const s = this.exports.ghostty_render_state_get_grapheme( + this.handle, + t, + e, + this.graphemeBufferPtr, + 16 + ); + if (s < 0) + return null; + const r = new Uint32Array(this.memory.buffer, this.graphemeBufferPtr, s); + return Array.from(r); + } + /** + * Get a string representation of the grapheme at the given position. + * This properly handles complex scripts like Hindi, emoji with ZWJ, etc. + */ + getGraphemeString(t, e) { + const s = this.getGrapheme(t, e); + return !s || s.length === 0 ? " " : String.fromCodePoint(...s); + } + /** + * Get all codepoints for a grapheme cluster in the scrollback buffer. + * @param offset Scrollback line offset (0 = oldest) + * @param col Column index + * @returns Array of codepoints, or null on error + */ + getScrollbackGrapheme(t, e) { + this.graphemeBuffer || (this.graphemeBufferPtr = this.exports.ghostty_wasm_alloc_u8_array(16 * 4), this.graphemeBuffer = new Uint32Array(this.memory.buffer, this.graphemeBufferPtr, 16)); + const s = this.exports.ghostty_terminal_get_scrollback_grapheme( + this.handle, + t, + e, + this.graphemeBufferPtr, + 16 + ); + if (s < 0) + return null; + const r = new Uint32Array(this.memory.buffer, this.graphemeBufferPtr, s); + return Array.from(r); + } + /** + * Get a string representation of a grapheme in the scrollback buffer. + */ + getScrollbackGraphemeString(t, e) { + const s = this.getScrollbackGrapheme(t, e); + return !s || s.length === 0 ? " " : String.fromCodePoint(...s); + } + invalidateBuffers() { + this.viewportBufferPtr && (this.exports.ghostty_wasm_free_u8_array(this.viewportBufferPtr, this.viewportBufferSize), this.viewportBufferPtr = 0, this.viewportBufferSize = 0), this.graphemeBufferPtr && (this.exports.ghostty_wasm_free_u8_array(this.graphemeBufferPtr, 16 * 4), this.graphemeBufferPtr = 0), this.graphemeBuffer = null; + } +}; +z.CELL_SIZE = 16; +let Z = z; +class T { + constructor() { + this.listeners = [], this.event = (t) => (this.listeners.push(t), { + dispose: () => { + const e = this.listeners.indexOf(t); + e >= 0 && this.listeners.splice(e, 1); + } + }); + } + fire(t) { + for (const e of this.listeners) + e(t); + } + dispose() { + this.listeners = []; + } +} +class Q { + constructor(t) { + this.bufferChangeEmitter = new T(), this.terminal = t; + } + get active() { + const t = this.terminal.wasmTerm; + return t ? t.isAlternateScreen() ? this.alternate : this.normal : this.normal; + } + get normal() { + return this._normalBuffer || (this._normalBuffer = new W(this.terminal, "normal")), this._normalBuffer; + } + get alternate() { + return this._alternateBuffer || (this._alternateBuffer = new W(this.terminal, "alternate")), this._alternateBuffer; + } + get onBufferChange() { + return this.bufferChangeEmitter.event; + } + /** + * Internal: Fire buffer change event when screen switches + * Should be called by Terminal when detecting screen change + */ + _fireBufferChange(t) { + this.bufferChangeEmitter.fire(t); + } +} +class W { + constructor(t, e) { + this.terminal = t, this.bufferType = e; + const s = { + codepoint: 0, + fg_r: 204, + fg_g: 204, + fg_b: 204, + bg_r: 0, + bg_g: 0, + bg_b: 0, + flags: 0, + width: 1, + hyperlink_id: 0, + grapheme_len: 0 + }; + this.nullCell = new B(s, 0); + } + get type() { + return this.bufferType; + } + get cursorX() { + const t = this.getWasmTerm(); + return t ? t.getCursor().x : 0; + } + get cursorY() { + const t = this.getWasmTerm(); + return t ? t.getCursor().y : 0; + } + get viewportY() { + return 0; + } + get baseY() { + return 0; + } + get length() { + const t = this.getWasmTerm(); + return t ? this.bufferType === "alternate" ? t.rows : t.getScrollbackLength() + t.rows : 0; + } + getLine(t) { + const e = this.getWasmTerm(); + if (!e || t < 0 || t >= this.length) + return; + const s = e.getScrollbackLength(); + let r, o, n; + if (this.bufferType === "normal" && t < s) { + const a = t; + r = e.getScrollbackLine(a), n = !1; + } else + o = this.bufferType === "normal" ? t - s : t, r = e.getLine(o), n = e.isRowWrapped(o); + if (r) + return new J(r, n, e.cols); + } + getNullCell() { + return this.nullCell; + } + getWasmTerm() { + return this.terminal.wasmTerm; + } +} +class J { + constructor(t, e, s) { + this.cells = t, this._isWrapped = e, this._length = s; + } + get length() { + return this._length; + } + get isWrapped() { + return this._isWrapped; + } + getCell(t) { + if (!(t < 0 || t >= this._length)) + return t >= this.cells.length ? new B( + { + codepoint: 0, + fg_r: 204, + fg_g: 204, + fg_b: 204, + bg_r: 0, + bg_g: 0, + bg_b: 0, + flags: 0, + width: 1, + hyperlink_id: 0, + grapheme_len: 0 + }, + t + ) : new B(this.cells[t], t); + } + translateToString(t = !1, e = 0, s = this._length) { + const r = Math.max(0, Math.min(e, this._length)), o = Math.max(r, Math.min(s, this._length)); + let n = ""; + for (let a = r; a < o; a++) { + const l = this.getCell(a); + if (l) { + const c = l.getChars(); + n += c; + } + } + return t && (n = n.trimEnd()), n; + } +} +class B { + constructor(t, e) { + this.cell = t, this.x = e; + } + getChars() { + const t = this.cell.codepoint; + return t === 0 ? "" : t < 0 || t > 1114111 || t >= 55296 && t <= 57343 ? "�" : String.fromCodePoint(t); + } + getCode() { + return this.cell.codepoint; + } + getWidth() { + return this.cell.width; + } + getFgColorMode() { + return -1; + } + getBgColorMode() { + return -1; + } + getFgColor() { + return this.cell.fg_r << 16 | this.cell.fg_g << 8 | this.cell.fg_b; + } + getBgColor() { + return this.cell.bg_r << 16 | this.cell.bg_g << 8 | this.cell.bg_b; + } + isBold() { + return this.cell.flags & E.BOLD ? 1 : 0; + } + isItalic() { + return this.cell.flags & E.ITALIC ? 1 : 0; + } + isUnderline() { + return this.cell.flags & E.UNDERLINE ? 1 : 0; + } + isStrikethrough() { + return this.cell.flags & E.STRIKETHROUGH ? 1 : 0; + } + isBlink() { + return this.cell.flags & E.BLINK ? 1 : 0; + } + isInverse() { + return this.cell.flags & E.INVERSE ? 1 : 0; + } + isInvisible() { + return this.cell.flags & E.INVISIBLE ? 1 : 0; + } + isFaint() { + return this.cell.flags & E.FAINT ? 1 : 0; + } + /** + * Get hyperlink ID for this cell (0 = no link) + * Used by link detection system + */ + getHyperlinkId() { + return this.cell.hyperlink_id; + } + /** + * Get the Unicode codepoint for this cell + * Used by link detection system + */ + getCodepoint() { + return this.cell.codepoint; + } + /** + * Check if cell has dim/faint attribute + * Added for IBufferCell compatibility + */ + isDim() { + return (this.cell.flags & E.FAINT) !== 0; + } +} +const j = { + // Letters + KeyA: h.A, + KeyB: h.B, + KeyC: h.C, + KeyD: h.D, + KeyE: h.E, + KeyF: h.F, + KeyG: h.G, + KeyH: h.H, + KeyI: h.I, + KeyJ: h.J, + KeyK: h.K, + KeyL: h.L, + KeyM: h.M, + KeyN: h.N, + KeyO: h.O, + KeyP: h.P, + KeyQ: h.Q, + KeyR: h.R, + KeyS: h.S, + KeyT: h.T, + KeyU: h.U, + KeyV: h.V, + KeyW: h.W, + KeyX: h.X, + KeyY: h.Y, + KeyZ: h.Z, + // Numbers + Digit1: h.ONE, + Digit2: h.TWO, + Digit3: h.THREE, + Digit4: h.FOUR, + Digit5: h.FIVE, + Digit6: h.SIX, + Digit7: h.SEVEN, + Digit8: h.EIGHT, + Digit9: h.NINE, + Digit0: h.ZERO, + // Special keys + Enter: h.ENTER, + Escape: h.ESCAPE, + Backspace: h.BACKSPACE, + Tab: h.TAB, + Space: h.SPACE, + // Punctuation + Minus: h.MINUS, + Equal: h.EQUAL, + BracketLeft: h.BRACKET_LEFT, + BracketRight: h.BRACKET_RIGHT, + Backslash: h.BACKSLASH, + Semicolon: h.SEMICOLON, + Quote: h.QUOTE, + Backquote: h.GRAVE, + Comma: h.COMMA, + Period: h.PERIOD, + Slash: h.SLASH, + // Function keys + CapsLock: h.CAPS_LOCK, + F1: h.F1, + F2: h.F2, + F3: h.F3, + F4: h.F4, + F5: h.F5, + F6: h.F6, + F7: h.F7, + F8: h.F8, + F9: h.F9, + F10: h.F10, + F11: h.F11, + F12: h.F12, + // Special function keys + PrintScreen: h.PRINT_SCREEN, + ScrollLock: h.SCROLL_LOCK, + Pause: h.PAUSE, + Insert: h.INSERT, + Home: h.HOME, + PageUp: h.PAGE_UP, + Delete: h.DELETE, + End: h.END, + PageDown: h.PAGE_DOWN, + // Arrow keys + ArrowRight: h.RIGHT, + ArrowLeft: h.LEFT, + ArrowDown: h.DOWN, + ArrowUp: h.UP, + // Keypad + NumLock: h.NUM_LOCK, + NumpadDivide: h.KP_DIVIDE, + NumpadMultiply: h.KP_MULTIPLY, + NumpadSubtract: h.KP_MINUS, + NumpadAdd: h.KP_PLUS, + NumpadEnter: h.KP_ENTER, + Numpad1: h.KP_1, + Numpad2: h.KP_2, + Numpad3: h.KP_3, + Numpad4: h.KP_4, + Numpad5: h.KP_5, + Numpad6: h.KP_6, + Numpad7: h.KP_7, + Numpad8: h.KP_8, + Numpad9: h.KP_9, + Numpad0: h.KP_0, + NumpadDecimal: h.KP_PERIOD, + // International + IntlBackslash: h.INTL_BACKSLASH, + ContextMenu: h.CONTEXT_MENU, + // Additional function keys + F13: h.F13, + F14: h.F14, + F15: h.F15, + F16: h.F16, + F17: h.F17, + F18: h.F18, + F19: h.F19, + F20: h.F20, + F21: h.F21, + F22: h.F22, + F23: h.F23, + F24: h.F24 +}, X = class x { + /** + * Create a new InputHandler + * @param ghostty - Ghostty instance (for creating KeyEncoder) + * @param container - DOM element to attach listeners to + * @param onData - Callback for terminal data (escape sequences to send to PTY) + * @param onBell - Callback for bell/beep event + * @param onKey - Optional callback for raw key events + * @param customKeyEventHandler - Optional custom key event handler + * @param getMode - Optional callback to query terminal mode state (for application cursor mode) + * @param onCopy - Optional callback to handle copy (Cmd+C/Ctrl+C with selection) + * @param inputElement - Optional input element for beforeinput events + * @param mouseConfig - Optional mouse tracking configuration + */ + constructor(t, e, s, r, o, n, a, l, c, u) { + this.keydownListener = null, this.keypressListener = null, this.pasteListener = null, this.beforeInputListener = null, this.compositionStartListener = null, this.compositionUpdateListener = null, this.compositionEndListener = null, this.mousedownListener = null, this.mouseupListener = null, this.mousemoveListener = null, this.wheelListener = null, this.isComposing = !1, this.isDisposed = !1, this.mouseButtonsPressed = 0, this.lastKeyDownData = null, this.lastKeyDownTime = 0, this.lastPasteData = null, this.lastPasteTime = 0, this.lastPasteSource = null, this.lastCompositionData = null, this.lastCompositionTime = 0, this.lastBeforeInputData = null, this.lastBeforeInputTime = 0, this.encoder = t.createKeyEncoder(), this.container = e, this.inputElement = c, this.onDataCallback = s, this.onBellCallback = r, this.onKeyCallback = o, this.customKeyEventHandler = n, this.getModeCallback = a, this.onCopyCallback = l, this.mouseConfig = u, this.attach(); + } + /** + * Set custom key event handler (for runtime updates) + */ + setCustomKeyEventHandler(t) { + this.customKeyEventHandler = t; + } + /** + * Attach keyboard event listeners to container + */ + attach() { + typeof this.container.hasAttribute == "function" && typeof this.container.setAttribute == "function" && (this.container.hasAttribute("tabindex") || this.container.setAttribute("tabindex", "0"), this.container.style && (this.container.style.outline = "none")), this.keydownListener = this.handleKeyDown.bind(this), this.container.addEventListener("keydown", this.keydownListener), this.pasteListener = this.handlePaste.bind(this), this.container.addEventListener("paste", this.pasteListener), this.inputElement && this.inputElement !== this.container && this.inputElement.addEventListener("paste", this.pasteListener), this.inputElement && (this.beforeInputListener = this.handleBeforeInput.bind(this), this.inputElement.addEventListener("beforeinput", this.beforeInputListener)), this.compositionStartListener = this.handleCompositionStart.bind(this), this.container.addEventListener("compositionstart", this.compositionStartListener), this.compositionUpdateListener = this.handleCompositionUpdate.bind(this), this.container.addEventListener("compositionupdate", this.compositionUpdateListener), this.compositionEndListener = this.handleCompositionEnd.bind(this), this.container.addEventListener("compositionend", this.compositionEndListener), this.mousedownListener = this.handleMouseDown.bind(this), this.container.addEventListener("mousedown", this.mousedownListener), this.mouseupListener = this.handleMouseUp.bind(this), this.container.addEventListener("mouseup", this.mouseupListener), this.mousemoveListener = this.handleMouseMove.bind(this), this.container.addEventListener("mousemove", this.mousemoveListener), this.wheelListener = this.handleWheel.bind(this), this.container.addEventListener("wheel", this.wheelListener, { passive: !1 }); + } + /** + * Map KeyboardEvent.code to USB HID Key enum value + * @param code - KeyboardEvent.code value + * @returns Key enum value or null if unmapped + */ + mapKeyCode(t) { + return j[t] ?? null; + } + /** + * Extract modifier flags from KeyboardEvent + * @param event - KeyboardEvent + * @returns Mods flags + */ + extractModifiers(t) { + let e = C.NONE; + return t.shiftKey && (e |= C.SHIFT), t.ctrlKey && (e |= C.CTRL), t.altKey && (e |= C.ALT), t.metaKey && (e |= C.SUPER), e; + } + /** + * Check if this is a printable character with no special modifiers + * @param event - KeyboardEvent + * @returns true if printable character + */ + isPrintableCharacter(t) { + return t.ctrlKey && !t.altKey || t.altKey && !t.ctrlKey || t.metaKey ? !1 : t.key.length === 1; + } + /** + * Handle keydown event + * @param event - KeyboardEvent + */ + handleKeyDown(t) { + if (this.isDisposed || this.isComposing || t.isComposing || t.keyCode === 229) + return; + if (this.onKeyCallback && this.onKeyCallback({ key: t.key, domEvent: t }), this.customKeyEventHandler && this.customKeyEventHandler(t)) { + t.preventDefault(); + return; + } + if ((t.ctrlKey || t.metaKey) && t.code === "KeyV") + return; + if (t.metaKey && t.code === "KeyC") { + this.onCopyCallback && this.onCopyCallback() && t.preventDefault(); + return; + } + if (this.isPrintableCharacter(t)) { + t.preventDefault(), this.onDataCallback(t.key), this.recordKeyDownData(t.key); + return; + } + const e = this.mapKeyCode(t.code); + if (e === null) + return; + const s = this.extractModifiers(t); + if (s === C.NONE || s === C.SHIFT) { + let o = null; + switch (e) { + case h.ENTER: + o = "\r"; + break; + case h.TAB: + s === C.SHIFT ? o = "\x1B[Z" : o = " "; + break; + case h.BACKSPACE: + o = ""; + break; + case h.ESCAPE: + o = "\x1B"; + break; + case h.HOME: + o = "\x1B[H"; + break; + case h.END: + o = "\x1B[F"; + break; + case h.INSERT: + o = "\x1B[2~"; + break; + case h.DELETE: + o = "\x1B[3~"; + break; + case h.PAGE_UP: + o = "\x1B[5~"; + break; + case h.PAGE_DOWN: + o = "\x1B[6~"; + break; + case h.F1: + o = "\x1BOP"; + break; + case h.F2: + o = "\x1BOQ"; + break; + case h.F3: + o = "\x1BOR"; + break; + case h.F4: + o = "\x1BOS"; + break; + case h.F5: + o = "\x1B[15~"; + break; + case h.F6: + o = "\x1B[17~"; + break; + case h.F7: + o = "\x1B[18~"; + break; + case h.F8: + o = "\x1B[19~"; + break; + case h.F9: + o = "\x1B[20~"; + break; + case h.F10: + o = "\x1B[21~"; + break; + case h.F11: + o = "\x1B[23~"; + break; + case h.F12: + o = "\x1B[24~"; + break; + } + if (o !== null) { + t.preventDefault(), this.onDataCallback(o), this.recordKeyDownData(o); + return; + } + } + const r = G.PRESS; + try { + if (this.getModeCallback) { + const c = this.getModeCallback(1); + this.encoder.setOption(N.CURSOR_KEY_APPLICATION, c); + } + const o = t.key.length === 1 && t.key.charCodeAt(0) < 128 ? t.key.toLowerCase() : void 0, n = this.encoder.encode({ + action: r, + key: e, + mods: s, + utf8: o + }), l = new TextDecoder().decode(n); + t.preventDefault(), t.stopPropagation(), l.length > 0 && (this.onDataCallback(l), this.recordKeyDownData(l)); + } catch (o) { + console.warn("Failed to encode key:", t.code, o); + } + } + /** + * Handle paste event from clipboard + * @param event - ClipboardEvent + */ + handlePaste(t) { + if (this.isDisposed) + return; + t.preventDefault(), t.stopPropagation(); + const e = t.clipboardData; + if (!e) { + console.warn("No clipboard data available"); + return; + } + const s = e.getData("text/plain"); + if (!s) { + console.warn("No text in clipboard"); + return; + } + this.shouldIgnorePasteEvent(s, "paste") || (this.emitPasteData(s), this.recordPasteData(s, "paste")); + } + /** + * Handle beforeinput event (mobile/IME input) + * @param event - InputEvent + */ + handleBeforeInput(t) { + if (this.isDisposed || this.isComposing || t.isComposing) + return; + const e = t.inputType, s = t.data ?? ""; + let r = null; + switch (e) { + case "insertText": + case "insertReplacementText": + r = s.length > 0 ? s.replace(/\n/g, "\r") : null; + break; + case "insertLineBreak": + case "insertParagraph": + r = "\r"; + break; + case "deleteContentBackward": + r = ""; + break; + case "deleteContentForward": + r = "\x1B[3~"; + break; + case "insertFromPaste": + if (!s) + return; + if (this.shouldIgnorePasteEvent(s, "beforeinput")) { + t.preventDefault(), t.stopPropagation(); + return; + } + t.preventDefault(), t.stopPropagation(), this.emitPasteData(s), this.recordPasteData(s, "beforeinput"); + return; + default: + return; + } + if (r) { + if (this.shouldIgnoreBeforeInput(r)) { + t.preventDefault(), t.stopPropagation(); + return; + } + if (s && this.shouldIgnoreBeforeInputFromComposition(s)) { + t.preventDefault(), t.stopPropagation(); + return; + } + t.preventDefault(), t.stopPropagation(), this.onDataCallback(r), s && this.recordBeforeInputData(s); + } + } + /** + * Handle compositionstart event + */ + handleCompositionStart(t) { + this.isDisposed || (this.isComposing = !0); + } + /** + * Handle compositionupdate event + */ + handleCompositionUpdate(t) { + this.isDisposed; + } + /** + * Handle compositionend event + */ + handleCompositionEnd(t) { + if (this.isDisposed) + return; + this.isComposing = !1; + const e = t.data; + if (e && e.length > 0) { + if (this.shouldIgnoreCompositionEnd(e)) { + this.cleanupCompositionTextNodes(); + return; + } + this.onDataCallback(e), this.recordCompositionData(e); + } + this.cleanupCompositionTextNodes(); + } + /** + * Cleanup text nodes in container after composition + */ + cleanupCompositionTextNodes() { + if (this.container && this.container.childNodes) + for (let t = this.container.childNodes.length - 1; t >= 0; t--) { + const e = this.container.childNodes[t]; + e.nodeType === 3 && this.container.removeChild(e); + } + } + // ========================================================================== + // Mouse Event Handling (for terminal mouse tracking) + // ========================================================================== + /** + * Convert pixel coordinates to terminal cell coordinates + */ + pixelToCell(t) { + if (!this.mouseConfig) + return null; + const e = this.mouseConfig.getCellDimensions(), s = this.mouseConfig.getCanvasOffset(); + if (e.width <= 0 || e.height <= 0) + return null; + const r = t.clientX - s.left, o = t.clientY - s.top, n = Math.floor(r / e.width) + 1, a = Math.floor(o / e.height) + 1; + return { + col: Math.max(1, n), + row: Math.max(1, a) + }; + } + /** + * Get modifier flags for mouse event + */ + getMouseModifiers(t) { + let e = 0; + return t.shiftKey && (e |= 4), t.metaKey && (e |= 8), t.ctrlKey && (e |= 16), e; + } + /** + * Encode mouse event as SGR sequence + * SGR format: \x1b[ + */ + encodeMouseX10(t, e, s, r) { + const o = t + r + 32, n = String.fromCharCode(Math.min(e + 32, 255)), a = String.fromCharCode(Math.min(s + 32, 255)); + return `\x1B[M${String.fromCharCode(o)}${n}${a}`; + } + /** + * Send mouse event to terminal + */ + sendMouseEvent(t, e, s, r, o) { + var c, u; + const n = this.getMouseModifiers(o), a = ((u = (c = this.mouseConfig) == null ? void 0 : c.hasSgrMouseMode) == null ? void 0 : u.call(c)) ?? !0; + let l; + if (a) + l = this.encodeMouseSGR(t, e, s, r, n); + else { + const m = r ? 3 : t; + l = this.encodeMouseX10(m, e, s, n); + } + this.onDataCallback(l); + } + /** + * Handle mousedown event + */ + handleMouseDown(t) { + var r; + if (this.isDisposed || !((r = this.mouseConfig) != null && r.hasMouseTracking())) + return; + const e = this.pixelToCell(t); + if (!e) + return; + const s = t.button; + this.mouseButtonsPressed |= 1 << s, this.sendMouseEvent(s, e.col, e.row, !1, t); + } + /** + * Handle mouseup event + */ + handleMouseUp(t) { + var r; + if (this.isDisposed || !((r = this.mouseConfig) != null && r.hasMouseTracking())) + return; + const e = this.pixelToCell(t); + if (!e) + return; + const s = t.button; + this.mouseButtonsPressed &= ~(1 << s), this.sendMouseEvent(s, e.col, e.row, !0, t); + } + /** + * Handle mousemove event + */ + handleMouseMove(t) { + var n, a, l; + if (this.isDisposed || !((n = this.mouseConfig) != null && n.hasMouseTracking())) + return; + const e = ((a = this.getModeCallback) == null ? void 0 : a.call(this, 1002)) ?? !1, s = ((l = this.getModeCallback) == null ? void 0 : l.call(this, 1003)) ?? !1; + if (!e && !s || e && !s && this.mouseButtonsPressed === 0) + return; + const r = this.pixelToCell(t); + if (!r) + return; + let o = 32; + this.mouseButtonsPressed & 1 ? o += 0 : this.mouseButtonsPressed & 2 ? o += 1 : this.mouseButtonsPressed & 4 && (o += 2), this.sendMouseEvent(o, r.col, r.row, !1, t); + } + /** + * Handle wheel event (scroll) + */ + handleWheel(t) { + var r; + if (this.isDisposed || !((r = this.mouseConfig) != null && r.hasMouseTracking())) + return; + const e = this.pixelToCell(t); + if (!e) + return; + const s = t.deltaY < 0 ? 64 : 65; + this.sendMouseEvent(s, e.col, e.row, !1, t), t.preventDefault(); + } + /** + * Emit paste data with bracketed paste support + */ + emitPasteData(t) { + var s; + ((s = this.getModeCallback) == null ? void 0 : s.call(this, 2004)) ?? !1 ? this.onDataCallback("\x1B[200~" + t + "\x1B[201~") : this.onDataCallback(t); + } + /** + * Record keydown data for beforeinput de-duplication + */ + recordKeyDownData(t) { + this.lastKeyDownData = t, this.lastKeyDownTime = this.getNow(); + } + /** + * Record paste data for beforeinput de-duplication + */ + recordPasteData(t, e) { + this.lastPasteData = t, this.lastPasteTime = this.getNow(), this.lastPasteSource = e; + } + /** + * Check if beforeinput should be ignored due to a recent keydown + */ + shouldIgnoreBeforeInput(t) { + if (!this.lastKeyDownData) + return !1; + const s = this.getNow() - this.lastKeyDownTime < x.BEFORE_INPUT_IGNORE_MS && this.lastKeyDownData === t; + return this.lastKeyDownData = null, s; + } + /** + * Check if beforeinput text should be ignored due to a recent composition end + */ + shouldIgnoreBeforeInputFromComposition(t) { + if (!this.lastCompositionData) + return !1; + const s = this.getNow() - this.lastCompositionTime < x.BEFORE_INPUT_IGNORE_MS && this.lastCompositionData === t; + return s && (this.lastCompositionData = null), s; + } + /** + * Check if composition end should be ignored due to a recent beforeinput text + */ + shouldIgnoreCompositionEnd(t) { + if (!this.lastBeforeInputData) + return !1; + const s = this.getNow() - this.lastBeforeInputTime < x.BEFORE_INPUT_IGNORE_MS && this.lastBeforeInputData === t; + return s && (this.lastBeforeInputData = null), s; + } + /** + * Record beforeinput text for composition de-duplication + */ + recordBeforeInputData(t) { + this.lastBeforeInputData = t, this.lastBeforeInputTime = this.getNow(); + } + /** + * Record composition end data for beforeinput de-duplication + */ + recordCompositionData(t) { + this.lastCompositionData = t, this.lastCompositionTime = this.getNow(); + } + /** + * Check if paste should be ignored due to a recent paste event from another source + */ + shouldIgnorePasteEvent(t, e) { + if (!this.lastPasteData || this.lastPasteSource === e) + return !1; + const r = this.getNow() - this.lastPasteTime < x.BEFORE_INPUT_IGNORE_MS && this.lastPasteData === t; + return r && (this.lastPasteData = null, this.lastPasteSource = null), r; + } + /** + * Get current time in milliseconds + */ + getNow() { + return typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(); + } + /** + * Dispose the InputHandler and remove event listeners + */ + dispose() { + this.isDisposed || (this.keydownListener && (this.container.removeEventListener("keydown", this.keydownListener), this.keydownListener = null), this.keypressListener && (this.container.removeEventListener("keypress", this.keypressListener), this.keypressListener = null), this.pasteListener && (this.container.removeEventListener("paste", this.pasteListener), this.inputElement && this.inputElement !== this.container && this.inputElement.removeEventListener("paste", this.pasteListener), this.pasteListener = null), this.beforeInputListener && this.inputElement && (this.inputElement.removeEventListener("beforeinput", this.beforeInputListener), this.beforeInputListener = null), this.compositionStartListener && (this.container.removeEventListener("compositionstart", this.compositionStartListener), this.compositionStartListener = null), this.compositionUpdateListener && (this.container.removeEventListener("compositionupdate", this.compositionUpdateListener), this.compositionUpdateListener = null), this.compositionEndListener && (this.container.removeEventListener("compositionend", this.compositionEndListener), this.compositionEndListener = null), this.mousedownListener && (this.container.removeEventListener("mousedown", this.mousedownListener), this.mousedownListener = null), this.mouseupListener && (this.container.removeEventListener("mouseup", this.mouseupListener), this.mouseupListener = null), this.mousemoveListener && (this.container.removeEventListener("mousemove", this.mousemoveListener), this.mousemoveListener = null), this.wheelListener && (this.container.removeEventListener("wheel", this.wheelListener), this.wheelListener = null), this.isDisposed = !0); + } + /** + * Check if handler is disposed + */ + isActive() { + return !this.isDisposed; + } +}; +X.BEFORE_INPUT_IGNORE_MS = 100; +let K = X; +class tt { + // Terminal instance for buffer access + constructor(t) { + this.terminal = t, this.providers = [], this.linkCache = /* @__PURE__ */ new Map(), this.scannedRows = /* @__PURE__ */ new Set(); + } + /** + * Register a link provider + */ + registerProvider(t) { + this.providers.push(t), this.invalidateCache(); + } + /** + * Get link at the specified buffer position + * @param col Column (0-based) + * @param row Absolute row in buffer (0-based) + * @returns Link at position, or undefined if none + */ + async getLinkAt(t, e) { + const s = this.terminal.buffer.active.getLine(e); + if (!(!s || t < 0 || t >= s.length || !s.getCell(t))) { + for (const o of this.linkCache.values()) + if (this.isPositionInLink(t, e, o)) + return o; + this.scannedRows.has(e) || await this.scanRow(e); + for (const o of this.linkCache.values()) + if (this.isPositionInLink(t, e, o)) + return o; + } + } + /** + * Scan a row for links using all registered providers + */ + async scanRow(t) { + this.scannedRows.add(t); + const e = []; + for (const s of this.providers) { + const r = await new Promise((o) => { + s.provideLinks(t, o); + }); + r && e.push(...r); + } + for (const s of e) + this.cacheLink(s); + } + /** + * Cache a link for fast lookup + * + * Note: We cache by position range, not hyperlink_id, because the WASM + * returns hyperlink_id as a boolean (0 or 1), not a unique identifier. + * The actual unique identifier is the URI which is retrieved separately. + */ + cacheLink(t) { + const { start: e, end: s } = t.range, r = `r${e.y}:${e.x}-${s.x}`; + this.linkCache.has(r) || this.linkCache.set(r, t); + } + /** + * Check if a position is within a link's range + */ + isPositionInLink(t, e, s) { + const { start: r, end: o } = s.range; + return e < r.y || e > o.y ? !1 : r.y === o.y ? t >= r.x && t <= o.x : e === r.y ? t >= r.x : e === o.y ? t <= o.x : !0; + } + /** + * Invalidate cache when terminal content changes + * Should be called on terminal write, resize, or clear + */ + invalidateCache() { + this.linkCache.clear(), this.scannedRows.clear(); + } + /** + * Invalidate cache for specific rows + * Used when only part of the terminal changed + */ + invalidateRows(t, e) { + for (let r = t; r <= e; r++) + this.scannedRows.delete(r); + const s = []; + for (const [r, o] of this.linkCache.entries()) { + const { start: n, end: a } = o.range; + (n.y >= t && n.y <= e || a.y >= t && a.y <= e || n.y < t && a.y > e) && s.push(r); + } + for (const r of s) + this.linkCache.delete(r); + } + /** + * Dispose and cleanup + */ + dispose() { + var t; + this.linkCache.clear(), this.scannedRows.clear(); + for (const e of this.providers) + (t = e.dispose) == null || t.call(e); + this.providers = []; + } +} +class et { + constructor(t) { + this.terminal = t; + } + /** + * Provide all OSC 8 links on the given row + * Note: This may return links that span multiple rows + */ + provideLinks(t, e) { + const s = [], r = /* @__PURE__ */ new Set(), o = this.terminal.buffer.active.getLine(t); + if (!o) { + e(void 0); + return; + } + for (let n = 0; n < o.length; n++) { + if (r.has(n)) + continue; + const a = o.getCell(n); + if (!a || a.getHyperlinkId() === 0 || !this.terminal.wasmTerm) + continue; + const c = this.terminal.wasmTerm.getScrollbackLength(), u = t - c; + let m; + if (u < 0 ? m = this.terminal.wasmTerm.getScrollbackHyperlinkUri(t, n) : m = this.terminal.wasmTerm.getHyperlinkUri(u, n), m) { + let g = n; + for (let d = n + 1; d < o.length; d++) { + const p = o.getCell(d); + if (!p || p.getHyperlinkId() === 0 || (u < 0 ? this.terminal.wasmTerm.getScrollbackHyperlinkUri(t, d) : this.terminal.wasmTerm.getHyperlinkUri(u, d)) !== m) + break; + g = d; + } + for (let d = n; d <= g; d++) + r.add(d); + const w = { + start: { x: n, y: t }, + end: { x: g, y: t } + }; + s.push({ + text: m, + range: w, + activate: (d) => { + (d.ctrlKey || d.metaKey) && window.open(m, "_blank", "noopener,noreferrer"); + } + }); + } + } + e(s.length > 0 ? s : void 0); + } + /** + * Find the full extent of a link by scanning for contiguous cells + * with the same hyperlink_id. Handles multi-line links. + */ + findLinkRange(t, e, s) { + const r = this.terminal.buffer.active; + let o = e, n = s; + for (; n > 0; ) { + const u = r.getLine(o); + if (!u) + break; + const m = u.getCell(n - 1); + if (!m || m.getHyperlinkId() !== t) + break; + n--; + } + if (n === 0 && o > 0) { + let u = o - 1; + for (; u >= 0; ) { + const m = r.getLine(u); + if (!m || m.length === 0) + break; + const g = m.getCell(m.length - 1); + if (!g || g.getHyperlinkId() !== t) + break; + o = u, n = 0; + for (let w = m.length - 1; w >= 0; w--) { + const d = m.getCell(w); + if (!d || d.getHyperlinkId() !== t) { + n = w + 1; + break; + } + } + if (n === 0) + u--; + else + break; + } + } + let a = e, l = s; + const c = r.getLine(a); + if (c) { + for (; l < c.length - 1; ) { + const u = c.getCell(l + 1); + if (!u || u.getHyperlinkId() !== t) + break; + l++; + } + if (l === c.length - 1) { + let u = a + 1; + const m = r.length; + for (; u < m; ) { + const g = r.getLine(u); + if (!g || g.length === 0) + break; + const w = g.getCell(0); + if (!w || w.getHyperlinkId() !== t) + break; + a = u, l = 0; + for (let d = 0; d < g.length; d++) { + const p = g.getCell(d); + if (!p) + break; + if (p.getHyperlinkId() !== t) { + l = d - 1; + break; + } + l = d; + } + if (l === g.length - 1) + u++; + else + break; + } + } + } + return { + start: { x: n, y: o }, + end: { x: l, y: a } + }; + } + dispose() { + } +} +const y = class R { + constructor(t) { + this.terminal = t; + } + /** + * Provide all regex-detected URLs on the given row + */ + provideLinks(t, e) { + const s = [], r = this.terminal.buffer.active.getLine(t); + if (!r) { + e(void 0); + return; + } + const o = this.lineToText(r); + R.URL_REGEX.lastIndex = 0; + let n = R.URL_REGEX.exec(o); + for (; n !== null; ) { + let a = n[0]; + const l = n.index; + let c = n.index + a.length - 1; + const u = a.replace(R.TRAILING_PUNCTUATION, ""); + u.length < a.length && (a = u, c = l + a.length - 1), a.length > 8 && s.push({ + text: a, + range: { + start: { x: l, y: t }, + end: { x: c, y: t } + }, + activate: (m) => { + (m.ctrlKey || m.metaKey) && window.open(a, "_blank", "noopener,noreferrer"); + } + }), n = R.URL_REGEX.exec(o); + } + e(s.length > 0 ? s : void 0); + } + /** + * Convert a buffer line to plain text string + */ + lineToText(t) { + const e = []; + for (let s = 0; s < t.length; s++) { + const r = t.getCell(s); + if (!r) { + e.push(" "); + continue; + } + const o = r.getCodepoint(); + o === 0 || o < 32 ? e.push(" ") : e.push(String.fromCodePoint(o)); + } + return e.join(""); + } + dispose() { + } +}; +y.URL_REGEX = /(?:https?:\/\/|mailto:|ftp:\/\/|ssh:\/\/|git:\/\/|tel:|magnet:|gemini:\/\/|gopher:\/\/|news:)[\w\-.~:\/?#@!$&*+,;=%]+/gi; +y.TRAILING_PUNCTUATION = /[.,;!?)\]]+$/; +let st = y; +const O = { + foreground: "#d4d4d4", + background: "#1e1e1e", + cursor: "#ffffff", + cursorAccent: "#1e1e1e", + // Selection colors: solid colors that replace cell bg/fg when selected + // Using Ghostty's approach: selection bg = default fg, selection fg = default bg + selectionBackground: "#d4d4d4", + selectionForeground: "#1e1e1e", + black: "#000000", + red: "#cd3131", + green: "#0dbc79", + yellow: "#e5e510", + blue: "#2472c8", + magenta: "#bc3fbc", + cyan: "#11a8cd", + white: "#e5e5e5", + brightBlack: "#666666", + brightRed: "#f14c4c", + brightGreen: "#23d18b", + brightYellow: "#f5f543", + brightBlue: "#3b8eea", + brightMagenta: "#d670d6", + brightCyan: "#29b8db", + brightWhite: "#ffffff" +}; +class it { + constructor(t, e = {}) { + this.cursorVisible = !0, this.lastCursorPosition = { x: 0, y: 0 }, this.lastViewportY = 0, this.currentBuffer = null, this.currentSelectionCoords = null, this.hoveredHyperlinkId = 0, this.previousHoveredHyperlinkId = 0, this.hoveredLinkRange = null, this.previousHoveredLinkRange = null, this.canvas = t; + const s = t.getContext("2d", { alpha: !0 }); + if (!s) + throw new Error("Failed to get 2D rendering context"); + this.ctx = s, this.fontSize = e.fontSize ?? 15, this.fontFamily = e.fontFamily ?? "monospace", this.cursorStyle = e.cursorStyle ?? "block", this.cursorBlink = e.cursorBlink ?? !1, this.theme = { ...O, ...e.theme }, this.devicePixelRatio = e.devicePixelRatio ?? window.devicePixelRatio ?? 1, this.palette = [ + this.theme.black, + this.theme.red, + this.theme.green, + this.theme.yellow, + this.theme.blue, + this.theme.magenta, + this.theme.cyan, + this.theme.white, + this.theme.brightBlack, + this.theme.brightRed, + this.theme.brightGreen, + this.theme.brightYellow, + this.theme.brightBlue, + this.theme.brightMagenta, + this.theme.brightCyan, + this.theme.brightWhite + ], this.metrics = this.measureFont(), this.cursorBlink && this.startCursorBlink(); + } + // ========================================================================== + // Font Metrics Measurement + // ========================================================================== + measureFont() { + const e = document.createElement("canvas").getContext("2d"); + e.font = `${this.fontSize}px ${this.fontFamily}`; + const s = e.measureText("M"), r = Math.ceil(s.width), o = s.actualBoundingBoxAscent || this.fontSize * 0.8, n = s.actualBoundingBoxDescent || this.fontSize * 0.2, a = Math.ceil(o + n) + 2, l = Math.ceil(o) + 1; + return { width: r, height: a, baseline: l }; + } + /** + * Remeasure font metrics (call after font loads or changes) + */ + remeasureFont() { + this.metrics = this.measureFont(); + } + // ========================================================================== + // Color Conversion + // ========================================================================== + rgbToCSS(t, e, s) { + return `rgb(${t}, ${e}, ${s})`; + } + // ========================================================================== + // Canvas Sizing + // ========================================================================== + /** + * Resize canvas to fit terminal dimensions + */ + resize(t, e) { + const s = t * this.metrics.width, r = e * this.metrics.height; + this.canvas.style.width = `${s}px`, this.canvas.style.height = `${r}px`, this.canvas.width = s * this.devicePixelRatio, this.canvas.height = r * this.devicePixelRatio, this.ctx.scale(this.devicePixelRatio, this.devicePixelRatio), this.ctx.textBaseline = "alphabetic", this.ctx.textAlign = "left", this.ctx.fillStyle = this.theme.background, this.ctx.fillRect(0, 0, s, r); + } + // ========================================================================== + // Main Rendering + // ========================================================================== + /** + * Render the terminal buffer to canvas + */ + render(t, e = !1, s = 0, r, o = 1) { + var v; + this.currentBuffer = t; + const n = t.getCursor(), a = t.getDimensions(), l = r ? r.getScrollbackLength() : 0; + (v = t.needsFullRedraw) != null && v.call(t) && (e = !0), (this.canvas.width !== a.cols * this.metrics.width * this.devicePixelRatio || this.canvas.height !== a.rows * this.metrics.height * this.devicePixelRatio) && (this.resize(a.cols, a.rows), e = !0), s !== this.lastViewportY && (e = !0, this.lastViewportY = s); + const u = n.x !== this.lastCursorPosition.x || n.y !== this.lastCursorPosition.y; + if (u || this.cursorBlink) { + if (!e && !t.isRowDirty(n.y)) { + const f = t.getLine(n.y); + f && this.renderLine(f, n.y, a.cols); + } + if (u && this.lastCursorPosition.y !== n.y && !e && !t.isRowDirty(this.lastCursorPosition.y)) { + const f = t.getLine(this.lastCursorPosition.y); + f && this.renderLine(f, this.lastCursorPosition.y, a.cols); + } + } + const m = this.selectionManager && this.selectionManager.hasSelection(), g = /* @__PURE__ */ new Set(); + if (this.currentSelectionCoords = m ? this.selectionManager.getSelectionCoords() : null, this.currentSelectionCoords) { + const f = this.currentSelectionCoords; + for (let b = f.startRow; b <= f.endRow; b++) + g.add(b); + } + if (this.selectionManager) { + const f = this.selectionManager.getDirtySelectionRows(); + if (f.size > 0) { + for (const b of f) + g.add(b); + this.selectionManager.clearDirtySelectionRows(); + } + } + const w = /* @__PURE__ */ new Set(), d = this.hoveredHyperlinkId !== this.previousHoveredHyperlinkId, p = JSON.stringify(this.hoveredLinkRange) !== JSON.stringify(this.previousHoveredLinkRange); + if (d) { + for (let f = 0; f < a.rows; f++) { + let b = null; + if (s > 0) + if (f < s && r) { + const S = l - Math.floor(s) + f; + b = r.getScrollbackLine(S); + } else { + const S = f - Math.floor(s); + b = t.getLine(S); + } + else + b = t.getLine(f); + if (b) { + for (const S of b) + if (S.hyperlink_id === this.hoveredHyperlinkId || S.hyperlink_id === this.previousHoveredHyperlinkId) { + w.add(f); + break; + } + } + } + this.previousHoveredHyperlinkId = this.hoveredHyperlinkId; + } + if (p) { + if (this.previousHoveredLinkRange) + for (let f = this.previousHoveredLinkRange.startY; f <= this.previousHoveredLinkRange.endY; f++) + w.add(f); + if (this.hoveredLinkRange) + for (let f = this.hoveredLinkRange.startY; f <= this.hoveredLinkRange.endY; f++) + w.add(f); + this.previousHoveredLinkRange = this.hoveredLinkRange; + } + const _ = /* @__PURE__ */ new Set(); + for (let f = 0; f < a.rows; f++) + (s > 0 ? !0 : e || t.isRowDirty(f) || g.has(f) || w.has(f)) && (_.add(f), f > 0 && _.add(f - 1), f < a.rows - 1 && _.add(f + 1)); + for (let f = 0; f < a.rows; f++) { + if (!_.has(f)) + continue; + let b = null; + if (s > 0) + if (f < s && r) { + const S = l - Math.floor(s) + f; + b = r.getScrollbackLine(S); + } else { + const S = s > 0 ? f - Math.floor(s) : f; + b = t.getLine(S); + } + else + b = t.getLine(f); + b && this.renderLine(b, f, a.cols); + } + s === 0 && n.visible && this.cursorVisible && this.renderCursor(n.x, n.y), r && o > 0 && this.renderScrollbar(s, l, a.rows, o), this.lastCursorPosition = { x: n.x, y: n.y }, t.clearDirty(); + } + /** + * Render a single line using two-pass approach: + * 1. First pass: Draw all cell backgrounds + * 2. Second pass: Draw all cell text and decorations + * + * This two-pass approach is necessary for proper rendering of complex scripts + * like Devanagari where diacritics (like vowel sign ि) can extend LEFT of the + * base character into the previous cell's visual area. If we draw backgrounds + * and text in a single pass (cell by cell), the background of cell N would + * cover any left-extending portions of graphemes from cell N-1. + */ + renderLine(t, e, s) { + const r = e * this.metrics.height, o = s * this.metrics.width; + this.ctx.clearRect(0, r, o, this.metrics.height), this.ctx.fillStyle = this.theme.background, this.ctx.fillRect(0, r, o, this.metrics.height); + for (let n = 0; n < t.length; n++) { + const a = t[n]; + a.width !== 0 && this.renderCellBackground(a, n, e); + } + for (let n = 0; n < t.length; n++) { + const a = t[n]; + a.width !== 0 && this.renderCellText(a, n, e); + } + } + /** + * Render a cell's background only (Pass 1 of two-pass rendering) + * Selection highlighting is integrated here to avoid z-order issues with + * complex glyphs (like Devanagari) that extend outside their cell bounds. + */ + renderCellBackground(t, e, s) { + const r = e * this.metrics.width, o = s * this.metrics.height, n = this.metrics.width * t.width; + if (this.isInSelection(e, s)) { + this.ctx.fillStyle = this.theme.selectionBackground, this.ctx.fillRect(r, o, n, this.metrics.height); + return; + } + let l = t.bg_r, c = t.bg_g, u = t.bg_b; + t.flags & E.INVERSE && (l = t.fg_r, c = t.fg_g, u = t.fg_b), l === 0 && c === 0 && u === 0 || (this.ctx.fillStyle = this.rgbToCSS(l, c, u), this.ctx.fillRect(r, o, n, this.metrics.height)); + } + /** + * Render a cell's text and decorations (Pass 2 of two-pass rendering) + * Selection foreground color is applied here to match the selection background. + */ + renderCellText(t, e, s, r) { + var w; + const o = e * this.metrics.width, n = s * this.metrics.height, a = this.metrics.width * t.width; + if (t.flags & E.INVISIBLE) + return; + const l = this.isInSelection(e, s); + let c = ""; + if (t.flags & E.ITALIC && (c += "italic "), t.flags & E.BOLD && (c += "bold "), this.ctx.font = `${c}${this.fontSize}px ${this.fontFamily}`, r) + this.ctx.fillStyle = r; + else if (l) + this.ctx.fillStyle = this.theme.selectionForeground; + else { + let d = t.fg_r, p = t.fg_g, _ = t.fg_b; + t.flags & E.INVERSE && (d = t.bg_r, p = t.bg_g, _ = t.bg_b), this.ctx.fillStyle = this.rgbToCSS(d, p, _); + } + t.flags & E.FAINT && (this.ctx.globalAlpha = 0.5); + const u = o, m = n + this.metrics.baseline; + let g; + if (t.grapheme_len > 0 && ((w = this.currentBuffer) != null && w.getGraphemeString) ? g = this.currentBuffer.getGraphemeString(s, e) : g = String.fromCodePoint(t.codepoint || 32), this.ctx.fillText(g, u, m), t.flags & E.FAINT && (this.ctx.globalAlpha = 1), t.flags & E.UNDERLINE) { + const d = n + this.metrics.baseline + 2; + this.ctx.strokeStyle = this.ctx.fillStyle, this.ctx.lineWidth = 1, this.ctx.beginPath(), this.ctx.moveTo(o, d), this.ctx.lineTo(o + a, d), this.ctx.stroke(); + } + if (t.flags & E.STRIKETHROUGH) { + const d = n + this.metrics.height / 2; + this.ctx.strokeStyle = this.ctx.fillStyle, this.ctx.lineWidth = 1, this.ctx.beginPath(), this.ctx.moveTo(o, d), this.ctx.lineTo(o + a, d), this.ctx.stroke(); + } + if (t.hyperlink_id > 0 && t.hyperlink_id === this.hoveredHyperlinkId) { + const p = n + this.metrics.baseline + 2; + this.ctx.strokeStyle = "#4A90E2", this.ctx.lineWidth = 1, this.ctx.beginPath(), this.ctx.moveTo(o, p), this.ctx.lineTo(o + a, p), this.ctx.stroke(); + } + if (this.hoveredLinkRange) { + const d = this.hoveredLinkRange; + if (s === d.startY && e >= d.startX && (s < d.endY || e <= d.endX) || s > d.startY && s < d.endY || s === d.endY && e <= d.endX && (s > d.startY || e >= d.startX)) { + const _ = n + this.metrics.baseline + 2; + this.ctx.strokeStyle = "#4A90E2", this.ctx.lineWidth = 1, this.ctx.beginPath(), this.ctx.moveTo(o, _), this.ctx.lineTo(o + a, _), this.ctx.stroke(); + } + } + } + /** + * Render cursor + */ + renderCursor(t, e) { + var o; + const s = t * this.metrics.width, r = e * this.metrics.height; + switch (this.ctx.fillStyle = this.theme.cursor, this.cursorStyle) { + case "block": + this.ctx.fillRect(s, r, this.metrics.width, this.metrics.height); + { + const l = (o = this.currentBuffer) == null ? void 0 : o.getLine(e); + l != null && l[t] && (this.ctx.save(), this.ctx.beginPath(), this.ctx.rect(s, r, this.metrics.width, this.metrics.height), this.ctx.clip(), this.renderCellText(l[t], t, e, this.theme.cursorAccent), this.ctx.restore()); + } + break; + case "underline": + const n = Math.max(2, Math.floor(this.metrics.height * 0.15)); + this.ctx.fillRect( + s, + r + this.metrics.height - n, + this.metrics.width, + n + ); + break; + case "bar": + const a = Math.max(2, Math.floor(this.metrics.width * 0.15)); + this.ctx.fillRect(s, r, a, this.metrics.height); + break; + } + } + // ========================================================================== + // Cursor Blinking + // ========================================================================== + startCursorBlink() { + this.cursorBlinkInterval = window.setInterval(() => { + this.cursorVisible = !this.cursorVisible; + }, 530); + } + stopCursorBlink() { + this.cursorBlinkInterval !== void 0 && (clearInterval(this.cursorBlinkInterval), this.cursorBlinkInterval = void 0), this.cursorVisible = !0; + } + // ========================================================================== + // Public API + // ========================================================================== + /** + * Update theme colors + */ + setTheme(t) { + this.theme = { ...O, ...t }, this.palette = [ + this.theme.black, + this.theme.red, + this.theme.green, + this.theme.yellow, + this.theme.blue, + this.theme.magenta, + this.theme.cyan, + this.theme.white, + this.theme.brightBlack, + this.theme.brightRed, + this.theme.brightGreen, + this.theme.brightYellow, + this.theme.brightBlue, + this.theme.brightMagenta, + this.theme.brightCyan, + this.theme.brightWhite + ]; + } + /** + * Update font size + */ + setFontSize(t) { + this.fontSize = t, this.metrics = this.measureFont(); + } + /** + * Update font family + */ + setFontFamily(t) { + this.fontFamily = t, this.metrics = this.measureFont(); + } + /** + * Update cursor style + */ + setCursorStyle(t) { + this.cursorStyle = t; + } + /** + * Enable/disable cursor blinking + */ + setCursorBlink(t) { + t && !this.cursorBlink ? (this.cursorBlink = !0, this.startCursorBlink()) : !t && this.cursorBlink && (this.cursorBlink = !1, this.stopCursorBlink()); + } + /** + * Get current font metrics + */ + /** + * Render scrollbar (Phase 2) + * Shows scroll position and allows click/drag interaction + * @param opacity Opacity level (0-1) for fade in/out effect + */ + renderScrollbar(t, e, s, r = 1) { + const o = this.ctx, n = this.canvas.height / this.devicePixelRatio, a = this.canvas.width / this.devicePixelRatio, l = 8, c = a - l - 4, u = 4, m = n - u * 2; + if (o.clearRect(c - 2, 0, l + 6, n), o.fillStyle = this.theme.background, o.fillRect(c - 2, 0, l + 6, n), r <= 0 || e === 0) + return; + const g = e + s, w = Math.max(20, s / g * m), d = t / e, p = u + (m - w) * (1 - d); + o.fillStyle = `rgba(128, 128, 128, ${0.1 * r})`, o.fillRect(c, u, l, m); + const v = t > 0 ? 0.5 : 0.3; + o.fillStyle = `rgba(128, 128, 128, ${v * r})`, o.fillRect(c, p, l, w); + } + getMetrics() { + return { ...this.metrics }; + } + /** + * Get canvas element (needed by SelectionManager) + */ + getCanvas() { + return this.canvas; + } + /** + * Set selection manager (for rendering selection) + */ + setSelectionManager(t) { + this.selectionManager = t; + } + /** + * Check if a cell at (x, y) is within the current selection. + * Uses cached selection coordinates for performance. + */ + isInSelection(t, e) { + const s = this.currentSelectionCoords; + if (!s) + return !1; + const { startCol: r, startRow: o, endCol: n, endRow: a } = s; + return o === a ? e === o && t >= r && t <= n : e === o ? t >= r : e === a ? t <= n : e > o && e < a; + } + /** + * Set the currently hovered hyperlink ID for rendering underlines + */ + setHoveredHyperlinkId(t) { + this.hoveredHyperlinkId = t; + } + /** + * Set the currently hovered link range for rendering underlines (for regex-detected URLs) + * Pass null to clear the hover state + */ + setHoveredLinkRange(t) { + this.hoveredLinkRange = t; + } + /** + * Get character cell width (for coordinate conversion) + */ + get charWidth() { + return this.metrics.width; + } + /** + * Get character cell height (for coordinate conversion) + */ + get charHeight() { + return this.metrics.height; + } + /** + * Clear entire canvas + */ + clear() { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height), this.ctx.fillStyle = this.theme.background, this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height); + } + /** + * Cleanup resources + */ + dispose() { + this.stopCursorBlink(); + } +} +const A = class M { + // ms between scroll steps + constructor(t, e, s, r) { + this.selectionStart = null, this.selectionEnd = null, this.isSelecting = !1, this.mouseDownX = 0, this.mouseDownY = 0, this.dragThresholdMet = !1, this.mouseDownTarget = null, this.dirtySelectionRows = /* @__PURE__ */ new Set(), this.selectionChangedEmitter = new T(), this.boundMouseUpHandler = null, this.boundContextMenuHandler = null, this.boundClickHandler = null, this.boundDocumentMouseMoveHandler = null, this.autoScrollInterval = null, this.autoScrollDirection = 0, this.terminal = t, this.renderer = e, this.wasmTerm = s, this.textarea = r, this.attachEventListeners(); + } + // pixels from edge to trigger scroll + /** + * Get current viewport Y position (how many lines scrolled into history) + */ + getViewportY() { + const t = typeof this.terminal.getViewportY == "function" ? this.terminal.getViewportY() : this.terminal.viewportY || 0; + return Math.max(0, Math.floor(t)); + } + /** + * Convert viewport row to absolute buffer row + * Absolute row is an index into combined buffer: scrollback (0 to len-1) + screen (len to len+rows-1) + */ + viewportRowToAbsolute(t) { + const e = this.wasmTerm.getScrollbackLength(), s = this.getViewportY(); + return e + t - s; + } + /** + * Convert absolute buffer row to viewport row (may be outside visible range) + */ + absoluteRowToViewport(t) { + const e = this.wasmTerm.getScrollbackLength(), s = this.getViewportY(); + return t - e + s; + } + // ========================================================================== + // Public API + // ========================================================================== + /** + * Get the selected text as a string + */ + getSelection() { + if (!this.selectionStart || !this.selectionEnd) + return ""; + let { col: t, absoluteRow: e } = this.selectionStart, { col: s, absoluteRow: r } = this.selectionEnd; + (e > r || e === r && t > s) && ([t, s] = [s, t], [e, r] = [r, e]); + const o = this.wasmTerm.getScrollbackLength(); + let n = ""; + for (let a = e; a <= r; a++) { + let l = null; + if (a < o) + l = this.wasmTerm.getScrollbackLine(a); + else { + const w = a - o; + l = this.wasmTerm.getLine(w); + } + if (!l) + continue; + let c = -1; + const u = a === e ? t : 0, m = a === r ? s : l.length - 1; + let g = ""; + for (let w = u; w <= m; w++) { + const d = l[w]; + if (d && d.codepoint !== 0) { + let p; + if (d.grapheme_len > 0) + if (a < o) + p = this.wasmTerm.getScrollbackGraphemeString(a, w); + else { + const _ = a - o; + p = this.wasmTerm.getGraphemeString(_, w); + } + else + p = String.fromCodePoint(d.codepoint); + g += p, p.trim() && (c = g.length); + } else + g += " "; + } + c >= 0 ? g = g.substring(0, c) : g = "", n += g, a < r && (n += ` +`); + } + return n; + } + /** + * Check if there's an active selection + */ + hasSelection() { + return !(!this.selectionStart || !this.selectionEnd || this.isSelecting && !this.dragThresholdMet); + } + /** + * Copy the current selection to clipboard + * @returns true if there was text to copy, false otherwise + */ + copySelection() { + if (!this.hasSelection()) + return !1; + const t = this.getSelection(); + return t ? (this.copyToClipboard(t), !0) : !1; + } + /** + * Clear the selection + */ + clearSelection() { + if (!this.hasSelection()) + return; + const t = this.normalizeSelection(); + if (t) + for (let e = t.startRow; e <= t.endRow; e++) + this.dirtySelectionRows.add(e); + this.selectionStart = null, this.selectionEnd = null, this.isSelecting = !1, this.requestRender(); + } + /** + * Select all text in the terminal + */ + selectAll() { + const t = this.wasmTerm.getDimensions(), e = this.getViewportY(); + this.selectionStart = { col: 0, absoluteRow: e }, this.selectionEnd = { col: t.cols - 1, absoluteRow: e + t.rows - 1 }, this.requestRender(), this.selectionChangedEmitter.fire(); + } + /** + * Select text at specific column and row with length + * xterm.js compatible API + */ + select(t, e, s) { + const r = this.wasmTerm.getDimensions(); + e = Math.max(0, Math.min(e, r.rows - 1)), t = Math.max(0, Math.min(t, r.cols - 1)); + let o = e, n = t + s - 1; + for (; n >= r.cols; ) + n -= r.cols, o++; + o = Math.min(o, r.rows - 1); + const a = this.getViewportY(); + this.selectionStart = { col: t, absoluteRow: a + e }, this.selectionEnd = { col: n, absoluteRow: a + o }, this.requestRender(), this.selectionChangedEmitter.fire(); + } + /** + * Select entire lines from start to end + * xterm.js compatible API + */ + selectLines(t, e) { + const s = this.wasmTerm.getDimensions(); + t = Math.max(0, Math.min(t, s.rows - 1)), e = Math.max(0, Math.min(e, s.rows - 1)), t > e && ([t, e] = [e, t]), this.selectionStart = { col: 0, absoluteRow: this.viewportRowToAbsolute(t) }, this.selectionEnd = { col: s.cols - 1, absoluteRow: this.viewportRowToAbsolute(e) }, this.requestRender(), this.selectionChangedEmitter.fire(); + } + /** + * Get selection position as buffer range + * xterm.js compatible API + */ + getSelectionPosition() { + const t = this.normalizeSelection(); + if (t) + return { + start: { x: t.startCol, y: t.startRow }, + end: { x: t.endCol, y: t.endRow } + }; + } + /** + * Deselect all text + * xterm.js compatible API + */ + deselect() { + this.clearSelection(), this.selectionChangedEmitter.fire(); + } + /** + * Focus the terminal (make it receive keyboard input) + */ + focus() { + const t = this.renderer.getCanvas(); + t.parentElement && t.parentElement.focus(); + } + /** + * Get current selection coordinates (for rendering) + */ + getSelectionCoords() { + return this.normalizeSelection(); + } + /** + * Get dirty selection rows that need redraw (for clearing old highlight) + */ + getDirtySelectionRows() { + return this.dirtySelectionRows; + } + /** + * Clear the dirty selection rows tracking (after redraw) + */ + clearDirtySelectionRows() { + this.dirtySelectionRows.clear(); + } + /** + * Get selection change event accessor + */ + get onSelectionChange() { + return this.selectionChangedEmitter.event; + } + /** + * Cleanup resources + */ + dispose() { + this.selectionChangedEmitter.dispose(), this.stopAutoScroll(), this.boundMouseUpHandler && (document.removeEventListener("mouseup", this.boundMouseUpHandler), this.boundMouseUpHandler = null), this.boundDocumentMouseMoveHandler && (document.removeEventListener("mousemove", this.boundDocumentMouseMoveHandler), this.boundDocumentMouseMoveHandler = null), this.boundContextMenuHandler && (this.renderer.getCanvas().removeEventListener("contextmenu", this.boundContextMenuHandler), this.boundContextMenuHandler = null), this.boundClickHandler && (document.removeEventListener("click", this.boundClickHandler), this.boundClickHandler = null); + } + // ========================================================================== + // Private Methods + // ========================================================================== + /** + * Attach mouse event listeners to canvas + */ + attachEventListeners() { + const t = this.renderer.getCanvas(); + t.addEventListener("mousedown", (e) => { + if (e.button === 0) { + t.parentElement && t.parentElement.focus(); + const s = this.pixelToCell(e.offsetX, e.offsetY); + this.hasSelection() && this.clearSelection(); + const o = this.viewportRowToAbsolute(s.row); + this.selectionStart = { col: s.col, absoluteRow: o }, this.selectionEnd = { col: s.col, absoluteRow: o }, this.isSelecting = !0, this.mouseDownX = e.offsetX, this.mouseDownY = e.offsetY, this.dragThresholdMet = !1; + } + }), t.addEventListener("mousemove", (e) => { + if (this.isSelecting) { + if (!this.dragThresholdMet) { + const o = e.offsetX - this.mouseDownX, n = e.offsetY - this.mouseDownY, a = this.renderer.getMetrics().width * 0.5; + if (o * o + n * n < a * a) + return; + this.dragThresholdMet = !0; + } + this.markCurrentSelectionDirty(); + const s = this.pixelToCell(e.offsetX, e.offsetY), r = this.viewportRowToAbsolute(s.row); + this.selectionEnd = { col: s.col, absoluteRow: r }, this.requestRender(), this.updateAutoScroll(e.offsetY, t.clientHeight); + } + }), t.addEventListener("mouseleave", (e) => { + if (this.isSelecting) { + const s = t.getBoundingClientRect(); + e.clientY < s.top ? this.startAutoScroll(-1) : e.clientY > s.bottom && this.startAutoScroll(1); + } + }), t.addEventListener("mouseenter", () => { + this.isSelecting && this.stopAutoScroll(); + }), this.boundDocumentMouseMoveHandler = (e) => { + if (this.isSelecting) { + if (!this.dragThresholdMet) { + const l = e.clientX - (t.getBoundingClientRect().left + this.mouseDownX), c = e.clientY - (t.getBoundingClientRect().top + this.mouseDownY), u = this.renderer.getMetrics().width * 0.5; + if (l * l + c * c < u * u) + return; + this.dragThresholdMet = !0; + } + const s = t.getBoundingClientRect(), r = Math.max(s.left, Math.min(e.clientX, s.right)), o = Math.max(s.top, Math.min(e.clientY, s.bottom)), n = r - s.left, a = o - s.top; + if ((e.clientX < s.left || e.clientX > s.right || e.clientY < s.top || e.clientY > s.bottom) && (e.clientY < s.top ? this.startAutoScroll(-1) : e.clientY > s.bottom ? this.startAutoScroll(1) : this.stopAutoScroll(), this.autoScrollDirection === 0)) { + this.markCurrentSelectionDirty(); + const l = this.pixelToCell(n, a), c = this.viewportRowToAbsolute(l.row); + this.selectionEnd = { col: l.col, absoluteRow: c }, this.requestRender(); + } + } + }, document.addEventListener("mousemove", this.boundDocumentMouseMoveHandler), document.addEventListener("mousedown", (e) => { + this.mouseDownTarget = e.target; + }), this.boundMouseUpHandler = (e) => { + if (this.isSelecting) { + if (this.isSelecting = !1, this.stopAutoScroll(), !this.dragThresholdMet) { + this.clearSelection(); + return; + } + if (this.hasSelection()) { + const s = this.getSelection(); + s && (this.copyToClipboard(s), this.selectionChangedEmitter.fire()); + } + } + }, document.addEventListener("mouseup", this.boundMouseUpHandler), t.addEventListener("click", (e) => { + if (e.detail === 2) { + const s = this.pixelToCell(e.offsetX, e.offsetY), r = this.getWordAtCell(s.col, s.row); + if (r) { + const o = this.viewportRowToAbsolute(s.row); + this.selectionStart = { col: r.startCol, absoluteRow: o }, this.selectionEnd = { col: r.endCol, absoluteRow: o }, this.requestRender(); + const n = this.getSelection(); + n && (this.copyToClipboard(n), this.selectionChangedEmitter.fire()); + } + } else if (e.detail >= 3) { + const s = this.pixelToCell(e.offsetX, e.offsetY), r = this.viewportRowToAbsolute(s.row), o = this.wasmTerm.getScrollbackLength(); + let n = null; + if (r < o) + n = this.wasmTerm.getScrollbackLine(r); + else { + const l = r - o; + n = this.wasmTerm.getLine(l); + } + let a = -1; + if (n) { + for (let l = n.length - 1; l >= 0; l--) + if (n[l] && n[l].codepoint !== 0 && n[l].codepoint !== 32) { + a = l; + break; + } + } + if (a >= 0) { + this.selectionStart = { col: 0, absoluteRow: r }, this.selectionEnd = { col: a, absoluteRow: r }, this.requestRender(); + const l = this.getSelection(); + l && (this.copyToClipboard(l), this.selectionChangedEmitter.fire()); + } + } + }), this.boundContextMenuHandler = (e) => { + if (this.renderer.getCanvas().getBoundingClientRect(), this.textarea.style.position = "fixed", this.textarea.style.left = `${e.clientX}px`, this.textarea.style.top = `${e.clientY}px`, this.textarea.style.width = "1px", this.textarea.style.height = "1px", this.textarea.style.zIndex = "1000", this.textarea.style.opacity = "0", this.textarea.style.pointerEvents = "auto", this.hasSelection()) { + const r = this.getSelection(); + this.textarea.value = r, this.textarea.select(), this.textarea.setSelectionRange(0, r.length); + } else + this.textarea.value = ""; + this.textarea.focus(), setTimeout(() => { + const r = () => { + this.textarea.style.pointerEvents = "none", this.textarea.style.zIndex = "-10", this.textarea.style.width = "0", this.textarea.style.height = "0", this.textarea.style.left = "0", this.textarea.style.top = "0", this.textarea.value = "", document.removeEventListener("click", r), document.removeEventListener("contextmenu", r), this.textarea.removeEventListener("blur", r); + }; + document.addEventListener("click", r, { once: !0 }), document.addEventListener("contextmenu", r, { once: !0 }), this.textarea.addEventListener("blur", r, { once: !0 }); + }, 10); + }, t.addEventListener("contextmenu", this.boundContextMenuHandler), this.boundClickHandler = (e) => { + if (this.isSelecting || this.mouseDownTarget && t.contains(this.mouseDownTarget)) + return; + const r = e.target; + t.contains(r) || this.hasSelection() && this.clearSelection(); + }, document.addEventListener("click", this.boundClickHandler); + } + /** + * Mark current selection rows as dirty for redraw + */ + markCurrentSelectionDirty() { + const t = this.normalizeSelection(); + if (t) + for (let e = t.startRow; e <= t.endRow; e++) + this.dirtySelectionRows.add(e); + } + /** + * Update auto-scroll based on mouse Y position within canvas + */ + updateAutoScroll(t, e) { + const s = M.AUTO_SCROLL_EDGE_SIZE; + t < s ? this.startAutoScroll(-1) : t > e - s ? this.startAutoScroll(1) : this.stopAutoScroll(); + } + /** + * Start auto-scrolling in the given direction + */ + startAutoScroll(t) { + this.autoScrollInterval !== null && this.autoScrollDirection === t || (this.stopAutoScroll(), this.autoScrollDirection = t, this.autoScrollInterval = setInterval(() => { + if (!this.isSelecting) { + this.stopAutoScroll(); + return; + } + const e = M.AUTO_SCROLL_SPEED * this.autoScrollDirection; + if (this.terminal.scrollLines(e), this.selectionEnd) { + const s = this.wasmTerm.getDimensions(); + if (this.autoScrollDirection < 0) { + const r = this.viewportRowToAbsolute(0); + r < this.selectionEnd.absoluteRow && (this.selectionEnd = { col: 0, absoluteRow: r }); + } else { + const r = this.viewportRowToAbsolute(s.rows - 1); + r > this.selectionEnd.absoluteRow && (this.selectionEnd = { col: s.cols - 1, absoluteRow: r }); + } + } + this.requestRender(); + }, M.AUTO_SCROLL_INTERVAL)); + } + /** + * Stop auto-scrolling + */ + stopAutoScroll() { + this.autoScrollInterval !== null && (clearInterval(this.autoScrollInterval), this.autoScrollInterval = null), this.autoScrollDirection = 0; + } + /** + * Convert pixel coordinates to terminal cell coordinates + */ + pixelToCell(t, e) { + const s = this.renderer.getMetrics(), r = Math.floor(t / s.width), o = Math.floor(e / s.height); + return { + col: Math.max(0, Math.min(r, this.terminal.cols - 1)), + row: Math.max(0, Math.min(o, this.terminal.rows - 1)) + }; + } + /** + * Normalize selection coordinates (handle backward selection) + * Returns coordinates in VIEWPORT space for rendering, clamped to visible area + */ + normalizeSelection() { + if (!this.selectionStart || !this.selectionEnd) + return null; + let { col: t, absoluteRow: e } = this.selectionStart, { col: s, absoluteRow: r } = this.selectionEnd; + (e > r || e === r && t > s) && ([t, s] = [s, t], [e, r] = [r, e]); + let o = this.absoluteRowToViewport(e), n = this.absoluteRowToViewport(r); + const a = this.wasmTerm.getDimensions(), l = a.rows - 1; + return n < 0 || o > l ? null : (o < 0 && (o = 0, t = 0), n > l && (n = l, s = a.cols - 1), { startCol: t, startRow: o, endCol: s, endRow: n }); + } + /** + * Get word boundaries at a cell position + */ + getWordAtCell(t, e) { + const s = this.viewportRowToAbsolute(e), r = this.wasmTerm.getScrollbackLength(); + let o; + if (s < r) + o = this.wasmTerm.getScrollbackLine(s); + else { + const c = s - r; + o = this.wasmTerm.getLine(c); + } + if (!o) + return null; + const n = (c) => { + if (!c || c.codepoint === 0) + return !1; + const u = String.fromCodePoint(c.codepoint); + return /[\w\-./~@+]/.test(u); + }; + if (!n(o[t])) + return null; + let a = t; + for (; a > 0 && n(o[a - 1]); ) + a--; + let l = t; + for (; l < o.length - 1 && n(o[l + 1]); ) + l++; + return { startCol: a, endCol: l }; + } + /** + * Copy text to clipboard + * + * Strategy (modern APIs first): + * 1. Try ClipboardItem API (works in Safari and modern browsers) + * - Safari requires the ClipboardItem to be created synchronously within user gesture + * 2. Try navigator.clipboard.writeText (modern async API, may fail in Safari) + * 3. Fall back to execCommand (legacy, for older browsers) + */ + copyToClipboard(t) { + if (navigator.clipboard && typeof ClipboardItem < "u") + try { + const e = new Blob([t], { type: "text/plain" }), s = new ClipboardItem({ + "text/plain": e + }); + navigator.clipboard.write([s]).catch((r) => { + console.warn("ClipboardItem write failed, trying writeText:", r), this.copyWithWriteText(t); + }); + return; + } catch { + } + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(t).catch((e) => { + console.warn("Clipboard writeText failed, trying execCommand:", e), this.copyWithExecCommand(t); + }); + return; + } + this.copyWithExecCommand(t); + } + /** + * Copy using navigator.clipboard.writeText + */ + copyWithWriteText(t) { + navigator.clipboard && navigator.clipboard.writeText ? navigator.clipboard.writeText(t).catch((e) => { + console.warn("Clipboard writeText failed, trying execCommand:", e), this.copyWithExecCommand(t); + }) : this.copyWithExecCommand(t); + } + /** + * Copy using legacy execCommand (fallback for older browsers) + */ + copyWithExecCommand(t) { + const e = document.activeElement; + try { + const s = this.textarea; + s.value = t, s.style.position = "fixed", s.style.left = "-9999px", s.style.top = "0", s.style.width = "1px", s.style.height = "1px", s.style.opacity = "0", s.focus(), s.select(), s.setSelectionRange(0, t.length); + const r = document.execCommand("copy"); + e && e.focus(), r || console.warn("execCommand copy failed"); + } catch (s) { + console.warn("execCommand copy threw:", s), e && e.focus(); + } + } + /** + * Request a render update (triggers selection overlay redraw) + */ + requestRender() { + } +}; +A.AUTO_SCROLL_EDGE_SIZE = 30; +A.AUTO_SCROLL_SPEED = 3; +A.AUTO_SCROLL_INTERVAL = 50; +let rt = A; +function V(i, t) { + const e = String(i || "").trim(); + if (!e) + return t; + if (e.startsWith("#")) { + const r = e.slice(1), o = r.length === 3 ? r.split("").map((n) => n + n).join("") : r; + if (/^[0-9a-fA-F]{6}$/.test(o)) { + const n = Number.parseInt(o, 16); + return { + r: n >> 16 & 255, + g: n >> 8 & 255, + b: n & 255 + }; + } + } + const s = e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/i); + return s ? { + r: Number.parseInt(s[1], 10), + g: Number.parseInt(s[2], 10), + b: Number.parseInt(s[3], 10) + } : t; +} +function ot(i, t, e) { + const s = V(e.foreground, { r: 212, g: 212, b: 212 }), r = V(e.background, { r: 30, g: 30, b: 30 }), o = { + codepoint: 32, + fg_r: s.r, + fg_g: s.g, + fg_b: s.b, + bg_r: r.r, + bg_g: r.g, + bg_b: r.b, + flags: 0, + width: 1, + hyperlink_id: 0, + grapheme_len: 0 + }; + return Array.from({ length: t }, () => Array.from({ length: i }, () => ({ ...o }))); +} +class ut { + constructor(t = {}) { + this.unicode = { + get activeVersion() { + return "15.1"; + } + }, this.dataEmitter = new T(), this.resizeEmitter = new T(), this.bellEmitter = new T(), this.selectionChangeEmitter = new T(), this.keyEmitter = new T(), this.titleChangeEmitter = new T(), this.scrollEmitter = new T(), this.renderEmitter = new T(), this.cursorMoveEmitter = new T(), this.onData = this.dataEmitter.event, this.onResize = this.resizeEmitter.event, this.onBell = this.bellEmitter.event, this.onSelectionChange = this.selectionChangeEmitter.event, this.onKey = this.keyEmitter.event, this.onTitleChange = this.titleChangeEmitter.event, this.onScroll = this.scrollEmitter.event, this.onRender = this.renderEmitter.event, this.onCursorMove = this.cursorMoveEmitter.event, this.isOpen = !1, this.isDisposed = !1, this.writeQueue = [], this.addons = [], this.currentTitle = "", this.viewportY = 0, this.targetViewportY = 0, this.lastCursorY = 0, this.isDraggingScrollbar = !1, this.scrollbarDragStart = null, this.scrollbarDragStartViewportY = 0, this.scrollbarVisible = !1, this.scrollbarOpacity = 0, this.SCROLLBAR_HIDE_DELAY_MS = 1500, this.SCROLLBAR_FADE_DURATION_MS = 200, this.bootstrapCells = null, this.bootstrapDirty = !1, this.animateScroll = () => { + if (!this.wasmTerm || this.scrollAnimationStartTime === void 0) + return; + const s = this.options.smoothScrollDuration ?? 100, r = this.targetViewportY - this.viewportY; + if (Math.abs(r) < 0.01) { + this.viewportY = this.targetViewportY, this.scrollEmitter.fire(Math.floor(this.viewportY)), this.getScrollbackLength() > 0 && this.showScrollbar(), this.scrollAnimationFrame = void 0, this.scrollAnimationStartTime = void 0, this.scrollAnimationStartY = void 0; + return; + } + const a = 1 - (1 / (s / 1e3 * 60)) ** 2; + this.viewportY += r * a; + const l = Math.floor(this.viewportY); + this.scrollEmitter.fire(l), this.getScrollbackLength() > 0 && this.showScrollbar(), this.scrollAnimationFrame = requestAnimationFrame(this.animateScroll); + }, this.handleMouseMove = (s) => { + if (!(!this.canvas || !this.renderer || !this.wasmTerm)) { + if (this.isDraggingScrollbar) { + this.processScrollbarDrag(s); + return; + } + if (this.linkDetector) { + if (this.mouseMoveThrottleTimeout) { + this.pendingMouseMove = s; + return; + } + this.processMouseMove(s), this.mouseMoveThrottleTimeout = window.setTimeout(() => { + if (this.mouseMoveThrottleTimeout = void 0, this.pendingMouseMove) { + const r = this.pendingMouseMove; + this.pendingMouseMove = void 0, this.processMouseMove(r); + } + }, 16); + } + } + }, this.handleMouseLeave = () => { + var s, r; + this.renderer && this.wasmTerm && ((this.renderer.hoveredHyperlinkId || 0) > 0 && this.renderer.setHoveredHyperlinkId(0), this.renderer.setHoveredLinkRange(null)), this.currentHoveredLink && ((r = (s = this.currentHoveredLink).hover) == null || r.call(s, !1), this.currentHoveredLink = void 0, this.element && (this.element.style.cursor = "text", this.canvas && (this.canvas.style.cursor = "text"))); + }, this.handleClick = async (s) => { + if (!this.canvas || !this.renderer || !this.linkDetector || !this.wasmTerm) + return; + const r = this.canvas.getBoundingClientRect(), o = Math.floor((s.clientX - r.left) / this.renderer.charWidth), a = Math.floor((s.clientY - r.top) / this.renderer.charHeight), l = this.wasmTerm.getScrollbackLength(); + let c; + const u = this.getViewportY(), m = Math.max(0, Math.floor(u)); + if (m > 0) + if (a < m) + c = l - m + a; + else { + const w = a - m; + c = l + w; + } + else + c = l + a; + const g = await this.linkDetector.getLinkAt(o, c); + g && (g.activate(s), (s.ctrlKey || s.metaKey) && s.preventDefault()); + }, this.handleWheel = (s) => { + var o, n, a; + if (s.preventDefault(), s.stopPropagation(), this.customWheelEventHandler && this.customWheelEventHandler(s)) + return; + if (((o = this.wasmTerm) == null ? void 0 : o.isAlternateScreen()) ?? !1) { + const l = s.deltaY > 0 ? "down" : "up", c = Math.min(Math.abs(Math.round(s.deltaY / 33)), 5); + for (let u = 0; u < c; u++) + l === "up" ? this.dataEmitter.fire("\x1B[A") : this.dataEmitter.fire("\x1B[B"); + } else { + let l; + if (s.deltaMode === WheelEvent.DOM_DELTA_PIXEL) { + const c = ((a = (n = this.renderer) == null ? void 0 : n.getMetrics()) == null ? void 0 : a.height) ?? 20; + l = s.deltaY / c; + } else + s.deltaMode === WheelEvent.DOM_DELTA_LINE ? l = s.deltaY : s.deltaMode === WheelEvent.DOM_DELTA_PAGE ? l = s.deltaY * this.rows : l = s.deltaY / 33; + if (l !== 0) { + const c = this.viewportY - l; + this.smoothScrollTo(c); + } + } + }, this.handleMouseDown = (s) => { + if (!this.canvas || !this.renderer || !this.wasmTerm) + return; + const r = this.wasmTerm.getScrollbackLength(); + if (r === 0) + return; + const o = this.canvas.getBoundingClientRect(), n = s.clientX - o.left, a = s.clientY - o.top, l = o.width, c = o.height, u = 8, m = l - u - 4, g = 4; + if (n >= m && n <= m + u) { + s.preventDefault(), s.stopPropagation(), s.stopImmediatePropagation(); + const w = c - g * 2, d = this.rows, p = r + d, _ = Math.max(20, d / p * w), v = this.viewportY / r, f = g + (w - _) * (1 - v); + if (a >= f && a <= f + _) + this.isDraggingScrollbar = !0, this.scrollbarDragStart = a, this.scrollbarDragStartViewportY = this.viewportY, this.canvas && (this.canvas.style.userSelect = "none", this.canvas.style.webkitUserSelect = "none"); + else { + const S = 1 - (a - g) / w, P = Math.round(S * r); + this.scrollToLine(Math.max(0, Math.min(r, P))); + } + } + }, this.handleMouseUp = () => { + this.isDraggingScrollbar && (this.isDraggingScrollbar = !1, this.scrollbarDragStart = null, this.canvas && (this.canvas.style.userSelect = "", this.canvas.style.webkitUserSelect = ""), this.scrollbarVisible && this.getScrollbackLength() > 0 && this.showScrollbar()); + }, this.ghostty = t.ghostty ?? ct(); + const e = { + cols: t.cols ?? 80, + rows: t.rows ?? 24, + cursorBlink: t.cursorBlink ?? !1, + cursorStyle: t.cursorStyle ?? "block", + theme: t.theme ?? {}, + scrollback: t.scrollback ?? 1e4, + fontSize: t.fontSize ?? 15, + fontFamily: t.fontFamily ?? "monospace", + allowTransparency: t.allowTransparency ?? !1, + convertEol: t.convertEol ?? !1, + disableStdin: t.disableStdin ?? !1, + smoothScrollDuration: t.smoothScrollDuration ?? 100 + // Default: 100ms smooth scroll + }; + this.options = new Proxy(e, { + set: (s, r, o) => { + const n = s[r]; + return s[r] = o, this.isOpen && this.handleOptionChange(r, o, n), !0; + } + }), this.cols = this.options.cols, this.rows = this.options.rows, this.buffer = new Q(this), this.bootstrapBuffer = { + getLine: (s) => { + var r; + return this.bootstrapCells && s >= 0 && s < this.bootstrapCells.length ? this.bootstrapCells[s] : ((r = this.wasmTerm) == null ? void 0 : r.getLine(s)) ?? null; + }, + getCursor: () => { + var s; + return this.bootstrapCells ? { x: 0, y: 0, visible: !0 } : ((s = this.wasmTerm) == null ? void 0 : s.getCursor()) ?? { x: 0, y: 0, visible: !0 }; + }, + getDimensions: () => ({ cols: this.cols, rows: this.rows }), + isRowDirty: (s) => { + var r; + return this.bootstrapDirty ? !0 : this.bootstrapCells ? !1 : ((r = this.wasmTerm) == null ? void 0 : r.isRowDirty(s)) ?? !1; + }, + needsFullRedraw: () => { + var r; + if (this.bootstrapDirty) + return !0; + if (this.bootstrapCells) + return !1; + const s = this.wasmTerm; + return ((r = s == null ? void 0 : s.needsFullRedraw) == null ? void 0 : r.call(s)) ?? !1; + }, + clearDirty: () => { + var s; + this.bootstrapDirty = !1, (s = this.wasmTerm) == null || s.clearDirty(); + }, + getGraphemeString: (s, r) => { + var n, a; + if (this.bootstrapCells && s >= 0 && s < this.bootstrapCells.length) { + const l = (n = this.bootstrapCells[s]) == null ? void 0 : n[r]; + return l ? String.fromCodePoint(l.codepoint || 32) : " "; + } + const o = this.wasmTerm; + return ((a = o == null ? void 0 : o.getGraphemeString) == null ? void 0 : a.call(o, s, r)) ?? " "; + } + }; + } + // ========================================================================== + // Option Change Handling (for mutable options) + // ========================================================================== + /** + * Handle runtime option changes (called when options are modified after terminal is open) + * This enables xterm.js compatibility where options can be changed at runtime + */ + handleOptionChange(t, e, s) { + if (e !== s) + switch (t) { + case "disableStdin": + break; + case "cursorBlink": + case "cursorStyle": + this.renderer && (this.renderer.setCursorStyle(this.options.cursorStyle), this.renderer.setCursorBlink(this.options.cursorBlink)); + break; + case "theme": + this.renderer && console.warn("ghostty-web: theme changes after open() are not yet fully supported"); + break; + case "fontSize": + this.renderer && (this.renderer.setFontSize(this.options.fontSize), this.handleFontChange()); + break; + case "fontFamily": + this.renderer && (this.renderer.setFontFamily(this.options.fontFamily), this.handleFontChange()); + break; + case "cols": + case "rows": + this.resize(this.options.cols, this.options.rows); + break; + } + } + /** + * Handle font changes (fontSize or fontFamily) + * Updates canvas size to match new font metrics and forces a full re-render + */ + handleFontChange() { + if (!this.renderer || !this.wasmTerm || !this.canvas) + return; + this.selectionManager && this.selectionManager.clearSelection(), this.renderer.resize(this.cols, this.rows); + const t = this.renderer.getMetrics(); + this.canvas.width = t.width * this.cols, this.canvas.height = t.height * this.rows, this.canvas.style.width = `${t.width * this.cols}px`, this.canvas.style.height = `${t.height * this.rows}px`, this.renderer.render(this.wasmTerm, !0, this.viewportY, this); + } + /** + * Parse a CSS color string to 0xRRGGBB format. + * Returns 0 if the color is undefined or invalid. + */ + parseColorToHex(t) { + if (!t) + return 0; + if (t.startsWith("#")) { + let s = t.slice(1); + s.length === 3 && (s = s[0] + s[0] + s[1] + s[1] + s[2] + s[2]); + const r = Number.parseInt(s, 16); + return Number.isNaN(r) ? 0 : r; + } + const e = t.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/); + if (e) { + const s = Number.parseInt(e[1], 10), r = Number.parseInt(e[2], 10), o = Number.parseInt(e[3], 10); + return s << 16 | r << 8 | o; + } + return 0; + } + /** + * Convert terminal options to WASM terminal config. + */ + buildWasmConfig() { + const t = this.options.theme, e = this.options.scrollback; + if (!t && e === 1e4) + return; + const s = [ + this.parseColorToHex(t == null ? void 0 : t.black), + this.parseColorToHex(t == null ? void 0 : t.red), + this.parseColorToHex(t == null ? void 0 : t.green), + this.parseColorToHex(t == null ? void 0 : t.yellow), + this.parseColorToHex(t == null ? void 0 : t.blue), + this.parseColorToHex(t == null ? void 0 : t.magenta), + this.parseColorToHex(t == null ? void 0 : t.cyan), + this.parseColorToHex(t == null ? void 0 : t.white), + this.parseColorToHex(t == null ? void 0 : t.brightBlack), + this.parseColorToHex(t == null ? void 0 : t.brightRed), + this.parseColorToHex(t == null ? void 0 : t.brightGreen), + this.parseColorToHex(t == null ? void 0 : t.brightYellow), + this.parseColorToHex(t == null ? void 0 : t.brightBlue), + this.parseColorToHex(t == null ? void 0 : t.brightMagenta), + this.parseColorToHex(t == null ? void 0 : t.brightCyan), + this.parseColorToHex(t == null ? void 0 : t.brightWhite) + ]; + return { + scrollbackLimit: e, + fgColor: this.parseColorToHex(t == null ? void 0 : t.foreground), + bgColor: this.parseColorToHex(t == null ? void 0 : t.background), + cursorColor: this.parseColorToHex(t == null ? void 0 : t.cursor), + palette: s + }; + } + // ========================================================================== + // Lifecycle Methods + // ========================================================================== + /** + * Open terminal in a parent element + * + * Initializes all components and starts rendering. + * Requires a pre-loaded Ghostty instance passed to the constructor. + */ + open(t) { + if (this.isOpen) + throw new Error("Terminal is already open"); + if (this.isDisposed) + throw new Error("Terminal has been disposed"); + this.element = t, this.isOpen = !0; + try { + t.hasAttribute("tabindex") || t.setAttribute("tabindex", "0"), t.setAttribute("contenteditable", "true"), t.addEventListener("beforeinput", (l) => { + l.target === t && l.preventDefault(); + }), t.setAttribute("role", "textbox"), t.setAttribute("aria-label", "Terminal input"), t.setAttribute("aria-multiline", "true"); + const e = this.buildWasmConfig(); + this.wasmTerm = this.ghostty.createTerminal(this.cols, this.rows, e), this.canvas = document.createElement("canvas"), this.canvas.style.display = "block", this.canvas.style.cursor = "text", t.appendChild(this.canvas), this.textarea = document.createElement("textarea"), this.textarea.setAttribute("autocorrect", "off"), this.textarea.setAttribute("autocapitalize", "off"), this.textarea.setAttribute("spellcheck", "false"), this.textarea.setAttribute("tabindex", "0"), this.textarea.setAttribute("aria-label", "Terminal input"), this.textarea.style.position = "absolute", this.textarea.style.left = "0", this.textarea.style.top = "0", this.textarea.style.width = "1px", this.textarea.style.height = "1px", this.textarea.style.padding = "0", this.textarea.style.border = "none", this.textarea.style.margin = "0", this.textarea.style.opacity = "0", this.textarea.style.clipPath = "inset(50%)", this.textarea.style.overflow = "hidden", this.textarea.style.whiteSpace = "nowrap", this.textarea.style.resize = "none", t.appendChild(this.textarea); + const s = this.textarea; + this.canvas.addEventListener("mousedown", (l) => { + l.preventDefault(), s.focus(); + }), this.canvas.addEventListener("touchend", (l) => { + l.preventDefault(), s.focus(); + }), this.renderer = new it(this.canvas, { + fontSize: this.options.fontSize, + fontFamily: this.options.fontFamily, + cursorStyle: this.options.cursorStyle, + cursorBlink: this.options.cursorBlink, + theme: this.options.theme + }), this.renderer.resize(this.cols, this.rows); + const r = this.canvas, o = this.renderer, n = this.wasmTerm, a = { + hasMouseTracking: () => (n == null ? void 0 : n.hasMouseTracking()) ?? !1, + hasSgrMouseMode: () => (n == null ? void 0 : n.getMode(1006, !1)) ?? !0, + // SGR extended mode + getCellDimensions: () => ({ + width: o.charWidth, + height: o.charHeight + }), + getCanvasOffset: () => { + const l = r.getBoundingClientRect(); + return { left: l.left, top: l.top }; + } + }; + this.inputHandler = new K( + this.ghostty, + t, + (l) => { + var c; + this.options.disableStdin || ((c = this.selectionManager) == null || c.clearSelection(), this.dataEmitter.fire(l)); + }, + () => { + this.bellEmitter.fire(); + }, + (l) => { + this.keyEmitter.fire(l); + }, + this.customKeyEventHandler, + (l) => { + var c; + return ((c = this.wasmTerm) == null ? void 0 : c.getMode(l, !1)) ?? !1; + }, + () => this.copySelection(), + this.textarea, + a + ), this.selectionManager = new rt( + this, + this.renderer, + this.wasmTerm, + this.textarea + ), this.renderer.setSelectionManager(this.selectionManager), this.selectionManager.onSelectionChange(() => { + this.selectionChangeEmitter.fire(); + }), this.linkDetector = new tt(this), this.linkDetector.registerProvider(new et(this)), this.linkDetector.registerProvider(new st(this)), t.addEventListener("mousedown", this.handleMouseDown, { capture: !0 }), t.addEventListener("mousemove", this.handleMouseMove), t.addEventListener("mouseleave", this.handleMouseLeave), t.addEventListener("click", this.handleClick), document.addEventListener("mouseup", this.handleMouseUp), t.addEventListener("wheel", this.handleWheel, { passive: !1, capture: !0 }), this.armBootstrapBlank(), this.renderer.render(this.bootstrapBuffer, !0, this.viewportY, this, this.scrollbarOpacity), this.startRenderLoop(), this.focus(); + } catch (e) { + throw this.isOpen = !1, this.cleanupComponents(), new Error(`Failed to open terminal: ${e}`); + } + } + /** + * Write data to terminal + */ + write(t, e) { + this.assertOpen(), this.options.convertEol && typeof t == "string" && (t = t.replace(/\n/g, `\r +`)), this.writeInternal(t, e); + } + /** + * Internal write implementation (extracted from write()) + */ + writeInternal(t, e) { + var s; + this.disarmBootstrapBlank(), this.wasmTerm.write(t), this.processTerminalResponses(), typeof t == "string" && t.includes("\x07") ? this.bellEmitter.fire() : t instanceof Uint8Array && t.includes(7) && this.bellEmitter.fire(), (s = this.linkDetector) == null || s.invalidateCache(), this.viewportY !== 0 && this.scrollToBottom(), typeof t == "string" && t.includes("\x1B]") && this.checkForTitleChange(t), e && requestAnimationFrame(e); + } + /** + * Write data with newline + */ + writeln(t, e) { + if (typeof t == "string") + this.write(t + `\r +`, e); + else { + const s = new Uint8Array(t.length + 2); + s.set(t), s[t.length] = 13, s[t.length + 1] = 10, this.write(s, e); + } + } + /** + * Paste text into terminal (triggers bracketed paste if supported) + */ + paste(t) { + this.assertOpen(), !this.options.disableStdin && (this.wasmTerm.hasBracketedPaste() ? this.dataEmitter.fire("\x1B[200~" + t + "\x1B[201~") : this.dataEmitter.fire(t)); + } + /** + * Input data into terminal (as if typed by user) + * + * @param data - Data to input + * @param wasUserInput - If true, triggers onData event (default: false for compat with some apps) + */ + input(t, e = !1) { + this.assertOpen(), !this.options.disableStdin && (e ? this.dataEmitter.fire(t) : this.write(t)); + } + /** + * Resize terminal + */ + resize(t, e) { + if (this.assertOpen(), !(t === this.cols && e === this.rows)) { + this.cancelRenderLoop(); + try { + this.cols = t, this.rows = e, this.wasmTerm.resize(t, e), this.renderer.resize(t, e); + const s = this.renderer.getMetrics(); + this.canvas.width = s.width * t, this.canvas.height = s.height * e, this.canvas.style.width = `${s.width * t}px`, this.canvas.style.height = `${s.height * e}px`, this.resizeEmitter.fire({ cols: t, rows: e }), this.renderer.render(this.wasmTerm, !0, this.viewportY, this); + } catch (s) { + console.error("Terminal resize failed:", s); + } + this.flushWriteQueue(), this.startRenderLoop(); + } + } + /** + * Clear terminal screen + */ + clear() { + this.assertOpen(), this.wasmTerm.write("\x1B[2J\x1B[H"); + } + /** + * Reset terminal state + */ + reset() { + this.assertOpen(), this.wasmTerm && this.wasmTerm.free(); + const t = this.buildWasmConfig(); + this.wasmTerm = this.ghostty.createTerminal(this.cols, this.rows, t), this.armBootstrapBlank(), this.renderer.clear(), this.renderer.render(this.bootstrapBuffer, !0, this.viewportY, this, this.scrollbarOpacity), this.currentTitle = ""; + } + /** + * Focus terminal input + */ + focus() { + this.isOpen && this.element && (this.element.focus(), setTimeout(() => { + var t; + (t = this.element) == null || t.focus(); + }, 0)); + } + /** + * Blur terminal (remove focus) + */ + blur() { + this.isOpen && this.element && this.element.blur(); + } + /** + * Load an addon + */ + loadAddon(t) { + t.activate(this), this.addons.push(t); + } + // ========================================================================== + // Selection API (xterm.js compatible) + // ========================================================================== + /** + * Get the selected text as a string + */ + getSelection() { + var t; + return ((t = this.selectionManager) == null ? void 0 : t.getSelection()) || ""; + } + /** + * Check if there's an active selection + */ + hasSelection() { + var t; + return ((t = this.selectionManager) == null ? void 0 : t.hasSelection()) || !1; + } + /** + * Clear the current selection + */ + clearSelection() { + var t; + (t = this.selectionManager) == null || t.clearSelection(); + } + /** + * Copy the current selection to clipboard + * @returns true if there was text to copy, false otherwise + */ + copySelection() { + var t; + return ((t = this.selectionManager) == null ? void 0 : t.copySelection()) || !1; + } + /** + * Select all text in the terminal + */ + selectAll() { + var t; + (t = this.selectionManager) == null || t.selectAll(); + } + /** + * Select text at specific column and row with length + */ + select(t, e, s) { + var r; + (r = this.selectionManager) == null || r.select(t, e, s); + } + /** + * Select entire lines from start to end + */ + selectLines(t, e) { + var s; + (s = this.selectionManager) == null || s.selectLines(t, e); + } + /** + * Get selection position as buffer range + */ + /** + * Get the current viewport Y position. + * + * This is the number of lines scrolled back from the bottom of the + * scrollback buffer. It may be fractional during smooth scrolling. + */ + getViewportY() { + return this.viewportY; + } + getSelectionPosition() { + var t; + return (t = this.selectionManager) == null ? void 0 : t.getSelectionPosition(); + } + // ========================================================================== + // Phase 1: Custom Event Handlers + // ========================================================================== + /** + * Attach a custom keyboard event handler + * Returns true to prevent default handling + */ + attachCustomKeyEventHandler(t) { + this.customKeyEventHandler = t, this.inputHandler && this.inputHandler.setCustomKeyEventHandler(t); + } + /** + * Attach a custom wheel event handler (Phase 2) + * Returns true to prevent default handling + */ + attachCustomWheelEventHandler(t) { + this.customWheelEventHandler = t; + } + // ========================================================================== + // Link Detection Methods + // ========================================================================== + /** + * Register a custom link provider + * Multiple providers can be registered to detect different types of links + * + * @example + * ```typescript + * term.registerLinkProvider({ + * provideLinks(y, callback) { + * // Detect URLs, file paths, etc. + * callback(detectedLinks); + * } + * }); + * ``` + */ + registerLinkProvider(t) { + if (!this.linkDetector) + throw new Error("Terminal must be opened before registering link providers"); + this.linkDetector.registerProvider(t); + } + // ========================================================================== + // Phase 2: Scrolling Methods + // ========================================================================== + /** + * Scroll viewport by a number of lines + * @param amount Number of lines to scroll (positive = down, negative = up) + */ + scrollLines(t) { + if (!this.wasmTerm) + throw new Error("Terminal not open"); + const e = this.getScrollbackLength(), r = Math.max(0, Math.min(e, this.viewportY - t)); + r !== this.viewportY && (this.viewportY = r, this.scrollEmitter.fire(this.viewportY), e > 0 && this.showScrollbar()); + } + /** + * Scroll viewport by a number of pages + * @param amount Number of pages to scroll (positive = down, negative = up) + */ + scrollPages(t) { + this.scrollLines(t * this.rows); + } + /** + * Scroll viewport to the top of the scrollback buffer + */ + scrollToTop() { + const t = this.getScrollbackLength(); + t > 0 && this.viewportY !== t && (this.viewportY = t, this.scrollEmitter.fire(this.viewportY), this.showScrollbar()); + } + /** + * Scroll viewport to the bottom (current output) + */ + scrollToBottom() { + this.viewportY !== 0 && (this.viewportY = 0, this.scrollEmitter.fire(this.viewportY), this.getScrollbackLength() > 0 && this.showScrollbar()); + } + /** + * Scroll viewport to a specific line in the buffer + * @param line Line number (0 = top of scrollback, scrollbackLength = bottom) + */ + scrollToLine(t) { + const e = this.getScrollbackLength(), s = Math.max(0, Math.min(e, t)); + s !== this.viewportY && (this.viewportY = s, this.scrollEmitter.fire(this.viewportY), e > 0 && this.showScrollbar()); + } + /** + * Smoothly scroll to a target viewport position + * @param targetY Target viewport Y position (in lines, can be fractional) + */ + smoothScrollTo(t) { + if (!this.wasmTerm) + return; + const e = this.getScrollbackLength(), r = Math.max(0, Math.min(e, t)); + if ((this.options.smoothScrollDuration ?? 100) === 0) { + this.viewportY = r, this.targetViewportY = r, this.scrollEmitter.fire(Math.floor(this.viewportY)), e > 0 && this.showScrollbar(); + return; + } + this.targetViewportY = r, !this.scrollAnimationFrame && (this.scrollAnimationStartTime = Date.now(), this.scrollAnimationStartY = this.viewportY, this.animateScroll()); + } + // ========================================================================== + // Lifecycle + // ========================================================================== + /** + * Dispose terminal and clean up resources + */ + dispose() { + if (!this.isDisposed) { + this.isDisposed = !0, this.isOpen = !1, this.cancelRenderLoop(), this.writeQueue.length = 0, this.scrollAnimationFrame && (cancelAnimationFrame(this.scrollAnimationFrame), this.scrollAnimationFrame = void 0), this.mouseMoveThrottleTimeout && (clearTimeout(this.mouseMoveThrottleTimeout), this.mouseMoveThrottleTimeout = void 0), this.pendingMouseMove = void 0; + for (const t of this.addons) + t.dispose(); + this.addons = [], this.cleanupComponents(), this.dataEmitter.dispose(), this.resizeEmitter.dispose(), this.bellEmitter.dispose(), this.selectionChangeEmitter.dispose(), this.keyEmitter.dispose(), this.titleChangeEmitter.dispose(), this.scrollEmitter.dispose(), this.renderEmitter.dispose(), this.cursorMoveEmitter.dispose(); + } + } + // ========================================================================== + // Private Methods + // ========================================================================== + /** + * Cancel the render loop + */ + cancelRenderLoop() { + this.animationFrameId && (cancelAnimationFrame(this.animationFrameId), this.animationFrameId = void 0); + } + /** + * Flush any writes that were queued during resize + */ + flushWriteQueue() { + for (; this.writeQueue.length > 0; ) { + const t = this.writeQueue.shift(); + this.wasmTerm.write(t); + } + } + /** + * Start the render loop + */ + startRenderLoop() { + if (this.animationFrameId) + return; + const t = () => { + if (!this.isDisposed && this.isOpen) { + this.renderer.render(this.bootstrapBuffer, !1, this.viewportY, this, this.scrollbarOpacity); + const e = this.wasmTerm.getCursor(); + e.y !== this.lastCursorY && (this.lastCursorY = e.y, this.cursorMoveEmitter.fire()), this.animationFrameId = requestAnimationFrame(t); + } + }; + t(); + } + /** + * Get a line from native WASM scrollback buffer + * Implements IScrollbackProvider + */ + getScrollbackLine(t) { + return this.wasmTerm ? this.wasmTerm.getScrollbackLine(t) : null; + } + /** + * Get scrollback length from native WASM + * Implements IScrollbackProvider + */ + getScrollbackLength() { + return this.wasmTerm ? this.wasmTerm.getScrollbackLength() : 0; + } + armBootstrapBlank() { + const t = { ...O, ...this.options.theme }; + this.bootstrapCells = ot(this.cols, this.rows, { + foreground: t.foreground, + background: t.background + }), this.bootstrapDirty = !0; + } + disarmBootstrapBlank() { + this.bootstrapCells && (this.bootstrapCells = null, this.bootstrapDirty = !0); + } + /** + * Clean up components (called on dispose or error) + */ + cleanupComponents() { + this.selectionManager && (this.selectionManager.dispose(), this.selectionManager = void 0), this.inputHandler && (this.inputHandler.dispose(), this.inputHandler = void 0), this.renderer && (this.renderer.dispose(), this.renderer = void 0), this.canvas && this.canvas.parentNode && (this.canvas.parentNode.removeChild(this.canvas), this.canvas = void 0), this.textarea && this.textarea.parentNode && (this.textarea.parentNode.removeChild(this.textarea), this.textarea = void 0), this.element && (this.element.removeEventListener("wheel", this.handleWheel), this.element.removeEventListener("mousedown", this.handleMouseDown, { capture: !0 }), this.element.removeEventListener("mousemove", this.handleMouseMove), this.element.removeEventListener("mouseleave", this.handleMouseLeave), this.element.removeEventListener("click", this.handleClick), this.element.removeAttribute("contenteditable"), this.element.removeAttribute("role"), this.element.removeAttribute("aria-label"), this.element.removeAttribute("aria-multiline")), this.isOpen && typeof document < "u" && document.removeEventListener("mouseup", this.handleMouseUp), this.scrollbarHideTimeout && (window.clearTimeout(this.scrollbarHideTimeout), this.scrollbarHideTimeout = void 0), this.linkDetector && (this.linkDetector.dispose(), this.linkDetector = void 0), this.wasmTerm && (this.wasmTerm.free(), this.wasmTerm = void 0), this.ghostty = void 0, this.element = void 0, this.textarea = void 0; + } + /** + * Assert terminal is open (throw if not) + */ + assertOpen() { + if (this.isDisposed) + throw new Error("Terminal has been disposed"); + if (!this.isOpen) + throw new Error("Terminal must be opened before use. Call terminal.open(parent) first."); + } + /** + * Process mouse move for link detection (internal, called by throttled handler) + */ + processMouseMove(t) { + if (!this.canvas || !this.renderer || !this.linkDetector || !this.wasmTerm) + return; + const e = this.canvas.getBoundingClientRect(), s = Math.floor((t.clientX - e.left) / this.renderer.charWidth), o = Math.floor((t.clientY - e.top) / this.renderer.charHeight); + let n = 0, a = null; + const l = this.getViewportY(), c = Math.max(0, Math.floor(l)); + if (c > 0) { + const p = this.wasmTerm.getScrollbackLength(); + if (o < c) { + const _ = p - c + o; + a = this.wasmTerm.getScrollbackLine(_); + } else { + const _ = o - c; + a = this.wasmTerm.getLine(_); + } + } else + a = this.wasmTerm.getLine(o); + a && s >= 0 && s < a.length && (n = a[s].hyperlink_id); + const u = this.renderer.hoveredHyperlinkId || 0; + n !== u && this.renderer.setHoveredHyperlinkId(n); + const m = this.wasmTerm.getScrollbackLength(); + let g; + const w = this.getViewportY(), d = Math.max(0, Math.floor(w)); + if (d > 0) + if (o < d) + g = m - d + o; + else { + const p = o - d; + g = m + p; + } + else + g = m + o; + this.linkDetector.getLinkAt(s, g).then((p) => { + var _, v, f, b; + if (p !== this.currentHoveredLink) { + (v = (_ = this.currentHoveredLink) == null ? void 0 : _.hover) == null || v.call(_, !1), this.currentHoveredLink = p, (f = p == null ? void 0 : p.hover) == null || f.call(p, !0); + const S = p ? "pointer" : "text"; + if (this.element && (this.element.style.cursor = S), this.canvas && (this.canvas.style.cursor = S), this.renderer) + if (p) { + const P = ((b = this.wasmTerm) == null ? void 0 : b.getScrollbackLength()) || 0, $ = this.getViewportY(), F = Math.max(0, Math.floor($)), H = p.range.start.y - P + F, U = p.range.end.y - P + F; + H < this.rows && U >= 0 ? this.renderer.setHoveredLinkRange({ + startX: p.range.start.x, + startY: Math.max(0, H), + endX: p.range.end.x, + endY: Math.min(this.rows - 1, U) + }) : this.renderer.setHoveredLinkRange(null); + } else + this.renderer.setHoveredLinkRange(null); + } + }).catch((p) => { + console.warn("Link detection error:", p); + }); + } + /** + * Process scrollbar drag movement + */ + processScrollbarDrag(t) { + if (!this.canvas || !this.renderer || !this.wasmTerm || this.scrollbarDragStart === null) + return; + const e = this.wasmTerm.getScrollbackLength(); + if (e === 0) + return; + const s = this.canvas.getBoundingClientRect(), o = t.clientY - s.top - this.scrollbarDragStart, l = s.height - 4 * 2, c = this.rows, u = e + c, m = Math.max(20, c / u * l), g = -o / (l - m), w = Math.round(g * e), d = this.scrollbarDragStartViewportY + w; + this.scrollToLine(Math.max(0, Math.min(e, d))); + } + /** + * Show scrollbar with fade-in and schedule auto-hide + */ + showScrollbar() { + this.scrollbarHideTimeout && (window.clearTimeout(this.scrollbarHideTimeout), this.scrollbarHideTimeout = void 0), this.scrollbarVisible ? this.scrollbarOpacity = 1 : (this.scrollbarVisible = !0, this.scrollbarOpacity = 0, this.fadeInScrollbar()), this.isDraggingScrollbar || (this.scrollbarHideTimeout = window.setTimeout(() => { + this.hideScrollbar(); + }, this.SCROLLBAR_HIDE_DELAY_MS)); + } + /** + * Hide scrollbar with fade-out + */ + hideScrollbar() { + this.scrollbarHideTimeout && (window.clearTimeout(this.scrollbarHideTimeout), this.scrollbarHideTimeout = void 0), this.scrollbarVisible && this.fadeOutScrollbar(); + } + /** + * Fade in scrollbar + */ + fadeInScrollbar() { + const t = Date.now(), e = () => { + const s = Date.now() - t, r = Math.min(s / this.SCROLLBAR_FADE_DURATION_MS, 1); + this.scrollbarOpacity = r, this.renderer && this.wasmTerm && this.renderer.render(this.wasmTerm, !1, this.viewportY, this, this.scrollbarOpacity), r < 1 && requestAnimationFrame(e); + }; + e(); + } + /** + * Fade out scrollbar + */ + fadeOutScrollbar() { + const t = Date.now(), e = this.scrollbarOpacity, s = () => { + const r = Date.now() - t, o = Math.min(r / this.SCROLLBAR_FADE_DURATION_MS, 1); + this.scrollbarOpacity = e * (1 - o), this.renderer && this.wasmTerm && this.renderer.render(this.wasmTerm, !1, this.viewportY, this, this.scrollbarOpacity), o < 1 ? requestAnimationFrame(s) : (this.scrollbarVisible = !1, this.scrollbarOpacity = 0, this.renderer && this.wasmTerm && this.renderer.render(this.wasmTerm, !1, this.viewportY, this, 0)); + }; + s(); + } + /** + * Process any pending terminal responses and emit them via onData. + * + * This handles escape sequences that require the terminal to send a response + * back to the PTY, such as: + * - DSR 6 (cursor position): Shell sends \x1b[6n, terminal responds with \x1b[row;colR + * - DSR 5 (operating status): Shell sends \x1b[5n, terminal responds with \x1b[0n + * + * Without this, shells like nushell that rely on cursor position queries + * will hang waiting for a response that never comes. + * + * Note: We loop to read all pending responses, not just one. This is important + * when multiple queries are processed in a single write() call (e.g., when + * buffered data is written all at once during terminal initialization). + */ + processTerminalResponses() { + if (this.wasmTerm) + for (; ; ) { + const t = this.wasmTerm.readResponse(); + if (t === null) + break; + this.dataEmitter.fire(t); + } + } + /** + * Check for title changes in written data (OSC sequences) + * Simplified implementation - looks for OSC 0, 1, 2 + */ + checkForTitleChange(t) { + const e = /\x1b\]([012]);([^\x07\x1b]*?)(?:\x07|\x1b\\)/g; + let s = null; + for (; (s = e.exec(t)) !== null; ) { + const r = s[1], o = s[2]; + (r === "0" || r === "2") && o !== this.currentTitle && (this.currentTitle = o, this.titleChangeEmitter.fire(o)); + } + } + // ============================================================================ + // Terminal Modes + // ============================================================================ + /** + * Query terminal mode state + * + * @param mode Mode number (e.g., 2004 for bracketed paste) + * @param isAnsi True for ANSI modes, false for DEC modes (default: false) + * @returns true if mode is enabled + */ + getMode(t, e = !1) { + return this.assertOpen(), this.wasmTerm.getMode(t, e); + } + /** + * Check if bracketed paste mode is enabled + */ + hasBracketedPaste() { + return this.assertOpen(), this.wasmTerm.hasBracketedPaste(); + } + /** + * Check if focus event reporting is enabled + */ + hasFocusEvents() { + return this.assertOpen(), this.wasmTerm.hasFocusEvents(); + } + /** + * Check if mouse tracking is enabled + */ + hasMouseTracking() { + return this.assertOpen(), this.wasmTerm.hasMouseTracking(); + } +} +const nt = 2, at = 1, lt = 15, ht = 100; +class dt { + constructor() { + this._isResizing = !1; + } + /** + * Activate the addon (called by Terminal.loadAddon) + */ + activate(t) { + this._terminal = t; + } + /** + * Dispose the addon and clean up resources + */ + dispose() { + this._resizeObserver && (this._resizeObserver.disconnect(), this._resizeObserver = void 0), this._resizeDebounceTimer && (clearTimeout(this._resizeDebounceTimer), this._resizeDebounceTimer = void 0), this._lastCols = void 0, this._lastRows = void 0, this._terminal = void 0; + } + /** + * Fit the terminal to its container + * + * Calculates optimal dimensions and resizes the terminal. + * Does nothing if dimensions cannot be calculated or haven't changed. + */ + fit() { + if (this._isResizing) + return; + const t = this.proposeDimensions(); + if (!t || !this._terminal) + return; + const e = this._terminal, s = e.cols, r = e.rows; + if (!(t.cols === this._lastCols && t.rows === this._lastRows || t.cols === s && t.rows === r)) { + this._lastCols = t.cols, this._lastRows = t.rows, this._isResizing = !0; + try { + e.resize && typeof e.resize == "function" && e.resize(t.cols, t.rows); + } finally { + setTimeout(() => { + this._isResizing = !1; + }, 50); + } + } + } + /** + * Propose dimensions to fit the terminal to its container + * + * Calculates cols and rows based on: + * - Terminal container element dimensions (clientWidth/Height) + * - Terminal element padding + * - Font metrics (character cell size) + * - Scrollbar width reservation + * + * @returns Proposed dimensions or undefined if cannot calculate + */ + proposeDimensions() { + var _; + if (!((_ = this._terminal) != null && _.element)) + return; + const e = this._terminal.renderer; + if (!e || typeof e.getMetrics != "function") + return; + const s = e.getMetrics(); + if (!s || s.width === 0 || s.height === 0) + return; + const r = this._terminal.element; + if (typeof r.clientWidth > "u") + return; + const o = window.getComputedStyle(r), n = Number.parseInt(o.getPropertyValue("padding-top")) || 0, a = Number.parseInt(o.getPropertyValue("padding-bottom")) || 0, l = Number.parseInt(o.getPropertyValue("padding-left")) || 0, c = Number.parseInt(o.getPropertyValue("padding-right")) || 0, u = r.clientWidth, m = r.clientHeight; + if (u === 0 || m === 0) + return; + const g = u - l - c - lt, w = m - n - a, d = Math.max(nt, Math.floor(g / s.width)), p = Math.max(at, Math.floor(w / s.height)); + return { cols: d, rows: p }; + } + /** + * Observe the terminal's container for resize events + * + * Sets up a ResizeObserver to automatically call fit() when the + * container size changes. Resize events are debounced to avoid + * excessive calls during window drag operations. + * + * Call dispose() to stop observing. + */ + observeResize() { + var t; + (t = this._terminal) != null && t.element && (this._resizeObserver || (this._resizeObserver = new ResizeObserver((e) => { + this._isResizing || !e[0] || (this._resizeDebounceTimer && clearTimeout(this._resizeDebounceTimer), this._resizeDebounceTimer = setTimeout(() => { + this.fit(); + }, ht)); + }), this._resizeObserver.observe(this._terminal.element))); + } +} +let D = null; +async function ft() { + D || (D = await k.load()); +} +function ct() { + if (!D) + throw new Error( + `ghostty-web not initialized. Call init() before creating Terminal instances. +Example: + import { init, Terminal } from "ghostty-web"; + await init(); + const term = new Terminal(); + +For tests, pass a Ghostty instance directly: + import { Ghostty, Terminal } from "ghostty-web"; + const ghostty = await Ghostty.load(); + const term = new Terminal({ ghostty });` + ); + return D; +} +export { + it as CanvasRenderer, + E as CellFlags, + I as DirtyState, + T as EventEmitter, + dt as FitAddon, + k as Ghostty, + Z as GhosttyTerminal, + K as InputHandler, + h as Key, + G as KeyAction, + q as KeyEncoder, + N as KeyEncoderOption, + tt as LinkDetector, + C as Mods, + et as OSC8LinkProvider, + rt as SelectionManager, + ut as Terminal, + st as UrlRegexProvider, + ct as getGhostty, + ft as init +}; diff --git a/dist/ghostty-web.umd.cjs b/dist/ghostty-web.umd.cjs new file mode 100644 index 0000000..7d27d31 --- /dev/null +++ b/dist/ghostty-web.umd.cjs @@ -0,0 +1,13 @@ +(function(b,x){typeof exports=="object"&&typeof module<"u"?x(exports):typeof define=="function"&&define.amd?define(["exports"],x):(b=typeof globalThis<"u"?globalThis:b||self,x(b.GhosttyWeb={}))})(this,function(b){"use strict";var x=(i=>(i[i.CURSOR_KEY_APPLICATION=0]="CURSOR_KEY_APPLICATION",i[i.KEYPAD_KEY_APPLICATION=1]="KEYPAD_KEY_APPLICATION",i[i.IGNORE_KEYPAD_WITH_NUMLOCK=2]="IGNORE_KEYPAD_WITH_NUMLOCK",i[i.ALT_ESC_PREFIX=3]="ALT_ESC_PREFIX",i[i.MODIFY_OTHER_KEYS_STATE_2=4]="MODIFY_OTHER_KEYS_STATE_2",i[i.KITTY_KEYBOARD_FLAGS=5]="KITTY_KEYBOARD_FLAGS",i))(x||{}),y=(i=>(i[i.RELEASE=0]="RELEASE",i[i.PRESS=1]="PRESS",i[i.REPEAT=2]="REPEAT",i))(y||{}),h=(i=>(i[i.UNIDENTIFIED=0]="UNIDENTIFIED",i[i.GRAVE=1]="GRAVE",i[i.BACKSLASH=2]="BACKSLASH",i[i.BRACKET_LEFT=3]="BRACKET_LEFT",i[i.BRACKET_RIGHT=4]="BRACKET_RIGHT",i[i.COMMA=5]="COMMA",i[i.ZERO=6]="ZERO",i[i.ONE=7]="ONE",i[i.TWO=8]="TWO",i[i.THREE=9]="THREE",i[i.FOUR=10]="FOUR",i[i.FIVE=11]="FIVE",i[i.SIX=12]="SIX",i[i.SEVEN=13]="SEVEN",i[i.EIGHT=14]="EIGHT",i[i.NINE=15]="NINE",i[i.EQUAL=16]="EQUAL",i[i.INTL_BACKSLASH=17]="INTL_BACKSLASH",i[i.INTL_RO=18]="INTL_RO",i[i.INTL_YEN=19]="INTL_YEN",i[i.A=20]="A",i[i.B=21]="B",i[i.C=22]="C",i[i.D=23]="D",i[i.E=24]="E",i[i.F=25]="F",i[i.G=26]="G",i[i.H=27]="H",i[i.I=28]="I",i[i.J=29]="J",i[i.K=30]="K",i[i.L=31]="L",i[i.M=32]="M",i[i.N=33]="N",i[i.O=34]="O",i[i.P=35]="P",i[i.Q=36]="Q",i[i.R=37]="R",i[i.S=38]="S",i[i.T=39]="T",i[i.U=40]="U",i[i.V=41]="V",i[i.W=42]="W",i[i.X=43]="X",i[i.Y=44]="Y",i[i.Z=45]="Z",i[i.MINUS=46]="MINUS",i[i.PERIOD=47]="PERIOD",i[i.QUOTE=48]="QUOTE",i[i.SEMICOLON=49]="SEMICOLON",i[i.SLASH=50]="SLASH",i[i.ALT_LEFT=51]="ALT_LEFT",i[i.ALT_RIGHT=52]="ALT_RIGHT",i[i.BACKSPACE=53]="BACKSPACE",i[i.CAPS_LOCK=54]="CAPS_LOCK",i[i.CONTEXT_MENU=55]="CONTEXT_MENU",i[i.CONTROL_LEFT=56]="CONTROL_LEFT",i[i.CONTROL_RIGHT=57]="CONTROL_RIGHT",i[i.ENTER=58]="ENTER",i[i.META_LEFT=59]="META_LEFT",i[i.META_RIGHT=60]="META_RIGHT",i[i.SHIFT_LEFT=61]="SHIFT_LEFT",i[i.SHIFT_RIGHT=62]="SHIFT_RIGHT",i[i.SPACE=63]="SPACE",i[i.TAB=64]="TAB",i[i.CONVERT=65]="CONVERT",i[i.KANA_MODE=66]="KANA_MODE",i[i.NON_CONVERT=67]="NON_CONVERT",i[i.DELETE=68]="DELETE",i[i.END=69]="END",i[i.HELP=70]="HELP",i[i.HOME=71]="HOME",i[i.INSERT=72]="INSERT",i[i.PAGE_DOWN=73]="PAGE_DOWN",i[i.PAGE_UP=74]="PAGE_UP",i[i.DOWN=75]="DOWN",i[i.LEFT=76]="LEFT",i[i.RIGHT=77]="RIGHT",i[i.UP=78]="UP",i[i.NUM_LOCK=79]="NUM_LOCK",i[i.KP_0=80]="KP_0",i[i.KP_1=81]="KP_1",i[i.KP_2=82]="KP_2",i[i.KP_3=83]="KP_3",i[i.KP_4=84]="KP_4",i[i.KP_5=85]="KP_5",i[i.KP_6=86]="KP_6",i[i.KP_7=87]="KP_7",i[i.KP_8=88]="KP_8",i[i.KP_9=89]="KP_9",i[i.KP_PLUS=90]="KP_PLUS",i[i.KP_BACKSPACE=91]="KP_BACKSPACE",i[i.KP_CLEAR=92]="KP_CLEAR",i[i.KP_CLEAR_ENTRY=93]="KP_CLEAR_ENTRY",i[i.KP_COMMA=94]="KP_COMMA",i[i.KP_PERIOD=95]="KP_PERIOD",i[i.KP_DIVIDE=96]="KP_DIVIDE",i[i.KP_ENTER=97]="KP_ENTER",i[i.KP_EQUAL=98]="KP_EQUAL",i[i.KP_MEMORY_ADD=99]="KP_MEMORY_ADD",i[i.KP_MEMORY_CLEAR=100]="KP_MEMORY_CLEAR",i[i.KP_MEMORY_RECALL=101]="KP_MEMORY_RECALL",i[i.KP_MEMORY_STORE=102]="KP_MEMORY_STORE",i[i.KP_MEMORY_SUBTRACT=103]="KP_MEMORY_SUBTRACT",i[i.KP_MULTIPLY=104]="KP_MULTIPLY",i[i.KP_PAREN_LEFT=105]="KP_PAREN_LEFT",i[i.KP_PAREN_RIGHT=106]="KP_PAREN_RIGHT",i[i.KP_MINUS=107]="KP_MINUS",i[i.KP_SEPARATOR=108]="KP_SEPARATOR",i[i.NUMPAD_UP=109]="NUMPAD_UP",i[i.NUMPAD_DOWN=110]="NUMPAD_DOWN",i[i.NUMPAD_RIGHT=111]="NUMPAD_RIGHT",i[i.NUMPAD_LEFT=112]="NUMPAD_LEFT",i[i.NUMPAD_BEGIN=113]="NUMPAD_BEGIN",i[i.NUMPAD_HOME=114]="NUMPAD_HOME",i[i.NUMPAD_END=115]="NUMPAD_END",i[i.NUMPAD_INSERT=116]="NUMPAD_INSERT",i[i.NUMPAD_DELETE=117]="NUMPAD_DELETE",i[i.NUMPAD_PAGE_UP=118]="NUMPAD_PAGE_UP",i[i.NUMPAD_PAGE_DOWN=119]="NUMPAD_PAGE_DOWN",i[i.ESCAPE=120]="ESCAPE",i[i.F1=121]="F1",i[i.F2=122]="F2",i[i.F3=123]="F3",i[i.F4=124]="F4",i[i.F5=125]="F5",i[i.F6=126]="F6",i[i.F7=127]="F7",i[i.F8=128]="F8",i[i.F9=129]="F9",i[i.F10=130]="F10",i[i.F11=131]="F11",i[i.F12=132]="F12",i[i.F13=133]="F13",i[i.F14=134]="F14",i[i.F15=135]="F15",i[i.F16=136]="F16",i[i.F17=137]="F17",i[i.F18=138]="F18",i[i.F19=139]="F19",i[i.F20=140]="F20",i[i.F21=141]="F21",i[i.F22=142]="F22",i[i.F23=143]="F23",i[i.F24=144]="F24",i[i.F25=145]="F25",i[i.FN_LOCK=146]="FN_LOCK",i[i.PRINT_SCREEN=147]="PRINT_SCREEN",i[i.SCROLL_LOCK=148]="SCROLL_LOCK",i[i.PAUSE=149]="PAUSE",i[i.BROWSER_BACK=150]="BROWSER_BACK",i[i.BROWSER_FAVORITES=151]="BROWSER_FAVORITES",i[i.BROWSER_FORWARD=152]="BROWSER_FORWARD",i[i.BROWSER_HOME=153]="BROWSER_HOME",i[i.BROWSER_REFRESH=154]="BROWSER_REFRESH",i[i.BROWSER_SEARCH=155]="BROWSER_SEARCH",i[i.BROWSER_STOP=156]="BROWSER_STOP",i[i.EJECT=157]="EJECT",i[i.LAUNCH_APP_1=158]="LAUNCH_APP_1",i[i.LAUNCH_APP_2=159]="LAUNCH_APP_2",i[i.LAUNCH_MAIL=160]="LAUNCH_MAIL",i[i.MEDIA_PLAY_PAUSE=161]="MEDIA_PLAY_PAUSE",i[i.MEDIA_SELECT=162]="MEDIA_SELECT",i[i.MEDIA_STOP=163]="MEDIA_STOP",i[i.MEDIA_TRACK_NEXT=164]="MEDIA_TRACK_NEXT",i[i.MEDIA_TRACK_PREVIOUS=165]="MEDIA_TRACK_PREVIOUS",i[i.POWER=166]="POWER",i[i.SLEEP=167]="SLEEP",i[i.AUDIO_VOLUME_DOWN=168]="AUDIO_VOLUME_DOWN",i[i.AUDIO_VOLUME_MUTE=169]="AUDIO_VOLUME_MUTE",i[i.AUDIO_VOLUME_UP=170]="AUDIO_VOLUME_UP",i[i.WAKE_UP=171]="WAKE_UP",i[i.COPY=172]="COPY",i[i.CUT=173]="CUT",i[i.PASTE=174]="PASTE",i))(h||{}),C=(i=>(i[i.NONE=0]="NONE",i[i.SHIFT=1]="SHIFT",i[i.CTRL=2]="CTRL",i[i.ALT=4]="ALT",i[i.SUPER=8]="SUPER",i[i.CAPSLOCK=16]="CAPSLOCK",i[i.NUMLOCK=32]="NUMLOCK",i))(C||{}),D=(i=>(i[i.NONE=0]="NONE",i[i.PARTIAL=1]="PARTIAL",i[i.FULL=2]="FULL",i))(D||{});const U=80;var S=(i=>(i[i.BOLD=1]="BOLD",i[i.ITALIC=2]="ITALIC",i[i.UNDERLINE=4]="UNDERLINE",i[i.STRIKETHROUGH=8]="STRIKETHROUGH",i[i.INVERSE=16]="INVERSE",i[i.INVISIBLE=32]="INVISIBLE",i[i.BLINK=64]="BLINK",i[i.FAINT=128]="FAINT",i))(S||{});class k{constructor(t){this.exports=t.exports,this.memory=this.exports.memory}createKeyEncoder(){return new Y(this.exports)}createTerminal(t=80,e=24,s){return new V(this.exports,this.memory,t,e,s)}static async load(t){if(t)return k.loadFromPath(t);const e=new URL("../ghostty-vt.wasm",self.location),s=[];if(e.protocol==="file:"){let o=e.pathname;o.match(/^\/[A-Za-z]:\//)&&(o=o.slice(1)),s.push(o)}s.push(e.href,"./ghostty-vt.wasm","/ghostty-vt.wasm");let r=null;for(const o of s)try{return await k.loadFromPath(o)}catch(n){r=n instanceof Error?n:new Error(String(n))}throw r||new Error("Failed to load Ghostty WASM")}static async loadFromPath(t){let e;if(typeof Bun<"u"&&typeof Bun.file=="function")try{const o=Bun.file(t);await o.exists()&&(e=await o.arrayBuffer())}catch{}if(!e)try{const n=await(await Promise.resolve().then(()=>mt)).readFile(t);e=n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength)}catch{}if(!e){const o=await fetch(t);if(!o.ok)throw new Error(`Failed to fetch WASM: ${o.status} ${o.statusText}`);if(e=await o.arrayBuffer(),e.byteLength===0)throw new Error(`WASM file is empty (0 bytes). Check path: ${t}`)}if(!e)throw new Error(`Could not load WASM from path: ${t}`);const s=await WebAssembly.compile(e),r=await WebAssembly.instantiate(s,{env:{log:(o,n)=>{const a=new Uint8Array(r.exports.memory.buffer,o,n);console.log("[ghostty-vt]",new TextDecoder().decode(a))}}});return new k(r)}}class Y{constructor(t){this.encoder=0,this.exports=t;const e=this.exports.ghostty_wasm_alloc_opaque(),s=this.exports.ghostty_key_encoder_new(0,e);if(s!==0)throw new Error(`Failed to create key encoder: ${s}`);const r=new DataView(this.exports.memory.buffer);this.encoder=r.getUint32(e,!0),this.exports.ghostty_wasm_free_opaque(e)}setOption(t,e){const s=this.exports.ghostty_wasm_alloc_u8();new DataView(this.exports.memory.buffer).setUint8(s,typeof e=="boolean"?e?1:0:e),this.exports.ghostty_key_encoder_setopt(this.encoder,t,s),this.exports.ghostty_wasm_free_u8(s)}setKittyFlags(t){this.setOption(x.KITTY_KEYBOARD_FLAGS,t)}encode(t){const e=this.exports.ghostty_wasm_alloc_opaque(),s=this.exports.ghostty_key_event_new(0,e);if(s!==0)throw new Error(`Failed to create key event: ${s}`);const r=new DataView(this.exports.memory.buffer),o=r.getUint32(e,!0);if(this.exports.ghostty_wasm_free_opaque(e),this.exports.ghostty_key_event_set_action(o,t.action),this.exports.ghostty_key_event_set_key(o,t.key),this.exports.ghostty_key_event_set_mods(o,t.mods),t.utf8){const w=new TextEncoder().encode(t.utf8),d=this.exports.ghostty_wasm_alloc_u8_array(w.length);new Uint8Array(this.exports.memory.buffer).set(w,d),this.exports.ghostty_key_event_set_utf8(o,d,w.length),this.exports.ghostty_wasm_free_u8_array(d,w.length)}const n=32,a=this.exports.ghostty_wasm_alloc_u8_array(n),l=this.exports.ghostty_wasm_alloc_usize(),c=this.exports.ghostty_key_encoder_encode(this.encoder,o,a,n,l);if(c!==0)throw this.exports.ghostty_wasm_free_u8_array(a,n),this.exports.ghostty_wasm_free_usize(l),this.exports.ghostty_key_event_free(o),new Error(`Failed to encode key: ${c}`);const u=r.getUint32(l,!0),m=new Uint8Array(this.exports.memory.buffer,a,u).slice();return this.exports.ghostty_wasm_free_u8_array(a,n),this.exports.ghostty_wasm_free_usize(l),this.exports.ghostty_key_event_free(o),m}dispose(){this.encoder&&(this.exports.ghostty_key_encoder_free(this.encoder),this.encoder=0)}}const W=class R{constructor(t,e,s=80,r=24,o){var n;if(this.viewportBufferPtr=0,this.viewportBufferSize=0,this.cellPool=[],this.graphemeBuffer=null,this.graphemeBufferPtr=0,this.exports=t,this.memory=e,this._cols=s,this._rows=r,o){const a=this.exports.ghostty_wasm_alloc_u8_array(U);if(a===0)throw new Error("Failed to allocate config (out of memory)");try{const l=new DataView(this.memory.buffer);let c=a;l.setUint32(c,o.scrollbackLimit??1e4,!0),c+=4,l.setUint32(c,o.fgColor??0,!0),c+=4,l.setUint32(c,o.bgColor??0,!0),c+=4,l.setUint32(c,o.cursorColor??0,!0),c+=4;for(let u=0;u<16;u++)l.setUint32(c,((n=o.palette)==null?void 0:n[u])??0,!0),c+=4;this.handle=this.exports.ghostty_terminal_new_with_config(s,r,a)}finally{this.exports.ghostty_wasm_free_u8_array(a,U)}}else this.handle=this.exports.ghostty_terminal_new(s,r);if(!this.handle)throw new Error("Failed to create terminal");this.initCellPool()}get cols(){return this._cols}get rows(){return this._rows}write(t){const e=typeof t=="string"?new TextEncoder().encode(t):t,s=this.exports.ghostty_wasm_alloc_u8_array(e.length);new Uint8Array(this.memory.buffer).set(e,s),this.exports.ghostty_terminal_write(this.handle,s,e.length),this.exports.ghostty_wasm_free_u8_array(s,e.length)}resize(t,e){t===this._cols&&e===this._rows||(this._cols=t,this._rows=e,this.exports.ghostty_terminal_resize(this.handle,t,e),this.invalidateBuffers(),this.initCellPool())}free(){this.viewportBufferPtr&&(this.exports.ghostty_wasm_free_u8_array(this.viewportBufferPtr,this.viewportBufferSize),this.viewportBufferPtr=0),this.exports.ghostty_terminal_free(this.handle)}update(){return this.exports.ghostty_render_state_update(this.handle)}getCursor(){return this.update(),{x:this.exports.ghostty_render_state_get_cursor_x(this.handle),y:this.exports.ghostty_render_state_get_cursor_y(this.handle),viewportX:this.exports.ghostty_render_state_get_cursor_x(this.handle),viewportY:this.exports.ghostty_render_state_get_cursor_y(this.handle),visible:this.exports.ghostty_render_state_get_cursor_visible(this.handle),blinking:!1,style:"block"}}getColors(){const t=this.exports.ghostty_render_state_get_bg_color(this.handle),e=this.exports.ghostty_render_state_get_fg_color(this.handle);return{background:{r:t>>16&255,g:t>>8&255,b:t&255},foreground:{r:e>>16&255,g:e>>8&255,b:e&255},cursor:null}}isRowDirty(t){return this.exports.ghostty_render_state_is_row_dirty(this.handle,t)}markClean(){this.exports.ghostty_render_state_mark_clean(this.handle)}getViewport(){const t=this._cols*this._rows,e=t*R.CELL_SIZE;return(!this.viewportBufferPtr||this.viewportBufferSize=this._rows)return null;this.update();const e=this.getViewport(),s=t*this._cols;return e.slice(s,s+this._cols).map(r=>({...r}))}isDirty(){return this.update()!==D.NONE}needsFullRedraw(){return this.update()===D.FULL}clearDirty(){this.markClean()}isAlternateScreen(){return!!this.exports.ghostty_terminal_is_alternate_screen(this.handle)}hasBracketedPaste(){return this.getMode(2004,!1)}hasFocusEvents(){return this.getMode(1004,!1)}hasMouseTracking(){return this.exports.ghostty_terminal_has_mouse_tracking(this.handle)!==0}getDimensions(){return{cols:this._cols,rows:this._rows}}getScrollbackLength(){return this.exports.ghostty_terminal_get_scrollback_length(this.handle)}getScrollbackLine(t){const e=this._cols*R.CELL_SIZE;(!this.viewportBufferPtr||this.viewportBufferSize(this.listeners.push(t),{dispose:()=>{const e=this.listeners.indexOf(t);e>=0&&this.listeners.splice(e,1)}})}fire(t){for(const e of this.listeners)e(t)}dispose(){this.listeners=[]}}class it{constructor(t){this.bufferChangeEmitter=new v,this.terminal=t}get active(){const t=this.terminal.wasmTerm;return t?t.isAlternateScreen()?this.alternate:this.normal:this.normal}get normal(){return this._normalBuffer||(this._normalBuffer=new G(this.terminal,"normal")),this._normalBuffer}get alternate(){return this._alternateBuffer||(this._alternateBuffer=new G(this.terminal,"alternate")),this._alternateBuffer}get onBufferChange(){return this.bufferChangeEmitter.event}_fireBufferChange(t){this.bufferChangeEmitter.fire(t)}}class G{constructor(t,e){this.terminal=t,this.bufferType=e;const s={codepoint:0,fg_r:204,fg_g:204,fg_b:204,bg_r:0,bg_g:0,bg_b:0,flags:0,width:1,hyperlink_id:0,grapheme_len:0};this.nullCell=new N(s,0)}get type(){return this.bufferType}get cursorX(){const t=this.getWasmTerm();return t?t.getCursor().x:0}get cursorY(){const t=this.getWasmTerm();return t?t.getCursor().y:0}get viewportY(){return 0}get baseY(){return 0}get length(){const t=this.getWasmTerm();return t?this.bufferType==="alternate"?t.rows:t.getScrollbackLength()+t.rows:0}getLine(t){const e=this.getWasmTerm();if(!e||t<0||t>=this.length)return;const s=e.getScrollbackLength();let r,o,n;if(this.bufferType==="normal"&&t=this._length))return t>=this.cells.length?new N({codepoint:0,fg_r:204,fg_g:204,fg_b:204,bg_r:0,bg_g:0,bg_b:0,flags:0,width:1,hyperlink_id:0,grapheme_len:0},t):new N(this.cells[t],t)}translateToString(t=!1,e=0,s=this._length){const r=Math.max(0,Math.min(e,this._length)),o=Math.max(r,Math.min(s,this._length));let n="";for(let a=r;a1114111||t>=55296&&t<=57343?"�":String.fromCodePoint(t)}getCode(){return this.cell.codepoint}getWidth(){return this.cell.width}getFgColorMode(){return-1}getBgColorMode(){return-1}getFgColor(){return this.cell.fg_r<<16|this.cell.fg_g<<8|this.cell.fg_b}getBgColor(){return this.cell.bg_r<<16|this.cell.bg_g<<8|this.cell.bg_b}isBold(){return this.cell.flags&S.BOLD?1:0}isItalic(){return this.cell.flags&S.ITALIC?1:0}isUnderline(){return this.cell.flags&S.UNDERLINE?1:0}isStrikethrough(){return this.cell.flags&S.STRIKETHROUGH?1:0}isBlink(){return this.cell.flags&S.BLINK?1:0}isInverse(){return this.cell.flags&S.INVERSE?1:0}isInvisible(){return this.cell.flags&S.INVISIBLE?1:0}isFaint(){return this.cell.flags&S.FAINT?1:0}getHyperlinkId(){return this.cell.hyperlink_id}getCodepoint(){return this.cell.codepoint}isDim(){return(this.cell.flags&S.FAINT)!==0}}const ot={KeyA:h.A,KeyB:h.B,KeyC:h.C,KeyD:h.D,KeyE:h.E,KeyF:h.F,KeyG:h.G,KeyH:h.H,KeyI:h.I,KeyJ:h.J,KeyK:h.K,KeyL:h.L,KeyM:h.M,KeyN:h.N,KeyO:h.O,KeyP:h.P,KeyQ:h.Q,KeyR:h.R,KeyS:h.S,KeyT:h.T,KeyU:h.U,KeyV:h.V,KeyW:h.W,KeyX:h.X,KeyY:h.Y,KeyZ:h.Z,Digit1:h.ONE,Digit2:h.TWO,Digit3:h.THREE,Digit4:h.FOUR,Digit5:h.FIVE,Digit6:h.SIX,Digit7:h.SEVEN,Digit8:h.EIGHT,Digit9:h.NINE,Digit0:h.ZERO,Enter:h.ENTER,Escape:h.ESCAPE,Backspace:h.BACKSPACE,Tab:h.TAB,Space:h.SPACE,Minus:h.MINUS,Equal:h.EQUAL,BracketLeft:h.BRACKET_LEFT,BracketRight:h.BRACKET_RIGHT,Backslash:h.BACKSLASH,Semicolon:h.SEMICOLON,Quote:h.QUOTE,Backquote:h.GRAVE,Comma:h.COMMA,Period:h.PERIOD,Slash:h.SLASH,CapsLock:h.CAPS_LOCK,F1:h.F1,F2:h.F2,F3:h.F3,F4:h.F4,F5:h.F5,F6:h.F6,F7:h.F7,F8:h.F8,F9:h.F9,F10:h.F10,F11:h.F11,F12:h.F12,PrintScreen:h.PRINT_SCREEN,ScrollLock:h.SCROLL_LOCK,Pause:h.PAUSE,Insert:h.INSERT,Home:h.HOME,PageUp:h.PAGE_UP,Delete:h.DELETE,End:h.END,PageDown:h.PAGE_DOWN,ArrowRight:h.RIGHT,ArrowLeft:h.LEFT,ArrowDown:h.DOWN,ArrowUp:h.UP,NumLock:h.NUM_LOCK,NumpadDivide:h.KP_DIVIDE,NumpadMultiply:h.KP_MULTIPLY,NumpadSubtract:h.KP_MINUS,NumpadAdd:h.KP_PLUS,NumpadEnter:h.KP_ENTER,Numpad1:h.KP_1,Numpad2:h.KP_2,Numpad3:h.KP_3,Numpad4:h.KP_4,Numpad5:h.KP_5,Numpad6:h.KP_6,Numpad7:h.KP_7,Numpad8:h.KP_8,Numpad9:h.KP_9,Numpad0:h.KP_0,NumpadDecimal:h.KP_PERIOD,IntlBackslash:h.INTL_BACKSLASH,ContextMenu:h.CONTEXT_MENU,F13:h.F13,F14:h.F14,F15:h.F15,F16:h.F16,F17:h.F17,F18:h.F18,F19:h.F19,F20:h.F20,F21:h.F21,F22:h.F22,F23:h.F23,F24:h.F24},z=class P{constructor(t,e,s,r,o,n,a,l,c,u){this.keydownListener=null,this.keypressListener=null,this.pasteListener=null,this.beforeInputListener=null,this.compositionStartListener=null,this.compositionUpdateListener=null,this.compositionEndListener=null,this.mousedownListener=null,this.mouseupListener=null,this.mousemoveListener=null,this.wheelListener=null,this.isComposing=!1,this.isDisposed=!1,this.mouseButtonsPressed=0,this.lastKeyDownData=null,this.lastKeyDownTime=0,this.lastPasteData=null,this.lastPasteTime=0,this.lastPasteSource=null,this.lastCompositionData=null,this.lastCompositionTime=0,this.lastBeforeInputData=null,this.lastBeforeInputTime=0,this.encoder=t.createKeyEncoder(),this.container=e,this.inputElement=c,this.onDataCallback=s,this.onBellCallback=r,this.onKeyCallback=o,this.customKeyEventHandler=n,this.getModeCallback=a,this.onCopyCallback=l,this.mouseConfig=u,this.attach()}setCustomKeyEventHandler(t){this.customKeyEventHandler=t}attach(){typeof this.container.hasAttribute=="function"&&typeof this.container.setAttribute=="function"&&(this.container.hasAttribute("tabindex")||this.container.setAttribute("tabindex","0"),this.container.style&&(this.container.style.outline="none")),this.keydownListener=this.handleKeyDown.bind(this),this.container.addEventListener("keydown",this.keydownListener),this.pasteListener=this.handlePaste.bind(this),this.container.addEventListener("paste",this.pasteListener),this.inputElement&&this.inputElement!==this.container&&this.inputElement.addEventListener("paste",this.pasteListener),this.inputElement&&(this.beforeInputListener=this.handleBeforeInput.bind(this),this.inputElement.addEventListener("beforeinput",this.beforeInputListener)),this.compositionStartListener=this.handleCompositionStart.bind(this),this.container.addEventListener("compositionstart",this.compositionStartListener),this.compositionUpdateListener=this.handleCompositionUpdate.bind(this),this.container.addEventListener("compositionupdate",this.compositionUpdateListener),this.compositionEndListener=this.handleCompositionEnd.bind(this),this.container.addEventListener("compositionend",this.compositionEndListener),this.mousedownListener=this.handleMouseDown.bind(this),this.container.addEventListener("mousedown",this.mousedownListener),this.mouseupListener=this.handleMouseUp.bind(this),this.container.addEventListener("mouseup",this.mouseupListener),this.mousemoveListener=this.handleMouseMove.bind(this),this.container.addEventListener("mousemove",this.mousemoveListener),this.wheelListener=this.handleWheel.bind(this),this.container.addEventListener("wheel",this.wheelListener,{passive:!1})}mapKeyCode(t){return ot[t]??null}extractModifiers(t){let e=C.NONE;return t.shiftKey&&(e|=C.SHIFT),t.ctrlKey&&(e|=C.CTRL),t.altKey&&(e|=C.ALT),t.metaKey&&(e|=C.SUPER),e}isPrintableCharacter(t){return t.ctrlKey&&!t.altKey||t.altKey&&!t.ctrlKey||t.metaKey?!1:t.key.length===1}handleKeyDown(t){if(this.isDisposed||this.isComposing||t.isComposing||t.keyCode===229)return;if(this.onKeyCallback&&this.onKeyCallback({key:t.key,domEvent:t}),this.customKeyEventHandler&&this.customKeyEventHandler(t)){t.preventDefault();return}if((t.ctrlKey||t.metaKey)&&t.code==="KeyV")return;if(t.metaKey&&t.code==="KeyC"){this.onCopyCallback&&this.onCopyCallback()&&t.preventDefault();return}if(this.isPrintableCharacter(t)){t.preventDefault(),this.onDataCallback(t.key),this.recordKeyDownData(t.key);return}const e=this.mapKeyCode(t.code);if(e===null)return;const s=this.extractModifiers(t);if(s===C.NONE||s===C.SHIFT){let o=null;switch(e){case h.ENTER:o="\r";break;case h.TAB:s===C.SHIFT?o="\x1B[Z":o=" ";break;case h.BACKSPACE:o="";break;case h.ESCAPE:o="\x1B";break;case h.HOME:o="\x1B[H";break;case h.END:o="\x1B[F";break;case h.INSERT:o="\x1B[2~";break;case h.DELETE:o="\x1B[3~";break;case h.PAGE_UP:o="\x1B[5~";break;case h.PAGE_DOWN:o="\x1B[6~";break;case h.F1:o="\x1BOP";break;case h.F2:o="\x1BOQ";break;case h.F3:o="\x1BOR";break;case h.F4:o="\x1BOS";break;case h.F5:o="\x1B[15~";break;case h.F6:o="\x1B[17~";break;case h.F7:o="\x1B[18~";break;case h.F8:o="\x1B[19~";break;case h.F9:o="\x1B[20~";break;case h.F10:o="\x1B[21~";break;case h.F11:o="\x1B[23~";break;case h.F12:o="\x1B[24~";break}if(o!==null){t.preventDefault(),this.onDataCallback(o),this.recordKeyDownData(o);return}}const r=y.PRESS;try{if(this.getModeCallback){const c=this.getModeCallback(1);this.encoder.setOption(x.CURSOR_KEY_APPLICATION,c)}const o=t.key.length===1&&t.key.charCodeAt(0)<128?t.key.toLowerCase():void 0,n=this.encoder.encode({action:r,key:e,mods:s,utf8:o}),l=new TextDecoder().decode(n);t.preventDefault(),t.stopPropagation(),l.length>0&&(this.onDataCallback(l),this.recordKeyDownData(l))}catch(o){console.warn("Failed to encode key:",t.code,o)}}handlePaste(t){if(this.isDisposed)return;t.preventDefault(),t.stopPropagation();const e=t.clipboardData;if(!e){console.warn("No clipboard data available");return}const s=e.getData("text/plain");if(!s){console.warn("No text in clipboard");return}this.shouldIgnorePasteEvent(s,"paste")||(this.emitPasteData(s),this.recordPasteData(s,"paste"))}handleBeforeInput(t){if(this.isDisposed||this.isComposing||t.isComposing)return;const e=t.inputType,s=t.data??"";let r=null;switch(e){case"insertText":case"insertReplacementText":r=s.length>0?s.replace(/\n/g,"\r"):null;break;case"insertLineBreak":case"insertParagraph":r="\r";break;case"deleteContentBackward":r="";break;case"deleteContentForward":r="\x1B[3~";break;case"insertFromPaste":if(!s)return;if(this.shouldIgnorePasteEvent(s,"beforeinput")){t.preventDefault(),t.stopPropagation();return}t.preventDefault(),t.stopPropagation(),this.emitPasteData(s),this.recordPasteData(s,"beforeinput");return;default:return}if(r){if(this.shouldIgnoreBeforeInput(r)){t.preventDefault(),t.stopPropagation();return}if(s&&this.shouldIgnoreBeforeInputFromComposition(s)){t.preventDefault(),t.stopPropagation();return}t.preventDefault(),t.stopPropagation(),this.onDataCallback(r),s&&this.recordBeforeInputData(s)}}handleCompositionStart(t){this.isDisposed||(this.isComposing=!0)}handleCompositionUpdate(t){this.isDisposed}handleCompositionEnd(t){if(this.isDisposed)return;this.isComposing=!1;const e=t.data;if(e&&e.length>0){if(this.shouldIgnoreCompositionEnd(e)){this.cleanupCompositionTextNodes();return}this.onDataCallback(e),this.recordCompositionData(e)}this.cleanupCompositionTextNodes()}cleanupCompositionTextNodes(){if(this.container&&this.container.childNodes)for(let t=this.container.childNodes.length-1;t>=0;t--){const e=this.container.childNodes[t];e.nodeType===3&&this.container.removeChild(e)}}pixelToCell(t){if(!this.mouseConfig)return null;const e=this.mouseConfig.getCellDimensions(),s=this.mouseConfig.getCanvasOffset();if(e.width<=0||e.height<=0)return null;const r=t.clientX-s.left,o=t.clientY-s.top,n=Math.floor(r/e.width)+1,a=Math.floor(o/e.height)+1;return{col:Math.max(1,n),row:Math.max(1,a)}}getMouseModifiers(t){let e=0;return t.shiftKey&&(e|=4),t.metaKey&&(e|=8),t.ctrlKey&&(e|=16),e}encodeMouseSGR(t,e,s,r,o){return`\x1B[<${t+o};${e};${s}${r?"m":"M"}`}encodeMouseX10(t,e,s,r){const o=t+r+32,n=String.fromCharCode(Math.min(e+32,255)),a=String.fromCharCode(Math.min(s+32,255));return`\x1B[M${String.fromCharCode(o)}${n}${a}`}sendMouseEvent(t,e,s,r,o){var c,u;const n=this.getMouseModifiers(o),a=((u=(c=this.mouseConfig)==null?void 0:c.hasSgrMouseMode)==null?void 0:u.call(c))??!0;let l;if(a)l=this.encodeMouseSGR(t,e,s,r,n);else{const m=r?3:t;l=this.encodeMouseX10(m,e,s,n)}this.onDataCallback(l)}handleMouseDown(t){var r;if(this.isDisposed||!((r=this.mouseConfig)!=null&&r.hasMouseTracking()))return;const e=this.pixelToCell(t);if(!e)return;const s=t.button;this.mouseButtonsPressed|=1<=s.length||!s.getCell(t))){for(const o of this.linkCache.values())if(this.isPositionInLink(t,e,o))return o;this.scannedRows.has(e)||await this.scanRow(e);for(const o of this.linkCache.values())if(this.isPositionInLink(t,e,o))return o}}async scanRow(t){this.scannedRows.add(t);const e=[];for(const s of this.providers){const r=await new Promise(o=>{s.provideLinks(t,o)});r&&e.push(...r)}for(const s of e)this.cacheLink(s)}cacheLink(t){const{start:e,end:s}=t.range,r=`r${e.y}:${e.x}-${s.x}`;this.linkCache.has(r)||this.linkCache.set(r,t)}isPositionInLink(t,e,s){const{start:r,end:o}=s.range;return eo.y?!1:r.y===o.y?t>=r.x&&t<=o.x:e===r.y?t>=r.x:e===o.y?t<=o.x:!0}invalidateCache(){this.linkCache.clear(),this.scannedRows.clear()}invalidateRows(t,e){for(let r=t;r<=e;r++)this.scannedRows.delete(r);const s=[];for(const[r,o]of this.linkCache.entries()){const{start:n,end:a}=o.range;(n.y>=t&&n.y<=e||a.y>=t&&a.y<=e||n.ye)&&s.push(r)}for(const r of s)this.linkCache.delete(r)}dispose(){var t;this.linkCache.clear(),this.scannedRows.clear();for(const e of this.providers)(t=e.dispose)==null||t.call(e);this.providers=[]}}class q{constructor(t){this.terminal=t}provideLinks(t,e){const s=[],r=new Set,o=this.terminal.buffer.active.getLine(t);if(!o){e(void 0);return}for(let n=0;n{(d.ctrlKey||d.metaKey)&&window.open(m,"_blank","noopener,noreferrer")}})}}e(s.length>0?s:void 0)}findLinkRange(t,e,s){const r=this.terminal.buffer.active;let o=e,n=s;for(;n>0;){const u=r.getLine(o);if(!u)break;const m=u.getCell(n-1);if(!m||m.getHyperlinkId()!==t)break;n--}if(n===0&&o>0){let u=o-1;for(;u>=0;){const m=r.getLine(u);if(!m||m.length===0)break;const g=m.getCell(m.length-1);if(!g||g.getHyperlinkId()!==t)break;o=u,n=0;for(let w=m.length-1;w>=0;w--){const d=m.getCell(w);if(!d||d.getHyperlinkId()!==t){n=w+1;break}}if(n===0)u--;else break}}let a=e,l=s;const c=r.getLine(a);if(c){for(;l8&&s.push({text:a,range:{start:{x:l,y:t},end:{x:c,y:t}},activate:m=>{(m.ctrlKey||m.metaKey)&&window.open(a,"_blank","noopener,noreferrer")}}),n=M.URL_REGEX.exec(o)}e(s.length>0?s:void 0)}lineToText(t){const e=[];for(let s=0;s0){for(const E of f)g.add(E);this.selectionManager.clearDirtySelectionRows()}}const w=new Set,d=this.hoveredHyperlinkId!==this.previousHoveredHyperlinkId,p=JSON.stringify(this.hoveredLinkRange)!==JSON.stringify(this.previousHoveredLinkRange);if(d){for(let f=0;f0)if(f0?!0:e||t.isRowDirty(f)||g.has(f)||w.has(f))&&(_.add(f),f>0&&_.add(f-1),f0)if(f0?f-Math.floor(s):f;E=t.getLine(T)}else E=t.getLine(f);E&&this.renderLine(E,f,a.cols)}s===0&&n.visible&&this.cursorVisible&&this.renderCursor(n.x,n.y),r&&o>0&&this.renderScrollbar(s,l,a.rows,o),this.lastCursorPosition={x:n.x,y:n.y},t.clearDirty()}renderLine(t,e,s){const r=e*this.metrics.height,o=s*this.metrics.width;this.ctx.clearRect(0,r,o,this.metrics.height),this.ctx.fillStyle=this.theme.background,this.ctx.fillRect(0,r,o,this.metrics.height);for(let n=0;n0&&((w=this.currentBuffer)!=null&&w.getGraphemeString)?g=this.currentBuffer.getGraphemeString(s,e):g=String.fromCodePoint(t.codepoint||32),this.ctx.fillText(g,u,m),t.flags&S.FAINT&&(this.ctx.globalAlpha=1),t.flags&S.UNDERLINE){const d=n+this.metrics.baseline+2;this.ctx.strokeStyle=this.ctx.fillStyle,this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(o,d),this.ctx.lineTo(o+a,d),this.ctx.stroke()}if(t.flags&S.STRIKETHROUGH){const d=n+this.metrics.height/2;this.ctx.strokeStyle=this.ctx.fillStyle,this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(o,d),this.ctx.lineTo(o+a,d),this.ctx.stroke()}if(t.hyperlink_id>0&&t.hyperlink_id===this.hoveredHyperlinkId){const p=n+this.metrics.baseline+2;this.ctx.strokeStyle="#4A90E2",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(o,p),this.ctx.lineTo(o+a,p),this.ctx.stroke()}if(this.hoveredLinkRange){const d=this.hoveredLinkRange;if(s===d.startY&&e>=d.startX&&(sd.startY&&sd.startY||e>=d.startX)){const _=n+this.metrics.baseline+2;this.ctx.strokeStyle="#4A90E2",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(o,_),this.ctx.lineTo(o+a,_),this.ctx.stroke()}}}renderCursor(t,e){var o;const s=t*this.metrics.width,r=e*this.metrics.height;switch(this.ctx.fillStyle=this.theme.cursor,this.cursorStyle){case"block":this.ctx.fillRect(s,r,this.metrics.width,this.metrics.height);{const l=(o=this.currentBuffer)==null?void 0:o.getLine(e);l!=null&&l[t]&&(this.ctx.save(),this.ctx.beginPath(),this.ctx.rect(s,r,this.metrics.width,this.metrics.height),this.ctx.clip(),this.renderCellText(l[t],t,e,this.theme.cursorAccent),this.ctx.restore())}break;case"underline":const n=Math.max(2,Math.floor(this.metrics.height*.15));this.ctx.fillRect(s,r+this.metrics.height-n,this.metrics.width,n);break;case"bar":const a=Math.max(2,Math.floor(this.metrics.width*.15));this.ctx.fillRect(s,r,a,this.metrics.height);break}}startCursorBlink(){this.cursorBlinkInterval=window.setInterval(()=>{this.cursorVisible=!this.cursorVisible},530)}stopCursorBlink(){this.cursorBlinkInterval!==void 0&&(clearInterval(this.cursorBlinkInterval),this.cursorBlinkInterval=void 0),this.cursorVisible=!0}setTheme(t){this.theme={...H,...t},this.palette=[this.theme.black,this.theme.red,this.theme.green,this.theme.yellow,this.theme.blue,this.theme.magenta,this.theme.cyan,this.theme.white,this.theme.brightBlack,this.theme.brightRed,this.theme.brightGreen,this.theme.brightYellow,this.theme.brightBlue,this.theme.brightMagenta,this.theme.brightCyan,this.theme.brightWhite]}setFontSize(t){this.fontSize=t,this.metrics=this.measureFont()}setFontFamily(t){this.fontFamily=t,this.metrics=this.measureFont()}setCursorStyle(t){this.cursorStyle=t}setCursorBlink(t){t&&!this.cursorBlink?(this.cursorBlink=!0,this.startCursorBlink()):!t&&this.cursorBlink&&(this.cursorBlink=!1,this.stopCursorBlink())}renderScrollbar(t,e,s,r=1){const o=this.ctx,n=this.canvas.height/this.devicePixelRatio,a=this.canvas.width/this.devicePixelRatio,l=8,c=a-l-4,u=4,m=n-u*2;if(o.clearRect(c-2,0,l+6,n),o.fillStyle=this.theme.background,o.fillRect(c-2,0,l+6,n),r<=0||e===0)return;const g=e+s,w=Math.max(20,s/g*m),d=t/e,p=u+(m-w)*(1-d);o.fillStyle=`rgba(128, 128, 128, ${.1*r})`,o.fillRect(c,u,l,m);const L=t>0?.5:.3;o.fillStyle=`rgba(128, 128, 128, ${L*r})`,o.fillRect(c,p,l,w)}getMetrics(){return{...this.metrics}}getCanvas(){return this.canvas}setSelectionManager(t){this.selectionManager=t}isInSelection(t,e){const s=this.currentSelectionCoords;if(!s)return!1;const{startCol:r,startRow:o,endCol:n,endRow:a}=s;return o===a?e===o&&t>=r&&t<=n:e===o?t>=r:e===a?t<=n:e>o&&er||e===r&&t>s)&&([t,s]=[s,t],[e,r]=[r,e]);const o=this.wasmTerm.getScrollbackLength();let n="";for(let a=e;a<=r;a++){let l=null;if(a0)if(a=0?g=g.substring(0,c):g="",n+=g,a=r.cols;)n-=r.cols,o++;o=Math.min(o,r.rows-1);const a=this.getViewportY();this.selectionStart={col:t,absoluteRow:a+e},this.selectionEnd={col:n,absoluteRow:a+o},this.requestRender(),this.selectionChangedEmitter.fire()}selectLines(t,e){const s=this.wasmTerm.getDimensions();t=Math.max(0,Math.min(t,s.rows-1)),e=Math.max(0,Math.min(e,s.rows-1)),t>e&&([t,e]=[e,t]),this.selectionStart={col:0,absoluteRow:this.viewportRowToAbsolute(t)},this.selectionEnd={col:s.cols-1,absoluteRow:this.viewportRowToAbsolute(e)},this.requestRender(),this.selectionChangedEmitter.fire()}getSelectionPosition(){const t=this.normalizeSelection();if(t)return{start:{x:t.startCol,y:t.startRow},end:{x:t.endCol,y:t.endRow}}}deselect(){this.clearSelection(),this.selectionChangedEmitter.fire()}focus(){const t=this.renderer.getCanvas();t.parentElement&&t.parentElement.focus()}getSelectionCoords(){return this.normalizeSelection()}getDirtySelectionRows(){return this.dirtySelectionRows}clearDirtySelectionRows(){this.dirtySelectionRows.clear()}get onSelectionChange(){return this.selectionChangedEmitter.event}dispose(){this.selectionChangedEmitter.dispose(),this.stopAutoScroll(),this.boundMouseUpHandler&&(document.removeEventListener("mouseup",this.boundMouseUpHandler),this.boundMouseUpHandler=null),this.boundDocumentMouseMoveHandler&&(document.removeEventListener("mousemove",this.boundDocumentMouseMoveHandler),this.boundDocumentMouseMoveHandler=null),this.boundContextMenuHandler&&(this.renderer.getCanvas().removeEventListener("contextmenu",this.boundContextMenuHandler),this.boundContextMenuHandler=null),this.boundClickHandler&&(document.removeEventListener("click",this.boundClickHandler),this.boundClickHandler=null)}attachEventListeners(){const t=this.renderer.getCanvas();t.addEventListener("mousedown",e=>{if(e.button===0){t.parentElement&&t.parentElement.focus();const s=this.pixelToCell(e.offsetX,e.offsetY);this.hasSelection()&&this.clearSelection();const o=this.viewportRowToAbsolute(s.row);this.selectionStart={col:s.col,absoluteRow:o},this.selectionEnd={col:s.col,absoluteRow:o},this.isSelecting=!0,this.mouseDownX=e.offsetX,this.mouseDownY=e.offsetY,this.dragThresholdMet=!1}}),t.addEventListener("mousemove",e=>{if(this.isSelecting){if(!this.dragThresholdMet){const o=e.offsetX-this.mouseDownX,n=e.offsetY-this.mouseDownY,a=this.renderer.getMetrics().width*.5;if(o*o+n*n{if(this.isSelecting){const s=t.getBoundingClientRect();e.clientYs.bottom&&this.startAutoScroll(1)}}),t.addEventListener("mouseenter",()=>{this.isSelecting&&this.stopAutoScroll()}),this.boundDocumentMouseMoveHandler=e=>{if(this.isSelecting){if(!this.dragThresholdMet){const l=e.clientX-(t.getBoundingClientRect().left+this.mouseDownX),c=e.clientY-(t.getBoundingClientRect().top+this.mouseDownY),u=this.renderer.getMetrics().width*.5;if(l*l+c*cs.right||e.clientYs.bottom)&&(e.clientYs.bottom?this.startAutoScroll(1):this.stopAutoScroll(),this.autoScrollDirection===0)){this.markCurrentSelectionDirty();const l=this.pixelToCell(n,a),c=this.viewportRowToAbsolute(l.row);this.selectionEnd={col:l.col,absoluteRow:c},this.requestRender()}}},document.addEventListener("mousemove",this.boundDocumentMouseMoveHandler),document.addEventListener("mousedown",e=>{this.mouseDownTarget=e.target}),this.boundMouseUpHandler=e=>{if(this.isSelecting){if(this.isSelecting=!1,this.stopAutoScroll(),!this.dragThresholdMet){this.clearSelection();return}if(this.hasSelection()){const s=this.getSelection();s&&(this.copyToClipboard(s),this.selectionChangedEmitter.fire())}}},document.addEventListener("mouseup",this.boundMouseUpHandler),t.addEventListener("click",e=>{if(e.detail===2){const s=this.pixelToCell(e.offsetX,e.offsetY),r=this.getWordAtCell(s.col,s.row);if(r){const o=this.viewportRowToAbsolute(s.row);this.selectionStart={col:r.startCol,absoluteRow:o},this.selectionEnd={col:r.endCol,absoluteRow:o},this.requestRender();const n=this.getSelection();n&&(this.copyToClipboard(n),this.selectionChangedEmitter.fire())}}else if(e.detail>=3){const s=this.pixelToCell(e.offsetX,e.offsetY),r=this.viewportRowToAbsolute(s.row),o=this.wasmTerm.getScrollbackLength();let n=null;if(r=0;l--)if(n[l]&&n[l].codepoint!==0&&n[l].codepoint!==32){a=l;break}}if(a>=0){this.selectionStart={col:0,absoluteRow:r},this.selectionEnd={col:a,absoluteRow:r},this.requestRender();const l=this.getSelection();l&&(this.copyToClipboard(l),this.selectionChangedEmitter.fire())}}}),this.boundContextMenuHandler=e=>{if(this.renderer.getCanvas().getBoundingClientRect(),this.textarea.style.position="fixed",this.textarea.style.left=`${e.clientX}px`,this.textarea.style.top=`${e.clientY}px`,this.textarea.style.width="1px",this.textarea.style.height="1px",this.textarea.style.zIndex="1000",this.textarea.style.opacity="0",this.textarea.style.pointerEvents="auto",this.hasSelection()){const r=this.getSelection();this.textarea.value=r,this.textarea.select(),this.textarea.setSelectionRange(0,r.length)}else this.textarea.value="";this.textarea.focus(),setTimeout(()=>{const r=()=>{this.textarea.style.pointerEvents="none",this.textarea.style.zIndex="-10",this.textarea.style.width="0",this.textarea.style.height="0",this.textarea.style.left="0",this.textarea.style.top="0",this.textarea.value="",document.removeEventListener("click",r),document.removeEventListener("contextmenu",r),this.textarea.removeEventListener("blur",r)};document.addEventListener("click",r,{once:!0}),document.addEventListener("contextmenu",r,{once:!0}),this.textarea.addEventListener("blur",r,{once:!0})},10)},t.addEventListener("contextmenu",this.boundContextMenuHandler),this.boundClickHandler=e=>{if(this.isSelecting||this.mouseDownTarget&&t.contains(this.mouseDownTarget))return;const r=e.target;t.contains(r)||this.hasSelection()&&this.clearSelection()},document.addEventListener("click",this.boundClickHandler)}markCurrentSelectionDirty(){const t=this.normalizeSelection();if(t)for(let e=t.startRow;e<=t.endRow;e++)this.dirtySelectionRows.add(e)}updateAutoScroll(t,e){const s=O.AUTO_SCROLL_EDGE_SIZE;te-s?this.startAutoScroll(1):this.stopAutoScroll()}startAutoScroll(t){this.autoScrollInterval!==null&&this.autoScrollDirection===t||(this.stopAutoScroll(),this.autoScrollDirection=t,this.autoScrollInterval=setInterval(()=>{if(!this.isSelecting){this.stopAutoScroll();return}const e=O.AUTO_SCROLL_SPEED*this.autoScrollDirection;if(this.terminal.scrollLines(e),this.selectionEnd){const s=this.wasmTerm.getDimensions();if(this.autoScrollDirection<0){const r=this.viewportRowToAbsolute(0);rthis.selectionEnd.absoluteRow&&(this.selectionEnd={col:s.cols-1,absoluteRow:r})}}this.requestRender()},O.AUTO_SCROLL_INTERVAL))}stopAutoScroll(){this.autoScrollInterval!==null&&(clearInterval(this.autoScrollInterval),this.autoScrollInterval=null),this.autoScrollDirection=0}pixelToCell(t,e){const s=this.renderer.getMetrics(),r=Math.floor(t/s.width),o=Math.floor(e/s.height);return{col:Math.max(0,Math.min(r,this.terminal.cols-1)),row:Math.max(0,Math.min(o,this.terminal.rows-1))}}normalizeSelection(){if(!this.selectionStart||!this.selectionEnd)return null;let{col:t,absoluteRow:e}=this.selectionStart,{col:s,absoluteRow:r}=this.selectionEnd;(e>r||e===r&&t>s)&&([t,s]=[s,t],[e,r]=[r,e]);let o=this.absoluteRowToViewport(e),n=this.absoluteRowToViewport(r);const a=this.wasmTerm.getDimensions(),l=a.rows-1;return n<0||o>l?null:(o<0&&(o=0,t=0),n>l&&(n=l,s=a.cols-1),{startCol:t,startRow:o,endCol:s,endRow:n})}getWordAtCell(t,e){const s=this.viewportRowToAbsolute(e),r=this.wasmTerm.getScrollbackLength();let o;if(s{if(!c||c.codepoint===0)return!1;const u=String.fromCodePoint(c.codepoint);return/[\w\-./~@+]/.test(u)};if(!n(o[t]))return null;let a=t;for(;a>0&&n(o[a-1]);)a--;let l=t;for(;l{console.warn("ClipboardItem write failed, trying writeText:",r),this.copyWithWriteText(t)});return}catch{}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(t).catch(e=>{console.warn("Clipboard writeText failed, trying execCommand:",e),this.copyWithExecCommand(t)});return}this.copyWithExecCommand(t)}copyWithWriteText(t){navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(t).catch(e=>{console.warn("Clipboard writeText failed, trying execCommand:",e),this.copyWithExecCommand(t)}):this.copyWithExecCommand(t)}copyWithExecCommand(t){const e=document.activeElement;try{const s=this.textarea;s.value=t,s.style.position="fixed",s.style.left="-9999px",s.style.top="0",s.style.width="1px",s.style.height="1px",s.style.opacity="0",s.focus(),s.select(),s.setSelectionRange(0,t.length);const r=document.execCommand("copy");e&&e.focus(),r||console.warn("execCommand copy failed")}catch(s){console.warn("execCommand copy threw:",s),e&&e.focus()}}requestRender(){}};A.AUTO_SCROLL_EDGE_SIZE=30,A.AUTO_SCROLL_SPEED=3,A.AUTO_SCROLL_INTERVAL=50;let J=A;function j(i,t){const e=String(i||"").trim();if(!e)return t;if(e.startsWith("#")){const r=e.slice(1),o=r.length===3?r.split("").map(n=>n+n).join(""):r;if(/^[0-9a-fA-F]{6}$/.test(o)){const n=Number.parseInt(o,16);return{r:n>>16&255,g:n>>8&255,b:n&255}}}const s=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/i);return s?{r:Number.parseInt(s[1],10),g:Number.parseInt(s[2],10),b:Number.parseInt(s[3],10)}:t}function nt(i,t,e){const s=j(e.foreground,{r:212,g:212,b:212}),r=j(e.background,{r:30,g:30,b:30}),o={codepoint:32,fg_r:s.r,fg_g:s.g,fg_b:s.b,bg_r:r.r,bg_g:r.g,bg_b:r.b,flags:0,width:1,hyperlink_id:0,grapheme_len:0};return Array.from({length:t},()=>Array.from({length:i},()=>({...o})))}class at{constructor(t={}){this.unicode={get activeVersion(){return"15.1"}},this.dataEmitter=new v,this.resizeEmitter=new v,this.bellEmitter=new v,this.selectionChangeEmitter=new v,this.keyEmitter=new v,this.titleChangeEmitter=new v,this.scrollEmitter=new v,this.renderEmitter=new v,this.cursorMoveEmitter=new v,this.onData=this.dataEmitter.event,this.onResize=this.resizeEmitter.event,this.onBell=this.bellEmitter.event,this.onSelectionChange=this.selectionChangeEmitter.event,this.onKey=this.keyEmitter.event,this.onTitleChange=this.titleChangeEmitter.event,this.onScroll=this.scrollEmitter.event,this.onRender=this.renderEmitter.event,this.onCursorMove=this.cursorMoveEmitter.event,this.isOpen=!1,this.isDisposed=!1,this.writeQueue=[],this.addons=[],this.currentTitle="",this.viewportY=0,this.targetViewportY=0,this.lastCursorY=0,this.isDraggingScrollbar=!1,this.scrollbarDragStart=null,this.scrollbarDragStartViewportY=0,this.scrollbarVisible=!1,this.scrollbarOpacity=0,this.SCROLLBAR_HIDE_DELAY_MS=1500,this.SCROLLBAR_FADE_DURATION_MS=200,this.bootstrapCells=null,this.bootstrapDirty=!1,this.animateScroll=()=>{if(!this.wasmTerm||this.scrollAnimationStartTime===void 0)return;const s=this.options.smoothScrollDuration??100,r=this.targetViewportY-this.viewportY;if(Math.abs(r)<.01){this.viewportY=this.targetViewportY,this.scrollEmitter.fire(Math.floor(this.viewportY)),this.getScrollbackLength()>0&&this.showScrollbar(),this.scrollAnimationFrame=void 0,this.scrollAnimationStartTime=void 0,this.scrollAnimationStartY=void 0;return}const a=1-(1/(s/1e3*60))**2;this.viewportY+=r*a;const l=Math.floor(this.viewportY);this.scrollEmitter.fire(l),this.getScrollbackLength()>0&&this.showScrollbar(),this.scrollAnimationFrame=requestAnimationFrame(this.animateScroll)},this.handleMouseMove=s=>{if(!(!this.canvas||!this.renderer||!this.wasmTerm)){if(this.isDraggingScrollbar){this.processScrollbarDrag(s);return}if(this.linkDetector){if(this.mouseMoveThrottleTimeout){this.pendingMouseMove=s;return}this.processMouseMove(s),this.mouseMoveThrottleTimeout=window.setTimeout(()=>{if(this.mouseMoveThrottleTimeout=void 0,this.pendingMouseMove){const r=this.pendingMouseMove;this.pendingMouseMove=void 0,this.processMouseMove(r)}},16)}}},this.handleMouseLeave=()=>{var s,r;this.renderer&&this.wasmTerm&&((this.renderer.hoveredHyperlinkId||0)>0&&this.renderer.setHoveredHyperlinkId(0),this.renderer.setHoveredLinkRange(null)),this.currentHoveredLink&&((r=(s=this.currentHoveredLink).hover)==null||r.call(s,!1),this.currentHoveredLink=void 0,this.element&&(this.element.style.cursor="text",this.canvas&&(this.canvas.style.cursor="text")))},this.handleClick=async s=>{if(!this.canvas||!this.renderer||!this.linkDetector||!this.wasmTerm)return;const r=this.canvas.getBoundingClientRect(),o=Math.floor((s.clientX-r.left)/this.renderer.charWidth),a=Math.floor((s.clientY-r.top)/this.renderer.charHeight),l=this.wasmTerm.getScrollbackLength();let c;const u=this.getViewportY(),m=Math.max(0,Math.floor(u));if(m>0)if(a{var o,n,a;if(s.preventDefault(),s.stopPropagation(),this.customWheelEventHandler&&this.customWheelEventHandler(s))return;if(((o=this.wasmTerm)==null?void 0:o.isAlternateScreen())??!1){const l=s.deltaY>0?"down":"up",c=Math.min(Math.abs(Math.round(s.deltaY/33)),5);for(let u=0;u{if(!this.canvas||!this.renderer||!this.wasmTerm)return;const r=this.wasmTerm.getScrollbackLength();if(r===0)return;const o=this.canvas.getBoundingClientRect(),n=s.clientX-o.left,a=s.clientY-o.top,l=o.width,c=o.height,u=8,m=l-u-4,g=4;if(n>=m&&n<=m+u){s.preventDefault(),s.stopPropagation(),s.stopImmediatePropagation();const w=c-g*2,d=this.rows,p=r+d,_=Math.max(20,d/p*w),L=this.viewportY/r,f=g+(w-_)*(1-L);if(a>=f&&a<=f+_)this.isDraggingScrollbar=!0,this.scrollbarDragStart=a,this.scrollbarDragStartViewportY=this.viewportY,this.canvas&&(this.canvas.style.userSelect="none",this.canvas.style.webkitUserSelect="none");else{const T=1-(a-g)/w,B=Math.round(T*r);this.scrollToLine(Math.max(0,Math.min(r,B)))}}},this.handleMouseUp=()=>{this.isDraggingScrollbar&&(this.isDraggingScrollbar=!1,this.scrollbarDragStart=null,this.canvas&&(this.canvas.style.userSelect="",this.canvas.style.webkitUserSelect=""),this.scrollbarVisible&&this.getScrollbackLength()>0&&this.showScrollbar())},this.ghostty=t.ghostty??K();const e={cols:t.cols??80,rows:t.rows??24,cursorBlink:t.cursorBlink??!1,cursorStyle:t.cursorStyle??"block",theme:t.theme??{},scrollback:t.scrollback??1e4,fontSize:t.fontSize??15,fontFamily:t.fontFamily??"monospace",allowTransparency:t.allowTransparency??!1,convertEol:t.convertEol??!1,disableStdin:t.disableStdin??!1,smoothScrollDuration:t.smoothScrollDuration??100};this.options=new Proxy(e,{set:(s,r,o)=>{const n=s[r];return s[r]=o,this.isOpen&&this.handleOptionChange(r,o,n),!0}}),this.cols=this.options.cols,this.rows=this.options.rows,this.buffer=new it(this),this.bootstrapBuffer={getLine:s=>{var r;return this.bootstrapCells&&s>=0&&s{var s;return this.bootstrapCells?{x:0,y:0,visible:!0}:((s=this.wasmTerm)==null?void 0:s.getCursor())??{x:0,y:0,visible:!0}},getDimensions:()=>({cols:this.cols,rows:this.rows}),isRowDirty:s=>{var r;return this.bootstrapDirty?!0:this.bootstrapCells?!1:((r=this.wasmTerm)==null?void 0:r.isRowDirty(s))??!1},needsFullRedraw:()=>{var r;if(this.bootstrapDirty)return!0;if(this.bootstrapCells)return!1;const s=this.wasmTerm;return((r=s==null?void 0:s.needsFullRedraw)==null?void 0:r.call(s))??!1},clearDirty:()=>{var s;this.bootstrapDirty=!1,(s=this.wasmTerm)==null||s.clearDirty()},getGraphemeString:(s,r)=>{var n,a;if(this.bootstrapCells&&s>=0&&s{l.target===t&&l.preventDefault()}),t.setAttribute("role","textbox"),t.setAttribute("aria-label","Terminal input"),t.setAttribute("aria-multiline","true");const e=this.buildWasmConfig();this.wasmTerm=this.ghostty.createTerminal(this.cols,this.rows,e),this.canvas=document.createElement("canvas"),this.canvas.style.display="block",this.canvas.style.cursor="text",t.appendChild(this.canvas),this.textarea=document.createElement("textarea"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.setAttribute("tabindex","0"),this.textarea.setAttribute("aria-label","Terminal input"),this.textarea.style.position="absolute",this.textarea.style.left="0",this.textarea.style.top="0",this.textarea.style.width="1px",this.textarea.style.height="1px",this.textarea.style.padding="0",this.textarea.style.border="none",this.textarea.style.margin="0",this.textarea.style.opacity="0",this.textarea.style.clipPath="inset(50%)",this.textarea.style.overflow="hidden",this.textarea.style.whiteSpace="nowrap",this.textarea.style.resize="none",t.appendChild(this.textarea);const s=this.textarea;this.canvas.addEventListener("mousedown",l=>{l.preventDefault(),s.focus()}),this.canvas.addEventListener("touchend",l=>{l.preventDefault(),s.focus()}),this.renderer=new Q(this.canvas,{fontSize:this.options.fontSize,fontFamily:this.options.fontFamily,cursorStyle:this.options.cursorStyle,cursorBlink:this.options.cursorBlink,theme:this.options.theme}),this.renderer.resize(this.cols,this.rows);const r=this.canvas,o=this.renderer,n=this.wasmTerm,a={hasMouseTracking:()=>(n==null?void 0:n.hasMouseTracking())??!1,hasSgrMouseMode:()=>(n==null?void 0:n.getMode(1006,!1))??!0,getCellDimensions:()=>({width:o.charWidth,height:o.charHeight}),getCanvasOffset:()=>{const l=r.getBoundingClientRect();return{left:l.left,top:l.top}}};this.inputHandler=new X(this.ghostty,t,l=>{var c;this.options.disableStdin||((c=this.selectionManager)==null||c.clearSelection(),this.dataEmitter.fire(l))},()=>{this.bellEmitter.fire()},l=>{this.keyEmitter.fire(l)},this.customKeyEventHandler,l=>{var c;return((c=this.wasmTerm)==null?void 0:c.getMode(l,!1))??!1},()=>this.copySelection(),this.textarea,a),this.selectionManager=new J(this,this.renderer,this.wasmTerm,this.textarea),this.renderer.setSelectionManager(this.selectionManager),this.selectionManager.onSelectionChange(()=>{this.selectionChangeEmitter.fire()}),this.linkDetector=new $(this),this.linkDetector.registerProvider(new q(this)),this.linkDetector.registerProvider(new Z(this)),t.addEventListener("mousedown",this.handleMouseDown,{capture:!0}),t.addEventListener("mousemove",this.handleMouseMove),t.addEventListener("mouseleave",this.handleMouseLeave),t.addEventListener("click",this.handleClick),document.addEventListener("mouseup",this.handleMouseUp),t.addEventListener("wheel",this.handleWheel,{passive:!1,capture:!0}),this.armBootstrapBlank(),this.renderer.render(this.bootstrapBuffer,!0,this.viewportY,this,this.scrollbarOpacity),this.startRenderLoop(),this.focus()}catch(e){throw this.isOpen=!1,this.cleanupComponents(),new Error(`Failed to open terminal: ${e}`)}}write(t,e){this.assertOpen(),this.options.convertEol&&typeof t=="string"&&(t=t.replace(/\n/g,`\r +`)),this.writeInternal(t,e)}writeInternal(t,e){var s;this.disarmBootstrapBlank(),this.wasmTerm.write(t),this.processTerminalResponses(),typeof t=="string"&&t.includes("\x07")?this.bellEmitter.fire():t instanceof Uint8Array&&t.includes(7)&&this.bellEmitter.fire(),(s=this.linkDetector)==null||s.invalidateCache(),this.viewportY!==0&&this.scrollToBottom(),typeof t=="string"&&t.includes("\x1B]")&&this.checkForTitleChange(t),e&&requestAnimationFrame(e)}writeln(t,e){if(typeof t=="string")this.write(t+`\r +`,e);else{const s=new Uint8Array(t.length+2);s.set(t),s[t.length]=13,s[t.length+1]=10,this.write(s,e)}}paste(t){this.assertOpen(),!this.options.disableStdin&&(this.wasmTerm.hasBracketedPaste()?this.dataEmitter.fire("\x1B[200~"+t+"\x1B[201~"):this.dataEmitter.fire(t))}input(t,e=!1){this.assertOpen(),!this.options.disableStdin&&(e?this.dataEmitter.fire(t):this.write(t))}resize(t,e){if(this.assertOpen(),!(t===this.cols&&e===this.rows)){this.cancelRenderLoop();try{this.cols=t,this.rows=e,this.wasmTerm.resize(t,e),this.renderer.resize(t,e);const s=this.renderer.getMetrics();this.canvas.width=s.width*t,this.canvas.height=s.height*e,this.canvas.style.width=`${s.width*t}px`,this.canvas.style.height=`${s.height*e}px`,this.resizeEmitter.fire({cols:t,rows:e}),this.renderer.render(this.wasmTerm,!0,this.viewportY,this)}catch(s){console.error("Terminal resize failed:",s)}this.flushWriteQueue(),this.startRenderLoop()}}clear(){this.assertOpen(),this.wasmTerm.write("\x1B[2J\x1B[H")}reset(){this.assertOpen(),this.wasmTerm&&this.wasmTerm.free();const t=this.buildWasmConfig();this.wasmTerm=this.ghostty.createTerminal(this.cols,this.rows,t),this.armBootstrapBlank(),this.renderer.clear(),this.renderer.render(this.bootstrapBuffer,!0,this.viewportY,this,this.scrollbarOpacity),this.currentTitle=""}focus(){this.isOpen&&this.element&&(this.element.focus(),setTimeout(()=>{var t;(t=this.element)==null||t.focus()},0))}blur(){this.isOpen&&this.element&&this.element.blur()}loadAddon(t){t.activate(this),this.addons.push(t)}getSelection(){var t;return((t=this.selectionManager)==null?void 0:t.getSelection())||""}hasSelection(){var t;return((t=this.selectionManager)==null?void 0:t.hasSelection())||!1}clearSelection(){var t;(t=this.selectionManager)==null||t.clearSelection()}copySelection(){var t;return((t=this.selectionManager)==null?void 0:t.copySelection())||!1}selectAll(){var t;(t=this.selectionManager)==null||t.selectAll()}select(t,e,s){var r;(r=this.selectionManager)==null||r.select(t,e,s)}selectLines(t,e){var s;(s=this.selectionManager)==null||s.selectLines(t,e)}getViewportY(){return this.viewportY}getSelectionPosition(){var t;return(t=this.selectionManager)==null?void 0:t.getSelectionPosition()}attachCustomKeyEventHandler(t){this.customKeyEventHandler=t,this.inputHandler&&this.inputHandler.setCustomKeyEventHandler(t)}attachCustomWheelEventHandler(t){this.customWheelEventHandler=t}registerLinkProvider(t){if(!this.linkDetector)throw new Error("Terminal must be opened before registering link providers");this.linkDetector.registerProvider(t)}scrollLines(t){if(!this.wasmTerm)throw new Error("Terminal not open");const e=this.getScrollbackLength(),r=Math.max(0,Math.min(e,this.viewportY-t));r!==this.viewportY&&(this.viewportY=r,this.scrollEmitter.fire(this.viewportY),e>0&&this.showScrollbar())}scrollPages(t){this.scrollLines(t*this.rows)}scrollToTop(){const t=this.getScrollbackLength();t>0&&this.viewportY!==t&&(this.viewportY=t,this.scrollEmitter.fire(this.viewportY),this.showScrollbar())}scrollToBottom(){this.viewportY!==0&&(this.viewportY=0,this.scrollEmitter.fire(this.viewportY),this.getScrollbackLength()>0&&this.showScrollbar())}scrollToLine(t){const e=this.getScrollbackLength(),s=Math.max(0,Math.min(e,t));s!==this.viewportY&&(this.viewportY=s,this.scrollEmitter.fire(this.viewportY),e>0&&this.showScrollbar())}smoothScrollTo(t){if(!this.wasmTerm)return;const e=this.getScrollbackLength(),r=Math.max(0,Math.min(e,t));if((this.options.smoothScrollDuration??100)===0){this.viewportY=r,this.targetViewportY=r,this.scrollEmitter.fire(Math.floor(this.viewportY)),e>0&&this.showScrollbar();return}this.targetViewportY=r,!this.scrollAnimationFrame&&(this.scrollAnimationStartTime=Date.now(),this.scrollAnimationStartY=this.viewportY,this.animateScroll())}dispose(){if(!this.isDisposed){this.isDisposed=!0,this.isOpen=!1,this.cancelRenderLoop(),this.writeQueue.length=0,this.scrollAnimationFrame&&(cancelAnimationFrame(this.scrollAnimationFrame),this.scrollAnimationFrame=void 0),this.mouseMoveThrottleTimeout&&(clearTimeout(this.mouseMoveThrottleTimeout),this.mouseMoveThrottleTimeout=void 0),this.pendingMouseMove=void 0;for(const t of this.addons)t.dispose();this.addons=[],this.cleanupComponents(),this.dataEmitter.dispose(),this.resizeEmitter.dispose(),this.bellEmitter.dispose(),this.selectionChangeEmitter.dispose(),this.keyEmitter.dispose(),this.titleChangeEmitter.dispose(),this.scrollEmitter.dispose(),this.renderEmitter.dispose(),this.cursorMoveEmitter.dispose()}}cancelRenderLoop(){this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=void 0)}flushWriteQueue(){for(;this.writeQueue.length>0;){const t=this.writeQueue.shift();this.wasmTerm.write(t)}}startRenderLoop(){if(this.animationFrameId)return;const t=()=>{if(!this.isDisposed&&this.isOpen){this.renderer.render(this.bootstrapBuffer,!1,this.viewportY,this,this.scrollbarOpacity);const e=this.wasmTerm.getCursor();e.y!==this.lastCursorY&&(this.lastCursorY=e.y,this.cursorMoveEmitter.fire()),this.animationFrameId=requestAnimationFrame(t)}};t()}getScrollbackLine(t){return this.wasmTerm?this.wasmTerm.getScrollbackLine(t):null}getScrollbackLength(){return this.wasmTerm?this.wasmTerm.getScrollbackLength():0}armBootstrapBlank(){const t={...H,...this.options.theme};this.bootstrapCells=nt(this.cols,this.rows,{foreground:t.foreground,background:t.background}),this.bootstrapDirty=!0}disarmBootstrapBlank(){this.bootstrapCells&&(this.bootstrapCells=null,this.bootstrapDirty=!0)}cleanupComponents(){this.selectionManager&&(this.selectionManager.dispose(),this.selectionManager=void 0),this.inputHandler&&(this.inputHandler.dispose(),this.inputHandler=void 0),this.renderer&&(this.renderer.dispose(),this.renderer=void 0),this.canvas&&this.canvas.parentNode&&(this.canvas.parentNode.removeChild(this.canvas),this.canvas=void 0),this.textarea&&this.textarea.parentNode&&(this.textarea.parentNode.removeChild(this.textarea),this.textarea=void 0),this.element&&(this.element.removeEventListener("wheel",this.handleWheel),this.element.removeEventListener("mousedown",this.handleMouseDown,{capture:!0}),this.element.removeEventListener("mousemove",this.handleMouseMove),this.element.removeEventListener("mouseleave",this.handleMouseLeave),this.element.removeEventListener("click",this.handleClick),this.element.removeAttribute("contenteditable"),this.element.removeAttribute("role"),this.element.removeAttribute("aria-label"),this.element.removeAttribute("aria-multiline")),this.isOpen&&typeof document<"u"&&document.removeEventListener("mouseup",this.handleMouseUp),this.scrollbarHideTimeout&&(window.clearTimeout(this.scrollbarHideTimeout),this.scrollbarHideTimeout=void 0),this.linkDetector&&(this.linkDetector.dispose(),this.linkDetector=void 0),this.wasmTerm&&(this.wasmTerm.free(),this.wasmTerm=void 0),this.ghostty=void 0,this.element=void 0,this.textarea=void 0}assertOpen(){if(this.isDisposed)throw new Error("Terminal has been disposed");if(!this.isOpen)throw new Error("Terminal must be opened before use. Call terminal.open(parent) first.")}processMouseMove(t){if(!this.canvas||!this.renderer||!this.linkDetector||!this.wasmTerm)return;const e=this.canvas.getBoundingClientRect(),s=Math.floor((t.clientX-e.left)/this.renderer.charWidth),o=Math.floor((t.clientY-e.top)/this.renderer.charHeight);let n=0,a=null;const l=this.getViewportY(),c=Math.max(0,Math.floor(l));if(c>0){const p=this.wasmTerm.getScrollbackLength();if(o=0&&s0)if(o{var _,L,f,E;if(p!==this.currentHoveredLink){(L=(_=this.currentHoveredLink)==null?void 0:_.hover)==null||L.call(_,!1),this.currentHoveredLink=p,(f=p==null?void 0:p.hover)==null||f.call(p,!0);const T=p?"pointer":"text";if(this.element&&(this.element.style.cursor=T),this.canvas&&(this.canvas.style.cursor=T),this.renderer)if(p){const B=((E=this.wasmTerm)==null?void 0:E.getScrollbackLength())||0,gt=this.getViewportY(),tt=Math.max(0,Math.floor(gt)),et=p.range.start.y-B+tt,st=p.range.end.y-B+tt;et=0?this.renderer.setHoveredLinkRange({startX:p.range.start.x,startY:Math.max(0,et),endX:p.range.end.x,endY:Math.min(this.rows-1,st)}):this.renderer.setHoveredLinkRange(null)}else this.renderer.setHoveredLinkRange(null)}}).catch(p=>{console.warn("Link detection error:",p)})}processScrollbarDrag(t){if(!this.canvas||!this.renderer||!this.wasmTerm||this.scrollbarDragStart===null)return;const e=this.wasmTerm.getScrollbackLength();if(e===0)return;const s=this.canvas.getBoundingClientRect(),o=t.clientY-s.top-this.scrollbarDragStart,l=s.height-4*2,c=this.rows,u=e+c,m=Math.max(20,c/u*l),g=-o/(l-m),w=Math.round(g*e),d=this.scrollbarDragStartViewportY+w;this.scrollToLine(Math.max(0,Math.min(e,d)))}showScrollbar(){this.scrollbarHideTimeout&&(window.clearTimeout(this.scrollbarHideTimeout),this.scrollbarHideTimeout=void 0),this.scrollbarVisible?this.scrollbarOpacity=1:(this.scrollbarVisible=!0,this.scrollbarOpacity=0,this.fadeInScrollbar()),this.isDraggingScrollbar||(this.scrollbarHideTimeout=window.setTimeout(()=>{this.hideScrollbar()},this.SCROLLBAR_HIDE_DELAY_MS))}hideScrollbar(){this.scrollbarHideTimeout&&(window.clearTimeout(this.scrollbarHideTimeout),this.scrollbarHideTimeout=void 0),this.scrollbarVisible&&this.fadeOutScrollbar()}fadeInScrollbar(){const t=Date.now(),e=()=>{const s=Date.now()-t,r=Math.min(s/this.SCROLLBAR_FADE_DURATION_MS,1);this.scrollbarOpacity=r,this.renderer&&this.wasmTerm&&this.renderer.render(this.wasmTerm,!1,this.viewportY,this,this.scrollbarOpacity),r<1&&requestAnimationFrame(e)};e()}fadeOutScrollbar(){const t=Date.now(),e=this.scrollbarOpacity,s=()=>{const r=Date.now()-t,o=Math.min(r/this.SCROLLBAR_FADE_DURATION_MS,1);this.scrollbarOpacity=e*(1-o),this.renderer&&this.wasmTerm&&this.renderer.render(this.wasmTerm,!1,this.viewportY,this,this.scrollbarOpacity),o<1?requestAnimationFrame(s):(this.scrollbarVisible=!1,this.scrollbarOpacity=0,this.renderer&&this.wasmTerm&&this.renderer.render(this.wasmTerm,!1,this.viewportY,this,0))};s()}processTerminalResponses(){if(this.wasmTerm)for(;;){const t=this.wasmTerm.readResponse();if(t===null)break;this.dataEmitter.fire(t)}}checkForTitleChange(t){const e=/\x1b\]([012]);([^\x07\x1b]*?)(?:\x07|\x1b\\)/g;let s=null;for(;(s=e.exec(t))!==null;){const r=s[1],o=s[2];(r==="0"||r==="2")&&o!==this.currentTitle&&(this.currentTitle=o,this.titleChangeEmitter.fire(o))}}getMode(t,e=!1){return this.assertOpen(),this.wasmTerm.getMode(t,e)}hasBracketedPaste(){return this.assertOpen(),this.wasmTerm.hasBracketedPaste()}hasFocusEvents(){return this.assertOpen(),this.wasmTerm.hasFocusEvents()}hasMouseTracking(){return this.assertOpen(),this.wasmTerm.hasMouseTracking()}}const lt=2,ht=1,ct=15,ut=100;class dt{constructor(){this._isResizing=!1}activate(t){this._terminal=t}dispose(){this._resizeObserver&&(this._resizeObserver.disconnect(),this._resizeObserver=void 0),this._resizeDebounceTimer&&(clearTimeout(this._resizeDebounceTimer),this._resizeDebounceTimer=void 0),this._lastCols=void 0,this._lastRows=void 0,this._terminal=void 0}fit(){if(this._isResizing)return;const t=this.proposeDimensions();if(!t||!this._terminal)return;const e=this._terminal,s=e.cols,r=e.rows;if(!(t.cols===this._lastCols&&t.rows===this._lastRows||t.cols===s&&t.rows===r)){this._lastCols=t.cols,this._lastRows=t.rows,this._isResizing=!0;try{e.resize&&typeof e.resize=="function"&&e.resize(t.cols,t.rows)}finally{setTimeout(()=>{this._isResizing=!1},50)}}}proposeDimensions(){var _;if(!((_=this._terminal)!=null&&_.element))return;const e=this._terminal.renderer;if(!e||typeof e.getMetrics!="function")return;const s=e.getMetrics();if(!s||s.width===0||s.height===0)return;const r=this._terminal.element;if(typeof r.clientWidth>"u")return;const o=window.getComputedStyle(r),n=Number.parseInt(o.getPropertyValue("padding-top"))||0,a=Number.parseInt(o.getPropertyValue("padding-bottom"))||0,l=Number.parseInt(o.getPropertyValue("padding-left"))||0,c=Number.parseInt(o.getPropertyValue("padding-right"))||0,u=r.clientWidth,m=r.clientHeight;if(u===0||m===0)return;const g=u-l-c-ct,w=m-n-a,d=Math.max(lt,Math.floor(g/s.width)),p=Math.max(ht,Math.floor(w/s.height));return{cols:d,rows:p}}observeResize(){var t;(t=this._terminal)!=null&&t.element&&(this._resizeObserver||(this._resizeObserver=new ResizeObserver(e=>{this._isResizing||!e[0]||(this._resizeDebounceTimer&&clearTimeout(this._resizeDebounceTimer),this._resizeDebounceTimer=setTimeout(()=>{this.fit()},ut))}),this._resizeObserver.observe(this._terminal.element)))}}let I=null;async function ft(){I||(I=await k.load())}function K(){if(!I)throw new Error(`ghostty-web not initialized. Call init() before creating Terminal instances. +Example: + import { init, Terminal } from "ghostty-web"; + await init(); + const term = new Terminal(); + +For tests, pass a Ghostty instance directly: + import { Ghostty, Terminal } from "ghostty-web"; + const ghostty = await Ghostty.load(); + const term = new Terminal({ ghostty });`);return I}const mt=Object.freeze(Object.defineProperty({__proto__:null,default:{}},Symbol.toStringTag,{value:"Module"}));b.CanvasRenderer=Q,b.CellFlags=S,b.DirtyState=D,b.EventEmitter=v,b.FitAddon=dt,b.Ghostty=k,b.GhosttyTerminal=V,b.InputHandler=X,b.Key=h,b.KeyAction=y,b.KeyEncoder=Y,b.KeyEncoderOption=x,b.LinkDetector=$,b.Mods=C,b.OSC8LinkProvider=q,b.SelectionManager=J,b.Terminal=at,b.UrlRegexProvider=Z,b.getGhostty=K,b.init=ft,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})}); diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..c43e1d9 --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,2036 @@ +export declare class CanvasRenderer { + private canvas; + private ctx; + private fontSize; + private fontFamily; + private cursorStyle; + private cursorBlink; + private theme; + private devicePixelRatio; + private metrics; + private palette; + private cursorVisible; + private cursorBlinkInterval?; + private lastCursorPosition; + private lastViewportY; + private currentBuffer; + private selectionManager?; + private currentSelectionCoords; + private hoveredHyperlinkId; + private previousHoveredHyperlinkId; + private hoveredLinkRange; + private previousHoveredLinkRange; + constructor(canvas: HTMLCanvasElement, options?: RendererOptions); + private measureFont; + /** + * Remeasure font metrics (call after font loads or changes) + */ + remeasureFont(): void; + private rgbToCSS; + /** + * Resize canvas to fit terminal dimensions + */ + resize(cols: number, rows: number): void; + /** + * Render the terminal buffer to canvas + */ + render(buffer: IRenderable, forceAll?: boolean, viewportY?: number, scrollbackProvider?: IScrollbackProvider, scrollbarOpacity?: number): void; + /** + * Render a single line using two-pass approach: + * 1. First pass: Draw all cell backgrounds + * 2. Second pass: Draw all cell text and decorations + * + * This two-pass approach is necessary for proper rendering of complex scripts + * like Devanagari where diacritics (like vowel sign ि) can extend LEFT of the + * base character into the previous cell's visual area. If we draw backgrounds + * and text in a single pass (cell by cell), the background of cell N would + * cover any left-extending portions of graphemes from cell N-1. + */ + private renderLine; + /** + * Render a cell's background only (Pass 1 of two-pass rendering) + * Selection highlighting is integrated here to avoid z-order issues with + * complex glyphs (like Devanagari) that extend outside their cell bounds. + */ + private renderCellBackground; + /** + * Render a cell's text and decorations (Pass 2 of two-pass rendering) + * Selection foreground color is applied here to match the selection background. + */ + private renderCellText; + /** + * Render cursor + */ + private renderCursor; + private startCursorBlink; + private stopCursorBlink; + /** + * Update theme colors + */ + setTheme(theme: ITheme): void; + /** + * Update font size + */ + setFontSize(size: number): void; + /** + * Update font family + */ + setFontFamily(family: string): void; + /** + * Update cursor style + */ + setCursorStyle(style: 'block' | 'underline' | 'bar'): void; + /** + * Enable/disable cursor blinking + */ + setCursorBlink(enabled: boolean): void; + /** + * Get current font metrics + */ + /** + * Render scrollbar (Phase 2) + * Shows scroll position and allows click/drag interaction + * @param opacity Opacity level (0-1) for fade in/out effect + */ + private renderScrollbar; + getMetrics(): FontMetrics; + /** + * Get canvas element (needed by SelectionManager) + */ + getCanvas(): HTMLCanvasElement; + /** + * Set selection manager (for rendering selection) + */ + setSelectionManager(manager: SelectionManager): void; + /** + * Check if a cell at (x, y) is within the current selection. + * Uses cached selection coordinates for performance. + */ + private isInSelection; + /** + * Set the currently hovered hyperlink ID for rendering underlines + */ + setHoveredHyperlinkId(hyperlinkId: number): void; + /** + * Set the currently hovered link range for rendering underlines (for regex-detected URLs) + * Pass null to clear the hover state + */ + setHoveredLinkRange(range: { + startX: number; + startY: number; + endX: number; + endY: number; + } | null): void; + /** + * Get character cell width (for coordinate conversion) + */ + get charWidth(): number; + /** + * Get character cell height (for coordinate conversion) + */ + get charHeight(): number; + /** + * Clear entire canvas + */ + clear(): void; + /** + * Cleanup resources + */ + dispose(): void; +} + +/** + * Cell style flags (bitfield) + */ +export declare enum CellFlags { + BOLD = 1, + ITALIC = 2, + UNDERLINE = 4, + STRIKETHROUGH = 8, + INVERSE = 16, + INVISIBLE = 32, + BLINK = 64, + FAINT = 128 +} + +/** + * Cursor position and visibility + */ +export declare interface Cursor { + x: number; + y: number; + visible: boolean; +} + +/** + * Dirty state from RenderState + */ +export declare enum DirtyState { + NONE = 0, + PARTIAL = 1, + FULL = 2 +} + +export declare class EventEmitter { + private listeners; + fire(arg: T): void; + event: IEvent; + dispose(): void; +} + +export declare class FitAddon implements ITerminalAddon { + private _terminal?; + private _resizeObserver?; + private _resizeDebounceTimer?; + private _lastCols?; + private _lastRows?; + private _isResizing; + /** + * Activate the addon (called by Terminal.loadAddon) + */ + activate(terminal: ITerminalCore): void; + /** + * Dispose the addon and clean up resources + */ + dispose(): void; + /** + * Fit the terminal to its container + * + * Calculates optimal dimensions and resizes the terminal. + * Does nothing if dimensions cannot be calculated or haven't changed. + */ + fit(): void; + /** + * Propose dimensions to fit the terminal to its container + * + * Calculates cols and rows based on: + * - Terminal container element dimensions (clientWidth/Height) + * - Terminal element padding + * - Font metrics (character cell size) + * - Scrollbar width reservation + * + * @returns Proposed dimensions or undefined if cannot calculate + */ + proposeDimensions(): ITerminalDimensions | undefined; + /** + * Observe the terminal's container for resize events + * + * Sets up a ResizeObserver to automatically call fit() when the + * container size changes. Resize events are debounced to avoid + * excessive calls during window drag operations. + * + * Call dispose() to stop observing. + */ + observeResize(): void; +} + +export declare interface FontMetrics { + width: number; + height: number; + baseline: number; +} + +/* Excluded from this release type: getGhostty */ + +/** + * Main Ghostty WASM wrapper class + */ +export declare class Ghostty { + private exports; + private memory; + constructor(wasmInstance: WebAssembly.Instance); + createKeyEncoder(): KeyEncoder; + createTerminal(cols?: number, rows?: number, config?: GhosttyTerminalConfig): GhosttyTerminal; + static load(wasmPath?: string): Promise; + private static loadFromPath; +} + +/** + * Cell structure matching ghostty_cell_t in C (16 bytes) + */ +export declare interface GhosttyCell { + codepoint: number; + fg_r: number; + fg_g: number; + fg_b: number; + bg_r: number; + bg_g: number; + bg_b: number; + flags: number; + width: number; + hyperlink_id: number; + grapheme_len: number; +} + +/** + * GhosttyTerminal - High-performance terminal emulator + * + * Uses Ghostty's native RenderState for optimal performance: + * - ONE call to update all state (renderStateUpdate) + * - ONE call to get all cells (getViewport) + * - No per-row WASM boundary crossings! + */ +export declare class GhosttyTerminal { + private exports; + private memory; + private handle; + private _cols; + private _rows; + /** Size of GhosttyCell in WASM (16 bytes) */ + private static readonly CELL_SIZE; + /** Reusable buffer for viewport operations */ + private viewportBufferPtr; + private viewportBufferSize; + /** Cell pool for zero-allocation rendering */ + private cellPool; + constructor(exports: GhosttyWasmExports, memory: WebAssembly.Memory, cols?: number, rows?: number, config?: GhosttyTerminalConfig); + get cols(): number; + get rows(): number; + write(data: string | Uint8Array): void; + resize(cols: number, rows: number): void; + free(): void; + /** + * Update render state from terminal. + * + * This syncs the RenderState with the current Terminal state. + * The dirty state (full/partial/none) is stored in the WASM RenderState + * and can be queried via isRowDirty(). When dirty==full, isRowDirty() + * returns true for ALL rows. + * + * The WASM layer automatically detects screen switches (normal <-> alternate) + * and returns FULL dirty state when switching screens (e.g., vim exit). + * + * Safe to call multiple times - dirty state persists until markClean(). + */ + update(): DirtyState; + /** + * Get cursor state from render state. + * Ensures render state is fresh by calling update(). + */ + getCursor(): RenderStateCursor; + /** + * Get default colors from render state + */ + getColors(): RenderStateColors; + /** + * Check if a specific row is dirty + */ + isRowDirty(y: number): boolean; + /** + * Mark render state as clean (call after rendering) + */ + markClean(): void; + /** + * Get ALL viewport cells in ONE WASM call - the key performance optimization! + * Returns a reusable cell array (zero allocation after warmup). + */ + getViewport(): GhosttyCell[]; + /** + * Get line - for compatibility, extracts from viewport. + * Ensures render state is fresh by calling update(). + * Returns a COPY of the cells to avoid pool reference issues. + */ + getLine(y: number): GhosttyCell[] | null; + /** For compatibility with old API */ + isDirty(): boolean; + /** + * Check if a full redraw is needed (screen change, resize, etc.) + * Note: This calls update() to ensure fresh state. Safe to call multiple times. + */ + needsFullRedraw(): boolean; + /** Mark render state as clean after rendering */ + clearDirty(): void; + isAlternateScreen(): boolean; + hasBracketedPaste(): boolean; + hasFocusEvents(): boolean; + hasMouseTracking(): boolean; + /** Get dimensions - for compatibility */ + getDimensions(): { + cols: number; + rows: number; + }; + /** Get number of scrollback lines (history, not including active screen) */ + getScrollbackLength(): number; + /** + * Get a line from the scrollback buffer. + * Ensures render state is fresh by calling update(). + * @param offset 0 = oldest line, (length-1) = most recent scrollback line + */ + getScrollbackLine(offset: number): GhosttyCell[] | null; + /** Check if a row in the active screen is wrapped (soft-wrapped to next line) */ + isRowWrapped(row: number): boolean; + /** + * Get the hyperlink URI for a cell at the given position. + * @param row Row index (0-based, in active viewport) + * @param col Column index (0-based) + * @returns The URI string, or null if no hyperlink at that position + */ + getHyperlinkUri(row: number, col: number): string | null; + /** + * Get the hyperlink URI for a cell in the scrollback buffer. + * @param offset Scrollback line offset (0 = oldest, scrollback_len-1 = newest) + * @param col Column index (0-based) + * @returns The URI string, or null if no hyperlink at that position + */ + getScrollbackHyperlinkUri(offset: number, col: number): string | null; + /** + * Check if there are pending responses from the terminal. + * Responses are generated by escape sequences like DSR (Device Status Report). + */ + hasResponse(): boolean; + /** + * Read pending responses from the terminal. + * Returns the response string, or null if no responses pending. + * + * Responses are generated by escape sequences that require replies: + * - DSR 6 (cursor position): Returns \x1b[row;colR + * - DSR 5 (operating status): Returns \x1b[0n + */ + readResponse(): string | null; + /** + * Query arbitrary terminal mode by number + * @param mode Mode number (e.g., 25 for cursor visibility, 2004 for bracketed paste) + * @param isAnsi True for ANSI modes, false for DEC modes (default: false) + */ + getMode(mode: number, isAnsi?: boolean): boolean; + private initCellPool; + private parseCellsIntoPool; + /** Small buffer for grapheme lookups (reused to avoid allocation) */ + private graphemeBuffer; + private graphemeBufferPtr; + /** + * Get all codepoints for a grapheme cluster at the given position. + * For most cells this returns a single codepoint, but for complex scripts + * (Hindi, emoji with ZWJ, etc.) it returns multiple codepoints. + * @returns Array of codepoints, or null on error + */ + getGrapheme(row: number, col: number): number[] | null; + /** + * Get a string representation of the grapheme at the given position. + * This properly handles complex scripts like Hindi, emoji with ZWJ, etc. + */ + getGraphemeString(row: number, col: number): string; + /** + * Get all codepoints for a grapheme cluster in the scrollback buffer. + * @param offset Scrollback line offset (0 = oldest) + * @param col Column index + * @returns Array of codepoints, or null on error + */ + getScrollbackGrapheme(offset: number, col: number): number[] | null; + /** + * Get a string representation of a grapheme in the scrollback buffer. + */ + getScrollbackGraphemeString(offset: number, col: number): string; + private invalidateBuffers; +} + +/** + * Terminal configuration (passed to ghostty_terminal_new_with_config) + * All color values use 0xRRGGBB format. A value of 0 means "use default". + */ +declare interface GhosttyTerminalConfig { + scrollbackLimit?: number; + fgColor?: number; + bgColor?: number; + cursorColor?: number; + palette?: number[]; +} + +/** + * Interface for libghostty-vt WASM exports + */ +declare interface GhosttyWasmExports extends WebAssembly.Exports { + memory: WebAssembly.Memory; + ghostty_wasm_alloc_opaque(): number; + ghostty_wasm_free_opaque(ptr: number): void; + ghostty_wasm_alloc_u8_array(len: number): number; + ghostty_wasm_free_u8_array(ptr: number, len: number): void; + ghostty_wasm_alloc_u16_array(len: number): number; + ghostty_wasm_free_u16_array(ptr: number, len: number): void; + ghostty_wasm_alloc_u8(): number; + ghostty_wasm_free_u8(ptr: number): void; + ghostty_wasm_alloc_usize(): number; + ghostty_wasm_free_usize(ptr: number): void; + ghostty_sgr_new(allocator: number, parserPtrPtr: number): number; + ghostty_sgr_free(parser: number): void; + ghostty_sgr_reset(parser: number): void; + ghostty_sgr_set_params(parser: number, paramsPtr: number, subsPtr: number, paramsLen: number): number; + ghostty_sgr_next(parser: number, attrPtr: number): boolean; + ghostty_sgr_attribute_tag(attrPtr: number): number; + ghostty_sgr_attribute_value(attrPtr: number, tagPtr: number): number; + ghostty_wasm_alloc_sgr_attribute(): number; + ghostty_wasm_free_sgr_attribute(ptr: number): void; + ghostty_key_encoder_new(allocator: number, encoderPtrPtr: number): number; + ghostty_key_encoder_free(encoder: number): void; + ghostty_key_encoder_setopt(encoder: number, option: number, valuePtr: number): number; + ghostty_key_encoder_encode(encoder: number, eventPtr: number, bufPtr: number, bufLen: number, writtenPtr: number): number; + ghostty_key_event_new(allocator: number, eventPtrPtr: number): number; + ghostty_key_event_free(event: number): void; + ghostty_key_event_set_action(event: number, action: number): void; + ghostty_key_event_set_key(event: number, key: number): void; + ghostty_key_event_set_mods(event: number, mods: number): void; + ghostty_key_event_set_utf8(event: number, ptr: number, len: number): void; + ghostty_terminal_new(cols: number, rows: number): TerminalHandle; + ghostty_terminal_new_with_config(cols: number, rows: number, configPtr: number): TerminalHandle; + ghostty_terminal_free(terminal: TerminalHandle): void; + ghostty_terminal_resize(terminal: TerminalHandle, cols: number, rows: number): void; + ghostty_terminal_write(terminal: TerminalHandle, dataPtr: number, dataLen: number): void; + ghostty_render_state_update(terminal: TerminalHandle): number; + ghostty_render_state_get_cols(terminal: TerminalHandle): number; + ghostty_render_state_get_rows(terminal: TerminalHandle): number; + ghostty_render_state_get_cursor_x(terminal: TerminalHandle): number; + ghostty_render_state_get_cursor_y(terminal: TerminalHandle): number; + ghostty_render_state_get_cursor_visible(terminal: TerminalHandle): boolean; + ghostty_render_state_get_bg_color(terminal: TerminalHandle): number; + ghostty_render_state_get_fg_color(terminal: TerminalHandle): number; + ghostty_render_state_is_row_dirty(terminal: TerminalHandle, row: number): boolean; + ghostty_render_state_mark_clean(terminal: TerminalHandle): void; + ghostty_render_state_get_viewport(terminal: TerminalHandle, bufPtr: number, bufLen: number): number; + ghostty_render_state_get_grapheme(terminal: TerminalHandle, row: number, col: number, bufPtr: number, bufLen: number): number; + ghostty_terminal_is_alternate_screen(terminal: TerminalHandle): boolean; + ghostty_terminal_has_mouse_tracking(terminal: TerminalHandle): number; + ghostty_terminal_get_mode(terminal: TerminalHandle, mode: number, isAnsi: boolean): number; + ghostty_terminal_get_scrollback_length(terminal: TerminalHandle): number; + ghostty_terminal_get_scrollback_line(terminal: TerminalHandle, offset: number, bufPtr: number, bufLen: number): number; + ghostty_terminal_get_scrollback_grapheme(terminal: TerminalHandle, offset: number, col: number, bufPtr: number, bufLen: number): number; + ghostty_terminal_is_row_wrapped(terminal: TerminalHandle, row: number): number; + ghostty_terminal_get_hyperlink_uri(terminal: TerminalHandle, row: number, col: number, bufPtr: number, bufLen: number): number; + ghostty_terminal_get_scrollback_hyperlink_uri(terminal: TerminalHandle, offset: number, col: number, bufPtr: number, bufLen: number): number; + ghostty_terminal_has_response(terminal: TerminalHandle): boolean; + ghostty_terminal_read_response(terminal: TerminalHandle, bufPtr: number, bufLen: number): number; +} + +/** + * A terminal buffer (normal or alternate screen) + */ +declare interface IBuffer { + /** Buffer type: 'normal' or 'alternate' */ + readonly type: 'normal' | 'alternate'; + /** Cursor X position (0-indexed) */ + readonly cursorX: number; + /** Cursor Y position (0-indexed, relative to viewport) */ + readonly cursorY: number; + /** Viewport Y position (scroll offset, 0 = bottom of scrollback) */ + readonly viewportY: number; + /** Base Y position (always 0 for normal buffer, may vary for alternate) */ + readonly baseY: number; + /** Total buffer length (rows + scrollback for normal, just rows for alternate) */ + readonly length: number; + /** + * Get a line from the buffer + * @param y Line index (0 = top of scrollback for normal buffer) + * @returns Line object or undefined if out of bounds + */ + getLine(y: number): IBufferLine | undefined; + /** + * Get the null cell (used for empty/uninitialized cells) + */ + getNullCell(): IBufferCell; +} + +/** + * A single cell in the buffer + */ +declare interface IBufferCell { + /** Character(s) in this cell (may be empty, single char, or emoji) */ + getChars(): string; + /** Unicode codepoint (0 for null cell) */ + getCode(): number; + /** Character width (1 = normal, 2 = wide/emoji, 0 = combining) */ + getWidth(): number; + /** Foreground color index (for palette colors) or -1 for RGB */ + getFgColorMode(): number; + /** Background color index (for palette colors) or -1 for RGB */ + getBgColorMode(): number; + /** Foreground RGB color (or 0 for default) */ + getFgColor(): number; + /** Background RGB color (or 0 for default) */ + getBgColor(): number; + /** Whether cell has bold style */ + isBold(): number; + /** Whether cell has italic style */ + isItalic(): number; + /** Whether cell has underline style */ + isUnderline(): number; + /** Whether cell has strikethrough style */ + isStrikethrough(): number; + /** Whether cell has blink style */ + isBlink(): number; + /** Whether cell has inverse video style */ + isInverse(): number; + /** Whether cell has invisible style */ + isInvisible(): number; + /** Whether cell has faint/dim style */ + isFaint(): number; + /** Get hyperlink ID for this cell (0 = no link) */ + getHyperlinkId(): number; + /** Get the Unicode codepoint for this cell */ + getCodepoint(): number; + /** Whether cell has dim/faint attribute (boolean version) */ + isDim(): boolean; +} + +/** + * Represents a coordinate in the terminal buffer + */ +export declare interface IBufferCellPosition { + x: number; + y: number; +} + +/** + * A single line in the buffer + */ +declare interface IBufferLine { + /** Length of the line (in columns) */ + readonly length: number; + /** Whether this line wraps to the next line */ + readonly isWrapped: boolean; + /** + * Get a cell from this line + * @param x Column index (0-indexed) + * @returns Cell object or undefined if out of bounds + */ + getCell(x: number): IBufferCell | undefined; + /** + * Translate the line to a string + * @param trimRight Whether to trim trailing whitespace (default: false) + * @param startColumn Start column (default: 0) + * @param endColumn End column (default: length) + * @returns String representation of the line + */ + translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string; +} + +/** + * Minimal buffer line interface for URL detection + */ +declare interface IBufferLineForUrlProvider { + length: number; + getCell(x: number): { + getCodepoint(): number; + } | undefined; +} + +/** + * Top-level buffer API namespace + * Provides access to active, normal, and alternate screen buffers + */ +declare interface IBufferNamespace { + /** The currently active buffer (normal or alternate) */ + readonly active: IBuffer; + /** The normal buffer (primary screen) */ + readonly normal: IBuffer; + /** The alternate buffer (used by full-screen apps like vim) */ + readonly alternate: IBuffer; + /** Event fired when buffer changes (normal ↔ alternate) */ + readonly onBufferChange: IEvent; +} + +/** + * Buffer range for selection coordinates + */ +export declare interface IBufferRange { + start: { + x: number; + y: number; + }; + end: { + x: number; + y: number; + }; +} + +/** + * Represents a range in the terminal buffer + * Can span multiple lines for wrapped links + */ +declare interface IBufferRange_2 { + start: IBufferCellPosition; + end: IBufferCellPosition; +} + +export declare interface IDisposable { + dispose(): void; +} + +export declare type IEvent = (listener: (arg: T) => void) => IDisposable; + +/** + * Keyboard event with key and DOM event + */ +export declare interface IKeyEvent { + key: string; + domEvent: KeyboardEvent; +} + +/** + * Represents a detected link in the terminal + */ +export declare interface ILink { + /** The URL or text of the link */ + text: string; + /** The range of the link in the buffer (may span multiple lines) */ + range: IBufferRange_2; + /** Called when the link is activated (clicked with modifier) */ + activate(event: MouseEvent): void; + /** Optional: called when mouse enters/leaves the link */ + hover?(isHovered: boolean): void; + /** Optional: called to clean up resources */ + dispose?(): void; +} + +/** + * Provides link detection for a specific type of link + * Examples: OSC 8 hyperlinks, URL regex detection + */ +export declare interface ILinkProvider { + /** + * Provide links for a given row + * @param y Absolute row in buffer (0-based) + * @param callback Called with detected links (or undefined if none) + */ + provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void; + /** Optional: called when terminal is disposed */ + dispose?(): void; +} + +/** + * Initialize the ghostty-web library by loading the WASM module. + * Must be called before creating any Terminal instances. + * + * This creates a shared WASM instance that all Terminal instances will use. + * For test isolation, pass a Ghostty instance directly to Terminal constructor. + * + * @example + * ```typescript + * import { init, Terminal } from 'ghostty-web'; + * + * await init(); + * const term = new Terminal(); + * term.open(document.getElementById('terminal')); + * ``` + */ +export declare function init(): Promise; + +export declare class InputHandler { + private encoder; + private container; + private inputElement?; + private onDataCallback; + private onBellCallback; + private onKeyCallback?; + private customKeyEventHandler?; + private getModeCallback?; + private onCopyCallback?; + private mouseConfig?; + private keydownListener; + private keypressListener; + private pasteListener; + private beforeInputListener; + private compositionStartListener; + private compositionUpdateListener; + private compositionEndListener; + private mousedownListener; + private mouseupListener; + private mousemoveListener; + private wheelListener; + private isComposing; + private isDisposed; + private mouseButtonsPressed; + private lastKeyDownData; + private lastKeyDownTime; + private lastPasteData; + private lastPasteTime; + private lastPasteSource; + private lastCompositionData; + private lastCompositionTime; + private lastBeforeInputData; + private lastBeforeInputTime; + private static readonly BEFORE_INPUT_IGNORE_MS; + /** + * Create a new InputHandler + * @param ghostty - Ghostty instance (for creating KeyEncoder) + * @param container - DOM element to attach listeners to + * @param onData - Callback for terminal data (escape sequences to send to PTY) + * @param onBell - Callback for bell/beep event + * @param onKey - Optional callback for raw key events + * @param customKeyEventHandler - Optional custom key event handler + * @param getMode - Optional callback to query terminal mode state (for application cursor mode) + * @param onCopy - Optional callback to handle copy (Cmd+C/Ctrl+C with selection) + * @param inputElement - Optional input element for beforeinput events + * @param mouseConfig - Optional mouse tracking configuration + */ + constructor(ghostty: Ghostty, container: HTMLElement, onData: (data: string) => void, onBell: () => void, onKey?: (keyEvent: IKeyEvent) => void, customKeyEventHandler?: (event: KeyboardEvent) => boolean, getMode?: (mode: number) => boolean, onCopy?: () => boolean, inputElement?: HTMLElement, mouseConfig?: MouseTrackingConfig); + /** + * Set custom key event handler (for runtime updates) + */ + setCustomKeyEventHandler(handler: (event: KeyboardEvent) => boolean): void; + /** + * Attach keyboard event listeners to container + */ + private attach; + /** + * Map KeyboardEvent.code to USB HID Key enum value + * @param code - KeyboardEvent.code value + * @returns Key enum value or null if unmapped + */ + private mapKeyCode; + /** + * Extract modifier flags from KeyboardEvent + * @param event - KeyboardEvent + * @returns Mods flags + */ + private extractModifiers; + /** + * Check if this is a printable character with no special modifiers + * @param event - KeyboardEvent + * @returns true if printable character + */ + private isPrintableCharacter; + /** + * Handle keydown event + * @param event - KeyboardEvent + */ + private handleKeyDown; + /** + * Handle paste event from clipboard + * @param event - ClipboardEvent + */ + private handlePaste; + /** + * Handle beforeinput event (mobile/IME input) + * @param event - InputEvent + */ + private handleBeforeInput; + /** + * Handle compositionstart event + */ + private handleCompositionStart; + /** + * Handle compositionupdate event + */ + private handleCompositionUpdate; + /** + * Handle compositionend event + */ + private handleCompositionEnd; + /** + * Cleanup text nodes in container after composition + */ + private cleanupCompositionTextNodes; + /** + * Convert pixel coordinates to terminal cell coordinates + */ + private pixelToCell; + /** + * Get modifier flags for mouse event + */ + private getMouseModifiers; + /** + * Encode mouse event as SGR sequence + * SGR format: \x1b[ + */ + private encodeMouseX10; + /** + * Send mouse event to terminal + */ + private sendMouseEvent; + /** + * Handle mousedown event + */ + private handleMouseDown; + /** + * Handle mouseup event + */ + private handleMouseUp; + /** + * Handle mousemove event + */ + private handleMouseMove; + /** + * Handle wheel event (scroll) + */ + private handleWheel; + /** + * Emit paste data with bracketed paste support + */ + private emitPasteData; + /** + * Record keydown data for beforeinput de-duplication + */ + private recordKeyDownData; + /** + * Record paste data for beforeinput de-duplication + */ + private recordPasteData; + /** + * Check if beforeinput should be ignored due to a recent keydown + */ + private shouldIgnoreBeforeInput; + /** + * Check if beforeinput text should be ignored due to a recent composition end + */ + private shouldIgnoreBeforeInputFromComposition; + /** + * Check if composition end should be ignored due to a recent beforeinput text + */ + private shouldIgnoreCompositionEnd; + /** + * Record beforeinput text for composition de-duplication + */ + private recordBeforeInputData; + /** + * Record composition end data for beforeinput de-duplication + */ + private recordCompositionData; + /** + * Check if paste should be ignored due to a recent paste event from another source + */ + private shouldIgnorePasteEvent; + /** + * Get current time in milliseconds + */ + private getNow; + /** + * Dispose the InputHandler and remove event listeners + */ + dispose(): void; + /** + * Check if handler is disposed + */ + isActive(): boolean; +} + +export declare interface IRenderable { + getLine(y: number): GhosttyCell[] | null; + getCursor(): { + x: number; + y: number; + visible: boolean; + }; + getDimensions(): { + cols: number; + rows: number; + }; + isRowDirty(y: number): boolean; + /** Returns true if a full redraw is needed (e.g., screen change) */ + needsFullRedraw?(): boolean; + clearDirty(): void; + /** + * Get the full grapheme string for a cell at (row, col). + * For cells with grapheme_len > 0, this returns all codepoints combined. + * For simple cells, returns the single character. + */ + getGraphemeString?(row: number, col: number): string; +} + +declare interface IScrollbackProvider { + getScrollbackLine(offset: number): GhosttyCell[] | null; + getScrollbackLength(): number; +} + +export declare interface ITerminalAddon { + activate(terminal: ITerminalCore): void; + dispose(): void; +} + +export declare interface ITerminalCore { + cols: number; + rows: number; + element?: HTMLElement; + textarea?: HTMLTextAreaElement; +} + +export declare interface ITerminalDimensions { + cols: number; + rows: number; +} + +/** + * Minimal terminal interface required by LinkDetector + * Keeps coupling low and testing easy + */ +declare interface ITerminalForLinkDetector { + buffer: { + active: { + getLine(y: number): { + length: number; + getCell(x: number): { + getHyperlinkId(): number; + } | undefined; + } | undefined; + }; + }; +} + +/** + * Minimal terminal interface required by OSC8LinkProvider + */ +declare interface ITerminalForOSC8Provider { + buffer: { + active: { + length: number; + getLine(y: number): { + length: number; + getCell(x: number): { + getHyperlinkId(): number; + } | undefined; + } | undefined; + }; + }; + wasmTerm?: { + getHyperlinkUri(row: number, col: number): string | null; + getScrollbackHyperlinkUri(offset: number, col: number): string | null; + getScrollbackLength(): number; + }; +} + +/** + * Minimal terminal interface required by UrlRegexProvider + */ +declare interface ITerminalForUrlProvider { + buffer: { + active: { + getLine(y: number): IBufferLineForUrlProvider | undefined; + }; + }; +} + +export declare interface ITerminalOptions { + cols?: number; + rows?: number; + cursorBlink?: boolean; + cursorStyle?: 'block' | 'underline' | 'bar'; + theme?: ITheme; + scrollback?: number; + fontSize?: number; + fontFamily?: string; + allowTransparency?: boolean; + convertEol?: boolean; + disableStdin?: boolean; + smoothScrollDuration?: number; + ghostty?: Ghostty; +} + +export declare interface ITheme { + foreground?: string; + background?: string; + cursor?: string; + cursorAccent?: string; + selectionBackground?: string; + selectionForeground?: string; + black?: string; + red?: string; + green?: string; + yellow?: string; + blue?: string; + magenta?: string; + cyan?: string; + white?: string; + brightBlack?: string; + brightRed?: string; + brightGreen?: string; + brightYellow?: string; + brightBlue?: string; + brightMagenta?: string; + brightCyan?: string; + brightWhite?: string; +} + +/** + * Unicode version provider (xterm.js compatibility) + */ +export declare interface IUnicodeVersionProvider { + readonly activeVersion: string; +} + +/** + * Physical key codes matching Ghostty's internal Key enum. + * These values are used by Ghostty's key encoder to produce correct escape sequences. + * Reference: ghostty/src/input/key.zig + */ +export declare enum Key { + UNIDENTIFIED = 0, + GRAVE = 1,// ` and ~ + BACKSLASH = 2,// \ and | + BRACKET_LEFT = 3,// [ and { + BRACKET_RIGHT = 4,// ] and } + COMMA = 5,// , and < + ZERO = 6, + ONE = 7, + TWO = 8, + THREE = 9, + FOUR = 10, + FIVE = 11, + SIX = 12, + SEVEN = 13, + EIGHT = 14, + NINE = 15, + EQUAL = 16,// = and + + INTL_BACKSLASH = 17, + INTL_RO = 18, + INTL_YEN = 19, + A = 20, + B = 21, + C = 22, + D = 23, + E = 24, + F = 25, + G = 26, + H = 27, + I = 28, + J = 29, + K = 30, + L = 31, + M = 32, + N = 33, + O = 34, + P = 35, + Q = 36, + R = 37, + S = 38, + T = 39, + U = 40, + V = 41, + W = 42, + X = 43, + Y = 44, + Z = 45, + MINUS = 46,// - and _ + PERIOD = 47,// . and > + QUOTE = 48,// ' and " + SEMICOLON = 49,// ; and : + SLASH = 50,// / and ? + ALT_LEFT = 51, + ALT_RIGHT = 52, + BACKSPACE = 53, + CAPS_LOCK = 54, + CONTEXT_MENU = 55, + CONTROL_LEFT = 56, + CONTROL_RIGHT = 57, + ENTER = 58, + META_LEFT = 59, + META_RIGHT = 60, + SHIFT_LEFT = 61, + SHIFT_RIGHT = 62, + SPACE = 63, + TAB = 64, + CONVERT = 65, + KANA_MODE = 66, + NON_CONVERT = 67, + DELETE = 68, + END = 69, + HELP = 70, + HOME = 71, + INSERT = 72, + PAGE_DOWN = 73, + PAGE_UP = 74, + DOWN = 75, + LEFT = 76, + RIGHT = 77, + UP = 78, + NUM_LOCK = 79, + KP_0 = 80, + KP_1 = 81, + KP_2 = 82, + KP_3 = 83, + KP_4 = 84, + KP_5 = 85, + KP_6 = 86, + KP_7 = 87, + KP_8 = 88, + KP_9 = 89, + KP_PLUS = 90,// Keypad + + KP_BACKSPACE = 91, + KP_CLEAR = 92, + KP_CLEAR_ENTRY = 93, + KP_COMMA = 94, + KP_PERIOD = 95,// Keypad . + KP_DIVIDE = 96,// Keypad / + KP_ENTER = 97,// Keypad Enter + KP_EQUAL = 98, + KP_MEMORY_ADD = 99, + KP_MEMORY_CLEAR = 100, + KP_MEMORY_RECALL = 101, + KP_MEMORY_STORE = 102, + KP_MEMORY_SUBTRACT = 103, + KP_MULTIPLY = 104,// Keypad * + KP_PAREN_LEFT = 105, + KP_PAREN_RIGHT = 106, + KP_MINUS = 107,// Keypad - + KP_SEPARATOR = 108, + NUMPAD_UP = 109, + NUMPAD_DOWN = 110, + NUMPAD_RIGHT = 111, + NUMPAD_LEFT = 112, + NUMPAD_BEGIN = 113, + NUMPAD_HOME = 114, + NUMPAD_END = 115, + NUMPAD_INSERT = 116, + NUMPAD_DELETE = 117, + NUMPAD_PAGE_UP = 118, + NUMPAD_PAGE_DOWN = 119, + ESCAPE = 120, + F1 = 121, + F2 = 122, + F3 = 123, + F4 = 124, + F5 = 125, + F6 = 126, + F7 = 127, + F8 = 128, + F9 = 129, + F10 = 130, + F11 = 131, + F12 = 132, + F13 = 133, + F14 = 134, + F15 = 135, + F16 = 136, + F17 = 137, + F18 = 138, + F19 = 139, + F20 = 140, + F21 = 141, + F22 = 142, + F23 = 143, + F24 = 144, + F25 = 145, + FN_LOCK = 146, + PRINT_SCREEN = 147, + SCROLL_LOCK = 148, + PAUSE = 149, + BROWSER_BACK = 150, + BROWSER_FAVORITES = 151, + BROWSER_FORWARD = 152, + BROWSER_HOME = 153, + BROWSER_REFRESH = 154, + BROWSER_SEARCH = 155, + BROWSER_STOP = 156, + EJECT = 157, + LAUNCH_APP_1 = 158, + LAUNCH_APP_2 = 159, + LAUNCH_MAIL = 160, + MEDIA_PLAY_PAUSE = 161, + MEDIA_SELECT = 162, + MEDIA_STOP = 163, + MEDIA_TRACK_NEXT = 164, + MEDIA_TRACK_PREVIOUS = 165, + POWER = 166, + SLEEP = 167, + AUDIO_VOLUME_DOWN = 168, + AUDIO_VOLUME_MUTE = 169, + AUDIO_VOLUME_UP = 170, + WAKE_UP = 171, + COPY = 172, + CUT = 173, + PASTE = 174 +} + +/** + * Key action + */ +export declare enum KeyAction { + RELEASE = 0, + PRESS = 1, + REPEAT = 2 +} + +/** + * Key Encoder - converts keyboard events into terminal escape sequences + */ +export declare class KeyEncoder { + private exports; + private encoder; + constructor(exports: GhosttyWasmExports); + setOption(option: KeyEncoderOption, value: boolean | number): void; + setKittyFlags(flags: KittyKeyFlags): void; + encode(event: KeyEvent): Uint8Array; + dispose(): void; +} + +/** + * Key encoder options + */ +export declare enum KeyEncoderOption { + CURSOR_KEY_APPLICATION = 0,// DEC mode 1 + KEYPAD_KEY_APPLICATION = 1,// DEC mode 66 + IGNORE_KEYPAD_WITH_NUMLOCK = 2,// DEC mode 1035 + ALT_ESC_PREFIX = 3,// DEC mode 1036 + MODIFY_OTHER_KEYS_STATE_2 = 4,// xterm modifyOtherKeys + KITTY_KEYBOARD_FLAGS = 5 +} + +/** + * Key event structure + */ +export declare interface KeyEvent { + action: KeyAction; + key: Key; + mods: Mods; + consumedMods?: Mods; + composing?: boolean; + utf8?: string; + unshiftedCodepoint?: number; +} + +/** + * Kitty keyboard protocol flags + * From include/ghostty/vt/key/encoder.h + */ +declare enum KittyKeyFlags { + DISABLED = 0, + DISAMBIGUATE = 1,// Disambiguate escape codes + REPORT_EVENTS = 2,// Report press and release + REPORT_ALTERNATES = 4,// Report alternate key codes + REPORT_ALL = 8,// Report all events + REPORT_ASSOCIATED = 16,// Report associated text + ALL = 31 +} + +/** + * Manages link detection across multiple providers with intelligent caching + */ +export declare class LinkDetector { + private terminal; + private providers; + private linkCache; + private scannedRows; + constructor(terminal: ITerminalForLinkDetector); + /** + * Register a link provider + */ + registerProvider(provider: ILinkProvider): void; + /** + * Get link at the specified buffer position + * @param col Column (0-based) + * @param row Absolute row in buffer (0-based) + * @returns Link at position, or undefined if none + */ + getLinkAt(col: number, row: number): Promise; + /** + * Scan a row for links using all registered providers + */ + private scanRow; + /** + * Cache a link for fast lookup + * + * Note: We cache by position range, not hyperlink_id, because the WASM + * returns hyperlink_id as a boolean (0 or 1), not a unique identifier. + * The actual unique identifier is the URI which is retrieved separately. + */ + private cacheLink; + /** + * Check if a position is within a link's range + */ + private isPositionInLink; + /** + * Invalidate cache when terminal content changes + * Should be called on terminal write, resize, or clear + */ + invalidateCache(): void; + /** + * Invalidate cache for specific rows + * Used when only part of the terminal changed + */ + invalidateRows(startRow: number, endRow: number): void; + /** + * Dispose and cleanup + */ + dispose(): void; +} + +/** + * Modifier keys + */ +export declare enum Mods { + NONE = 0, + SHIFT = 1, + CTRL = 2, + ALT = 4, + SUPER = 8,// Windows/Command key + CAPSLOCK = 16, + NUMLOCK = 32 +} + +/** + * InputHandler class + * Attaches keyboard event listeners to a container and converts + * keyboard events to terminal input data + */ +/** + * Mouse tracking configuration + */ +declare interface MouseTrackingConfig { + /** Check if any mouse tracking mode is enabled */ + hasMouseTracking: () => boolean; + /** Check if SGR extended mouse mode is enabled (mode 1006) */ + hasSgrMouseMode: () => boolean; + /** Get cell dimensions for pixel to cell conversion */ + getCellDimensions: () => { + width: number; + height: number; + }; + /** Get canvas/container offset for accurate position calculation */ + getCanvasOffset: () => { + left: number; + top: number; + }; +} + +/** + * OSC 8 Hyperlink Provider + * + * Detects OSC 8 hyperlinks by scanning for hyperlink_id in cells. + * Automatically handles multi-line links since Ghostty WASM preserves + * hyperlink_id across wrapped lines. + */ +export declare class OSC8LinkProvider implements ILinkProvider { + private terminal; + constructor(terminal: ITerminalForOSC8Provider); + /** + * Provide all OSC 8 links on the given row + * Note: This may return links that span multiple rows + */ + provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void; + /** + * Find the full extent of a link by scanning for contiguous cells + * with the same hyperlink_id. Handles multi-line links. + */ + private findLinkRange; + dispose(): void; +} + +export declare interface RendererOptions { + fontSize?: number; + fontFamily?: string; + cursorStyle?: 'block' | 'underline' | 'bar'; + cursorBlink?: boolean; + theme?: ITheme; + devicePixelRatio?: number; +} + +/** + * Colors from RenderState (12 bytes packed) + */ +declare interface RenderStateColors { + background: RGB; + foreground: RGB; + cursor: RGB | null; +} + +/** + * Cursor state from RenderState (8 bytes packed) + * Layout: x(u16) + y(u16) + viewport_x(i16) + viewport_y(i16) + visible(bool) + blinking(bool) + style(u8) + _pad(u8) + */ +declare interface RenderStateCursor { + x: number; + y: number; + viewportX: number; + viewportY: number; + visible: boolean; + blinking: boolean; + style: 'block' | 'underline' | 'bar'; +} + +/** + * RGB color + */ +export declare interface RGB { + r: number; + g: number; + b: number; +} + +export declare interface SelectionCoordinates { + startCol: number; + startRow: number; + endCol: number; + endRow: number; +} + +export declare class SelectionManager { + private terminal; + private renderer; + private wasmTerm; + private textarea; + private selectionStart; + private selectionEnd; + private isSelecting; + private mouseDownX; + private mouseDownY; + private dragThresholdMet; + private mouseDownTarget; + private dirtySelectionRows; + private selectionChangedEmitter; + private boundMouseUpHandler; + private boundContextMenuHandler; + private boundClickHandler; + private boundDocumentMouseMoveHandler; + private autoScrollInterval; + private autoScrollDirection; + private static readonly AUTO_SCROLL_EDGE_SIZE; + /** + * Get current viewport Y position (how many lines scrolled into history) + */ + private getViewportY; + /** + * Convert viewport row to absolute buffer row + * Absolute row is an index into combined buffer: scrollback (0 to len-1) + screen (len to len+rows-1) + */ + private viewportRowToAbsolute; + /** + * Convert absolute buffer row to viewport row (may be outside visible range) + */ + private absoluteRowToViewport; + private static readonly AUTO_SCROLL_SPEED; + private static readonly AUTO_SCROLL_INTERVAL; + constructor(terminal: Terminal, renderer: CanvasRenderer, wasmTerm: GhosttyTerminal, textarea: HTMLTextAreaElement); + /** + * Get the selected text as a string + */ + getSelection(): string; + /** + * Check if there's an active selection + */ + hasSelection(): boolean; + /** + * Copy the current selection to clipboard + * @returns true if there was text to copy, false otherwise + */ + copySelection(): boolean; + /** + * Clear the selection + */ + clearSelection(): void; + /** + * Select all text in the terminal + */ + selectAll(): void; + /** + * Select text at specific column and row with length + * xterm.js compatible API + */ + select(column: number, row: number, length: number): void; + /** + * Select entire lines from start to end + * xterm.js compatible API + */ + selectLines(start: number, end: number): void; + /** + * Get selection position as buffer range + * xterm.js compatible API + */ + getSelectionPosition(): { + start: { + x: number; + y: number; + }; + end: { + x: number; + y: number; + }; + } | undefined; + /** + * Deselect all text + * xterm.js compatible API + */ + deselect(): void; + /** + * Focus the terminal (make it receive keyboard input) + */ + focus(): void; + /** + * Get current selection coordinates (for rendering) + */ + getSelectionCoords(): SelectionCoordinates | null; + /** + * Get dirty selection rows that need redraw (for clearing old highlight) + */ + getDirtySelectionRows(): Set; + /** + * Clear the dirty selection rows tracking (after redraw) + */ + clearDirtySelectionRows(): void; + /** + * Get selection change event accessor + */ + get onSelectionChange(): IEvent; + /** + * Cleanup resources + */ + dispose(): void; + /** + * Attach mouse event listeners to canvas + */ + private attachEventListeners; + /** + * Mark current selection rows as dirty for redraw + */ + private markCurrentSelectionDirty; + /** + * Update auto-scroll based on mouse Y position within canvas + */ + private updateAutoScroll; + /** + * Start auto-scrolling in the given direction + */ + private startAutoScroll; + /** + * Stop auto-scrolling + */ + private stopAutoScroll; + /** + * Convert pixel coordinates to terminal cell coordinates + */ + private pixelToCell; + /** + * Normalize selection coordinates (handle backward selection) + * Returns coordinates in VIEWPORT space for rendering, clamped to visible area + */ + private normalizeSelection; + /** + * Get word boundaries at a cell position + */ + private getWordAtCell; + /** + * Copy text to clipboard + * + * Strategy (modern APIs first): + * 1. Try ClipboardItem API (works in Safari and modern browsers) + * - Safari requires the ClipboardItem to be created synchronously within user gesture + * 2. Try navigator.clipboard.writeText (modern async API, may fail in Safari) + * 3. Fall back to execCommand (legacy, for older browsers) + */ + private copyToClipboard; + /** + * Copy using navigator.clipboard.writeText + */ + private copyWithWriteText; + /** + * Copy using legacy execCommand (fallback for older browsers) + */ + private copyWithExecCommand; + /** + * Request a render update (triggers selection overlay redraw) + */ + private requestRender; +} + +export declare class Terminal implements ITerminalCore { + cols: number; + rows: number; + element?: HTMLElement; + textarea?: HTMLTextAreaElement; + readonly buffer: IBufferNamespace; + readonly unicode: IUnicodeVersionProvider; + readonly options: Required; + private ghostty?; + wasmTerm?: GhosttyTerminal; + renderer?: CanvasRenderer; + private inputHandler?; + private selectionManager?; + private canvas?; + private linkDetector?; + private currentHoveredLink?; + private mouseMoveThrottleTimeout?; + private pendingMouseMove?; + private dataEmitter; + private resizeEmitter; + private bellEmitter; + private selectionChangeEmitter; + private keyEmitter; + private titleChangeEmitter; + private scrollEmitter; + private renderEmitter; + private cursorMoveEmitter; + readonly onData: IEvent; + readonly onResize: IEvent<{ + cols: number; + rows: number; + }>; + readonly onBell: IEvent; + readonly onSelectionChange: IEvent; + readonly onKey: IEvent; + readonly onTitleChange: IEvent; + readonly onScroll: IEvent; + readonly onRender: IEvent<{ + start: number; + end: number; + }>; + readonly onCursorMove: IEvent; + private isOpen; + private isDisposed; + private animationFrameId?; + private writeQueue; + private addons; + private customKeyEventHandler?; + private currentTitle; + viewportY: number; + private targetViewportY; + private scrollAnimationStartTime?; + private scrollAnimationStartY?; + private scrollAnimationFrame?; + private customWheelEventHandler?; + private lastCursorY; + private isDraggingScrollbar; + private scrollbarDragStart; + private scrollbarDragStartViewportY; + private scrollbarVisible; + private scrollbarOpacity; + private scrollbarHideTimeout?; + private readonly SCROLLBAR_HIDE_DELAY_MS; + private readonly SCROLLBAR_FADE_DURATION_MS; + private bootstrapCells; + private bootstrapDirty; + private bootstrapBuffer; + constructor(options?: ITerminalOptions); + /** + * Handle runtime option changes (called when options are modified after terminal is open) + * This enables xterm.js compatibility where options can be changed at runtime + */ + private handleOptionChange; + /** + * Handle font changes (fontSize or fontFamily) + * Updates canvas size to match new font metrics and forces a full re-render + */ + private handleFontChange; + /** + * Parse a CSS color string to 0xRRGGBB format. + * Returns 0 if the color is undefined or invalid. + */ + private parseColorToHex; + /** + * Convert terminal options to WASM terminal config. + */ + private buildWasmConfig; + /** + * Open terminal in a parent element + * + * Initializes all components and starts rendering. + * Requires a pre-loaded Ghostty instance passed to the constructor. + */ + open(parent: HTMLElement): void; + /** + * Write data to terminal + */ + write(data: string | Uint8Array, callback?: () => void): void; + /** + * Internal write implementation (extracted from write()) + */ + private writeInternal; + /** + * Write data with newline + */ + writeln(data: string | Uint8Array, callback?: () => void): void; + /** + * Paste text into terminal (triggers bracketed paste if supported) + */ + paste(data: string): void; + /** + * Input data into terminal (as if typed by user) + * + * @param data - Data to input + * @param wasUserInput - If true, triggers onData event (default: false for compat with some apps) + */ + input(data: string, wasUserInput?: boolean): void; + /** + * Resize terminal + */ + resize(cols: number, rows: number): void; + /** + * Clear terminal screen + */ + clear(): void; + /** + * Reset terminal state + */ + reset(): void; + /** + * Focus terminal input + */ + focus(): void; + /** + * Blur terminal (remove focus) + */ + blur(): void; + /** + * Load an addon + */ + loadAddon(addon: ITerminalAddon): void; + /** + * Get the selected text as a string + */ + getSelection(): string; + /** + * Check if there's an active selection + */ + hasSelection(): boolean; + /** + * Clear the current selection + */ + clearSelection(): void; + /** + * Copy the current selection to clipboard + * @returns true if there was text to copy, false otherwise + */ + copySelection(): boolean; + /** + * Select all text in the terminal + */ + selectAll(): void; + /** + * Select text at specific column and row with length + */ + select(column: number, row: number, length: number): void; + /** + * Select entire lines from start to end + */ + selectLines(start: number, end: number): void; + /** + * Get selection position as buffer range + */ + /** + * Get the current viewport Y position. + * + * This is the number of lines scrolled back from the bottom of the + * scrollback buffer. It may be fractional during smooth scrolling. + */ + getViewportY(): number; + getSelectionPosition(): IBufferRange | undefined; + /** + * Attach a custom keyboard event handler + * Returns true to prevent default handling + */ + attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void; + /** + * Attach a custom wheel event handler (Phase 2) + * Returns true to prevent default handling + */ + attachCustomWheelEventHandler(customWheelEventHandler?: (event: WheelEvent) => boolean): void; + /** + * Register a custom link provider + * Multiple providers can be registered to detect different types of links + * + * @example + * ```typescript + * term.registerLinkProvider({ + * provideLinks(y, callback) { + * // Detect URLs, file paths, etc. + * callback(detectedLinks); + * } + * }); + * ``` + */ + registerLinkProvider(provider: ILinkProvider): void; + /** + * Scroll viewport by a number of lines + * @param amount Number of lines to scroll (positive = down, negative = up) + */ + scrollLines(amount: number): void; + /** + * Scroll viewport by a number of pages + * @param amount Number of pages to scroll (positive = down, negative = up) + */ + scrollPages(amount: number): void; + /** + * Scroll viewport to the top of the scrollback buffer + */ + scrollToTop(): void; + /** + * Scroll viewport to the bottom (current output) + */ + scrollToBottom(): void; + /** + * Scroll viewport to a specific line in the buffer + * @param line Line number (0 = top of scrollback, scrollbackLength = bottom) + */ + scrollToLine(line: number): void; + /** + * Smoothly scroll to a target viewport position + * @param targetY Target viewport Y position (in lines, can be fractional) + */ + private smoothScrollTo; + /** + * Animation loop for smooth scrolling + * Uses asymptotic approach - moves a fraction of remaining distance each frame + */ + private animateScroll; + /** + * Dispose terminal and clean up resources + */ + dispose(): void; + /** + * Cancel the render loop + */ + private cancelRenderLoop; + /** + * Flush any writes that were queued during resize + */ + private flushWriteQueue; + /** + * Start the render loop + */ + private startRenderLoop; + /** + * Get a line from native WASM scrollback buffer + * Implements IScrollbackProvider + */ + getScrollbackLine(offset: number): GhosttyCell[] | null; + /** + * Get scrollback length from native WASM + * Implements IScrollbackProvider + */ + getScrollbackLength(): number; + private armBootstrapBlank; + private disarmBootstrapBlank; + /** + * Clean up components (called on dispose or error) + */ + private cleanupComponents; + /** + * Assert terminal is open (throw if not) + */ + private assertOpen; + /** + * Handle mouse move for link hover detection and scrollbar dragging + * Throttled to avoid blocking scroll events (except when dragging scrollbar) + */ + private handleMouseMove; + /** + * Process mouse move for link detection (internal, called by throttled handler) + */ + private processMouseMove; + /** + * Handle mouse leave to clear link hover + */ + private handleMouseLeave; + /** + * Handle mouse click for link activation + */ + private handleClick; + /** + * Handle wheel events for scrolling (Phase 2) + */ + private handleWheel; + /** + * Handle mouse down for scrollbar interaction + */ + private handleMouseDown; + /** + * Handle mouse up for scrollbar drag + */ + private handleMouseUp; + /** + * Process scrollbar drag movement + */ + private processScrollbarDrag; + /** + * Show scrollbar with fade-in and schedule auto-hide + */ + private showScrollbar; + /** + * Hide scrollbar with fade-out + */ + private hideScrollbar; + /** + * Fade in scrollbar + */ + private fadeInScrollbar; + /** + * Fade out scrollbar + */ + private fadeOutScrollbar; + /** + * Process any pending terminal responses and emit them via onData. + * + * This handles escape sequences that require the terminal to send a response + * back to the PTY, such as: + * - DSR 6 (cursor position): Shell sends \x1b[6n, terminal responds with \x1b[row;colR + * - DSR 5 (operating status): Shell sends \x1b[5n, terminal responds with \x1b[0n + * + * Without this, shells like nushell that rely on cursor position queries + * will hang waiting for a response that never comes. + * + * Note: We loop to read all pending responses, not just one. This is important + * when multiple queries are processed in a single write() call (e.g., when + * buffered data is written all at once during terminal initialization). + */ + private processTerminalResponses; + /** + * Check for title changes in written data (OSC sequences) + * Simplified implementation - looks for OSC 0, 1, 2 + */ + private checkForTitleChange; + /** + * Query terminal mode state + * + * @param mode Mode number (e.g., 2004 for bracketed paste) + * @param isAnsi True for ANSI modes, false for DEC modes (default: false) + * @returns true if mode is enabled + */ + getMode(mode: number, isAnsi?: boolean): boolean; + /** + * Check if bracketed paste mode is enabled + */ + hasBracketedPaste(): boolean; + /** + * Check if focus event reporting is enabled + */ + hasFocusEvents(): boolean; + /** + * Check if mouse tracking is enabled + */ + hasMouseTracking(): boolean; +} + +/** + * Opaque terminal pointer (WASM memory address) + */ +export declare type TerminalHandle = number; + +/** + * URL Regex Provider + * + * Detects plain text URLs on a single line using regex. + * Does not support multi-line URLs or file paths. + * + * Supported protocols: + * - https://, http:// + * - mailto: + * - ftp://, ssh://, git:// + * - tel:, magnet: + * - gemini://, gopher://, news: + */ +export declare class UrlRegexProvider implements ILinkProvider { + private terminal; + /** + * URL regex pattern + * Matches common protocols followed by valid URL characters + * Excludes file paths (no ./ or ../ or bare /) + */ + private static readonly URL_REGEX; + /** + * Characters to strip from end of URLs + * Common punctuation that's unlikely to be part of the URL + */ + private static readonly TRAILING_PUNCTUATION; + constructor(terminal: ITerminalForUrlProvider); + /** + * Provide all regex-detected URLs on the given row + */ + provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void; + /** + * Convert a buffer line to plain text string + */ + private lineToText; + dispose(): void; +} + +export { } diff --git a/ghostty-vt.wasm b/ghostty-vt.wasm new file mode 100755 index 0000000000000000000000000000000000000000..128d46f41a290e529234857d5a76234c3b23d323 GIT binary patch literal 423910 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

>PUx`j0AGD1YH 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 F{{!-vZ%zOJ literal 0 HcmV?d00001 diff --git a/lib/terminal.ts b/lib/terminal.ts index eeb7acd..13cf8c9 100644 --- a/lib/terminal.ts +++ b/lib/terminal.ts @@ -34,10 +34,66 @@ import type { import { LinkDetector } from './link-detector'; import { OSC8LinkProvider } from './providers/osc8-link-provider'; import { UrlRegexProvider } from './providers/url-regex-provider'; -import { CanvasRenderer } from './renderer'; +import { CanvasRenderer, DEFAULT_THEME, type IRenderable } from './renderer'; import { SelectionManager } from './selection-manager'; import type { ILink, ILinkProvider } from './types'; +function parseCssColorToRgb( + input: string | undefined, + fallback: { r: number; g: number; b: number } +): { r: number; g: number; b: number } { + const raw = String(input || '').trim(); + if (!raw) return fallback; + + if (raw.startsWith('#')) { + const hex = raw.slice(1); + const full = hex.length === 3 ? hex.split('').map((c) => c + c).join('') : hex; + if (/^[0-9a-fA-F]{6}$/.test(full)) { + const value = Number.parseInt(full, 16); + return { + r: (value >> 16) & 255, + g: (value >> 8) & 255, + b: value & 255, + }; + } + } + + const rgbMatch = raw.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/i); + if (rgbMatch) { + return { + r: Number.parseInt(rgbMatch[1], 10), + g: Number.parseInt(rgbMatch[2], 10), + b: Number.parseInt(rgbMatch[3], 10), + }; + } + + return fallback; +} + +function createBlankBootstrapCells( + cols: number, + rows: number, + colors: { foreground: string; background: string } +): GhosttyCell[][] { + const fg = parseCssColorToRgb(colors.foreground, { r: 212, g: 212, b: 212 }); + const bg = parseCssColorToRgb(colors.background, { r: 30, g: 30, b: 30 }); + const cell: GhosttyCell = { + codepoint: 32, + fg_r: fg.r, + fg_g: fg.g, + fg_b: fg.b, + bg_r: bg.r, + bg_g: bg.g, + bg_b: bg.b, + flags: 0, + width: 1, + hyperlink_id: 0, + grapheme_len: 0, + }; + + return Array.from({ length: rows }, () => Array.from({ length: cols }, () => ({ ...cell }))); +} + // ============================================================================ // Terminal Class // ============================================================================ @@ -133,6 +189,10 @@ export class Terminal implements ITerminalCore { private readonly SCROLLBAR_HIDE_DELAY_MS = 1500; // Hide after 1.5 seconds private readonly SCROLLBAR_FADE_DURATION_MS = 200; // 200ms fade animation + private bootstrapCells: GhosttyCell[][] | null = null; + private bootstrapDirty: boolean = false; + private bootstrapBuffer: IRenderable; + constructor(options: ITerminalOptions = {}) { // Use provided Ghostty instance (for test isolation) or get module-level instance this.ghostty = options.ghostty ?? getGhostty(); @@ -173,6 +233,45 @@ export class Terminal implements ITerminalCore { // Initialize buffer API this.buffer = new BufferNamespace(this); + + this.bootstrapBuffer = { + getLine: (y: number) => { + if (this.bootstrapCells && y >= 0 && y < this.bootstrapCells.length) { + return this.bootstrapCells[y]; + } + return this.wasmTerm?.getLine(y) ?? null; + }, + getCursor: () => { + if (this.bootstrapCells) { + return { x: 0, y: 0, visible: true }; + } + return this.wasmTerm?.getCursor() ?? { x: 0, y: 0, visible: true }; + }, + getDimensions: () => ({ cols: this.cols, rows: this.rows }), + isRowDirty: (y: number) => { + if (this.bootstrapDirty) return true; + if (this.bootstrapCells) return false; + return this.wasmTerm?.isRowDirty(y) ?? false; + }, + needsFullRedraw: () => { + if (this.bootstrapDirty) return true; + if (this.bootstrapCells) return false; + const wasmTerm = this.wasmTerm as unknown as { needsFullRedraw?: () => boolean } | undefined; + return wasmTerm?.needsFullRedraw?.() ?? false; + }, + clearDirty: () => { + this.bootstrapDirty = false; + this.wasmTerm?.clearDirty(); + }, + getGraphemeString: (row: number, col: number) => { + if (this.bootstrapCells && row >= 0 && row < this.bootstrapCells.length) { + const cell = this.bootstrapCells[row]?.[col]; + return cell ? String.fromCodePoint(cell.codepoint || 32) : ' '; + } + const wasmTerm = this.wasmTerm as unknown as { getGraphemeString?: (row: number, col: number) => string } | undefined; + return wasmTerm?.getGraphemeString?.(row, col) ?? ' '; + }, + }; } // ========================================================================== @@ -520,7 +619,8 @@ export class Terminal implements ITerminalCore { parent.addEventListener('wheel', this.handleWheel, { passive: false, capture: true }); // Render initial blank screen (force full redraw) - this.renderer.render(this.wasmTerm, true, this.viewportY, this, this.scrollbarOpacity); + this.armBootstrapBlank(); + this.renderer.render(this.bootstrapBuffer, true, this.viewportY, this, this.scrollbarOpacity); // Start render loop this.startRenderLoop(); @@ -553,6 +653,8 @@ export class Terminal implements ITerminalCore { * Internal write implementation (extracted from write()) */ private writeInternal(data: string | Uint8Array, callback?: () => void): void { + this.disarmBootstrapBlank(); + // Note: We intentionally do NOT clear selection on write - most modern terminals // preserve selection when new data arrives. Selection is cleared by user actions // like clicking or typing, not by incoming data. @@ -725,8 +827,10 @@ export class Terminal implements ITerminalCore { const config = this.buildWasmConfig(); this.wasmTerm = this.ghostty!.createTerminal(this.cols, this.rows, config); - // Clear renderer + // Clear renderer and re-arm the bootstrap blank until real terminal output arrives + this.armBootstrapBlank(); this.renderer!.clear(); + this.renderer!.render(this.bootstrapBuffer, true, this.viewportY, this, this.scrollbarOpacity); // Reset title this.currentTitle = ''; @@ -1161,7 +1265,7 @@ export class Terminal implements ITerminalCore { // 1. Calls update() once to sync state and check dirty flags // 2. Only redraws dirty rows when forceAll=false // 3. Always calls clearDirty() at the end - this.renderer!.render(this.wasmTerm!, false, this.viewportY, this, this.scrollbarOpacity); + this.renderer!.render(this.bootstrapBuffer, false, this.viewportY, this, this.scrollbarOpacity); // Check for cursor movement (Phase 2: onCursorMove event) // Note: getCursor() reads from already-updated render state (from render() above) @@ -1199,6 +1303,21 @@ export class Terminal implements ITerminalCore { return this.wasmTerm.getScrollbackLength(); } + private armBootstrapBlank(): void { + const theme = { ...DEFAULT_THEME, ...this.options.theme }; + this.bootstrapCells = createBlankBootstrapCells(this.cols, this.rows, { + foreground: theme.foreground, + background: theme.background, + }); + this.bootstrapDirty = true; + } + + private disarmBootstrapBlank(): void { + if (!this.bootstrapCells) return; + this.bootstrapCells = null; + this.bootstrapDirty = true; + } + /** * Clean up components (called on dispose or error) */