@effect-tui/core 0.1.0 → 0.1.4
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 +31 -11
- package/dist/ansi.d.ts +127 -32
- package/dist/ansi.d.ts.map +1 -1
- package/dist/ansi.js +159 -37
- package/dist/ansi.js.map +1 -1
- package/dist/colors.d.ts +139 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +339 -0
- package/dist/colors.js.map +1 -0
- package/dist/index.d.ts +6 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -11
- package/dist/index.js.map +1 -1
- package/dist/keys.d.ts +21 -0
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +199 -58
- package/dist/keys.js.map +1 -1
- package/dist/layout/axis-helpers.d.ts +19 -0
- package/dist/layout/axis-helpers.d.ts.map +1 -0
- package/dist/layout/axis-helpers.js +19 -0
- package/dist/layout/axis-helpers.js.map +1 -0
- package/dist/output.d.ts +59 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +142 -0
- package/dist/output.js.map +1 -0
- package/dist/render/buffer.d.ts.map +1 -1
- package/dist/render/buffer.js +6 -25
- package/dist/render/buffer.js.map +1 -1
- package/dist/render/graphemes.d.ts +15 -0
- package/dist/render/graphemes.d.ts.map +1 -0
- package/dist/render/graphemes.js +28 -0
- package/dist/render/graphemes.js.map +1 -0
- package/dist/render/measure.d.ts +1 -0
- package/dist/render/measure.d.ts.map +1 -1
- package/dist/render/measure.js +14 -36
- package/dist/render/measure.js.map +1 -1
- package/dist/render/palette.d.ts.map +1 -1
- package/dist/render/palette.js +26 -1
- package/dist/render/palette.js.map +1 -1
- package/dist/render/segmenter.d.ts +8 -0
- package/dist/render/segmenter.d.ts.map +1 -0
- package/dist/render/segmenter.js +23 -0
- package/dist/render/segmenter.js.map +1 -0
- package/dist/render/surface.d.ts +6 -32
- package/dist/render/surface.d.ts.map +1 -1
- package/dist/render/surface.js +11 -80
- package/dist/render/surface.js.map +1 -1
- package/dist/runtime/backend_node.d.ts.map +1 -1
- package/dist/runtime/backend_node.js.map +1 -1
- package/dist/tailwind-colors.d.ts +291 -0
- package/dist/tailwind-colors.d.ts.map +1 -0
- package/dist/tailwind-colors.js +291 -0
- package/dist/tailwind-colors.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +55 -55
- package/src/ansi.ts +201 -73
- package/src/colors.ts +468 -0
- package/src/index.ts +28 -14
- package/src/keys.ts +467 -287
- package/src/layout/axis-helpers.ts +33 -0
- package/src/output.ts +175 -0
- package/src/render/buffer.ts +161 -184
- package/src/render/graphemes.ts +34 -0
- package/src/render/measure.ts +15 -38
- package/src/render/palette.ts +98 -77
- package/src/render/segmenter.ts +27 -0
- package/src/render/surface.ts +139 -225
- package/src/runtime/backend_node.ts +71 -71
- package/src/tailwind-colors.ts +295 -0
- package/src/types.ts +18 -0
- package/dist/anim.d.ts +0 -4
- package/dist/anim.d.ts.map +0 -1
- package/dist/anim.js +0 -5
- package/dist/anim.js.map +0 -1
- package/dist/layout/linearStack.d.ts +0 -17
- package/dist/layout/linearStack.d.ts.map +0 -1
- package/dist/layout/linearStack.js +0 -86
- package/dist/layout/linearStack.js.map +0 -1
- package/dist/motion-value.d.ts +0 -58
- package/dist/motion-value.d.ts.map +0 -1
- package/dist/motion-value.js +0 -250
- package/dist/motion-value.js.map +0 -1
- package/dist/present/display.d.ts +0 -58
- package/dist/present/display.d.ts.map +0 -1
- package/dist/present/display.js +0 -168
- package/dist/present/display.js.map +0 -1
- package/dist/present/writers/fullscreen.d.ts +0 -19
- package/dist/present/writers/fullscreen.d.ts.map +0 -1
- package/dist/present/writers/fullscreen.js +0 -55
- package/dist/present/writers/fullscreen.js.map +0 -1
- package/dist/present/writers/inline.d.ts +0 -20
- package/dist/present/writers/inline.d.ts.map +0 -1
- package/dist/present/writers/inline.js +0 -92
- package/dist/present/writers/inline.js.map +0 -1
- package/dist/render/color-utils.d.ts +0 -18
- package/dist/render/color-utils.d.ts.map +0 -1
- package/dist/render/color-utils.js +0 -58
- package/dist/render/color-utils.js.map +0 -1
- package/dist/render/diff.d.ts +0 -30
- package/dist/render/diff.d.ts.map +0 -1
- package/dist/render/diff.js +0 -83
- package/dist/render/diff.js.map +0 -1
- package/dist/spring-physics.d.ts +0 -36
- package/dist/spring-physics.d.ts.map +0 -1
- package/dist/spring-physics.js +0 -113
- package/dist/spring-physics.js.map +0 -1
- package/dist/spring.d.ts +0 -73
- package/dist/spring.d.ts.map +0 -1
- package/dist/spring.js +0 -136
- package/dist/spring.js.map +0 -1
- package/dist/ui/containers/canvas.d.ts +0 -13
- package/dist/ui/containers/canvas.d.ts.map +0 -1
- package/dist/ui/containers/canvas.js +0 -16
- package/dist/ui/containers/canvas.js.map +0 -1
- package/dist/ui/containers/geometry-reader.d.ts +0 -17
- package/dist/ui/containers/geometry-reader.d.ts.map +0 -1
- package/dist/ui/containers/geometry-reader.js +0 -24
- package/dist/ui/containers/geometry-reader.js.map +0 -1
- package/dist/ui/containers/hstack.d.ts +0 -12
- package/dist/ui/containers/hstack.d.ts.map +0 -1
- package/dist/ui/containers/hstack.js +0 -28
- package/dist/ui/containers/hstack.js.map +0 -1
- package/dist/ui/containers/scroll.d.ts +0 -28
- package/dist/ui/containers/scroll.d.ts.map +0 -1
- package/dist/ui/containers/scroll.js +0 -97
- package/dist/ui/containers/scroll.js.map +0 -1
- package/dist/ui/containers/shared.d.ts +0 -12
- package/dist/ui/containers/shared.d.ts.map +0 -1
- package/dist/ui/containers/shared.js +0 -19
- package/dist/ui/containers/shared.js.map +0 -1
- package/dist/ui/containers/vstack.d.ts +0 -12
- package/dist/ui/containers/vstack.d.ts.map +0 -1
- package/dist/ui/containers/vstack.js +0 -28
- package/dist/ui/containers/vstack.js.map +0 -1
- package/dist/ui/containers/zstack.d.ts +0 -14
- package/dist/ui/containers/zstack.d.ts.map +0 -1
- package/dist/ui/containers/zstack.js +0 -36
- package/dist/ui/containers/zstack.js.map +0 -1
- package/dist/ui/core/geometry-store.d.ts +0 -22
- package/dist/ui/core/geometry-store.d.ts.map +0 -1
- package/dist/ui/core/geometry-store.js +0 -29
- package/dist/ui/core/geometry-store.js.map +0 -1
- package/dist/ui/core/geometry.d.ts +0 -34
- package/dist/ui/core/geometry.d.ts.map +0 -1
- package/dist/ui/core/geometry.js +0 -14
- package/dist/ui/core/geometry.js.map +0 -1
- package/dist/ui/core/view.d.ts +0 -25
- package/dist/ui/core/view.d.ts.map +0 -1
- package/dist/ui/core/view.js +0 -34
- package/dist/ui/core/view.js.map +0 -1
- package/dist/ui/index.d.ts +0 -44
- package/dist/ui/index.d.ts.map +0 -1
- package/dist/ui/index.js +0 -39
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/inlinetext.d.ts +0 -24
- package/dist/ui/inlinetext.d.ts.map +0 -1
- package/dist/ui/inlinetext.js +0 -131
- package/dist/ui/inlinetext.js.map +0 -1
- package/dist/ui/install.d.ts +0 -22
- package/dist/ui/install.d.ts.map +0 -1
- package/dist/ui/install.js +0 -66
- package/dist/ui/install.js.map +0 -1
- package/dist/ui/markdown.d.ts +0 -40
- package/dist/ui/markdown.d.ts.map +0 -1
- package/dist/ui/markdown.js +0 -351
- package/dist/ui/markdown.js.map +0 -1
- package/dist/ui/modifiers/border.d.ts +0 -33
- package/dist/ui/modifiers/border.d.ts.map +0 -1
- package/dist/ui/modifiers/border.js +0 -82
- package/dist/ui/modifiers/border.js.map +0 -1
- package/dist/ui/modifiers/fill.d.ts +0 -14
- package/dist/ui/modifiers/fill.d.ts.map +0 -1
- package/dist/ui/modifiers/fill.js +0 -25
- package/dist/ui/modifiers/fill.js.map +0 -1
- package/dist/ui/modifiers/frame.d.ts +0 -23
- package/dist/ui/modifiers/frame.d.ts.map +0 -1
- package/dist/ui/modifiers/frame.js +0 -54
- package/dist/ui/modifiers/frame.js.map +0 -1
- package/dist/ui/modifiers/offset.d.ts +0 -15
- package/dist/ui/modifiers/offset.d.ts.map +0 -1
- package/dist/ui/modifiers/offset.js +0 -21
- package/dist/ui/modifiers/offset.js.map +0 -1
- package/dist/ui/modifiers/opacity.d.ts +0 -15
- package/dist/ui/modifiers/opacity.d.ts.map +0 -1
- package/dist/ui/modifiers/opacity.js +0 -95
- package/dist/ui/modifiers/opacity.js.map +0 -1
- package/dist/ui/modifiers/padding.d.ts +0 -20
- package/dist/ui/modifiers/padding.d.ts.map +0 -1
- package/dist/ui/modifiers/padding.js +0 -36
- package/dist/ui/modifiers/padding.js.map +0 -1
- package/dist/ui/modifiers/styled.d.ts +0 -14
- package/dist/ui/modifiers/styled.d.ts.map +0 -1
- package/dist/ui/modifiers/styled.js +0 -26
- package/dist/ui/modifiers/styled.js.map +0 -1
- package/dist/ui/primitives/rectangle.d.ts +0 -15
- package/dist/ui/primitives/rectangle.d.ts.map +0 -1
- package/dist/ui/primitives/rectangle.js +0 -23
- package/dist/ui/primitives/rectangle.js.map +0 -1
- package/dist/ui/primitives/spacer.d.ts +0 -13
- package/dist/ui/primitives/spacer.d.ts.map +0 -1
- package/dist/ui/primitives/spacer.js +0 -16
- package/dist/ui/primitives/spacer.js.map +0 -1
- package/dist/ui/primitives/text.d.ts +0 -15
- package/dist/ui/primitives/text.d.ts.map +0 -1
- package/dist/ui/primitives/text.js +0 -79
- package/dist/ui/primitives/text.js.map +0 -1
- package/dist/ui/primitives/wrapped-text.d.ts +0 -30
- package/dist/ui/primitives/wrapped-text.d.ts.map +0 -1
- package/dist/ui/primitives/wrapped-text.js +0 -117
- package/dist/ui/primitives/wrapped-text.js.map +0 -1
- package/dist/ui/shinytext.d.ts +0 -66
- package/dist/ui/shinytext.d.ts.map +0 -1
- package/dist/ui/shinytext.js +0 -99
- package/dist/ui/shinytext.js.map +0 -1
- package/dist/ui/text/layout.d.ts +0 -35
- package/dist/ui/text/layout.d.ts.map +0 -1
- package/dist/ui/text/layout.js +0 -102
- package/dist/ui/text/layout.js.map +0 -1
- package/dist/ui/textinput.d.ts +0 -140
- package/dist/ui/textinput.d.ts.map +0 -1
- package/dist/ui/textinput.js +0 -402
- package/dist/ui/textinput.js.map +0 -1
- package/dist/ui/view-constructors.d.ts +0 -72
- package/dist/ui/view-constructors.d.ts.map +0 -1
- package/dist/ui/view-constructors.js +0 -74
- package/dist/ui/view-constructors.js.map +0 -1
- package/src/anim.ts +0 -5
- package/src/layout/linearStack.ts +0 -115
- package/src/motion-value.ts +0 -335
- package/src/present/display.ts +0 -206
- package/src/present/writers/fullscreen.ts +0 -58
- package/src/present/writers/inline.ts +0 -101
- package/src/render/color-utils.ts +0 -60
- package/src/render/diff.ts +0 -95
- package/src/spring-physics.ts +0 -151
- package/src/spring.ts +0 -234
- package/src/ui/__snapshots__/wrappedtext.test.ts.snap +0 -57
- package/src/ui/containers/canvas.ts +0 -18
- package/src/ui/containers/geometry-reader.ts +0 -32
- package/src/ui/containers/hstack.ts +0 -33
- package/src/ui/containers/scroll.ts +0 -106
- package/src/ui/containers/shared.ts +0 -27
- package/src/ui/containers/vstack.ts +0 -34
- package/src/ui/containers/zstack.ts +0 -37
- package/src/ui/core/geometry-store.ts +0 -42
- package/src/ui/core/geometry.ts +0 -30
- package/src/ui/core/view.ts +0 -49
- package/src/ui/index.ts +0 -84
- package/src/ui/inlinetext.ts +0 -135
- package/src/ui/install.ts +0 -110
- package/src/ui/markdown.test.ts +0 -74
- package/src/ui/markdown.ts +0 -388
- package/src/ui/modifiers/border.ts +0 -100
- package/src/ui/modifiers/fill.ts +0 -28
- package/src/ui/modifiers/frame.ts +0 -74
- package/src/ui/modifiers/offset.ts +0 -23
- package/src/ui/modifiers/opacity.ts +0 -93
- package/src/ui/modifiers/padding.ts +0 -53
- package/src/ui/modifiers/styled.ts +0 -31
- package/src/ui/primitives/rectangle.ts +0 -25
- package/src/ui/primitives/spacer.ts +0 -18
- package/src/ui/primitives/text.ts +0 -85
- package/src/ui/primitives/wrapped-text.ts +0 -131
- package/src/ui/shinytext.ts +0 -159
- package/src/ui/text/layout.ts +0 -119
- package/src/ui/textinput.ts +0 -496
- package/src/ui/view-constructors.ts +0 -96
- package/src/ui/wrappedtext.test.ts +0 -138
package/package.json
CHANGED
|
@@ -1,57 +1,57 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
2
|
+
"name": "@effect-tui/core",
|
|
3
|
+
"version": "0.1.4",
|
|
4
|
+
"description": "Terminal UI library built with Effect",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist",
|
|
8
|
+
"src",
|
|
9
|
+
"README.md",
|
|
10
|
+
"LICENSE"
|
|
11
|
+
],
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "https://github.com/kitlangton/effect-tui.git"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://github.com/kitlangton/effect-tui",
|
|
17
|
+
"bugs": "https://github.com/kitlangton/effect-tui/issues",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"bun": "./src/index.ts",
|
|
21
|
+
"import": "./dist/index.js",
|
|
22
|
+
"types": "./dist/index.d.ts"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"keywords": [
|
|
27
|
+
"terminal",
|
|
28
|
+
"tui",
|
|
29
|
+
"effect",
|
|
30
|
+
"cli",
|
|
31
|
+
"console"
|
|
32
|
+
],
|
|
33
|
+
"author": "Kit Langton",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc -p .",
|
|
40
|
+
"typecheck": "tsc -p . --noEmit",
|
|
41
|
+
"test": "vitest run",
|
|
42
|
+
"test:watch": "vitest",
|
|
43
|
+
"format": "biome format --write .",
|
|
44
|
+
"format:check": "biome format .",
|
|
45
|
+
"prepublishOnly": "bun run typecheck && bun run build"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"effect": "^3.19.13"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@effect/vitest": "^0.27.0",
|
|
52
|
+
"@types/node": "^25.0.3",
|
|
53
|
+
"effect": "^3.19.13",
|
|
54
|
+
"typescript": "^5.9.3",
|
|
55
|
+
"vitest": "^4.0.16"
|
|
56
|
+
}
|
|
57
57
|
}
|
package/src/ansi.ts
CHANGED
|
@@ -1,83 +1,211 @@
|
|
|
1
|
-
// ANSI escape sequences
|
|
1
|
+
// ansi.ts — ANSI escape sequences for terminal control
|
|
2
2
|
|
|
3
3
|
/** CSI prefix (ESC [) */
|
|
4
4
|
const CSI = "\x1b["
|
|
5
5
|
|
|
6
|
-
/**
|
|
6
|
+
/** ANSI escape sequence primitives */
|
|
7
7
|
export const ANSI = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
/** Enter alternate screen buffer */
|
|
28
|
-
altEnter: `${CSI}?1049h`,
|
|
29
|
-
/** Exit alternate screen buffer */
|
|
30
|
-
altExit: `${CSI}?1049l`,
|
|
31
|
-
/** Clear entire display */
|
|
32
|
-
clear: `${CSI}2J`,
|
|
33
|
-
/** Clear scrollback buffer */
|
|
34
|
-
clearScrollback: `${CSI}3J`,
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
/** Scrolling */
|
|
38
|
-
scroll: {
|
|
39
|
-
/** Scroll up by n lines */
|
|
40
|
-
up: (n: number) => `${CSI}${n}S`,
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
/** Device Status Reports / queries */
|
|
44
|
-
report: {
|
|
45
|
-
/** Report Cursor Position (response: ESC [ row ; col R) */
|
|
46
|
-
cursorPosition: `${CSI}6n`,
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
/** Bracketed paste mode */
|
|
50
|
-
paste: {
|
|
51
|
-
bracketed: {
|
|
52
|
-
on: `${CSI}?2004h`,
|
|
53
|
-
off: `${CSI}?2004l`,
|
|
54
|
-
},
|
|
55
|
-
},
|
|
56
|
-
|
|
57
|
-
/** Mouse reporting toggles */
|
|
58
|
-
mouse: {
|
|
59
|
-
/** Enable button tracking and SGR coordinates */
|
|
60
|
-
on: `${CSI}?1002h${CSI}?1006h`,
|
|
61
|
-
/** Disable SGR coords and button tracking */
|
|
62
|
-
off: `${CSI}?1006l${CSI}?1002l`,
|
|
63
|
-
},
|
|
64
|
-
} as const
|
|
8
|
+
/** Cursor control */
|
|
9
|
+
cursor: {
|
|
10
|
+
/** Move cursor to 1-based row/column position */
|
|
11
|
+
to: (x: number, y: number) => `${CSI}${y};${x}H`,
|
|
12
|
+
/** Move cursor to 1-based column on current row */
|
|
13
|
+
toCol: (col: number) => `${CSI}${col}G`,
|
|
14
|
+
/** Move cursor up by n rows */
|
|
15
|
+
up: (n: number) => (n > 0 ? `${CSI}${n}A` : ""),
|
|
16
|
+
/** Move cursor down by n rows */
|
|
17
|
+
down: (n: number) => (n > 0 ? `${CSI}${n}B` : ""),
|
|
18
|
+
/** Hide cursor */
|
|
19
|
+
hide: `${CSI}?25l`,
|
|
20
|
+
/** Show cursor */
|
|
21
|
+
show: `${CSI}?25h`,
|
|
22
|
+
/** Move cursor to start of current line */
|
|
23
|
+
startOfLine: "\r",
|
|
24
|
+
/** Move cursor to home position (1,1) */
|
|
25
|
+
home: `${CSI}H`,
|
|
26
|
+
},
|
|
65
27
|
|
|
66
|
-
/**
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
28
|
+
/** Line control */
|
|
29
|
+
line: {
|
|
30
|
+
/** Clear entire line */
|
|
31
|
+
clear: `${CSI}2K`,
|
|
32
|
+
/** Clear from cursor to end of line */
|
|
33
|
+
clearToEnd: `${CSI}0K`,
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
/** Screen control */
|
|
37
|
+
screen: {
|
|
38
|
+
/** Enter alternate screen buffer */
|
|
39
|
+
enterAlt: `${CSI}?1049h`,
|
|
40
|
+
/** Exit alternate screen buffer */
|
|
41
|
+
exitAlt: `${CSI}?1049l`,
|
|
42
|
+
/** Clear entire screen */
|
|
43
|
+
clear: `${CSI}2J`,
|
|
44
|
+
/** Clear from cursor to end of screen */
|
|
45
|
+
clearToEnd: `${CSI}J`,
|
|
46
|
+
/** Clear scrollback buffer */
|
|
47
|
+
clearScrollback: `${CSI}3J`,
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
/** Mouse reporting */
|
|
51
|
+
mouse: {
|
|
52
|
+
/** Enable SGR extended mouse mode with any-event tracking (scroll wheel support) */
|
|
53
|
+
enable: `${CSI}?1003h${CSI}?1006h`,
|
|
54
|
+
/** Disable mouse tracking */
|
|
55
|
+
disable: `${CSI}?1006l${CSI}?1003l`,
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
/** Bracketed paste mode */
|
|
59
|
+
paste: {
|
|
60
|
+
/** Enable bracketed paste */
|
|
61
|
+
enable: `${CSI}?2004h`,
|
|
62
|
+
/** Disable bracketed paste */
|
|
63
|
+
disable: `${CSI}?2004l`,
|
|
64
|
+
/** Paste start marker */
|
|
65
|
+
startMarker: `${CSI}200~`,
|
|
66
|
+
/** Paste end marker */
|
|
67
|
+
endMarker: `${CSI}201~`,
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
/** Line reflow control (DEC mode 2028 - limited terminal support) */
|
|
71
|
+
reflow: {
|
|
72
|
+
/** Disable line reflow on resize (Contour, some others) */
|
|
73
|
+
disable: `${CSI}?2028l`,
|
|
74
|
+
/** Enable line reflow on resize (default) */
|
|
75
|
+
enable: `${CSI}?2028h`,
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
/** Scroll region control (DECSTBM) */
|
|
79
|
+
scrollRegion: {
|
|
80
|
+
/** Set scroll region to rows [top, bottom] (1-indexed, inclusive) */
|
|
81
|
+
set: (top: number, bottom: number) => `${CSI}${top};${bottom}r`,
|
|
82
|
+
/** Reset scroll region to full screen */
|
|
83
|
+
reset: `${CSI}r`,
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
/** Line insertion/deletion */
|
|
87
|
+
lines: {
|
|
88
|
+
/** Insert n blank lines at cursor, pushing content down (IL) */
|
|
89
|
+
insert: (n: number) => (n > 0 ? `${CSI}${n}L` : ""),
|
|
90
|
+
/** Delete n lines at cursor, pulling content up (DL) */
|
|
91
|
+
delete: (n: number) => (n > 0 ? `${CSI}${n}M` : ""),
|
|
92
|
+
},
|
|
70
93
|
|
|
71
|
-
|
|
72
|
-
|
|
94
|
+
/** Cursor save/restore (DECSC/DECRC) */
|
|
95
|
+
cursorState: {
|
|
96
|
+
/** Save cursor position and attributes */
|
|
97
|
+
save: "\x1b7",
|
|
98
|
+
/** Restore cursor position and attributes */
|
|
99
|
+
restore: "\x1b8",
|
|
100
|
+
},
|
|
73
101
|
|
|
74
|
-
|
|
75
|
-
|
|
102
|
+
/**
|
|
103
|
+
* Kitty keyboard protocol
|
|
104
|
+
* @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/
|
|
105
|
+
* Enables enhanced key reporting with modifier detection for Ctrl+Shift+key combos
|
|
106
|
+
*/
|
|
107
|
+
keyboard: {
|
|
108
|
+
/**
|
|
109
|
+
* Enable Kitty keyboard protocol with flags.
|
|
110
|
+
* Flag 1 (disambiguate): Reports Ctrl+C as CSI sequence instead of raw ETX,
|
|
111
|
+
* allowing detection of Ctrl+Shift+C vs Ctrl+C.
|
|
112
|
+
* Supported by: Kitty, iTerm2 3.5+, WezTerm, Ghostty, foot, Contour, rio
|
|
113
|
+
* NOTE: Many terminals intercept Ctrl+Shift+C for their own copy - may need
|
|
114
|
+
* to configure terminal or use different keybinding.
|
|
115
|
+
*/
|
|
116
|
+
enable: (flags = 1) => `${CSI}>${flags}u`,
|
|
117
|
+
/** Disable/pop Kitty keyboard protocol */
|
|
118
|
+
disable: `${CSI}<u`,
|
|
119
|
+
/** Query current keyboard mode (response: CSI ? flags u) */
|
|
120
|
+
query: `${CSI}?u`,
|
|
121
|
+
},
|
|
76
122
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
123
|
+
/**
|
|
124
|
+
* xterm modifyOtherKeys mode
|
|
125
|
+
* @see https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
|
|
126
|
+
* Alternative to Kitty protocol, supported by xterm and some other terminals.
|
|
127
|
+
*/
|
|
128
|
+
modifyOtherKeys: {
|
|
129
|
+
/** Enable mode 2 (full modifier reporting) */
|
|
130
|
+
enable: `${CSI}>4;2m`,
|
|
131
|
+
/** Disable modifyOtherKeys */
|
|
132
|
+
disable: `${CSI}>4;0m`,
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
/** Style/SGR reset */
|
|
136
|
+
resetStyle: `${CSI}0m`,
|
|
137
|
+
|
|
138
|
+
/** Build style SGR sequence */
|
|
139
|
+
style: (s: {
|
|
140
|
+
fg?: number
|
|
141
|
+
bg?: number
|
|
142
|
+
bold?: boolean
|
|
143
|
+
italic?: boolean
|
|
144
|
+
underline?: boolean
|
|
145
|
+
inverse?: boolean
|
|
146
|
+
}) => {
|
|
147
|
+
const codes: number[] = []
|
|
148
|
+
if (s.bold) codes.push(1)
|
|
149
|
+
if (s.italic) codes.push(3)
|
|
150
|
+
if (s.underline) codes.push(4)
|
|
151
|
+
if (s.inverse) codes.push(7)
|
|
152
|
+
if (s.fg !== undefined) {
|
|
153
|
+
if (s.fg < 256) {
|
|
154
|
+
codes.push(38, 5, s.fg)
|
|
155
|
+
} else {
|
|
156
|
+
// Truecolor: decode from packed RGB
|
|
157
|
+
const r = (s.fg >> 16) & 0xff
|
|
158
|
+
const g = (s.fg >> 8) & 0xff
|
|
159
|
+
const b = s.fg & 0xff
|
|
160
|
+
codes.push(38, 2, r, g, b)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (s.bg !== undefined) {
|
|
164
|
+
if (s.bg < 256) {
|
|
165
|
+
codes.push(48, 5, s.bg)
|
|
166
|
+
} else {
|
|
167
|
+
const r = (s.bg >> 16) & 0xff
|
|
168
|
+
const g = (s.bg >> 8) & 0xff
|
|
169
|
+
const b = s.bg & 0xff
|
|
170
|
+
codes.push(48, 2, r, g, b)
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return codes.length > 0 ? `${CSI}${codes.join(";")}m` : ""
|
|
174
|
+
},
|
|
175
|
+
|
|
176
|
+
/** Scrolling */
|
|
177
|
+
scroll: {
|
|
178
|
+
/** Scroll up by n lines */
|
|
179
|
+
up: (n: number) => `${CSI}${n}S`,
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
/** Device Status Reports */
|
|
183
|
+
report: {
|
|
184
|
+
/** Request cursor position (response: ESC [ row ; col R) */
|
|
185
|
+
cursorPosition: `${CSI}6n`,
|
|
186
|
+
},
|
|
187
|
+
} as const
|
|
188
|
+
|
|
189
|
+
/** High-level terminal control utilities (compositions of ANSI primitives) */
|
|
190
|
+
export const Terminal = {
|
|
191
|
+
/** Enter full-screen mode: alternate screen + clear + hide cursor */
|
|
192
|
+
enterFullscreen: ANSI.screen.enterAlt + ANSI.screen.clear + ANSI.cursor.hide,
|
|
193
|
+
/** Exit full-screen mode: show cursor + exit alternate screen */
|
|
194
|
+
exitFullscreen: ANSI.screen.exitAlt + ANSI.cursor.show,
|
|
195
|
+
/** Hide cursor */
|
|
196
|
+
hideCursor: ANSI.cursor.hide,
|
|
197
|
+
/** Show cursor */
|
|
198
|
+
showCursor: ANSI.cursor.show,
|
|
199
|
+
/** Clear screen and move cursor to home */
|
|
200
|
+
clearAndHome: ANSI.screen.clear + ANSI.cursor.home,
|
|
201
|
+
/** Enable bracketed paste mode */
|
|
202
|
+
bracketedPasteOn: ANSI.paste.enable,
|
|
203
|
+
/** Disable bracketed paste mode */
|
|
204
|
+
bracketedPasteOff: ANSI.paste.disable,
|
|
205
|
+
/** Enable mouse tracking */
|
|
206
|
+
mouseOn: ANSI.mouse.enable,
|
|
207
|
+
/** Disable mouse tracking */
|
|
208
|
+
mouseOff: ANSI.mouse.disable,
|
|
209
|
+
/** Request cursor position report */
|
|
210
|
+
reportCursorPosition: ANSI.report.cursorPosition,
|
|
83
211
|
} as const
|