@vibecook/ghosttea-react 0.11.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +27 -0
  2. package/dist/TerminalSurface.d.ts.map +1 -1
  3. package/dist/TerminalSurface.js +31 -4
  4. package/dist/TerminalSurface.js.map +1 -1
  5. package/dist/appearance/AppearanceSettings.d.ts +3 -2
  6. package/dist/appearance/AppearanceSettings.d.ts.map +1 -1
  7. package/dist/appearance/AppearanceSettings.js +3 -2
  8. package/dist/appearance/AppearanceSettings.js.map +1 -1
  9. package/dist/appearance/BackdropBlurControl.d.ts +5 -0
  10. package/dist/appearance/BackdropBlurControl.d.ts.map +1 -0
  11. package/dist/appearance/BackdropBlurControl.js +42 -0
  12. package/dist/appearance/BackdropBlurControl.js.map +1 -0
  13. package/dist/appearance/types.d.ts +6 -0
  14. package/dist/appearance/types.d.ts.map +1 -1
  15. package/dist/link-input.d.ts +18 -0
  16. package/dist/link-input.d.ts.map +1 -0
  17. package/dist/link-input.js +27 -0
  18. package/dist/link-input.js.map +1 -0
  19. package/dist/renderers/background-geometry.d.ts +16 -0
  20. package/dist/renderers/background-geometry.d.ts.map +1 -0
  21. package/dist/renderers/background-geometry.js +20 -0
  22. package/dist/renderers/background-geometry.js.map +1 -0
  23. package/dist/renderers/types.d.ts +2 -0
  24. package/dist/renderers/types.d.ts.map +1 -1
  25. package/dist/renderers/types.js.map +1 -1
  26. package/dist/renderers/webgpu-renderer.d.ts.map +1 -1
  27. package/dist/renderers/webgpu-renderer.js +10 -2
  28. package/dist/renderers/webgpu-renderer.js.map +1 -1
  29. package/dist/runtime.d.ts +5 -0
  30. package/dist/runtime.d.ts.map +1 -1
  31. package/dist/runtime.js +50 -6
  32. package/dist/runtime.js.map +1 -1
  33. package/dist/styles.css +13 -0
  34. package/dist/terminal-render.worker.js +71 -9
  35. package/dist/terminal-render.worker.js.map +3 -3
  36. package/dist/use-terminal-links.d.ts +17 -0
  37. package/dist/use-terminal-links.d.ts.map +1 -0
  38. package/dist/use-terminal-links.js +101 -0
  39. package/dist/use-terminal-links.js.map +1 -0
  40. package/dist/worker-messages.d.ts +5 -0
  41. package/dist/worker-messages.d.ts.map +1 -1
  42. package/dist/workspace/Workspace.d.ts +6 -3
  43. package/dist/workspace/Workspace.d.ts.map +1 -1
  44. package/dist/workspace/Workspace.js +18 -9
  45. package/dist/workspace/Workspace.js.map +1 -1
  46. package/dist/workspace/index.d.ts +2 -2
  47. package/dist/workspace/index.d.ts.map +1 -1
  48. package/dist/workspace/index.js.map +1 -1
  49. package/dist/workspace/pane-focus.d.ts +8 -0
  50. package/dist/workspace/pane-focus.d.ts.map +1 -0
  51. package/dist/workspace/pane-focus.js +24 -0
  52. package/dist/workspace/pane-focus.js.map +1 -0
  53. package/dist/workspace/pane-layout.d.ts +2 -1
  54. package/dist/workspace/pane-layout.d.ts.map +1 -1
  55. package/dist/workspace/pane-layout.js +29 -2
  56. package/dist/workspace/pane-layout.js.map +1 -1
  57. package/package.json +4 -4
@@ -22,6 +22,7 @@ var SectionKind;
22
22
  SectionKind2[SectionKind2["ViewportMetadata"] = 9] = "ViewportMetadata";
23
23
  SectionKind2[SectionKind2["AccessibilityText"] = 10] = "AccessibilityText";
24
24
  SectionKind2[SectionKind2["ClipboardWrite"] = 11] = "ClipboardWrite";
25
+ SectionKind2[SectionKind2["LinkTargets"] = 12] = "LinkTargets";
25
26
  })(SectionKind || (SectionKind = {}));
26
27
  var GlyphFormat;
