@opentui/core 0.1.97 → 0.1.98

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5788,6 +5788,18 @@ var isShiftKey = (code) => {
5788
5788
  var isCtrlKey = (code) => {
5789
5789
  return ["Oa", "Ob", "Oc", "Od", "Oe", "[2^", "[3^", "[5^", "[6^", "[7^", "[8^"].includes(code);
5790
5790
  };
5791
+ var getCtrlKeyName = (charCode) => {
5792
+ if (charCode === 0) {
5793
+ return "space";
5794
+ }
5795
+ if (charCode >= 1 && charCode <= 26) {
5796
+ return String.fromCharCode(charCode + 97 - 1);
5797
+ }
5798
+ if (charCode >= 28 && charCode <= 31) {
5799
+ return String.fromCharCode(charCode + 64);
5800
+ }
5801
+ return;
5802
+ };
5791
5803
  var modifyOtherKeysRe = /^\x1b\[27;(\d+);(\d+)~$/;
5792
5804
  var parseKeypress = (s = "", options = {}) => {
5793
5805
  let parts;
@@ -5852,6 +5864,8 @@ var parseKeypress = (s = "", options = {}) => {
5852
5864
  source: "raw"
5853
5865
  };
5854
5866
  key.sequence = key.sequence || s || key.name;
5867
+ const ctrlKeyName = s.length === 1 ? getCtrlKeyName(s.charCodeAt(0)) : undefined;
5868
+ const metaCtrlKeyName = s.length === 2 && s[0] === "\x1B" ? getCtrlKeyName(s.charCodeAt(1)) : undefined;
5855
5869
  if (options.useKittyKeyboard) {
5856
5870
  const kittyResult = parseKittyKeyboard(s);
5857
5871
  if (kittyResult) {
@@ -5907,11 +5921,8 @@ var parseKeypress = (s = "", options = {}) => {
5907
5921
  } else if (s === " " || s === "\x1B ") {
5908
5922
  key.name = "space";
5909
5923
  key.meta = s.length === 2;
5910
- } else if (s === "\x00") {
5911
- key.name = "space";
5912
- key.ctrl = true;
5913
- } else if (s.length === 1 && s <= "\x1A") {
5914
- key.name = String.fromCharCode(s.charCodeAt(0) + 97 - 1);
5924
+ } else if (ctrlKeyName) {
5925
+ key.name = ctrlKeyName;
5915
5926
  key.ctrl = true;
5916
5927
  } else if (s.length === 1 && s >= "0" && s <= "9") {
5917
5928
  key.name = s;
@@ -5937,10 +5948,10 @@ var parseKeypress = (s = "", options = {}) => {
5937
5948
  } else {
5938
5949
  key.name = char;
5939
5950
  }
5940
- } else if (s.length === 2 && s[0] === "\x1B" && s[1] <= "\x1A") {
5951
+ } else if (metaCtrlKeyName) {
5941
5952
  key.meta = true;
5942
5953
  key.ctrl = true;
5943
- key.name = String.fromCharCode(s.charCodeAt(1) + 97 - 1);
5954
+ key.name = metaCtrlKeyName;
5944
5955
  } else if (parts = fnKeyRe.exec(s)) {
5945
5956
  const segs = [...s];
5946
5957
  if (segs[0] === "\x1B" && segs[1] === "\x1B") {
@@ -8457,19 +8468,7 @@ class ProcessQueue {
8457
8468
  }
8458
8469
 
8459
8470
  // src/lib/tree-sitter/default-parsers.ts
8460
- import { resolve, dirname } from "path";
8461
8471
  import { fileURLToPath } from "url";
8462
- import javascript_highlights from "./assets/javascript/highlights.scm" with { type: "file" };
8463
- import javascript_language from "./assets/javascript/tree-sitter-javascript.wasm" with { type: "file" };
8464
- import typescript_highlights from "./assets/typescript/highlights.scm" with { type: "file" };
8465
- import typescript_language from "./assets/typescript/tree-sitter-typescript.wasm" with { type: "file" };
8466
- import markdown_highlights from "./assets/markdown/highlights.scm" with { type: "file" };
8467
- import markdown_language from "./assets/markdown/tree-sitter-markdown.wasm" with { type: "file" };
8468
- import markdown_injections from "./assets/markdown/injections.scm" with { type: "file" };
8469
- import markdown_inline_highlights from "./assets/markdown_inline/highlights.scm" with { type: "file" };
8470
- import markdown_inline_language from "./assets/markdown_inline/tree-sitter-markdown_inline.wasm" with { type: "file" };
8471
- import zig_highlights from "./assets/zig/highlights.scm" with { type: "file" };
8472
- import zig_language from "./assets/zig/tree-sitter-zig.wasm" with { type: "file" };
8473
8472
  var _cachedParsers;
8474
8473
  function getParsers() {
8475
8474
  if (!_cachedParsers) {
@@ -8478,25 +8477,25 @@ function getParsers() {
8478
8477
  filetype: "javascript",
8479
8478
  aliases: ["javascriptreact"],
8480
8479
  queries: {
8481
- highlights: [resolve(dirname(fileURLToPath(import.meta.url)), javascript_highlights)]
8480
+ highlights: [fileURLToPath(new URL("./assets/javascript/highlights.scm", import.meta.url))]
8482
8481
  },
8483
- wasm: resolve(dirname(fileURLToPath(import.meta.url)), javascript_language)
8482
+ wasm: fileURLToPath(new URL("./assets/javascript/tree-sitter-javascript.wasm", import.meta.url))
8484
8483
  },
8485
8484
  {
8486
8485
  filetype: "typescript",
8487
8486
  aliases: ["typescriptreact"],
8488
8487
  queries: {
8489
- highlights: [resolve(dirname(fileURLToPath(import.meta.url)), typescript_highlights)]
8488
+ highlights: [fileURLToPath(new URL("./assets/typescript/highlights.scm", import.meta.url))]
8490
8489
  },
8491
- wasm: resolve(dirname(fileURLToPath(import.meta.url)), typescript_language)
8490
+ wasm: fileURLToPath(new URL("./assets/typescript/tree-sitter-typescript.wasm", import.meta.url))
8492
8491
  },
8493
8492
  {
8494
8493
  filetype: "markdown",
8495
8494
  queries: {
8496
- highlights: [resolve(dirname(fileURLToPath(import.meta.url)), markdown_highlights)],
8497
- injections: [resolve(dirname(fileURLToPath(import.meta.url)), markdown_injections)]
8495
+ highlights: [fileURLToPath(new URL("./assets/markdown/highlights.scm", import.meta.url))],
8496
+ injections: [fileURLToPath(new URL("./assets/markdown/injections.scm", import.meta.url))]
8498
8497
  },
8499
- wasm: resolve(dirname(fileURLToPath(import.meta.url)), markdown_language),
8498
+ wasm: fileURLToPath(new URL("./assets/markdown/tree-sitter-markdown.wasm", import.meta.url)),
8500
8499
  injectionMapping: {
8501
8500
  nodeTypes: {
8502
8501
  inline: "markdown_inline",
@@ -8519,16 +8518,16 @@ function getParsers() {
8519
8518
  {
8520
8519
  filetype: "markdown_inline",
8521
8520
  queries: {
8522
- highlights: [resolve(dirname(fileURLToPath(import.meta.url)), markdown_inline_highlights)]
8521
+ highlights: [fileURLToPath(new URL("./assets/markdown_inline/highlights.scm", import.meta.url))]
8523
8522
  },
8524
- wasm: resolve(dirname(fileURLToPath(import.meta.url)), markdown_inline_language)
8523
+ wasm: fileURLToPath(new URL("./assets/markdown_inline/tree-sitter-markdown_inline.wasm", import.meta.url))
8525
8524
  },
8526
8525
  {
8527
8526
  filetype: "zig",
8528
8527
  queries: {
8529
- highlights: [resolve(dirname(fileURLToPath(import.meta.url)), zig_highlights)]
8528
+ highlights: [fileURLToPath(new URL("./assets/zig/highlights.scm", import.meta.url))]
8530
8529
  },
8531
- wasm: resolve(dirname(fileURLToPath(import.meta.url)), zig_language)
8530
+ wasm: fileURLToPath(new URL("./assets/zig/tree-sitter-zig.wasm", import.meta.url))
8532
8531
  }
8533
8532
  ];
8534
8533
  }
@@ -8536,7 +8535,7 @@ function getParsers() {
8536
8535
  }
8537
8536
 
8538
8537
  // src/lib/tree-sitter/client.ts
8539
- import { resolve as resolve2, isAbsolute, parse } from "path";
8538
+ import { resolve, isAbsolute, parse } from "path";
8540
8539
  import { existsSync } from "fs";
8541
8540
 
8542
8541
  // src/lib/bunfs.ts
@@ -8609,7 +8608,7 @@ class TreeSitterClient extends EventEmitter2 {
8609
8608
  worker_path = this.options.workerPath;
8610
8609
  } else {
8611
8610
  worker_path = new URL("./parser.worker.js", import.meta.url).href;
8612
- if (!existsSync(resolve2(import.meta.dirname, "parser.worker.js"))) {
8611
+ if (!existsSync(resolve(import.meta.dirname, "parser.worker.js"))) {
8613
8612
  worker_path = new URL("./parser.worker.ts", import.meta.url).href;
8614
8613
  }
8615
8614
  }
@@ -8644,7 +8643,7 @@ class TreeSitterClient extends EventEmitter2 {
8644
8643
  if (this.initializePromise) {
8645
8644
  return this.initializePromise;
8646
8645
  }
8647
- this.initializePromise = new Promise((resolve3, reject) => {
8646
+ this.initializePromise = new Promise((resolve2, reject) => {
8648
8647
  const timeoutMs = this.options.initTimeout ?? 1e4;
8649
8648
  const timeoutId = setTimeout(() => {
8650
8649
  const error = new Error("Worker initialization timed out");
@@ -8652,7 +8651,7 @@ class TreeSitterClient extends EventEmitter2 {
8652
8651
  this.initializeResolvers = undefined;
8653
8652
  reject(error);
8654
8653
  }, timeoutMs);
8655
- this.initializeResolvers = { resolve: resolve3, reject, timeoutId };
8654
+ this.initializeResolvers = { resolve: resolve2, reject, timeoutId };
8656
8655
  this.worker?.postMessage({
8657
8656
  type: "INIT",
8658
8657
  dataPath: this.options.dataPath
@@ -8675,7 +8674,7 @@ class TreeSitterClient extends EventEmitter2 {
8675
8674
  return normalizeBunfsPath(parse(path).base);
8676
8675
  }
8677
8676
  if (!isAbsolute(path)) {
8678
- return resolve2(path);
8677
+ return resolve(path);
8679
8678
  }
8680
8679
  return path;
8681
8680
  }
@@ -8693,8 +8692,8 @@ class TreeSitterClient extends EventEmitter2 {
8693
8692
  }
8694
8693
  async getPerformance() {
8695
8694
  const messageId = `performance_${this.messageIdCounter++}`;
8696
- return new Promise((resolve3) => {
8697
- this.messageCallbacks.set(messageId, resolve3);
8695
+ return new Promise((resolve2) => {
8696
+ this.messageCallbacks.set(messageId, resolve2);
8698
8697
  this.worker?.postMessage({ type: "GET_PERFORMANCE", messageId });
8699
8698
  });
8700
8699
  }
@@ -8707,8 +8706,8 @@ class TreeSitterClient extends EventEmitter2 {
8707
8706
  }
8708
8707
  }
8709
8708
  const messageId = `oneshot_${this.messageIdCounter++}`;
8710
- return new Promise((resolve3) => {
8711
- this.messageCallbacks.set(messageId, resolve3);
8709
+ return new Promise((resolve2) => {
8710
+ this.messageCallbacks.set(messageId, resolve2);
8712
8711
  this.worker?.postMessage({
8713
8712
  type: "ONESHOT_HIGHLIGHT",
8714
8713
  content,
@@ -8817,8 +8816,8 @@ class TreeSitterClient extends EventEmitter2 {
8817
8816
  }
8818
8817
  async preloadParser(filetype) {
8819
8818
  const messageId = `has_parser_${this.messageIdCounter++}`;
8820
- const response = await new Promise((resolve3) => {
8821
- this.messageCallbacks.set(messageId, resolve3);
8819
+ const response = await new Promise((resolve2) => {
8820
+ this.messageCallbacks.set(messageId, resolve2);
8822
8821
  this.worker?.postMessage({
8823
8822
  type: "PRELOAD_PARSER",
8824
8823
  filetype,
@@ -8845,8 +8844,8 @@ class TreeSitterClient extends EventEmitter2 {
8845
8844
  }
8846
8845
  this.buffers.set(id, { id, content, filetype, version, hasParser: false });
8847
8846
  const messageId = `init_${this.messageIdCounter++}`;
8848
- const response = await new Promise((resolve3) => {
8849
- this.messageCallbacks.set(messageId, resolve3);
8847
+ const response = await new Promise((resolve2) => {
8848
+ this.messageCallbacks.set(messageId, resolve2);
8850
8849
  this.worker?.postMessage({
8851
8850
  type: "INITIALIZE_PARSER",
8852
8851
  bufferId: id,
@@ -8902,9 +8901,9 @@ class TreeSitterClient extends EventEmitter2 {
8902
8901
  this.editQueues.delete(bufferId);
8903
8902
  }
8904
8903
  if (this.worker) {
8905
- await new Promise((resolve3) => {
8904
+ await new Promise((resolve2) => {
8906
8905
  const messageId = `dispose_${bufferId}`;
8907
- this.messageCallbacks.set(messageId, resolve3);
8906
+ this.messageCallbacks.set(messageId, resolve2);
8908
8907
  try {
8909
8908
  this.worker.postMessage({
8910
8909
  type: "DISPOSE_BUFFER",
@@ -8912,13 +8911,13 @@ class TreeSitterClient extends EventEmitter2 {
8912
8911
  });
8913
8912
  } catch (error) {
8914
8913
  console.error("Error disposing buffer", error);
8915
- resolve3(false);
8914
+ resolve2(false);
8916
8915
  }
8917
8916
  setTimeout(() => {
8918
8917
  if (this.messageCallbacks.has(messageId)) {
8919
8918
  this.messageCallbacks.delete(messageId);
8920
8919
  console.warn({ bufferId }, "Timed out waiting for buffer to be disposed");
8921
- resolve3(false);
8920
+ resolve2(false);
8922
8921
  }
8923
8922
  }, 3000);
8924
8923
  });
@@ -8975,12 +8974,12 @@ class TreeSitterClient extends EventEmitter2 {
8975
8974
  this.options.dataPath = dataPath;
8976
8975
  if (this.initialized && this.worker) {
8977
8976
  const messageId = `update_datapath_${this.messageIdCounter++}`;
8978
- return new Promise((resolve3, reject) => {
8977
+ return new Promise((resolve2, reject) => {
8979
8978
  this.messageCallbacks.set(messageId, (response) => {
8980
8979
  if (response.error) {
8981
8980
  reject(new Error(response.error));
8982
8981
  } else {
8983
- resolve3();
8982
+ resolve2();
8984
8983
  }
8985
8984
  });
8986
8985
  this.worker.postMessage({
@@ -8996,12 +8995,12 @@ class TreeSitterClient extends EventEmitter2 {
8996
8995
  throw new Error("Cannot clear cache: client is not initialized");
8997
8996
  }
8998
8997
  const messageId = `clear_cache_${this.messageIdCounter++}`;
8999
- return new Promise((resolve3, reject) => {
8998
+ return new Promise((resolve2, reject) => {
9000
8999
  this.messageCallbacks.set(messageId, (response) => {
9001
9000
  if (response.error) {
9002
9001
  reject(new Error(response.error));
9003
9002
  } else {
9004
- resolve3();
9003
+ resolve2();
9005
9004
  }
9006
9005
  });
9007
9006
  this.worker.postMessage({
@@ -9527,26 +9526,13 @@ ${content}`);
9527
9526
  return "./" + path4.relative(path4.dirname(outputPath), queryPath);
9528
9527
  }
9529
9528
  async function generateDefaultParsersFile(parsers, outputPath) {
9530
- const imports = parsers.map((parser) => {
9531
- const safeFiletype = parser.filetype.replace(/[^a-zA-Z0-9]/g, "_");
9532
- const lines = [
9533
- `import ${safeFiletype}_highlights from "${parser.highlightsPath}" with { type: "file" }`,
9534
- `import ${safeFiletype}_language from "${parser.languagePath}" with { type: "file" }`
9535
- ];
9536
- if (parser.injectionsPath) {
9537
- lines.push(`import ${safeFiletype}_injections from "${parser.injectionsPath}" with { type: "file" }`);
9538
- }
9539
- return lines.join(`
9540
- `);
9541
- }).join(`
9542
- `);
9543
9529
  const parserDefinitions = parsers.map((parser) => {
9544
9530
  const safeFiletype = parser.filetype.replace(/[^a-zA-Z0-9]/g, "_");
9545
9531
  const queriesLines = [
9546
- ` highlights: [resolve(dirname(fileURLToPath(import.meta.url)), ${safeFiletype}_highlights)],`
9532
+ ` highlights: [fileURLToPath(new URL("${parser.highlightsPath}", import.meta.url))],`
9547
9533
  ];
9548
9534
  if (parser.injectionsPath) {
9549
- queriesLines.push(` injections: [resolve(dirname(fileURLToPath(import.meta.url)), ${safeFiletype}_injections)],`);
9535
+ queriesLines.push(` injections: [fileURLToPath(new URL("${parser.injectionsPath}", import.meta.url))],`);
9550
9536
  }
9551
9537
  const injectionMappingLine = parser.injectionMapping ? ` injectionMapping: ${JSON.stringify(parser.injectionMapping, null, 10)},` : "";
9552
9538
  const aliasesLine = parser.aliases?.length ? ` aliases: ${JSON.stringify(parser.aliases)},` : "";
@@ -9557,7 +9543,7 @@ ${aliasesLine ? aliasesLine + `
9557
9543
  ${queriesLines.join(`
9558
9544
  `)}
9559
9545
  },
9560
- wasm: resolve(dirname(fileURLToPath(import.meta.url)), ${safeFiletype}_language),${injectionMappingLine ? `
9546
+ wasm: fileURLToPath(new URL("${parser.languagePath}", import.meta.url)),${injectionMappingLine ? `
9561
9547
  ` + injectionMappingLine : ""}
9562
9548
  }`;
9563
9549
  }).join(`,
@@ -9567,11 +9553,8 @@ ${queriesLines.join(`
9567
9553
  // Last generated: ${new Date().toISOString()}
9568
9554
 
9569
9555
  import type { FiletypeParserOptions } from "./types"
9570
- import { resolve, dirname } from "path"
9571
9556
  import { fileURLToPath } from "url"
9572
9557
 
9573
- ${imports}
9574
-
9575
9558
  // Cached parsers to avoid re-resolving paths on every call
9576
9559
  let _cachedParsers: FiletypeParserOptions[] | undefined
9577
9560
 
@@ -10463,7 +10446,7 @@ class TerminalPalette {
10463
10446
  const out = this.stdout;
10464
10447
  if (!out.isTTY || !this.stdin.isTTY)
10465
10448
  return false;
10466
- return new Promise((resolve4) => {
10449
+ return new Promise((resolve3) => {
10467
10450
  const session = this.createQuerySession();
10468
10451
  let buffer = "";
10469
10452
  let settled = false;
@@ -10472,7 +10455,7 @@ class TerminalPalette {
10472
10455
  return;
10473
10456
  settled = true;
10474
10457
  session.cleanup();
10475
- resolve4(supported);
10458
+ resolve3(supported);
10476
10459
  };
10477
10460
  const onData = (chunk) => {
10478
10461
  buffer += chunk.toString();
@@ -10495,7 +10478,7 @@ class TerminalPalette {
10495
10478
  if (!out.isTTY || !this.stdin.isTTY) {
10496
10479
  return results;
10497
10480
  }
10498
- return new Promise((resolve4) => {
10481
+ return new Promise((resolve3) => {
10499
10482
  const session = this.createQuerySession();
10500
10483
  let buffer = "";
10501
10484
  let idleTimer = null;
@@ -10505,7 +10488,7 @@ class TerminalPalette {
10505
10488
  return;
10506
10489
  settled = true;
10507
10490
  session.cleanup();
10508
- resolve4(results);
10491
+ resolve3(results);
10509
10492
  };
10510
10493
  const onData = (chunk) => {
10511
10494
  buffer += chunk.toString();
@@ -10546,7 +10529,7 @@ class TerminalPalette {
10546
10529
  if (!out.isTTY || !this.stdin.isTTY) {
10547
10530
  return results;
10548
10531
  }
10549
- return new Promise((resolve4) => {
10532
+ return new Promise((resolve3) => {
10550
10533
  const session = this.createQuerySession();
10551
10534
  let buffer = "";
10552
10535
  let idleTimer = null;
@@ -10556,7 +10539,7 @@ class TerminalPalette {
10556
10539
  return;
10557
10540
  settled = true;
10558
10541
  session.cleanup();
10559
- resolve4(results);
10542
+ resolve3(results);
10560
10543
  };
10561
10544
  const onData = (chunk) => {
10562
10545
  buffer += chunk.toString();
@@ -14648,6 +14631,7 @@ class Renderable extends BaseRenderable {
14648
14631
  frameBuffer = null;
14649
14632
  _focusable = false;
14650
14633
  _focused = false;
14634
+ _hasFocusedDescendant = false;
14651
14635
  keypressHandler = null;
14652
14636
  pasteHandler = null;
14653
14637
  _live = false;
@@ -14797,11 +14781,24 @@ class Renderable extends BaseRenderable {
14797
14781
  };
14798
14782
  this.ctx._internalKeyInput.onInternal("keypress", this.keypressHandler);
14799
14783
  this.ctx._internalKeyInput.onInternal("paste", this.pasteHandler);
14784
+ this.propagateFocusChange(true);
14800
14785
  this.emit("focused" /* FOCUSED */);
14801
14786
  }
14787
+ propagateFocusChange(hasFocus) {
14788
+ let parent = this.parent;
14789
+ while (parent) {
14790
+ if (parent._hasFocusedDescendant !== hasFocus) {
14791
+ parent._hasFocusedDescendant = hasFocus;
14792
+ parent.markDirty();
14793
+ }
14794
+ parent = parent.parent;
14795
+ }
14796
+ this.requestRender();
14797
+ }
14802
14798
  blur() {
14803
14799
  if (!this._focused || !this._focusable)
14804
14800
  return;
14801
+ this._ctx.blurRenderable(this);
14805
14802
  this._focused = false;
14806
14803
  this.requestRender();
14807
14804
  if (this.keypressHandler) {
@@ -14812,11 +14809,15 @@ class Renderable extends BaseRenderable {
14812
14809
  this.ctx._internalKeyInput.offInternal("paste", this.pasteHandler);
14813
14810
  this.pasteHandler = null;
14814
14811
  }
14812
+ this.propagateFocusChange(false);
14815
14813
  this.emit("blurred" /* BLURRED */);
14816
14814
  }
14817
14815
  get focused() {
14818
14816
  return this._focused;
14819
14817
  }
14818
+ get hasFocusedDescendant() {
14819
+ return this._hasFocusedDescendant;
14820
+ }
14820
14821
  get live() {
14821
14822
  return this._live;
14822
14823
  }
@@ -15352,7 +15353,10 @@ class Renderable extends BaseRenderable {
15352
15353
  }
15353
15354
  try {
15354
15355
  const widthMethod = this._ctx.widthMethod;
15355
- this.frameBuffer = OptimizedBuffer.create(w, h, widthMethod, { respectAlpha: true, id: `framebuffer-${this.id}` });
15356
+ this.frameBuffer = OptimizedBuffer.create(w, h, widthMethod, {
15357
+ respectAlpha: true,
15358
+ id: `framebuffer-${this.id}`
15359
+ });
15356
15360
  } catch (error) {
15357
15361
  console.error(`Failed to create frame buffer for ${this.id}:`, error);
15358
15362
  this.frameBuffer = null;
@@ -15739,7 +15743,14 @@ class Renderable extends BaseRenderable {
15739
15743
  class RootRenderable extends Renderable {
15740
15744
  renderList = [];
15741
15745
  constructor(ctx) {
15742
- super(ctx, { id: "__root__", zIndex: 0, visible: true, width: ctx.width, height: ctx.height, enableLayout: true });
15746
+ super(ctx, {
15747
+ id: "__root__",
15748
+ zIndex: 0,
15749
+ visible: true,
15750
+ width: ctx.width,
15751
+ height: ctx.height,
15752
+ enableLayout: true
15753
+ });
15743
15754
  if (this.yogaNode) {
15744
15755
  this.yogaNode.free();
15745
15756
  }
@@ -16581,6 +16592,41 @@ function mergeKeyBindings(defaults, custom) {
16581
16592
  function getKeyBindingKey(binding) {
16582
16593
  return `${binding.name}:${binding.ctrl ? 1 : 0}:${binding.shift ? 1 : 0}:${binding.meta ? 1 : 0}:${binding.super ? 1 : 0}`;
16583
16594
  }
16595
+ function getBaseCodeKeyName(baseCode) {
16596
+ if (baseCode === undefined || baseCode < 32 || baseCode === 127) {
16597
+ return;
16598
+ }
16599
+ try {
16600
+ const name = String.fromCodePoint(baseCode);
16601
+ if (name.length === 1 && name >= "A" && name <= "Z") {
16602
+ return name.toLowerCase();
16603
+ }
16604
+ return name;
16605
+ } catch {
16606
+ return;
16607
+ }
16608
+ }
16609
+ function getKeyBindingKeys(binding) {
16610
+ const names = new Set([binding.name]);
16611
+ const baseCodeName = getBaseCodeKeyName(binding.baseCode);
16612
+ if (baseCodeName) {
16613
+ names.add(baseCodeName);
16614
+ }
16615
+ return [...names].map((name) => getKeyBindingKey({ ...binding, name }));
16616
+ }
16617
+ function getKeyBindingAction(map, binding) {
16618
+ for (const key of getKeyBindingKeys(binding)) {
16619
+ const action = map.get(key);
16620
+ if (action !== undefined) {
16621
+ return action;
16622
+ }
16623
+ }
16624
+ return;
16625
+ }
16626
+ function matchesKeyBinding(binding, match) {
16627
+ const matchKey = getKeyBindingKey(match);
16628
+ return getKeyBindingKeys(binding).includes(matchKey);
16629
+ }
16584
16630
  function buildKeyBindingsMap(bindings, aliasMap) {
16585
16631
  const map = new Map;
16586
16632
  const aliases = aliasMap || {};
@@ -16964,15 +17010,7 @@ class TerminalConsole extends EventEmitter8 {
16964
17010
  this.blur();
16965
17011
  return;
16966
17012
  }
16967
- const bindingKey = getKeyBindingKey({
16968
- name: event.name,
16969
- ctrl: event.ctrl,
16970
- shift: event.shift,
16971
- meta: event.meta,
16972
- super: event.super,
16973
- action: "scroll-up"
16974
- });
16975
- const action = this._keyBindingsMap.get(bindingKey);
17013
+ const action = getKeyBindingAction(this._keyBindingsMap, event);
16976
17014
  if (action) {
16977
17015
  const handler = this._actionHandlers.get(action);
16978
17016
  if (handler) {
@@ -18248,6 +18286,8 @@ class EditBufferRenderable extends Renderable {
18248
18286
  const cursor = this.editorView.getCursor();
18249
18287
  if (cursor.col > 0) {
18250
18288
  this.editBuffer.deleteRange(cursor.row, 0, cursor.row, cursor.col);
18289
+ } else if (cursor.row > 0) {
18290
+ this.editBuffer.deleteCharBackward();
18251
18291
  }
18252
18292
  this.requestRender();
18253
18293
  return true;
@@ -18841,7 +18881,7 @@ var rendererTracker = singleton("RendererTracker", () => {
18841
18881
  });
18842
18882
  async function createCliRenderer(config = {}) {
18843
18883
  if (process.argv.includes("--delay-start")) {
18844
- await new Promise((resolve4) => setTimeout(resolve4, 5000));
18884
+ await new Promise((resolve3) => setTimeout(resolve3, 5000));
18845
18885
  }
18846
18886
  const stdin = config.stdin || process.stdin;
18847
18887
  const stdout = config.stdout || process.stdout;
@@ -19001,7 +19041,11 @@ class CliRenderer extends EventEmitter9 {
19001
19041
  _capabilities = null;
19002
19042
  _latestPointer = { x: 0, y: 0 };
19003
19043
  _hasPointer = false;
19004
- _lastPointerModifiers = { shift: false, alt: false, ctrl: false };
19044
+ _lastPointerModifiers = {
19045
+ shift: false,
19046
+ alt: false,
19047
+ ctrl: false
19048
+ };
19005
19049
  _currentMousePointerStyle = undefined;
19006
19050
  _currentFocusedRenderable = null;
19007
19051
  lifecyclePasses = new Set;
@@ -19121,7 +19165,7 @@ Captured output:
19121
19165
  const useKittyForParsing = kittyConfig !== null;
19122
19166
  this._keyHandler = new InternalKeyHandler;
19123
19167
  this._keyHandler.on("keypress", (event) => {
19124
- if (this.exitOnCtrlC && event.name === "c" && event.ctrl) {
19168
+ if (this.exitOnCtrlC && matchesKeyBinding(event, { name: "c", ctrl: true })) {
19125
19169
  process.nextTick(() => {
19126
19170
  this.destroy();
19127
19171
  });
@@ -19232,15 +19276,18 @@ Captured output:
19232
19276
  if (this._currentFocusedRenderable === renderable)
19233
19277
  return;
19234
19278
  const prev = this.currentFocusedEditor;
19235
- if (this._currentFocusedRenderable) {
19236
- this._currentFocusedRenderable.blur();
19237
- }
19279
+ this._currentFocusedRenderable?.blur();
19238
19280
  this._currentFocusedRenderable = renderable;
19239
19281
  const next = this.currentFocusedEditor;
19240
19282
  if (prev !== next) {
19241
19283
  this.emit("focused_editor" /* FOCUSED_EDITOR */, next, prev);
19242
19284
  }
19243
19285
  }
19286
+ blurRenderable(renderable) {
19287
+ if (this._currentFocusedRenderable === renderable) {
19288
+ this._currentFocusedRenderable = null;
19289
+ }
19290
+ }
19244
19291
  setCapturedRenderable(renderable) {
19245
19292
  if (this.capturedRenderable === renderable) {
19246
19293
  return;
@@ -19332,8 +19379,8 @@ Captured output:
19332
19379
  if (!this.isIdleNow())
19333
19380
  return;
19334
19381
  const resolvers = this.idleResolvers.splice(0);
19335
- for (const resolve4 of resolvers) {
19336
- resolve4();
19382
+ for (const resolve3 of resolvers) {
19383
+ resolve3();
19337
19384
  }
19338
19385
  }
19339
19386
  idle() {
@@ -19341,8 +19388,8 @@ Captured output:
19341
19388
  return Promise.resolve();
19342
19389
  if (this.isIdleNow())
19343
19390
  return Promise.resolve();
19344
- return new Promise((resolve4) => {
19345
- this.idleResolvers.push(resolve4);
19391
+ return new Promise((resolve3) => {
19392
+ this.idleResolvers.push(resolve3);
19346
19393
  });
19347
19394
  }
19348
19395
  get resolution() {
@@ -19820,14 +19867,20 @@ Captured output:
19820
19867
  if (mouseEvent.type === "drag" && this.currentSelection?.isDragging) {
19821
19868
  this.updateSelection(maybeRenderable, mouseEvent.x, mouseEvent.y);
19822
19869
  if (maybeRenderable) {
19823
- const event2 = new MouseEvent(maybeRenderable, { ...mouseEvent, isDragging: true });
19870
+ const event2 = new MouseEvent(maybeRenderable, {
19871
+ ...mouseEvent,
19872
+ isDragging: true
19873
+ });
19824
19874
  maybeRenderable.processMouseEvent(event2);
19825
19875
  }
19826
19876
  return true;
19827
19877
  }
19828
19878
  if (mouseEvent.type === "up" && this.currentSelection?.isDragging) {
19829
19879
  if (maybeRenderable) {
19830
- const event2 = new MouseEvent(maybeRenderable, { ...mouseEvent, isDragging: true });
19880
+ const event2 = new MouseEvent(maybeRenderable, {
19881
+ ...mouseEvent,
19882
+ isDragging: true
19883
+ });
19831
19884
  maybeRenderable.processMouseEvent(event2);
19832
19885
  }
19833
19886
  this.finishSelection();
@@ -19842,7 +19895,10 @@ Captured output:
19842
19895
  }
19843
19896
  if (!sameElement && (mouseEvent.type === "drag" || mouseEvent.type === "move")) {
19844
19897
  if (this.lastOverRenderable && this.lastOverRenderable !== this.capturedRenderable && !this.lastOverRenderable.isDestroyed) {
19845
- const event2 = new MouseEvent(this.lastOverRenderable, { ...mouseEvent, type: "out" });
19898
+ const event2 = new MouseEvent(this.lastOverRenderable, {
19899
+ ...mouseEvent,
19900
+ type: "out"
19901
+ });
19846
19902
  this.lastOverRenderable.processMouseEvent(event2);
19847
19903
  }
19848
19904
  this.lastOverRenderable = maybeRenderable;
@@ -19861,7 +19917,10 @@ Captured output:
19861
19917
  return true;
19862
19918
  }
19863
19919
  if (this.capturedRenderable && mouseEvent.type === "up") {
19864
- const event2 = new MouseEvent(this.capturedRenderable, { ...mouseEvent, type: "drag-end" });
19920
+ const event2 = new MouseEvent(this.capturedRenderable, {
19921
+ ...mouseEvent,
19922
+ type: "drag-end"
19923
+ });
19865
19924
  this.capturedRenderable.processMouseEvent(event2);
19866
19925
  this.capturedRenderable.processMouseEvent(new MouseEvent(this.capturedRenderable, mouseEvent));
19867
19926
  if (maybeRenderable) {
@@ -20269,6 +20328,7 @@ Captured output:
20269
20328
  pixelResolutionQueryActive: false,
20270
20329
  explicitWidthCprActive: false
20271
20330
  }, true);
20331
+ this._useMouse = false;
20272
20332
  this.setCapturedRenderable(undefined);
20273
20333
  this.stdin.removeListener("data", this.stdinListener);
20274
20334
  if (this.stdin.setRawMode) {
@@ -20599,7 +20659,7 @@ Captured output:
20599
20659
  }
20600
20660
  }
20601
20661
 
20602
- export { __toESM, __commonJS, __export, __require, Edge, Gutter, MeasureMode, exports_src, isValidBorderStyle, parseBorderStyle, BorderChars, getBorderFromSides, getBorderSides, borderCharsToArray, BorderCharArrays, KeyEvent, PasteEvent, KeyHandler, InternalKeyHandler, RGBA, hexToRgb, rgbToHex, hsvToRgb, parseColor, fonts, measureText, getCharacterPositions, coordinateToCharacterIndex, renderFontToFrameBuffer, TextAttributes, ATTRIBUTE_BASE_BITS, ATTRIBUTE_BASE_MASK, getBaseAttributes, DebugOverlayCorner, TargetChannel, createTextAttributes, attributesWithLink, getLinkId, visualizeRenderableTree, isStyledText, StyledText, stringToStyledText, black, red, green, yellow, blue, magenta, cyan, white, brightBlack, brightRed, brightGreen, brightYellow, brightBlue, brightMagenta, brightCyan, brightWhite, bgBlack, bgRed, bgGreen, bgYellow, bgBlue, bgMagenta, bgCyan, bgWhite, bold, italic, underline, strikethrough, dim, reverse, blink, fg, bg, link, t, hastToStyledText, SystemClock, nonAlphanumericKeys, parseKeypress, LinearScrollAccel, MacOSScrollAccel, parseAlign, parseAlignItems, parseBoxSizing, parseDimension, parseDirection, parseDisplay, parseEdge, parseFlexDirection, parseGutter, parseJustify, parseLogLevel, parseMeasureMode, parseOverflow, parsePositionType, parseUnit, parseWrap, MouseParser, Selection, convertGlobalToLocalSelection, ASCIIFontSelectionHelper, envRegistry, registerEnvVar, clearEnvCache, generateEnvMarkdown, generateEnvColored, env, StdinParser, treeSitterToTextChunks, treeSitterToStyledText, addDefaultParsers, TreeSitterClient, DataPathsManager, getDataPaths, extensionToFiletype, basenameToFiletype, extToFiletype, pathToFiletype, infoStringToFiletype, main, getTreeSitterClient, ExtmarksController, createExtmarksController, TerminalPalette, createTerminalPalette, decodePasteBytes, stripAnsiSequences, detectLinks, TextBuffer, SpanInfoStruct, LogLevel2 as LogLevel, setRenderLibPath, resolveRenderLib, OptimizedBuffer, h, isVNode, maybeMakeRenderable, wrapWithDelegates, instantiate, delegate, isValidPercentage, LayoutEvents, RenderableEvents, isRenderable, BaseRenderable, Renderable, RootRenderable, EditBuffer, EditorView, ANSI, defaultKeyAliases, mergeKeyAliases, mergeKeyBindings, getKeyBindingKey, buildKeyBindingsMap, capture, ConsolePosition, TerminalConsole, getObjectsInViewport, EditBufferRenderableEvents, isEditBufferRenderable, EditBufferRenderable, buildKittyKeyboardFlags, MouseEvent, MouseButton, createCliRenderer, CliRenderEvents, RendererControlState, CliRenderer };
20662
+ export { __toESM, __commonJS, __export, __require, Edge, Gutter, MeasureMode, exports_src, isValidBorderStyle, parseBorderStyle, BorderChars, getBorderFromSides, getBorderSides, borderCharsToArray, BorderCharArrays, KeyEvent, PasteEvent, KeyHandler, InternalKeyHandler, RGBA, hexToRgb, rgbToHex, hsvToRgb, parseColor, fonts, measureText, getCharacterPositions, coordinateToCharacterIndex, renderFontToFrameBuffer, TextAttributes, ATTRIBUTE_BASE_BITS, ATTRIBUTE_BASE_MASK, getBaseAttributes, DebugOverlayCorner, TargetChannel, createTextAttributes, attributesWithLink, getLinkId, visualizeRenderableTree, isStyledText, StyledText, stringToStyledText, black, red, green, yellow, blue, magenta, cyan, white, brightBlack, brightRed, brightGreen, brightYellow, brightBlue, brightMagenta, brightCyan, brightWhite, bgBlack, bgRed, bgGreen, bgYellow, bgBlue, bgMagenta, bgCyan, bgWhite, bold, italic, underline, strikethrough, dim, reverse, blink, fg, bg, link, t, hastToStyledText, SystemClock, nonAlphanumericKeys, parseKeypress, LinearScrollAccel, MacOSScrollAccel, parseAlign, parseAlignItems, parseBoxSizing, parseDimension, parseDirection, parseDisplay, parseEdge, parseFlexDirection, parseGutter, parseJustify, parseLogLevel, parseMeasureMode, parseOverflow, parsePositionType, parseUnit, parseWrap, MouseParser, Selection, convertGlobalToLocalSelection, ASCIIFontSelectionHelper, envRegistry, registerEnvVar, clearEnvCache, generateEnvMarkdown, generateEnvColored, env, StdinParser, treeSitterToTextChunks, treeSitterToStyledText, addDefaultParsers, TreeSitterClient, DataPathsManager, getDataPaths, extensionToFiletype, basenameToFiletype, extToFiletype, pathToFiletype, infoStringToFiletype, main, getTreeSitterClient, ExtmarksController, createExtmarksController, TerminalPalette, createTerminalPalette, decodePasteBytes, stripAnsiSequences, detectLinks, TextBuffer, SpanInfoStruct, LogLevel2 as LogLevel, setRenderLibPath, resolveRenderLib, OptimizedBuffer, h, isVNode, maybeMakeRenderable, wrapWithDelegates, instantiate, delegate, isValidPercentage, LayoutEvents, RenderableEvents, isRenderable, BaseRenderable, Renderable, RootRenderable, EditBuffer, EditorView, ANSI, defaultKeyAliases, mergeKeyAliases, mergeKeyBindings, getKeyBindingAction, buildKeyBindingsMap, capture, ConsolePosition, TerminalConsole, getObjectsInViewport, EditBufferRenderableEvents, isEditBufferRenderable, EditBufferRenderable, buildKittyKeyboardFlags, MouseEvent, MouseButton, createCliRenderer, CliRenderEvents, RendererControlState, CliRenderer };
20603
20663
 
20604
- //# debugId=7AE492200477211D64756E2164756E21
20605
- //# sourceMappingURL=index-kgg0v67t.js.map
20664
+ //# debugId=62BA1E72DD78CA1964756E2164756E21
20665
+ //# sourceMappingURL=index-e4g80551.js.map