@effect-tui/react 0.15.2 → 2.0.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 +11 -2
- package/dist/src/codeblock.d.ts +1 -1
- package/dist/src/codeblock.d.ts.map +1 -1
- package/dist/src/codeblock.js +2 -2
- package/dist/src/codeblock.js.map +1 -1
- package/dist/src/components/ListView.d.ts +4 -4
- package/dist/src/components/ListView.d.ts.map +1 -1
- package/dist/src/components/ListView.js +16 -17
- package/dist/src/components/ListView.js.map +1 -1
- package/dist/src/components/Markdown.js +3 -3
- package/dist/src/components/Markdown.js.map +1 -1
- package/dist/src/components/MultilineTextInput.d.ts.map +1 -1
- package/dist/src/components/MultilineTextInput.js +133 -305
- package/dist/src/components/MultilineTextInput.js.map +1 -1
- package/dist/src/components/TextInput.d.ts.map +1 -1
- package/dist/src/components/TextInput.js +51 -98
- package/dist/src/components/TextInput.js.map +1 -1
- package/dist/src/components/text-editing.d.ts +61 -0
- package/dist/src/components/text-editing.d.ts.map +1 -1
- package/dist/src/components/text-editing.js +131 -0
- package/dist/src/components/text-editing.js.map +1 -1
- package/dist/src/console/ConsolePopover.d.ts +7 -1
- package/dist/src/console/ConsolePopover.d.ts.map +1 -1
- package/dist/src/console/ConsolePopover.js +55 -74
- package/dist/src/console/ConsolePopover.js.map +1 -1
- package/dist/src/debug/DebugOverlay.d.ts.map +1 -1
- package/dist/src/debug/DebugOverlay.js +3 -57
- package/dist/src/debug/DebugOverlay.js.map +1 -1
- package/dist/src/debug/DiagnosticsPanel.js +1 -1
- package/dist/src/debug/DiagnosticsPanel.js.map +1 -1
- package/dist/src/dev.d.ts +5 -117
- package/dist/src/dev.d.ts.map +1 -1
- package/dist/src/dev.js +3 -333
- package/dist/src/dev.js.map +1 -1
- package/dist/src/hooks/use-scroll.d.ts +31 -35
- package/dist/src/hooks/use-scroll.d.ts.map +1 -1
- package/dist/src/hooks/use-scroll.js +51 -90
- package/dist/src/hooks/use-scroll.js.map +1 -1
- package/dist/src/hosts/base.d.ts +13 -2
- package/dist/src/hosts/base.d.ts.map +1 -1
- package/dist/src/hosts/base.js +74 -2
- package/dist/src/hosts/base.js.map +1 -1
- package/dist/src/hosts/box.d.ts +2 -2
- package/dist/src/hosts/box.d.ts.map +1 -1
- package/dist/src/hosts/box.js +29 -2
- package/dist/src/hosts/box.js.map +1 -1
- package/dist/src/hosts/canvas.d.ts +24 -4
- package/dist/src/hosts/canvas.d.ts.map +1 -1
- package/dist/src/hosts/canvas.js +107 -41
- package/dist/src/hosts/canvas.js.map +1 -1
- package/dist/src/hosts/codeblock.d.ts +10 -12
- package/dist/src/hosts/codeblock.d.ts.map +1 -1
- package/dist/src/hosts/codeblock.js +38 -35
- package/dist/src/hosts/codeblock.js.map +1 -1
- package/dist/src/hosts/flex-container.d.ts +3 -3
- package/dist/src/hosts/flex-container.d.ts.map +1 -1
- package/dist/src/hosts/flex-container.js +20 -5
- package/dist/src/hosts/flex-container.js.map +1 -1
- package/dist/src/hosts/index.d.ts +3 -2
- package/dist/src/hosts/index.d.ts.map +1 -1
- package/dist/src/hosts/index.js +2 -1
- package/dist/src/hosts/index.js.map +1 -1
- package/dist/src/hosts/layout-helpers.d.ts +10 -0
- package/dist/src/hosts/layout-helpers.d.ts.map +1 -0
- package/dist/src/hosts/layout-helpers.js +10 -0
- package/dist/src/hosts/layout-helpers.js.map +1 -0
- package/dist/src/hosts/leaf.d.ts +14 -0
- package/dist/src/hosts/leaf.d.ts.map +1 -0
- package/dist/src/hosts/leaf.js +31 -0
- package/dist/src/hosts/leaf.js.map +1 -0
- package/dist/src/hosts/overlay-item.d.ts +2 -2
- package/dist/src/hosts/overlay-item.d.ts.map +1 -1
- package/dist/src/hosts/overlay-item.js +7 -2
- package/dist/src/hosts/overlay-item.js.map +1 -1
- package/dist/src/hosts/overlay.d.ts +2 -2
- package/dist/src/hosts/overlay.d.ts.map +1 -1
- package/dist/src/hosts/overlay.js +6 -9
- package/dist/src/hosts/overlay.js.map +1 -1
- package/dist/src/hosts/scroll.d.ts +54 -26
- package/dist/src/hosts/scroll.d.ts.map +1 -1
- package/dist/src/hosts/scroll.js +185 -87
- package/dist/src/hosts/scroll.js.map +1 -1
- package/dist/src/hosts/single-child.d.ts.map +1 -1
- package/dist/src/hosts/single-child.js +2 -0
- package/dist/src/hosts/single-child.js.map +1 -1
- package/dist/src/hosts/spacer.d.ts +3 -3
- package/dist/src/hosts/spacer.d.ts.map +1 -1
- package/dist/src/hosts/spacer.js +8 -3
- package/dist/src/hosts/spacer.js.map +1 -1
- package/dist/src/hosts/text.d.ts +22 -18
- package/dist/src/hosts/text.d.ts.map +1 -1
- package/dist/src/hosts/text.js +108 -131
- package/dist/src/hosts/text.js.map +1 -1
- package/dist/src/hosts/vstack.js +1 -1
- package/dist/src/hosts/vstack.js.map +1 -1
- package/dist/src/hosts/zstack.d.ts +3 -3
- package/dist/src/hosts/zstack.d.ts.map +1 -1
- package/dist/src/hosts/zstack.js +13 -8
- package/dist/src/hosts/zstack.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/internal/dev/hmr.d.ts +20 -0
- package/dist/src/internal/dev/hmr.d.ts.map +1 -0
- package/dist/src/internal/dev/hmr.js +93 -0
- package/dist/src/internal/dev/hmr.js.map +1 -0
- package/dist/src/internal/dev/runtime.d.ts +24 -0
- package/dist/src/internal/dev/runtime.d.ts.map +1 -0
- package/dist/src/internal/dev/runtime.js +135 -0
- package/dist/src/internal/dev/runtime.js.map +1 -0
- package/dist/src/internal/dev/ui.d.ts +13 -0
- package/dist/src/internal/dev/ui.d.ts.map +1 -0
- package/dist/src/internal/dev/ui.js +51 -0
- package/dist/src/internal/dev/ui.js.map +1 -0
- package/dist/src/internal/renderer/context.d.ts +9 -0
- package/dist/src/internal/renderer/context.d.ts.map +1 -0
- package/dist/src/internal/renderer/context.js +22 -0
- package/dist/src/internal/renderer/context.js.map +1 -0
- package/dist/src/internal/renderer/core/FrameBuilder.d.ts +18 -0
- package/dist/src/internal/renderer/core/FrameBuilder.d.ts.map +1 -0
- package/dist/src/internal/renderer/core/FrameBuilder.js +40 -0
- package/dist/src/internal/renderer/core/FrameBuilder.js.map +1 -0
- package/dist/src/internal/renderer/core/RendererState.d.ts +41 -0
- package/dist/src/internal/renderer/core/RendererState.d.ts.map +1 -0
- package/dist/src/internal/renderer/core/RendererState.js +70 -0
- package/dist/src/internal/renderer/core/RendererState.js.map +1 -0
- package/dist/src/internal/renderer/core/index.d.ts +3 -0
- package/dist/src/internal/renderer/core/index.d.ts.map +1 -0
- package/dist/src/internal/renderer/core/index.js +3 -0
- package/dist/src/internal/renderer/core/index.js.map +1 -0
- package/dist/src/internal/renderer/index.d.ts +40 -0
- package/dist/src/internal/renderer/index.d.ts.map +1 -0
- package/dist/src/internal/renderer/index.js +543 -0
- package/dist/src/internal/renderer/index.js.map +1 -0
- package/dist/src/internal/renderer/input/InputProcessor.d.ts +30 -0
- package/dist/src/internal/renderer/input/InputProcessor.d.ts.map +1 -0
- package/dist/src/internal/renderer/input/InputProcessor.js +122 -0
- package/dist/src/internal/renderer/input/InputProcessor.js.map +1 -0
- package/dist/src/internal/renderer/input/index.d.ts +2 -0
- package/dist/src/internal/renderer/input/index.d.ts.map +1 -0
- package/dist/src/internal/renderer/input/index.js +2 -0
- package/dist/src/internal/renderer/input/index.js.map +1 -0
- package/dist/src/internal/renderer/lifecycle/EventBus.d.ts +42 -0
- package/dist/src/internal/renderer/lifecycle/EventBus.d.ts.map +1 -0
- package/dist/src/internal/renderer/lifecycle/EventBus.js +97 -0
- package/dist/src/internal/renderer/lifecycle/EventBus.js.map +1 -0
- package/dist/src/internal/renderer/lifecycle/ProcessLifecycle.d.ts +13 -0
- package/dist/src/internal/renderer/lifecycle/ProcessLifecycle.d.ts.map +1 -0
- package/dist/src/internal/renderer/lifecycle/ProcessLifecycle.js +111 -0
- package/dist/src/internal/renderer/lifecycle/ProcessLifecycle.js.map +1 -0
- package/dist/src/internal/renderer/lifecycle/RenderCache.d.ts +3 -0
- package/dist/src/internal/renderer/lifecycle/RenderCache.d.ts.map +1 -0
- package/dist/src/internal/renderer/lifecycle/RenderCache.js +9 -0
- package/dist/src/internal/renderer/lifecycle/RenderCache.js.map +1 -0
- package/dist/src/internal/renderer/lifecycle/index.d.ts +4 -0
- package/dist/src/internal/renderer/lifecycle/index.d.ts.map +1 -0
- package/dist/src/internal/renderer/lifecycle/index.js +4 -0
- package/dist/src/internal/renderer/lifecycle/index.js.map +1 -0
- package/dist/src/internal/renderer/modes/FullscreenRenderer.d.ts +12 -0
- package/dist/src/internal/renderer/modes/FullscreenRenderer.d.ts.map +1 -0
- package/dist/src/internal/renderer/modes/FullscreenRenderer.js +54 -0
- package/dist/src/internal/renderer/modes/FullscreenRenderer.js.map +1 -0
- package/dist/src/internal/renderer/modes/InlineRenderer.d.ts +25 -0
- package/dist/src/internal/renderer/modes/InlineRenderer.d.ts.map +1 -0
- package/dist/src/internal/renderer/modes/InlineRenderer.js +166 -0
- package/dist/src/internal/renderer/modes/InlineRenderer.js.map +1 -0
- package/dist/src/internal/renderer/modes/RendererMode.d.ts +42 -0
- package/dist/src/internal/renderer/modes/RendererMode.d.ts.map +1 -0
- package/dist/src/internal/renderer/modes/RendererMode.js +2 -0
- package/dist/src/internal/renderer/modes/RendererMode.js.map +1 -0
- package/dist/src/internal/renderer/modes/StaticContentRenderer.d.ts +25 -0
- package/dist/src/internal/renderer/modes/StaticContentRenderer.d.ts.map +1 -0
- package/dist/src/internal/renderer/modes/StaticContentRenderer.js +49 -0
- package/dist/src/internal/renderer/modes/StaticContentRenderer.js.map +1 -0
- package/dist/src/internal/renderer/modes/index.d.ts +5 -0
- package/dist/src/internal/renderer/modes/index.d.ts.map +1 -0
- package/dist/src/internal/renderer/modes/index.js +4 -0
- package/dist/src/internal/renderer/modes/index.js.map +1 -0
- package/dist/src/internal/renderer/terminal/KeyboardCapabilityProbe.d.ts +13 -0
- package/dist/src/internal/renderer/terminal/KeyboardCapabilityProbe.d.ts.map +1 -0
- package/dist/src/internal/renderer/terminal/KeyboardCapabilityProbe.js +75 -0
- package/dist/src/internal/renderer/terminal/KeyboardCapabilityProbe.js.map +1 -0
- package/dist/src/internal/renderer/terminal/TerminalSetup.d.ts +29 -0
- package/dist/src/internal/renderer/terminal/TerminalSetup.d.ts.map +1 -0
- package/dist/src/internal/renderer/terminal/TerminalSetup.js +82 -0
- package/dist/src/internal/renderer/terminal/TerminalSetup.js.map +1 -0
- package/dist/src/internal/renderer/terminal/index.d.ts +3 -0
- package/dist/src/internal/renderer/terminal/index.d.ts.map +1 -0
- package/dist/src/internal/renderer/terminal/index.js +3 -0
- package/dist/src/internal/renderer/terminal/index.js.map +1 -0
- package/dist/src/internal/renderer/types.d.ts +122 -0
- package/dist/src/internal/renderer/types.d.ts.map +1 -0
- package/dist/src/internal/renderer/types.js +2 -0
- package/dist/src/internal/renderer/types.js.map +1 -0
- package/dist/src/motion/hooks.d.ts +1 -1
- package/dist/src/motion/hooks.js +1 -1
- package/dist/src/reconciler/host-config.js +2 -2
- package/dist/src/reconciler/host-config.js.map +1 -1
- package/dist/src/reconciler/types.d.ts +5 -1
- package/dist/src/reconciler/types.d.ts.map +1 -1
- package/dist/src/renderer-context.d.ts +1 -8
- package/dist/src/renderer-context.d.ts.map +1 -1
- package/dist/src/renderer-context.js +1 -21
- package/dist/src/renderer-context.js.map +1 -1
- package/dist/src/renderer-types.d.ts +1 -115
- package/dist/src/renderer-types.d.ts.map +1 -1
- package/dist/src/renderer.d.ts +1 -31
- package/dist/src/renderer.d.ts.map +1 -1
- package/dist/src/renderer.js +1 -495
- package/dist/src/renderer.js.map +1 -1
- package/dist/src/test/render-tui.d.ts +3 -3
- package/dist/src/test/render-tui.d.ts.map +1 -1
- package/dist/src/test/render-tui.js +16 -9
- package/dist/src/test/render-tui.js.map +1 -1
- package/dist/src/utils/alignment.d.ts +1 -1
- package/dist/src/utils/alignment.d.ts.map +1 -1
- package/dist/src/utils/alignment.js +0 -2
- package/dist/src/utils/alignment.js.map +1 -1
- package/dist/src/utils/border.d.ts +1 -1
- package/dist/src/utils/border.d.ts.map +1 -1
- package/dist/src/utils/border.js +2 -0
- package/dist/src/utils/border.js.map +1 -1
- package/dist/src/utils/console-helpers.d.ts +19 -0
- package/dist/src/utils/console-helpers.d.ts.map +1 -0
- package/dist/src/utils/console-helpers.js +61 -0
- package/dist/src/utils/console-helpers.js.map +1 -0
- package/dist/src/utils/index.d.ts +2 -1
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +2 -1
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/styles.d.ts +8 -1
- package/dist/src/utils/styles.d.ts.map +1 -1
- package/dist/src/utils/styles.js +10 -8
- package/dist/src/utils/styles.js.map +1 -1
- package/dist/src/utils/text-layout.d.ts +22 -0
- package/dist/src/utils/text-layout.d.ts.map +1 -0
- package/dist/src/utils/text-layout.js +37 -0
- package/dist/src/utils/text-layout.js.map +1 -0
- package/dist/src/utils/text-wrap.d.ts +31 -1
- package/dist/src/utils/text-wrap.d.ts.map +1 -1
- package/dist/src/utils/text-wrap.js +205 -48
- package/dist/src/utils/text-wrap.js.map +1 -1
- package/dist/src/visualize/index.js +1 -1
- package/dist/src/visualize/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/codeblock.tsx +2 -2
- package/src/components/ListView.tsx +21 -23
- package/src/components/Markdown.tsx +3 -3
- package/src/components/MultilineTextInput.tsx +138 -344
- package/src/components/TextInput.tsx +54 -99
- package/src/components/text-editing.ts +180 -0
- package/src/console/ConsolePopover.tsx +124 -107
- package/src/debug/DebugOverlay.ts +15 -74
- package/src/debug/DiagnosticsPanel.tsx +1 -1
- package/src/dev.tsx +5 -458
- package/src/hooks/use-scroll.ts +85 -145
- package/src/hosts/base.ts +86 -3
- package/src/hosts/box.ts +37 -2
- package/src/hosts/canvas.ts +128 -42
- package/src/hosts/codeblock.ts +48 -35
- package/src/hosts/flex-container.ts +25 -6
- package/src/hosts/index.ts +11 -2
- package/src/hosts/layout-helpers.ts +20 -0
- package/src/hosts/leaf.ts +36 -0
- package/src/hosts/overlay-item.ts +8 -2
- package/src/hosts/overlay.ts +13 -11
- package/src/hosts/scroll.ts +228 -106
- package/src/hosts/single-child.ts +2 -0
- package/src/hosts/spacer.ts +8 -3
- package/src/hosts/text.ts +126 -132
- package/src/hosts/vstack.ts +1 -1
- package/src/hosts/zstack.ts +14 -9
- package/src/index.ts +2 -2
- package/src/internal/dev/hmr.ts +101 -0
- package/src/internal/dev/runtime.ts +170 -0
- package/src/internal/dev/ui.tsx +87 -0
- package/src/internal/renderer/context.ts +27 -0
- package/src/{renderer → internal/renderer}/core/FrameBuilder.ts +2 -2
- package/src/internal/renderer/index.ts +689 -0
- package/src/{renderer → internal/renderer}/input/InputProcessor.ts +10 -1
- package/src/{renderer → internal/renderer}/lifecycle/EventBus.ts +9 -1
- package/src/internal/renderer/lifecycle/ProcessLifecycle.ts +125 -0
- package/src/internal/renderer/lifecycle/index.ts +3 -0
- package/src/{renderer → internal/renderer}/modes/InlineRenderer.ts +5 -2
- package/src/{renderer → internal/renderer}/modes/RendererMode.ts +1 -1
- package/src/{renderer → internal/renderer}/modes/StaticContentRenderer.ts +5 -2
- package/src/internal/renderer/terminal/KeyboardCapabilityProbe.ts +91 -0
- package/src/{renderer/lifecycle → internal/renderer/terminal}/TerminalSetup.ts +4 -22
- package/src/internal/renderer/terminal/index.ts +2 -0
- package/src/internal/renderer/types.ts +129 -0
- package/src/motion/hooks.ts +1 -1
- package/src/reconciler/host-config.ts +2 -2
- package/src/reconciler/types.ts +7 -1
- package/src/renderer-context.ts +1 -27
- package/src/renderer-types.ts +10 -123
- package/src/renderer.ts +1 -619
- package/src/test/render-tui.ts +16 -10
- package/src/utils/alignment.ts +1 -3
- package/src/utils/border.ts +11 -1
- package/src/utils/console-helpers.ts +86 -0
- package/src/utils/index.ts +15 -1
- package/src/utils/styles.ts +16 -4
- package/src/utils/text-layout.ts +65 -0
- package/src/utils/text-wrap.ts +261 -48
- package/src/visualize/index.tsx +1 -1
- package/src/renderer/lifecycle/ResizeManager.ts +0 -65
- package/src/renderer/lifecycle/index.ts +0 -4
- /package/src/{renderer → internal/renderer}/core/RendererState.ts +0 -0
- /package/src/{renderer → internal/renderer}/core/index.ts +0 -0
- /package/src/{renderer → internal/renderer}/input/index.ts +0 -0
- /package/src/{renderer → internal/renderer}/lifecycle/RenderCache.ts +0 -0
- /package/src/{renderer → internal/renderer}/modes/FullscreenRenderer.ts +0 -0
- /package/src/{renderer → internal/renderer}/modes/index.ts +0 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { ANSI, emitRowWithReset, findChangeWindow, rowContentWidth } from "@effect-tui/core";
|
|
2
|
+
/**
|
|
3
|
+
* Inline rendering mode that renders in-place without alternate buffer.
|
|
4
|
+
* When content exceeds terminal height, shows the bottom portion (bottom-aligned truncation).
|
|
5
|
+
*/
|
|
6
|
+
export class InlineRenderer {
|
|
7
|
+
previousHeight = 0;
|
|
8
|
+
previousStartRow = 0; // Track which row we started from (for truncation)
|
|
9
|
+
_needsFullRerender = false;
|
|
10
|
+
printedWidths = [];
|
|
11
|
+
_forceFullOutput = false;
|
|
12
|
+
generateOutput(ctx) {
|
|
13
|
+
const { prevBuffer, frameHeight, contentHeight } = ctx;
|
|
14
|
+
let output = "";
|
|
15
|
+
// Calculate visible region (bottom-aligned when overflowing)
|
|
16
|
+
const isOverflowing = contentHeight > frameHeight;
|
|
17
|
+
const visibleHeight = Math.min(contentHeight, frameHeight);
|
|
18
|
+
const startRow = isOverflowing ? contentHeight - frameHeight : 0;
|
|
19
|
+
// Detect if viewport shifted (content grew/shrank affecting visible region)
|
|
20
|
+
const startRowChanged = startRow !== this.previousStartRow;
|
|
21
|
+
const needsFullRedraw = this.previousHeight >= frameHeight || startRowChanged;
|
|
22
|
+
// Need full redraw if: at terminal limit, or viewport shifted
|
|
23
|
+
if (needsFullRedraw) {
|
|
24
|
+
// Clear visible area and redraw (prepend to output for atomic write)
|
|
25
|
+
if (this.previousHeight > 0) {
|
|
26
|
+
output += ANSI.cursor.up(this.previousHeight);
|
|
27
|
+
}
|
|
28
|
+
output += ANSI.cursor.startOfLine;
|
|
29
|
+
output += ANSI.screen.clearToEnd;
|
|
30
|
+
this.previousStartRow = startRow;
|
|
31
|
+
this.printedWidths = [];
|
|
32
|
+
}
|
|
33
|
+
else if (this.previousHeight > 0) {
|
|
34
|
+
// Normal case: move cursor up to start of previous output
|
|
35
|
+
output += ANSI.cursor.up(this.previousHeight);
|
|
36
|
+
output += ANSI.cursor.startOfLine;
|
|
37
|
+
}
|
|
38
|
+
// Generate output for visible region
|
|
39
|
+
// Force full output after static content handling (diff mode cursor tracking gets desynchronized)
|
|
40
|
+
if (prevBuffer && !needsFullRedraw && !this._forceFullOutput) {
|
|
41
|
+
output += this.generateDiffOutput(ctx, visibleHeight, startRow);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
output += this.generateFullOutput(ctx, visibleHeight, startRow, startRow + visibleHeight);
|
|
45
|
+
this._forceFullOutput = false;
|
|
46
|
+
}
|
|
47
|
+
this.previousHeight = visibleHeight;
|
|
48
|
+
this.previousStartRow = startRow;
|
|
49
|
+
return { output, contentHeight: visibleHeight };
|
|
50
|
+
}
|
|
51
|
+
generateDiffOutput(ctx, visibleHeight, startRow) {
|
|
52
|
+
const { nextBuffer, prevBuffer, palette, frameWidth } = ctx;
|
|
53
|
+
if (!prevBuffer)
|
|
54
|
+
return "";
|
|
55
|
+
let output = "";
|
|
56
|
+
const rowsToProcess = Math.max(visibleHeight, this.previousHeight);
|
|
57
|
+
let cursorRow = 0;
|
|
58
|
+
const moveToRow = (targetRow) => {
|
|
59
|
+
const delta = targetRow - cursorRow;
|
|
60
|
+
if (delta > 0) {
|
|
61
|
+
output += ANSI.cursor.down(delta);
|
|
62
|
+
}
|
|
63
|
+
else if (delta < 0) {
|
|
64
|
+
output += ANSI.cursor.up(-delta);
|
|
65
|
+
}
|
|
66
|
+
cursorRow = targetRow;
|
|
67
|
+
};
|
|
68
|
+
for (let screenY = 0; screenY < rowsToProcess; screenY++) {
|
|
69
|
+
const bufferY = startRow + screenY;
|
|
70
|
+
// Rows beyond visible height: clear if previously printed
|
|
71
|
+
if (screenY >= visibleHeight) {
|
|
72
|
+
const prevW = this.printedWidths[screenY] ?? 0;
|
|
73
|
+
if (prevW > 0) {
|
|
74
|
+
moveToRow(screenY);
|
|
75
|
+
output += ANSI.cursor.toCol(1) + palette.sgr(0) + ANSI.line.clear;
|
|
76
|
+
this.printedWidths[screenY] = 0;
|
|
77
|
+
}
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const change = findChangeWindow(prevBuffer, nextBuffer, bufferY, frameWidth);
|
|
81
|
+
const newW = rowContentWidth(nextBuffer, bufferY, frameWidth);
|
|
82
|
+
const prevW = this.printedWidths[screenY] ?? 0;
|
|
83
|
+
if (!change) {
|
|
84
|
+
// No change; maybe need to clear tail if content shrunk
|
|
85
|
+
if (prevW > newW) {
|
|
86
|
+
moveToRow(screenY);
|
|
87
|
+
output += ANSI.cursor.toCol(newW + 1) + palette.sgr(0) + ANSI.line.clearToEnd;
|
|
88
|
+
this.printedWidths[screenY] = newW;
|
|
89
|
+
}
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
// Emit changed region [left..right]
|
|
93
|
+
moveToRow(screenY);
|
|
94
|
+
output += ANSI.cursor.toCol(change.left + 1);
|
|
95
|
+
output += emitRowWithReset(nextBuffer, palette, bufferY, frameWidth, change.left, change.right + 1);
|
|
96
|
+
// Clear tail if shrunk
|
|
97
|
+
const effectiveW = Math.max(newW, change.right + 1);
|
|
98
|
+
if (prevW > effectiveW) {
|
|
99
|
+
output += ANSI.cursor.toCol(effectiveW + 1) + ANSI.line.clearToEnd;
|
|
100
|
+
}
|
|
101
|
+
this.printedWidths[screenY] = effectiveW;
|
|
102
|
+
}
|
|
103
|
+
// Ensure cursor ends just after the dynamic block for next frame positioning
|
|
104
|
+
moveToRow(visibleHeight);
|
|
105
|
+
output += ANSI.cursor.toCol(1);
|
|
106
|
+
return output;
|
|
107
|
+
}
|
|
108
|
+
generateFullOutput(ctx, rowCount, startRow, endRow) {
|
|
109
|
+
const { nextBuffer, palette, frameWidth } = ctx;
|
|
110
|
+
let output = "";
|
|
111
|
+
// Full redraw inline: clear each line first, then emit content
|
|
112
|
+
for (let bufferY = startRow; bufferY < endRow; bufferY++) {
|
|
113
|
+
const screenY = bufferY - startRow;
|
|
114
|
+
const trimmedWidth = rowContentWidth(nextBuffer, bufferY, frameWidth);
|
|
115
|
+
// Clear ENTIRE line first to handle resize artifacts
|
|
116
|
+
output += ANSI.line.clear;
|
|
117
|
+
output += emitRowWithReset(nextBuffer, palette, bufferY, frameWidth, 0, trimmedWidth);
|
|
118
|
+
output += "\r\n";
|
|
119
|
+
// Track line widths for resize reflow calculation
|
|
120
|
+
this.printedWidths[screenY] = trimmedWidth;
|
|
121
|
+
}
|
|
122
|
+
// Clear any extra lines if content shrank
|
|
123
|
+
for (let screenY = rowCount; screenY < this.previousHeight; screenY++) {
|
|
124
|
+
output += `${palette.sgr(0) + ANSI.line.clear}\r\n`;
|
|
125
|
+
this.printedWidths[screenY] = 0;
|
|
126
|
+
}
|
|
127
|
+
// Move cursor back up to end of content
|
|
128
|
+
if (this.previousHeight > rowCount) {
|
|
129
|
+
output += ANSI.cursor.up(this.previousHeight - rowCount);
|
|
130
|
+
}
|
|
131
|
+
return output;
|
|
132
|
+
}
|
|
133
|
+
handleResize(newWidth, _newHeight, prevWidth) {
|
|
134
|
+
// Any width change triggers full rerender (Ink-style: clear + replay static)
|
|
135
|
+
if (newWidth !== prevWidth) {
|
|
136
|
+
this._needsFullRerender = true;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** Check if full rerender is needed (clear screen + replay static) */
|
|
140
|
+
needsFullRerender() {
|
|
141
|
+
return this._needsFullRerender;
|
|
142
|
+
}
|
|
143
|
+
/** Clear the full rerender flag after handling (keeps previousHeight for cursor tracking) */
|
|
144
|
+
clearFullRerenderFlag() {
|
|
145
|
+
this._needsFullRerender = false;
|
|
146
|
+
// DON'T reset previousHeight - we need it for cursor positioning in generateOutput.
|
|
147
|
+
// After clear+replay static, the cursor is at end of static content.
|
|
148
|
+
// generateOutput will use previousHeight to know where dynamic content should go.
|
|
149
|
+
this.previousStartRow = 0;
|
|
150
|
+
this.printedWidths = [];
|
|
151
|
+
this._forceFullOutput = true; // Force full output to resync rendering
|
|
152
|
+
}
|
|
153
|
+
reset() {
|
|
154
|
+
this.previousHeight = 0;
|
|
155
|
+
this.previousStartRow = 0;
|
|
156
|
+
this.printedWidths = [];
|
|
157
|
+
}
|
|
158
|
+
/** Force full output on the next frame (needed after static content to resync cursor tracking) */
|
|
159
|
+
forceFullOutputOnce() {
|
|
160
|
+
this._forceFullOutput = true;
|
|
161
|
+
}
|
|
162
|
+
getPreviousHeight() {
|
|
163
|
+
return this.previousHeight;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=InlineRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineRenderer.js","sourceRoot":"","sources":["../../../../../src/internal/renderer/modes/InlineRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { CellBuffer, Palette } from "@effect-tui/core";
|
|
2
|
+
import type { TuiWriteStream } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Context passed to render mode output generation.
|
|
5
|
+
*/
|
|
6
|
+
export interface RenderContext {
|
|
7
|
+
nextBuffer: CellBuffer;
|
|
8
|
+
prevBuffer: CellBuffer | null;
|
|
9
|
+
palette: Palette;
|
|
10
|
+
frameWidth: number;
|
|
11
|
+
/** Terminal height (viewport) */
|
|
12
|
+
frameHeight: number;
|
|
13
|
+
/** Actual content height (may exceed frameHeight in inline mode) */
|
|
14
|
+
contentHeight: number;
|
|
15
|
+
enableDiff: boolean;
|
|
16
|
+
stdout: TuiWriteStream;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Result of generating output for a frame.
|
|
20
|
+
*/
|
|
21
|
+
export interface RenderOutput {
|
|
22
|
+
output: string;
|
|
23
|
+
contentHeight: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Interface for render mode implementations.
|
|
27
|
+
*/
|
|
28
|
+
export interface RendererMode {
|
|
29
|
+
/**
|
|
30
|
+
* Generate ANSI output for the current frame.
|
|
31
|
+
*/
|
|
32
|
+
generateOutput(ctx: RenderContext): RenderOutput;
|
|
33
|
+
/**
|
|
34
|
+
* Handle a resize event. Returns true if a full clear is needed.
|
|
35
|
+
*/
|
|
36
|
+
handleResize(newWidth: number, newHeight: number, prevWidth: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Reset any mode-specific state (e.g., after static content flush).
|
|
39
|
+
*/
|
|
40
|
+
reset(): void;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=RendererMode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RendererMode.d.ts","sourceRoot":"","sources":["../../../../../src/internal/renderer/modes/RendererMode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAA;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,OAAO,CAAA;IACnB,MAAM,EAAE,cAAc,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,YAAY,CAAA;IAEhD;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAE1E;;OAEG;IACH,KAAK,IAAI,IAAI,CAAA;CACb"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RendererMode.js","sourceRoot":"","sources":["../../../../../src/internal/renderer/modes/RendererMode.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Palette } from "@effect-tui/core";
|
|
2
|
+
import type { HostInstance } from "../../../reconciler/types.js";
|
|
3
|
+
import type { TuiWriteStream } from "../types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Renders static content to scrollback (inline mode only).
|
|
6
|
+
* Static content is rendered once and doesn't update with the dynamic section.
|
|
7
|
+
* Caches all output for replay on resize (Ink-style).
|
|
8
|
+
*/
|
|
9
|
+
export declare class StaticContentRenderer {
|
|
10
|
+
private palette;
|
|
11
|
+
private cachedOutput;
|
|
12
|
+
constructor(_stdout: TuiWriteStream, // Kept for API compatibility, not used (writes are atomic in renderer.ts)
|
|
13
|
+
palette: Palette);
|
|
14
|
+
/** Get all cached static output for replay on resize */
|
|
15
|
+
getCachedOutput(): string;
|
|
16
|
+
/** Clear the cache (call after full terminal clear + replay) */
|
|
17
|
+
clearCache(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Render a static node and return the output string.
|
|
20
|
+
* Static content is append-only - no cursor positioning needed.
|
|
21
|
+
* Caller clears dynamic area first, then appends this output.
|
|
22
|
+
*/
|
|
23
|
+
render(staticNode: HostInstance, frameWidth: number): string;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=StaticContentRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StaticContentRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/internal/renderer/modes/StaticContentRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,OAAO,EAAmB,MAAM,kBAAkB,CAAA;AAC9F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;GAIG;AACH,qBAAa,qBAAqB;IAKhC,OAAO,CAAC,OAAO;IAJhB,OAAO,CAAC,YAAY,CAAK;gBAGxB,OAAO,EAAE,cAAc,EAAE,0EAA0E;IAC3F,OAAO,EAAE,OAAO;IAGzB,wDAAwD;IACxD,eAAe,IAAI,MAAM;IAIzB,gEAAgE;IAChE,UAAU,IAAI,IAAI;IAIlB;;;;OAIG;IACH,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;CA0B5D"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { CellBuffer, emitRowWithReset, rowContentWidth } from "@effect-tui/core";
|
|
2
|
+
/**
|
|
3
|
+
* Renders static content to scrollback (inline mode only).
|
|
4
|
+
* Static content is rendered once and doesn't update with the dynamic section.
|
|
5
|
+
* Caches all output for replay on resize (Ink-style).
|
|
6
|
+
*/
|
|
7
|
+
export class StaticContentRenderer {
|
|
8
|
+
palette;
|
|
9
|
+
cachedOutput = ""; // Accumulates all static content for replay
|
|
10
|
+
constructor(_stdout, // Kept for API compatibility, not used (writes are atomic in renderer.ts)
|
|
11
|
+
palette) {
|
|
12
|
+
this.palette = palette;
|
|
13
|
+
}
|
|
14
|
+
/** Get all cached static output for replay on resize */
|
|
15
|
+
getCachedOutput() {
|
|
16
|
+
return this.cachedOutput;
|
|
17
|
+
}
|
|
18
|
+
/** Clear the cache (call after full terminal clear + replay) */
|
|
19
|
+
clearCache() {
|
|
20
|
+
this.cachedOutput = "";
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Render a static node and return the output string.
|
|
24
|
+
* Static content is append-only - no cursor positioning needed.
|
|
25
|
+
* Caller clears dynamic area first, then appends this output.
|
|
26
|
+
*/
|
|
27
|
+
render(staticNode, frameWidth) {
|
|
28
|
+
// Pre-frame cache prep (optional)
|
|
29
|
+
staticNode.prepareFrame?.();
|
|
30
|
+
// Measure and layout static content
|
|
31
|
+
const staticSize = staticNode.measure(frameWidth, Number.MAX_SAFE_INTEGER);
|
|
32
|
+
staticNode.layout({ x: 0, y: 0, w: frameWidth, h: staticSize.h });
|
|
33
|
+
// Render to a temporary buffer
|
|
34
|
+
const staticBuffer = new CellBuffer(frameWidth, staticSize.h);
|
|
35
|
+
staticBuffer.clear(0);
|
|
36
|
+
staticNode.render(staticBuffer, this.palette);
|
|
37
|
+
// Build content lines - append-only, no cursor movement
|
|
38
|
+
let contentLines = "";
|
|
39
|
+
for (let y = 0; y < staticSize.h; y++) {
|
|
40
|
+
const trimmedWidth = rowContentWidth(staticBuffer, y, frameWidth);
|
|
41
|
+
const line = emitRowWithReset(staticBuffer, this.palette, y, frameWidth, 0, trimmedWidth);
|
|
42
|
+
contentLines += `${line}\n`;
|
|
43
|
+
}
|
|
44
|
+
// Cache the content for replay on resize
|
|
45
|
+
this.cachedOutput += contentLines;
|
|
46
|
+
return contentLines;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=StaticContentRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StaticContentRenderer.js","sourceRoot":"","sources":["../../../../../src/internal/renderer/modes/StaticContentRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAgB,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAI9F;;;;GAIG;AACH,MAAM,OAAO,qBAAqB;IAKxB;IAJD,YAAY,GAAG,EAAE,CAAA,CAAC,4CAA4C;IAEtE,YACC,OAAuB,EAAE,0EAA0E;IAC3F,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;IACtB,CAAC;IAEJ,wDAAwD;IACxD,eAAe;QACd,OAAO,IAAI,CAAC,YAAY,CAAA;IACzB,CAAC;IAED,gEAAgE;IAChE,UAAU;QACT,IAAI,CAAC,YAAY,GAAG,EAAE,CAAA;IACvB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,UAAwB,EAAE,UAAkB;QAClD,kCAAkC;QAClC,UAAU,CAAC,YAAY,EAAE,EAAE,CAAA;QAE3B,oCAAoC;QACpC,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAA;QAC1E,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAA;QAEjE,+BAA+B;QAC/B,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;QAC7D,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,UAAU,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAE7C,wDAAwD;QACxD,IAAI,YAAY,GAAG,EAAE,CAAA;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;YACjE,MAAM,IAAI,GAAG,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,CAAC,CAAA;YACzF,YAAY,IAAI,GAAG,IAAI,IAAI,CAAA;QAC5B,CAAC;QAED,yCAAyC;QACzC,IAAI,CAAC,YAAY,IAAI,YAAY,CAAA;QAEjC,OAAO,YAAY,CAAA;IACpB,CAAC;CACD"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { FullscreenRenderer } from "./FullscreenRenderer.js";
|
|
2
|
+
export { InlineRenderer } from "./InlineRenderer.js";
|
|
3
|
+
export type { RenderContext, RendererMode, RenderOutput } from "./RendererMode.js";
|
|
4
|
+
export { StaticContentRenderer } from "./StaticContentRenderer.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/internal/renderer/modes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAClF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/internal/renderer/modes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TuiWriteStream } from "../types.js";
|
|
2
|
+
type ProbeOptions = {
|
|
3
|
+
stdout: TuiWriteStream;
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
onResolved: (supportsKitty: boolean) => void;
|
|
6
|
+
};
|
|
7
|
+
export type KeyboardCapabilityProbe = {
|
|
8
|
+
start(): void;
|
|
9
|
+
handleInput(input: string): string;
|
|
10
|
+
};
|
|
11
|
+
export declare function createKeyboardCapabilityProbe(options: ProbeOptions): KeyboardCapabilityProbe;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=KeyboardCapabilityProbe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyboardCapabilityProbe.d.ts","sourceRoot":"","sources":["../../../../../src/internal/renderer/terminal/KeyboardCapabilityProbe.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,KAAK,YAAY,GAAG;IACnB,MAAM,EAAE,cAAc,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACrC,KAAK,IAAI,IAAI,CAAA;IACb,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAClC,CAAA;AAID,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,YAAY,GAAG,uBAAuB,CA0E5F"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { ANSI } from "@effect-tui/core";
|
|
2
|
+
const kittyResponseRe = /^\x1b\[\?\d+(?:;\d+)?u$/;
|
|
3
|
+
export function createKeyboardCapabilityProbe(options) {
|
|
4
|
+
const timeoutMs = options.timeoutMs ?? 150;
|
|
5
|
+
let active = false;
|
|
6
|
+
let resolved = false;
|
|
7
|
+
let buffer = "";
|
|
8
|
+
let timer = null;
|
|
9
|
+
const resolve = (supportsKitty) => {
|
|
10
|
+
if (resolved)
|
|
11
|
+
return;
|
|
12
|
+
resolved = true;
|
|
13
|
+
active = false;
|
|
14
|
+
buffer = "";
|
|
15
|
+
if (timer) {
|
|
16
|
+
clearTimeout(timer);
|
|
17
|
+
timer = null;
|
|
18
|
+
}
|
|
19
|
+
options.onResolved(supportsKitty);
|
|
20
|
+
};
|
|
21
|
+
const handleCapabilitySequence = (sequence) => {
|
|
22
|
+
if (kittyResponseRe.test(sequence)) {
|
|
23
|
+
resolve(true);
|
|
24
|
+
}
|
|
25
|
+
else if (sequence.includes("kitty")) {
|
|
26
|
+
resolve(true);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const handleInput = (input) => {
|
|
30
|
+
if (!active)
|
|
31
|
+
return input;
|
|
32
|
+
let data = buffer + input;
|
|
33
|
+
buffer = "";
|
|
34
|
+
let output = "";
|
|
35
|
+
let i = 0;
|
|
36
|
+
while (i < data.length) {
|
|
37
|
+
if (data.startsWith("\x1b[?", i)) {
|
|
38
|
+
const end = data.indexOf("u", i + 3);
|
|
39
|
+
if (end === -1) {
|
|
40
|
+
buffer = data.slice(i);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
const seq = data.slice(i, end + 1);
|
|
44
|
+
handleCapabilitySequence(seq);
|
|
45
|
+
i = end + 1;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (data.startsWith("\x1bP>|", i)) {
|
|
49
|
+
const end = data.indexOf("\x1b\\", i + 4);
|
|
50
|
+
if (end === -1) {
|
|
51
|
+
buffer = data.slice(i);
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
const seq = data.slice(i, end + 2);
|
|
55
|
+
handleCapabilitySequence(seq);
|
|
56
|
+
i = end + 2;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
output += data[i];
|
|
60
|
+
i += 1;
|
|
61
|
+
}
|
|
62
|
+
return output;
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
start() {
|
|
66
|
+
if (resolved || active)
|
|
67
|
+
return;
|
|
68
|
+
active = true;
|
|
69
|
+
options.stdout.write(ANSI.keyboard.query);
|
|
70
|
+
timer = setTimeout(() => resolve(false), timeoutMs);
|
|
71
|
+
},
|
|
72
|
+
handleInput,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=KeyboardCapabilityProbe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyboardCapabilityProbe.js","sourceRoot":"","sources":["../../../../../src/internal/renderer/terminal/KeyboardCapabilityProbe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TuiReadStream, TuiWriteStream } from "../types.js";
|
|
2
|
+
export interface TerminalSetupConfig {
|
|
3
|
+
mode: "fullscreen" | "inline";
|
|
4
|
+
enablePaste: boolean;
|
|
5
|
+
enableMouse: boolean;
|
|
6
|
+
skipTerminalSetup: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Manages terminal setup and teardown sequences.
|
|
10
|
+
* Handles fullscreen mode, cursor visibility, paste bracketing, mouse tracking, and raw mode.
|
|
11
|
+
*/
|
|
12
|
+
export declare class TerminalSetup {
|
|
13
|
+
private stdout;
|
|
14
|
+
private stdin;
|
|
15
|
+
private config;
|
|
16
|
+
constructor(stdout: TuiWriteStream, stdin: TuiReadStream, config: TerminalSetupConfig);
|
|
17
|
+
/**
|
|
18
|
+
* Set up terminal for rendering.
|
|
19
|
+
* Call this before starting the render loop.
|
|
20
|
+
*/
|
|
21
|
+
setup(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Restore terminal to normal state.
|
|
24
|
+
* Call this when stopping the renderer.
|
|
25
|
+
* Uses a single write call to ensure atomic output and reliable flushing.
|
|
26
|
+
*/
|
|
27
|
+
teardown(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=TerminalSetup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalSetup.d.ts","sourceRoot":"","sources":["../../../../../src/internal/renderer/terminal/TerminalSetup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEhE,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,YAAY,GAAG,QAAQ,CAAA;IAC7B,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,OAAO,CAAA;IACpB,iBAAiB,EAAE,OAAO,CAAA;CAC1B;AAED;;;GAGG;AACH,qBAAa,aAAa;IAExB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,MAAM;gBAFN,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,mBAAmB;IAGpC;;;OAGG;IACH,KAAK,IAAI,IAAI;IA4Bb;;;;OAIG;IACH,QAAQ,IAAI,IAAI;CAuChB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { ANSI, Terminal } from "@effect-tui/core";
|
|
2
|
+
/**
|
|
3
|
+
* Manages terminal setup and teardown sequences.
|
|
4
|
+
* Handles fullscreen mode, cursor visibility, paste bracketing, mouse tracking, and raw mode.
|
|
5
|
+
*/
|
|
6
|
+
export class TerminalSetup {
|
|
7
|
+
stdout;
|
|
8
|
+
stdin;
|
|
9
|
+
config;
|
|
10
|
+
constructor(stdout, stdin, config) {
|
|
11
|
+
this.stdout = stdout;
|
|
12
|
+
this.stdin = stdin;
|
|
13
|
+
this.config = config;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Set up terminal for rendering.
|
|
17
|
+
* Call this before starting the render loop.
|
|
18
|
+
*/
|
|
19
|
+
setup() {
|
|
20
|
+
if (this.config.skipTerminalSetup)
|
|
21
|
+
return;
|
|
22
|
+
if (this.config.mode === "fullscreen") {
|
|
23
|
+
this.stdout.write(Terminal.enterFullscreen);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Inline mode: try to disable reflow (DEC mode 2028)
|
|
27
|
+
// Supported by Contour, some others. Ignored by unsupported terminals.
|
|
28
|
+
this.stdout.write(ANSI.reflow.disable);
|
|
29
|
+
}
|
|
30
|
+
// Hide cursor during rendering (both modes)
|
|
31
|
+
this.stdout.write(Terminal.hideCursor);
|
|
32
|
+
if (this.config.enablePaste) {
|
|
33
|
+
this.stdout.write(ANSI.paste.enable);
|
|
34
|
+
}
|
|
35
|
+
if (this.config.enableMouse) {
|
|
36
|
+
this.stdout.write(ANSI.mouse.enable);
|
|
37
|
+
}
|
|
38
|
+
if (this.stdin.isTTY && this.stdin.setRawMode) {
|
|
39
|
+
this.stdin.setRawMode(true);
|
|
40
|
+
this.stdin.resume?.();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Restore terminal to normal state.
|
|
45
|
+
* Call this when stopping the renderer.
|
|
46
|
+
* Uses a single write call to ensure atomic output and reliable flushing.
|
|
47
|
+
*/
|
|
48
|
+
teardown() {
|
|
49
|
+
if (this.config.skipTerminalSetup)
|
|
50
|
+
return;
|
|
51
|
+
// Disable raw mode FIRST - this is critical for proper terminal restoration
|
|
52
|
+
// Must happen before writing escape sequences so the terminal processes them correctly
|
|
53
|
+
if (this.stdin.isTTY && this.stdin.setRawMode) {
|
|
54
|
+
this.stdin.setRawMode(false);
|
|
55
|
+
}
|
|
56
|
+
// Build all escape sequences into a single string for atomic write
|
|
57
|
+
// This ensures all sequences are flushed together before process exit
|
|
58
|
+
let output = "";
|
|
59
|
+
// Disable enhanced keyboard protocols first (safe to send regardless of support)
|
|
60
|
+
output += ANSI.keyboard.disable;
|
|
61
|
+
output += ANSI.modifyOtherKeys.disable;
|
|
62
|
+
if (this.config.enableMouse) {
|
|
63
|
+
output += ANSI.mouse.disable;
|
|
64
|
+
}
|
|
65
|
+
if (this.config.enablePaste) {
|
|
66
|
+
output += ANSI.paste.disable;
|
|
67
|
+
}
|
|
68
|
+
// Exit fullscreen or re-enable reflow
|
|
69
|
+
if (this.config.mode === "fullscreen") {
|
|
70
|
+
output += Terminal.exitFullscreen;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
output += ANSI.reflow.enable;
|
|
74
|
+
output += "\r\n";
|
|
75
|
+
}
|
|
76
|
+
// Always show cursor at the end
|
|
77
|
+
output += Terminal.showCursor;
|
|
78
|
+
// Single atomic write - more reliable for process exit scenarios
|
|
79
|
+
this.stdout.write(output);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=TerminalSetup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalSetup.js","sourceRoot":"","sources":["../../../../../src/internal/renderer/terminal/TerminalSetup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/internal/renderer/terminal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAC1G,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/internal/renderer/terminal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAgC,MAAM,8BAA8B,CAAA;AAC1G,OAAO,EAAE,aAAa,EAA4B,MAAM,oBAAoB,CAAA"}
|