27
28
  (function(GlyphFormat2) {
@@ -230,6 +231,39 @@ function decodeClipboardWrite(section) {
230
231
  assertRange(length === section.bytes.byteLength - 4, "clipboard length mismatch");
231
232
  return new TextDecoder("utf-8", { fatal: true }).decode(section.bytes.subarray(4));
232
233
  }
234
+ function decodeLinkTargets(section, cols, rows) {
235
+ const bytes = section.bytes;
236
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
237
+ assertRange(bytes.length >= 4, "truncated link count");
238
+ const count = view.getUint32(0, true);
239
+ assertRange(count === section.itemCount && count <= cols * rows, "invalid link count");
240
+ const links = [];
241
+ const decoder = new TextDecoder("utf-8", { fatal: true });
242
+ let offset = 4;
243
+ for (let index = 0; index < count; index++) {
244
+ assertRange(offset + 8 <= bytes.length, "truncated link header");
245
+ const length = view.getUint32(offset, true);
246
+ const spanCount = view.getUint16(offset + 4, true);
247
+ const flags = view.getUint16(offset + 6, true);
248
+ offset += 8;
249
+ assertRange(length > 0 && length <= 8192 && spanCount > 0 && spanCount <= rows && flags <= 1, "invalid link header");
250
+ assertRange(offset + length + spanCount * 6 <= bytes.length, "truncated link target");
251
+ const uri = decoder.decode(bytes.subarray(offset, offset + length));
252
+ offset += length;
253
+ const spans = [];
254
+ for (let spanIndex = 0; spanIndex < spanCount; spanIndex++) {
255
+ const row = view.getUint16(offset, true);
256
+ const startColumn = view.getUint16(offset + 2, true);
257
+ const endColumn = view.getUint16(offset + 4, true);
258
+ assertRange(row < rows && startColumn < endColumn && endColumn <= cols, "link span exceeds viewport");
259
+ spans.push({ row, startColumn, endColumn });
260
+ offset += 6;
261
+ }
262
+ links.push({ uri, explicit: flags === 1, spans });
263
+ }
264
+ assertRange(offset === bytes.length, "trailing link data");
265
+ return links;
266
+ }
233
267
 
234
268
  // src/performance.ts
235
269
  function emptyRenderMetrics() {
@@ -422,6 +456,18 @@ function graphemeCellWidth(grapheme) {
422
456
  return /\p{Extended_Pictographic}/u.test(grapheme) || codepoint >= 4352 && codepoint <= 4447 || codepoint >= 11904 && codepoint <= 42191 || codepoint >= 44032 && codepoint <= 55203 || codepoint >= 63744 && codepoint <= 64255 || codepoint >= 65040 && codepoint <= 65135 || codepoint >= 65280 && codepoint <= 65376 || codepoint >= 127744 && codepoint <= 129791 || codepoint >= 131072 && codepoint <= 262141 ? 2 : 1;
423
457
  }
424
458
 
459
+ // src/renderers/background-geometry.ts
460
+ function backgroundRunBounds(run, row, cols, rows, scale, viewportWidth, viewportHeight) {
461
+ if (cols <= 0 || row < 0 || row >= rows || run.cellSpan <= 0 || run.cellStart >= cols) return null;
462
+ const end = run.cellStart + run.cellSpan;
463
+ const x = run.cellStart === 0 ? 0 : (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale;
464
+ const y = row === 0 ? 0 : (ORIGIN_Y + row * LINE_HEIGHT) * scale;
465
+ const right = end >= cols ? viewportWidth : Math.min(viewportWidth, (ORIGIN_X + end * CELL_WIDTH) * scale);
466
+ const bottom = row === rows - 1 ? viewportHeight : Math.min(viewportHeight, (ORIGIN_Y + (row + 1) * LINE_HEIGHT) * scale);
467
+ if (right <= x || bottom <= y) return null;
468
+ return { x, y, width: right - x, height: bottom - y };
469
+ }
470
+
425
471
  // src/renderers/render-damage.ts
426
472
  function rowsForDamage(rowCount, damage, sceneValid) {
427
473
  const full = !sceneValid || !damage || damage.full;
@@ -1079,6 +1125,7 @@ function geometryCacheKey(view, rows, hasNativeRows, atlasGenerations) {
1079
1125
  return [
1080
1126
  view.sessionEpoch.toString(),
1081
1127
  view.layoutEpoch.toString(),
1128
+ view.cols,
1082
1129
  hasNativeRows ? "native" : "fallback",
1083
1130
  rows.map((row) => `${row}:${view.rowRevisions[row]?.toString() ?? "-"}`).join(","),
1084
1131
  [
@@ -1891,12 +1938,14 @@ var WebGpuTerminalRenderer = class _WebGpuTerminalRenderer {
1891
1938
  for (const run of view.nativeStyleRows[row] ?? []) {
1892
1939
  const style = styleFor(run.styleId);
1893
1940
  if (!style.background) continue;
1941
+ const bounds = backgroundRunBounds(run, row, view.cols, rowCount, scale, viewportWidth, viewportHeight);
1942
+ if (!bounds) continue;
1894
1943
  pushRectangle(
1895
1944
  rectangleVertices,
1896
- (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale,
1897
- (ORIGIN_Y + row * LINE_HEIGHT) * scale,
1898
- run.cellSpan * CELL_WIDTH * scale,
1899
- LINE_HEIGHT * scale,
1945
+ bounds.x,
1946
+ bounds.y,
1947
+ bounds.width,
1948
+ bounds.height,
1900
1949
  style.background,
1901
1950
  viewportWidth,
1902
1951
  viewportHeight
@@ -2123,12 +2172,14 @@ var WebGpuTerminalRenderer = class _WebGpuTerminalRenderer {
2123
2172
  for (const run of view.nativeStyleRows[row] ?? []) {
2124
2173
  const style = styleFor(run.styleId);
2125
2174
  if (!style.background) continue;
2175
+ const bounds = backgroundRunBounds(run, row, view.cols, rowCount, scale, viewportWidth, viewportHeight);
2176
+ if (!bounds) continue;
2126
2177
  pushRectangle(
2127
2178
  rectangleVertices,
2128
- (ORIGIN_X + run.cellStart * CELL_WIDTH) * scale,
2129
- (ORIGIN_Y + row * LINE_HEIGHT) * scale,
2130
- run.cellSpan * CELL_WIDTH * scale,
2131
- LINE_HEIGHT * scale,
2179
+ bounds.x,
2180
+ bounds.y,
2181
+ bounds.width,
2182
+ bounds.height,
2132
2183
  style.background,
2133
2184
  viewportWidth,
2134
2185
  viewportHeight
@@ -3826,6 +3877,7 @@ function postToRenderer(message) {
3826
3877
  }
3827
3878
  function emptySessionSnapshot() {
3828
3879
  return {
3880
+ cols: 0,
3829
3881
  rows: [],
3830
3882
  nativeRows: [],
3831
3883
  nativeStyleRows: [],
@@ -3839,7 +3891,8 @@ function emptySessionSnapshot() {
3839
3891
  sequence: 0n,
3840
3892
  awaitingResync: false,
3841
3893
  catalogFallback: false,
3842
- scrollbar: null
3894
+ scrollbar: null,
3895
+ linkSignature: ""
3843
3896
  };
3844
3897
  }
3845
3898
  function snapshot(sessionHandle) {
@@ -3941,6 +3994,7 @@ function deleteSurface(surfaceId) {
3941
3994
  }
3942
3995
  function renderView(session, presentation) {
3943
3996
  return {
3997
+ cols: session.cols,
3944
3998
  rows: session.rows,
3945
3999
  nativeRows: session.nativeRows,
3946
4000
  nativeStyleRows: session.nativeStyleRows,
@@ -4271,6 +4325,8 @@ function applyFrame(packet, expectedIdentity, expectedLayout) {
4271
4325
  for (const replacement of replacements) {
4272
4326
  if (replacement.row >= frame.rows) throw new RangeError("Row replacement exceeds viewport");
4273
4327
  }
4328
+ const linkSection = frame.sections.find((candidate) => candidate.kind === SectionKind.LinkTargets);
4329
+ const links = linkSection ? decodeLinkTargets(linkSection, frame.cols, frame.rows) : [];
4274
4330
  const nextCursor = decodeCursorState(cursorSection);
4275
4331
  const clipboardText = clipboardSection ? decodeClipboardWrite(clipboardSection) : void 0;
4276
4332
  let scrollbar;
@@ -4380,6 +4436,7 @@ function applyFrame(packet, expectedIdentity, expectedLayout) {
4380
4436
  rowRevisions[replacement.row] = replacement.revision;
4381
4437
  damagedRows.push(replacement.row);
4382
4438
  }
4439
+ previous.cols = frame.cols;
4383
4440
  previous.rows = rows;
4384
4441
  previous.nativeRows = nativeRows;
4385
4442
  previous.nativeStyleRows = nativeStyleRows;
@@ -4396,6 +4453,11 @@ function applyFrame(packet, expectedIdentity, expectedLayout) {
4396
4453
  snapshots.set(id, previous);
4397
4454
  if (installedScene) clearSessionCatalog(installedScene);
4398
4455
  }
4456
+ const linkSignature = JSON.stringify(links);
4457
+ if (previous.linkSignature !== linkSignature || changedSession || completingResync) {
4458
+ previous.linkSignature = linkSignature;
4459
+ postToRenderer({ type: "link-targets", sessionHandle: id, links });
4460
+ }
4399
4461
  if (clipboardText !== void 0) postToRenderer({ type: "clipboard-write", text: clipboardText });
4400
4462
  if (scrollbarChanged && scrollbar) postToRenderer({ type: "scrollbar-state", sessionHandle: id, scrollbar });
4401
4463
  if (completingResync) postToRenderer({ type: "frame-resync-complete", sessionHandle: id });