@floegence/floeterm-terminal-web 0.5.22 → 0.5.24
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 +2 -1
- package/dist/core/TerminalCore.d.ts +2 -1
- package/dist/core/TerminalCore.d.ts.map +1 -1
- package/dist/core/TerminalCore.js +66 -46
- package/dist/core/TerminalCore.js.map +1 -1
- package/dist/core/TerminalInputBridge.d.ts +17 -7
- package/dist/core/TerminalInputBridge.d.ts.map +1 -1
- package/dist/core/TerminalInputBridge.js +78 -73
- package/dist/core/TerminalInputBridge.js.map +1 -1
- package/package.json +8 -2
package/README.md
CHANGED
|
@@ -76,6 +76,7 @@ import { preparePagedTerminalHistory } from '@floegence/floeterm-terminal-web/hi
|
|
|
76
76
|
- You must provide a `TerminalTransport` and `TerminalEventSource` for the managed controller.
|
|
77
77
|
- `ghostty-web` needs a one-time `init()`; `TerminalCore` handles that internally.
|
|
78
78
|
- `TerminalCore` bridges the hidden textarea used by `ghostty-web`, so soft-keyboard and composition input continue to work on touch devices.
|
|
79
|
+
- The hidden terminal input is mounted in the document viewport plane and anchored from rendered cursor geometry, so native IME candidate windows stay aligned without expanding transformed terminal hosts.
|
|
79
80
|
- Programmatic terminal focus uses no-scroll focus by default, keeping embedded terminals stable inside scaled, projected, or otherwise transformed host surfaces.
|
|
80
81
|
- Explicit terminal copy is handled through shared selection-copy APIs, so keyboard shortcuts, native app menus, and product context menus can reuse the same selection logic.
|
|
81
82
|
- `TerminalCore` exposes runtime appearance updates, shell bell/title events, custom terminal link providers, buffer line reads, and touch-scroll helpers without requiring consumers to reach into private runtime objects.
|
|
@@ -215,7 +216,7 @@ With `copyOnSelect: false`, `TerminalCore` keeps selection explicit:
|
|
|
215
216
|
|
|
216
217
|
- `core.hasSelection()` reports whether the terminal currently owns a copyable selection.
|
|
217
218
|
- `core.copySelection()` writes the current terminal selection to the clipboard.
|
|
218
|
-
- `Cmd+C` / `Ctrl+C` only
|
|
219
|
+
- `Cmd+C` / `Ctrl+C` copies only when the terminal currently has a selection. Without a selection, `Ctrl+C` remains terminal input and produces the standard interrupt control byte; `Cmd+C` is not converted into terminal input.
|
|
219
220
|
|
|
220
221
|
The managed controller exposes the same helpers through `controller.actions`.
|
|
221
222
|
|
|
@@ -13,6 +13,7 @@ export declare class TerminalCore {
|
|
|
13
13
|
private fabricAttachSeq;
|
|
14
14
|
private cancelFabricAttachSchedule;
|
|
15
15
|
private cancelInputRefocusSchedule;
|
|
16
|
+
private inputElement;
|
|
16
17
|
private viewportHost;
|
|
17
18
|
private renderHost;
|
|
18
19
|
private resizeObserver;
|
|
@@ -67,13 +68,13 @@ export declare class TerminalCore {
|
|
|
67
68
|
private createTerminalInstance;
|
|
68
69
|
private loadAddons;
|
|
69
70
|
private openTerminal;
|
|
71
|
+
private mountInputElement;
|
|
70
72
|
private installFitAddonGeometryPatch;
|
|
71
73
|
private proposeFitDimensions;
|
|
72
74
|
private proposeFabricFitDimensions;
|
|
73
75
|
private syncGhosttyInputGeometryToFabric;
|
|
74
76
|
private syncImeInputAnchor;
|
|
75
77
|
private shouldPreserveTransientInputPlacement;
|
|
76
|
-
private calibrateImeInputAnchorRect;
|
|
77
78
|
private resolveImeInputAnchorGeometry;
|
|
78
79
|
private isUsableAnchorGeometry;
|
|
79
80
|
private resolveImeCursorPosition;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TerminalCore.d.ts","sourceRoot":"","sources":["../../src/core/TerminalCore.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,aAAa,EACb,KAAK,MAAM,EAEX,KAAK,cAAc,EACnB,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAE1B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAGzB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,iCAAiC,EACtC,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EAElC,MAAM,aAAa,CAAC;AAsRrB,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAkSjF,qBAAa,YAAY;
|
|
1
|
+
{"version":3,"file":"TerminalCore.d.ts","sourceRoot":"","sources":["../../src/core/TerminalCore.ts"],"names":[],"mappings":"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"}
|
|
@@ -347,6 +347,7 @@ export class TerminalCore {
|
|
|
347
347
|
this.fabricAttachSeq = 0;
|
|
348
348
|
this.cancelFabricAttachSchedule = null;
|
|
349
349
|
this.cancelInputRefocusSchedule = null;
|
|
350
|
+
this.inputElement = null;
|
|
350
351
|
this.viewportHost = null;
|
|
351
352
|
this.renderHost = null;
|
|
352
353
|
this.resizeObserver = null;
|
|
@@ -531,6 +532,8 @@ export class TerminalCore {
|
|
|
531
532
|
this.fabricView = null;
|
|
532
533
|
this.terminal?.dispose();
|
|
533
534
|
this.terminal = null;
|
|
535
|
+
this.inputElement?.remove();
|
|
536
|
+
this.inputElement = null;
|
|
534
537
|
this.fitAddon = null;
|
|
535
538
|
this.viewportHost?.remove();
|
|
536
539
|
this.viewportHost = null;
|
|
@@ -602,18 +605,31 @@ export class TerminalCore {
|
|
|
602
605
|
}
|
|
603
606
|
await waitWithAbort(this.waitForDOMAndFonts(), signal);
|
|
604
607
|
await waitWithAbort(this.ensureContainerReady(), signal);
|
|
605
|
-
this.ensurePresentationHosts();
|
|
608
|
+
const renderHost = this.ensurePresentationHosts();
|
|
606
609
|
this.applyPresentationScaleStyles();
|
|
607
610
|
this.installDemandRenderPatchBeforeOpen();
|
|
608
|
-
this.terminal.open(
|
|
611
|
+
this.terminal.open(renderHost);
|
|
612
|
+
this.mountInputElement(renderHost);
|
|
609
613
|
this.stopGhosttyRenderLoop();
|
|
610
614
|
this.patchDemandRenderTriggersAfterOpen();
|
|
611
615
|
this.patchSelectionManagerClipboardBehavior();
|
|
612
616
|
this.patchSelectionManagerRenderingBehavior();
|
|
613
|
-
this.setupInputBridge();
|
|
617
|
+
this.setupInputBridge(renderHost);
|
|
614
618
|
this.applyRegisteredLinkProviders();
|
|
615
619
|
void this.refreshFontMetricsAfterLoad('open');
|
|
616
620
|
}
|
|
621
|
+
mountInputElement(renderHost) {
|
|
622
|
+
const input = resolveTerminalInputElement(renderHost);
|
|
623
|
+
if (!input) {
|
|
624
|
+
throw new Error('ghostty-web terminal input element was not created');
|
|
625
|
+
}
|
|
626
|
+
const body = this.container.ownerDocument.body;
|
|
627
|
+
if (!body) {
|
|
628
|
+
throw new Error('Terminal input requires a document body');
|
|
629
|
+
}
|
|
630
|
+
body.appendChild(input);
|
|
631
|
+
this.inputElement = input;
|
|
632
|
+
}
|
|
617
633
|
installFitAddonGeometryPatch() {
|
|
618
634
|
const fitAddon = this.fitAddon;
|
|
619
635
|
if (!fitAddon || fitAddon.__floetermGeometryPatchApplied) {
|
|
@@ -736,7 +752,7 @@ export class TerminalCore {
|
|
|
736
752
|
this.syncImeInputAnchor();
|
|
737
753
|
}
|
|
738
754
|
syncImeInputAnchor() {
|
|
739
|
-
const input =
|
|
755
|
+
const input = this.inputElement;
|
|
740
756
|
if (!input || this.shouldPreserveTransientInputPlacement(input)) {
|
|
741
757
|
return;
|
|
742
758
|
}
|
|
@@ -746,17 +762,34 @@ export class TerminalCore {
|
|
|
746
762
|
return;
|
|
747
763
|
}
|
|
748
764
|
const canvasRect = geometry.canvas.getBoundingClientRect();
|
|
749
|
-
const
|
|
750
|
-
const
|
|
751
|
-
if (!Number.isFinite(
|
|
765
|
+
const canvasClientWidth = Number(geometry.canvas.clientWidth);
|
|
766
|
+
const canvasClientHeight = Number(geometry.canvas.clientHeight);
|
|
767
|
+
if (!Number.isFinite(canvasClientWidth)
|
|
768
|
+
|| !Number.isFinite(canvasClientHeight)
|
|
769
|
+
|| canvasClientWidth <= 0
|
|
770
|
+
|| canvasClientHeight <= 0) {
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
773
|
+
const visibleScaleX = Number(canvasRect.width) / canvasClientWidth;
|
|
774
|
+
const visibleScaleY = Number(canvasRect.height) / canvasClientHeight;
|
|
775
|
+
const cellWidth = geometry.cellWidth * visibleScaleX;
|
|
776
|
+
const cellHeight = geometry.cellHeight * visibleScaleY;
|
|
777
|
+
const left = Number(canvasRect.left) + cursor.x * cellWidth;
|
|
778
|
+
const top = Number(canvasRect.top) + cursor.y * cellHeight;
|
|
779
|
+
if (!Number.isFinite(left)
|
|
780
|
+
|| !Number.isFinite(top)
|
|
781
|
+
|| !Number.isFinite(cellWidth)
|
|
782
|
+
|| !Number.isFinite(cellHeight)
|
|
783
|
+
|| cellWidth <= 0
|
|
784
|
+
|| cellHeight <= 0) {
|
|
752
785
|
return;
|
|
753
786
|
}
|
|
754
787
|
input.style.position = 'fixed';
|
|
755
788
|
input.style.left = formatCssPixelValue(left);
|
|
756
789
|
input.style.top = formatCssPixelValue(top);
|
|
757
|
-
input.style.width = formatCssPixelValue(
|
|
758
|
-
input.style.height = formatCssPixelValue(
|
|
759
|
-
input.style.lineHeight = formatCssPixelValue(
|
|
790
|
+
input.style.width = formatCssPixelValue(cellWidth);
|
|
791
|
+
input.style.height = formatCssPixelValue(cellHeight);
|
|
792
|
+
input.style.lineHeight = formatCssPixelValue(cellHeight);
|
|
760
793
|
input.style.padding = '0';
|
|
761
794
|
input.style.border = 'none';
|
|
762
795
|
input.style.margin = '0';
|
|
@@ -767,35 +800,10 @@ export class TerminalCore {
|
|
|
767
800
|
input.style.clipPath = 'none';
|
|
768
801
|
input.style.pointerEvents = 'none';
|
|
769
802
|
input.style.zIndex = '0';
|
|
770
|
-
this.calibrateImeInputAnchorRect(input, left, top);
|
|
771
803
|
}
|
|
772
804
|
shouldPreserveTransientInputPlacement(input) {
|
|
773
805
|
return input.style.pointerEvents === 'auto' || input.style.zIndex === '1000';
|
|
774
806
|
}
|
|
775
|
-
calibrateImeInputAnchorRect(input, targetLeft, targetTop) {
|
|
776
|
-
const rect = input.getBoundingClientRect();
|
|
777
|
-
if (rect.width <= 0
|
|
778
|
-
|| rect.height <= 0
|
|
779
|
-
|| !Number.isFinite(rect.left)
|
|
780
|
-
|| !Number.isFinite(rect.top)) {
|
|
781
|
-
return;
|
|
782
|
-
}
|
|
783
|
-
const deltaLeft = targetLeft - Number(rect.left);
|
|
784
|
-
const deltaTop = targetTop - Number(rect.top);
|
|
785
|
-
if (Math.abs(deltaLeft) < 0.5 && Math.abs(deltaTop) < 0.5) {
|
|
786
|
-
return;
|
|
787
|
-
}
|
|
788
|
-
const currentLeft = Number.parseFloat(input.style.left);
|
|
789
|
-
const currentTop = Number.parseFloat(input.style.top);
|
|
790
|
-
const nextLeft = (Number.isFinite(currentLeft) ? currentLeft : targetLeft) + deltaLeft;
|
|
791
|
-
const nextTop = (Number.isFinite(currentTop) ? currentTop : targetTop) + deltaTop;
|
|
792
|
-
if (Number.isFinite(nextLeft)) {
|
|
793
|
-
input.style.left = formatCssPixelValue(nextLeft);
|
|
794
|
-
}
|
|
795
|
-
if (Number.isFinite(nextTop)) {
|
|
796
|
-
input.style.top = formatCssPixelValue(nextTop);
|
|
797
|
-
}
|
|
798
|
-
}
|
|
799
807
|
resolveImeInputAnchorGeometry() {
|
|
800
808
|
const terminalAny = this.terminal;
|
|
801
809
|
const renderer = terminalAny?.renderer ?? null;
|
|
@@ -818,9 +826,8 @@ export class TerminalCore {
|
|
|
818
826
|
const metrics = renderer?.getMetrics?.() ?? renderer?.metrics ?? {};
|
|
819
827
|
const cols = Math.floor(Number(terminalAny?.cols));
|
|
820
828
|
const rows = Math.floor(Number(terminalAny?.rows));
|
|
821
|
-
const
|
|
822
|
-
const
|
|
823
|
-
const fallbackCellHeight = rows > 0 ? Number(canvasRect.height) / rows : Number.NaN;
|
|
829
|
+
const fallbackCellWidth = cols > 0 ? Number(canvas.clientWidth) / cols : Number.NaN;
|
|
830
|
+
const fallbackCellHeight = rows > 0 ? Number(canvas.clientHeight) / rows : Number.NaN;
|
|
824
831
|
const cellWidth = Number(metrics.width ?? renderer?.charWidth ?? fallbackCellWidth);
|
|
825
832
|
const cellHeight = Number(metrics.height ?? renderer?.charHeight ?? fallbackCellHeight);
|
|
826
833
|
if (!this.isUsableAnchorGeometry(cellWidth, cellHeight, cols, rows)) {
|
|
@@ -1126,7 +1133,10 @@ export class TerminalCore {
|
|
|
1126
1133
|
}
|
|
1127
1134
|
ensurePresentationHosts() {
|
|
1128
1135
|
if (this.viewportHost && this.renderHost) {
|
|
1129
|
-
return;
|
|
1136
|
+
return this.renderHost;
|
|
1137
|
+
}
|
|
1138
|
+
if (this.viewportHost || this.renderHost) {
|
|
1139
|
+
throw new Error('Terminal presentation host state is inconsistent');
|
|
1130
1140
|
}
|
|
1131
1141
|
const viewportHost = document.createElement('div');
|
|
1132
1142
|
viewportHost.style.position = 'relative';
|
|
@@ -1143,6 +1153,7 @@ export class TerminalCore {
|
|
|
1143
1153
|
this.container.replaceChildren(viewportHost);
|
|
1144
1154
|
this.viewportHost = viewportHost;
|
|
1145
1155
|
this.renderHost = renderHost;
|
|
1156
|
+
return renderHost;
|
|
1146
1157
|
}
|
|
1147
1158
|
applyPresentationScaleStyles() {
|
|
1148
1159
|
const renderHost = this.renderHost;
|
|
@@ -1252,16 +1263,23 @@ export class TerminalCore {
|
|
|
1252
1263
|
this.cancelFabricAttachSchedule = scheduleUiTurn(attach);
|
|
1253
1264
|
});
|
|
1254
1265
|
}
|
|
1255
|
-
setupInputBridge() {
|
|
1266
|
+
setupInputBridge(inputHost) {
|
|
1256
1267
|
this.disposeInputBridge();
|
|
1257
|
-
const input =
|
|
1268
|
+
const input = this.inputElement;
|
|
1258
1269
|
if (!input) {
|
|
1259
|
-
|
|
1260
|
-
return;
|
|
1270
|
+
throw new Error('Terminal input element was not mounted');
|
|
1261
1271
|
}
|
|
1262
|
-
this.inputBridge = new TerminalInputBridge(
|
|
1263
|
-
|
|
1264
|
-
|
|
1272
|
+
this.inputBridge = new TerminalInputBridge({
|
|
1273
|
+
inputHost,
|
|
1274
|
+
inputElement: input,
|
|
1275
|
+
onData: (data) => {
|
|
1276
|
+
this.eventHandlers.onData?.(data);
|
|
1277
|
+
},
|
|
1278
|
+
logger: this.logger,
|
|
1279
|
+
hasSelection: () => this.hasSelection(),
|
|
1280
|
+
copySelection: (source, clipboardData) => this.performSelectionCopy(source, clipboardData),
|
|
1281
|
+
syncInputGeometry: () => this.syncImeInputAnchor(),
|
|
1282
|
+
});
|
|
1265
1283
|
this.syncImeInputAnchor();
|
|
1266
1284
|
if (this.isContainerFocused()) {
|
|
1267
1285
|
this.scheduleInputSurfaceRefocus();
|
|
@@ -2672,6 +2690,8 @@ export class TerminalCore {
|
|
|
2672
2690
|
this.fabricView = null;
|
|
2673
2691
|
this.terminal?.dispose();
|
|
2674
2692
|
this.terminal = null;
|
|
2693
|
+
this.inputElement?.remove();
|
|
2694
|
+
this.inputElement = null;
|
|
2675
2695
|
this.viewportHost = null;
|
|
2676
2696
|
this.renderHost = null;
|
|
2677
2697
|
this.registeredLinkProviders.clear();
|