@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.
- package/README.md +27 -0
- package/dist/TerminalSurface.d.ts.map +1 -1
- package/dist/TerminalSurface.js +31 -4
- package/dist/TerminalSurface.js.map +1 -1
- package/dist/appearance/AppearanceSettings.d.ts +3 -2
- package/dist/appearance/AppearanceSettings.d.ts.map +1 -1
- package/dist/appearance/AppearanceSettings.js +3 -2
- package/dist/appearance/AppearanceSettings.js.map +1 -1
- package/dist/appearance/BackdropBlurControl.d.ts +5 -0
- package/dist/appearance/BackdropBlurControl.d.ts.map +1 -0
- package/dist/appearance/BackdropBlurControl.js +42 -0
- package/dist/appearance/BackdropBlurControl.js.map +1 -0
- package/dist/appearance/types.d.ts +6 -0
- package/dist/appearance/types.d.ts.map +1 -1
- package/dist/link-input.d.ts +18 -0
- package/dist/link-input.d.ts.map +1 -0
- package/dist/link-input.js +27 -0
- package/dist/link-input.js.map +1 -0
- package/dist/renderers/background-geometry.d.ts +16 -0
- package/dist/renderers/background-geometry.d.ts.map +1 -0
- package/dist/renderers/background-geometry.js +20 -0
- package/dist/renderers/background-geometry.js.map +1 -0
- package/dist/renderers/types.d.ts +2 -0
- package/dist/renderers/types.d.ts.map +1 -1
- package/dist/renderers/types.js.map +1 -1
- package/dist/renderers/webgpu-renderer.d.ts.map +1 -1
- package/dist/renderers/webgpu-renderer.js +10 -2
- package/dist/renderers/webgpu-renderer.js.map +1 -1
- package/dist/runtime.d.ts +5 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +50 -6
- package/dist/runtime.js.map +1 -1
- package/dist/styles.css +13 -0
- package/dist/terminal-render.worker.js +71 -9
- package/dist/terminal-render.worker.js.map +3 -3
- package/dist/use-terminal-links.d.ts +17 -0
- package/dist/use-terminal-links.d.ts.map +1 -0
- package/dist/use-terminal-links.js +101 -0
- package/dist/use-terminal-links.js.map +1 -0
- package/dist/worker-messages.d.ts +5 -0
- package/dist/worker-messages.d.ts.map +1 -1
- package/dist/workspace/Workspace.d.ts +6 -3
- package/dist/workspace/Workspace.d.ts.map +1 -1
- package/dist/workspace/Workspace.js +18 -9
- package/dist/workspace/Workspace.js.map +1 -1
- package/dist/workspace/index.d.ts +2 -2
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace/pane-focus.d.ts +8 -0
- package/dist/workspace/pane-focus.d.ts.map +1 -0
- package/dist/workspace/pane-focus.js +24 -0
- package/dist/workspace/pane-focus.js.map +1 -0
- package/dist/workspace/pane-layout.d.ts +2 -1
- package/dist/workspace/pane-layout.d.ts.map +1 -1
- package/dist/workspace/pane-layout.js +29 -2
- package/dist/workspace/pane-layout.js.map +1 -1
- 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
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
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
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
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 });
|