@hypercli/ui 0.1.1
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/LICENSE +21 -0
- package/README.md +11 -0
- package/dist/capabilities/index.d.ts +62 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +182 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/colors.d.ts +32 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +40 -0
- package/dist/colors.js.map +1 -0
- package/dist/components/columns.d.ts +28 -0
- package/dist/components/columns.d.ts.map +1 -0
- package/dist/components/columns.js +70 -0
- package/dist/components/columns.js.map +1 -0
- package/dist/components/confirmPrompt.d.ts +38 -0
- package/dist/components/confirmPrompt.d.ts.map +1 -0
- package/dist/components/confirmPrompt.js +109 -0
- package/dist/components/confirmPrompt.js.map +1 -0
- package/dist/components/diff.d.ts +37 -0
- package/dist/components/diff.d.ts.map +1 -0
- package/dist/components/diff.js +36 -0
- package/dist/components/diff.js.map +1 -0
- package/dist/components/helpLayout.d.ts +59 -0
- package/dist/components/helpLayout.d.ts.map +1 -0
- package/dist/components/helpLayout.js +103 -0
- package/dist/components/helpLayout.js.map +1 -0
- package/dist/components/index.d.ts +38 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +23 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/keyValue.d.ts +31 -0
- package/dist/components/keyValue.d.ts.map +1 -0
- package/dist/components/keyValue.js +36 -0
- package/dist/components/keyValue.js.map +1 -0
- package/dist/components/list.d.ts +30 -0
- package/dist/components/list.d.ts.map +1 -0
- package/dist/components/list.js +80 -0
- package/dist/components/list.js.map +1 -0
- package/dist/components/message.d.ts +33 -0
- package/dist/components/message.d.ts.map +1 -0
- package/dist/components/message.js +86 -0
- package/dist/components/message.js.map +1 -0
- package/dist/components/panel.d.ts +28 -0
- package/dist/components/panel.d.ts.map +1 -0
- package/dist/components/panel.js +30 -0
- package/dist/components/panel.js.map +1 -0
- package/dist/components/progressBar.d.ts +44 -0
- package/dist/components/progressBar.d.ts.map +1 -0
- package/dist/components/progressBar.js +154 -0
- package/dist/components/progressBar.js.map +1 -0
- package/dist/components/section.d.ts +22 -0
- package/dist/components/section.d.ts.map +1 -0
- package/dist/components/section.js +48 -0
- package/dist/components/section.js.map +1 -0
- package/dist/components/selectPrompt.d.ts +58 -0
- package/dist/components/selectPrompt.d.ts.map +1 -0
- package/dist/components/selectPrompt.js +206 -0
- package/dist/components/selectPrompt.js.map +1 -0
- package/dist/components/spinner.d.ts +38 -0
- package/dist/components/spinner.d.ts.map +1 -0
- package/dist/components/spinner.js +125 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/statusList.d.ts +22 -0
- package/dist/components/statusList.d.ts.map +1 -0
- package/dist/components/statusList.js +43 -0
- package/dist/components/statusList.js.map +1 -0
- package/dist/components/table.d.ts +39 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +132 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/textPrompt.d.ts +43 -0
- package/dist/components/textPrompt.d.ts.map +1 -0
- package/dist/components/textPrompt.js +123 -0
- package/dist/components/textPrompt.js.map +1 -0
- package/dist/components/tree.d.ts +30 -0
- package/dist/components/tree.d.ts.map +1 -0
- package/dist/components/tree.js +49 -0
- package/dist/components/tree.js.map +1 -0
- package/dist/ds-index.d.ts +113 -0
- package/dist/ds-index.d.ts.map +1 -0
- package/dist/ds-index.js +112 -0
- package/dist/ds-index.js.map +1 -0
- package/dist/help.d.ts +32 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +34 -0
- package/dist/help.js.map +1 -0
- package/dist/hyper-theme.d.ts +8 -0
- package/dist/hyper-theme.d.ts.map +1 -0
- package/dist/hyper-theme.js +30 -0
- package/dist/hyper-theme.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/md.d.ts +12 -0
- package/dist/md.d.ts.map +1 -0
- package/dist/md.js +19 -0
- package/dist/md.js.map +1 -0
- package/dist/messages.d.ts +20 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +65 -0
- package/dist/messages.js.map +1 -0
- package/dist/palette.d.ts +20 -0
- package/dist/palette.d.ts.map +1 -0
- package/dist/palette.js +22 -0
- package/dist/palette.js.map +1 -0
- package/dist/primitives/align.d.ts +23 -0
- package/dist/primitives/align.d.ts.map +1 -0
- package/dist/primitives/align.js +40 -0
- package/dist/primitives/align.js.map +1 -0
- package/dist/primitives/badge.d.ts +24 -0
- package/dist/primitives/badge.d.ts.map +1 -0
- package/dist/primitives/badge.js +40 -0
- package/dist/primitives/badge.js.map +1 -0
- package/dist/primitives/border.d.ts +29 -0
- package/dist/primitives/border.d.ts.map +1 -0
- package/dist/primitives/border.js +100 -0
- package/dist/primitives/border.js.map +1 -0
- package/dist/primitives/context.d.ts +48 -0
- package/dist/primitives/context.d.ts.map +1 -0
- package/dist/primitives/context.js +64 -0
- package/dist/primitives/context.js.map +1 -0
- package/dist/primitives/divider.d.ts +25 -0
- package/dist/primitives/divider.d.ts.map +1 -0
- package/dist/primitives/divider.js +56 -0
- package/dist/primitives/divider.js.map +1 -0
- package/dist/primitives/indent.d.ts +16 -0
- package/dist/primitives/indent.d.ts.map +1 -0
- package/dist/primitives/indent.js +25 -0
- package/dist/primitives/indent.js.map +1 -0
- package/dist/primitives/index.d.ts +32 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +22 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/line.d.ts +21 -0
- package/dist/primitives/line.d.ts.map +1 -0
- package/dist/primitives/line.js +29 -0
- package/dist/primitives/line.js.map +1 -0
- package/dist/primitives/markdown.d.ts +91 -0
- package/dist/primitives/markdown.d.ts.map +1 -0
- package/dist/primitives/markdown.js +62 -0
- package/dist/primitives/markdown.js.map +1 -0
- package/dist/primitives/pad.d.ts +24 -0
- package/dist/primitives/pad.d.ts.map +1 -0
- package/dist/primitives/pad.js +20 -0
- package/dist/primitives/pad.js.map +1 -0
- package/dist/primitives/stack.d.ts +22 -0
- package/dist/primitives/stack.d.ts.map +1 -0
- package/dist/primitives/stack.js +21 -0
- package/dist/primitives/stack.js.map +1 -0
- package/dist/primitives/styledText.d.ts +36 -0
- package/dist/primitives/styledText.d.ts.map +1 -0
- package/dist/primitives/styledText.js +42 -0
- package/dist/primitives/styledText.js.map +1 -0
- package/dist/primitives/symbol.d.ts +15 -0
- package/dist/primitives/symbol.d.ts.map +1 -0
- package/dist/primitives/symbol.js +18 -0
- package/dist/primitives/symbol.js.map +1 -0
- package/dist/primitives/truncate.d.ts +23 -0
- package/dist/primitives/truncate.d.ts.map +1 -0
- package/dist/primitives/truncate.js +99 -0
- package/dist/primitives/truncate.js.map +1 -0
- package/dist/primitives/wrap.d.ts +23 -0
- package/dist/primitives/wrap.d.ts.map +1 -0
- package/dist/primitives/wrap.js +30 -0
- package/dist/primitives/wrap.js.map +1 -0
- package/dist/render/ansi-utils.d.ts +49 -0
- package/dist/render/ansi-utils.d.ts.map +1 -0
- package/dist/render/ansi-utils.js +405 -0
- package/dist/render/ansi-utils.js.map +1 -0
- package/dist/render/index.d.ts +11 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +11 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/sgr.d.ts +60 -0
- package/dist/render/sgr.d.ts.map +1 -0
- package/dist/render/sgr.js +191 -0
- package/dist/render/sgr.js.map +1 -0
- package/dist/render/strip.d.ts +24 -0
- package/dist/render/strip.d.ts.map +1 -0
- package/dist/render/strip.js +81 -0
- package/dist/render/strip.js.map +1 -0
- package/dist/render/width.d.ts +30 -0
- package/dist/render/width.d.ts.map +1 -0
- package/dist/render/width.js +149 -0
- package/dist/render/width.js.map +1 -0
- package/dist/shortcuts.d.ts +76 -0
- package/dist/shortcuts.d.ts.map +1 -0
- package/dist/shortcuts.js +117 -0
- package/dist/shortcuts.js.map +1 -0
- package/dist/styles.d.ts +43 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +44 -0
- package/dist/styles.js.map +1 -0
- package/dist/symbols.d.ts +19 -0
- package/dist/symbols.d.ts.map +1 -0
- package/dist/symbols.js +21 -0
- package/dist/symbols.js.map +1 -0
- package/dist/test/compare.d.ts +28 -0
- package/dist/test/compare.d.ts.map +1 -0
- package/dist/test/compare.js +37 -0
- package/dist/test/compare.js.map +1 -0
- package/dist/test/index.d.ts +16 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +14 -0
- package/dist/test/index.js.map +1 -0
- package/dist/test/mock.d.ts +50 -0
- package/dist/test/mock.d.ts.map +1 -0
- package/dist/test/mock.js +135 -0
- package/dist/test/mock.js.map +1 -0
- package/dist/test/render.d.ts +29 -0
- package/dist/test/render.d.ts.map +1 -0
- package/dist/test/render.js +87 -0
- package/dist/test/render.js.map +1 -0
- package/dist/test/snapshot.d.ts +16 -0
- package/dist/test/snapshot.d.ts.map +1 -0
- package/dist/test/snapshot.js +216 -0
- package/dist/test/snapshot.js.map +1 -0
- package/dist/theme/builtins.d.ts +10 -0
- package/dist/theme/builtins.d.ts.map +1 -0
- package/dist/theme/builtins.js +102 -0
- package/dist/theme/builtins.js.map +1 -0
- package/dist/theme/engine.d.ts +51 -0
- package/dist/theme/engine.d.ts.map +1 -0
- package/dist/theme/engine.js +123 -0
- package/dist/theme/engine.js.map +1 -0
- package/dist/theme/index.d.ts +10 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +12 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/merge.d.ts +24 -0
- package/dist/theme/merge.d.ts.map +1 -0
- package/dist/theme/merge.js +66 -0
- package/dist/theme/merge.js.map +1 -0
- package/dist/theme/types.d.ts +44 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +8 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme.d.ts +9 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +53 -0
- package/dist/theme.js.map +1 -0
- package/dist/tokens/defaults.d.ts +13 -0
- package/dist/tokens/defaults.d.ts.map +1 -0
- package/dist/tokens/defaults.js +248 -0
- package/dist/tokens/defaults.js.map +1 -0
- package/dist/tokens/index.d.ts +10 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +10 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/resolver.d.ts +100 -0
- package/dist/tokens/resolver.d.ts.map +1 -0
- package/dist/tokens/resolver.js +138 -0
- package/dist/tokens/resolver.js.map +1 -0
- package/dist/tokens/types.d.ts +265 -0
- package/dist/tokens/types.d.ts.map +1 -0
- package/dist/tokens/types.js +10 -0
- package/dist/tokens/types.js.map +1 -0
- package/dist/tokens.d.ts +26 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +30 -0
- package/dist/tokens.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ANSI-Aware String Operations
|
|
3
|
+
*
|
|
4
|
+
* String manipulation functions that understand ANSI escape sequences,
|
|
5
|
+
* ensuring styles are properly preserved, carried, and closed across
|
|
6
|
+
* truncation, padding, slicing, and wrapping operations.
|
|
7
|
+
*/
|
|
8
|
+
import { stripAnsi } from "./strip.js";
|
|
9
|
+
import { charWidth, stringWidth } from "./width.js";
|
|
10
|
+
function parseSegments(str) {
|
|
11
|
+
const segments = [];
|
|
12
|
+
let i = 0;
|
|
13
|
+
while (i < str.length) {
|
|
14
|
+
// ANSI escape sequence
|
|
15
|
+
if (str.charCodeAt(i) === 0x1b && str[i + 1] === "[") {
|
|
16
|
+
let j = i + 2;
|
|
17
|
+
while (j < str.length) {
|
|
18
|
+
const ch = str.charCodeAt(j);
|
|
19
|
+
if ((ch >= 0x41 && ch <= 0x5a) || (ch >= 0x61 && ch <= 0x7a)) {
|
|
20
|
+
segments.push({ type: "ansi", value: str.slice(i, j + 1) });
|
|
21
|
+
i = j + 1;
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
j++;
|
|
25
|
+
}
|
|
26
|
+
if (j >= str.length) {
|
|
27
|
+
// Unterminated sequence, treat as text
|
|
28
|
+
segments.push({ type: "char", value: str.slice(i), width: 1 });
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// Regular character (handle surrogate pairs)
|
|
34
|
+
const code = str.codePointAt(i);
|
|
35
|
+
const charLen = code > 0xffff ? 2 : 1;
|
|
36
|
+
const ch = str.slice(i, i + charLen);
|
|
37
|
+
segments.push({ type: "char", value: ch, width: charWidth(code) });
|
|
38
|
+
i += charLen;
|
|
39
|
+
}
|
|
40
|
+
return segments;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Track which ANSI SGR styles are currently "open" by accumulating
|
|
44
|
+
* all SGR sequences encountered. Returns the concatenation of all
|
|
45
|
+
* active style sequences (for re-opening after a break).
|
|
46
|
+
*/
|
|
47
|
+
function collectOpenStyles(segments, upTo) {
|
|
48
|
+
// We track style state by replaying all SGR sequences up to the given index.
|
|
49
|
+
// A full reset (\x1b[0m or \x1b[m) clears everything.
|
|
50
|
+
const activeSequences = [];
|
|
51
|
+
for (let i = 0; i < upTo && i < segments.length; i++) {
|
|
52
|
+
const seg = segments[i];
|
|
53
|
+
if (seg.type === "ansi") {
|
|
54
|
+
const params = seg.value.slice(2, -1);
|
|
55
|
+
if (params === "" || params === "0") {
|
|
56
|
+
// Full reset
|
|
57
|
+
activeSequences.length = 0;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
activeSequences.push(seg.value);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return activeSequences.join("");
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if any styles are active (non-reset SGR sequences have been applied).
|
|
68
|
+
*/
|
|
69
|
+
function hasActiveStyles(openStyles) {
|
|
70
|
+
return openStyles.length > 0;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Truncates a string to `maxWidth` visual columns, appending an ellipsis if truncated.
|
|
74
|
+
* Preserves ANSI styling and properly closes any open styles at the truncation point.
|
|
75
|
+
*
|
|
76
|
+
* @param str - The string to truncate.
|
|
77
|
+
* @param maxWidth - Maximum visual width in terminal columns.
|
|
78
|
+
* @param ellipsis - Ellipsis string appended at the truncation point. Defaults to `''`.
|
|
79
|
+
* @returns The truncated string, or the original if it fits within `maxWidth`.
|
|
80
|
+
*/
|
|
81
|
+
export function ansiTruncate(str, maxWidth, ellipsis = "") {
|
|
82
|
+
const currentWidth = stringWidth(str);
|
|
83
|
+
if (currentWidth <= maxWidth)
|
|
84
|
+
return str;
|
|
85
|
+
const ellipsisWidth = stringWidth(ellipsis);
|
|
86
|
+
const targetWidth = maxWidth - ellipsisWidth;
|
|
87
|
+
if (targetWidth <= 0) {
|
|
88
|
+
// Ellipsis alone exceeds maxWidth; just return truncated ellipsis or empty
|
|
89
|
+
if (ellipsisWidth <= maxWidth)
|
|
90
|
+
return ellipsis;
|
|
91
|
+
return "";
|
|
92
|
+
}
|
|
93
|
+
const segments = parseSegments(str);
|
|
94
|
+
let width = 0;
|
|
95
|
+
let result = "";
|
|
96
|
+
let lastAnsiIndex = -1;
|
|
97
|
+
for (let i = 0; i < segments.length; i++) {
|
|
98
|
+
const seg = segments[i];
|
|
99
|
+
if (seg.type === "ansi") {
|
|
100
|
+
result += seg.value;
|
|
101
|
+
lastAnsiIndex = i;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (width + seg.width > targetWidth) {
|
|
105
|
+
// Close open styles, append ellipsis
|
|
106
|
+
const openStyles = collectOpenStyles(segments, i);
|
|
107
|
+
if (hasActiveStyles(openStyles)) {
|
|
108
|
+
result += "\x1b[0m";
|
|
109
|
+
}
|
|
110
|
+
result += ellipsis;
|
|
111
|
+
if (hasActiveStyles(openStyles)) {
|
|
112
|
+
result += openStyles;
|
|
113
|
+
}
|
|
114
|
+
// Find and append any remaining closing sequences
|
|
115
|
+
// Actually, we want to close styles after the ellipsis too
|
|
116
|
+
if (hasActiveStyles(openStyles)) {
|
|
117
|
+
result += "\x1b[0m";
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
result += seg.value;
|
|
122
|
+
width += seg.width;
|
|
123
|
+
}
|
|
124
|
+
return str;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Pads a string to an exact visual width using spaces.
|
|
128
|
+
*
|
|
129
|
+
* @param str - The string to pad.
|
|
130
|
+
* @param width - Target visual width in terminal columns.
|
|
131
|
+
* @param align - Alignment: `'left'` (default), `'right'`, or `'center'`.
|
|
132
|
+
* @returns The padded string.
|
|
133
|
+
*/
|
|
134
|
+
export function ansiPad(str, width, align = "left") {
|
|
135
|
+
const currentWidth = stringWidth(str);
|
|
136
|
+
if (currentWidth >= width)
|
|
137
|
+
return str;
|
|
138
|
+
const padding = width - currentWidth;
|
|
139
|
+
switch (align) {
|
|
140
|
+
case "right":
|
|
141
|
+
return " ".repeat(padding) + str;
|
|
142
|
+
case "center": {
|
|
143
|
+
const left = Math.floor(padding / 2);
|
|
144
|
+
const right = padding - left;
|
|
145
|
+
return " ".repeat(left) + str + " ".repeat(right);
|
|
146
|
+
}
|
|
147
|
+
default:
|
|
148
|
+
return str + " ".repeat(padding);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Slices a string by visual column positions, preserving active ANSI styles.
|
|
153
|
+
*
|
|
154
|
+
* Returns the substring from visual column `start` to `end` (exclusive),
|
|
155
|
+
* with any active styles from before the slice re-applied at the beginning
|
|
156
|
+
* and a reset appended at the end if styles were active.
|
|
157
|
+
*
|
|
158
|
+
* @param str - The string to slice.
|
|
159
|
+
* @param start - Start visual column (inclusive).
|
|
160
|
+
* @param end - End visual column (exclusive). Defaults to end of string.
|
|
161
|
+
* @returns The sliced substring with ANSI styles preserved.
|
|
162
|
+
*/
|
|
163
|
+
export function ansiSlice(str, start, end) {
|
|
164
|
+
const segments = parseSegments(str);
|
|
165
|
+
const totalWidth = stringWidth(str);
|
|
166
|
+
const effectiveEnd = end !== undefined ? Math.min(end, totalWidth) : totalWidth;
|
|
167
|
+
if (start >= effectiveEnd)
|
|
168
|
+
return "";
|
|
169
|
+
let col = 0;
|
|
170
|
+
let result = "";
|
|
171
|
+
let inRange = false;
|
|
172
|
+
let preStyles = ""; // Styles active before the start position
|
|
173
|
+
for (let i = 0; i < segments.length; i++) {
|
|
174
|
+
const seg = segments[i];
|
|
175
|
+
if (seg.type === "ansi") {
|
|
176
|
+
if (!inRange) {
|
|
177
|
+
// Track styles before our range
|
|
178
|
+
const params = seg.value.slice(2, -1);
|
|
179
|
+
if (params === "" || params === "0") {
|
|
180
|
+
preStyles = "";
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
preStyles += seg.value;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// Inside range, include the ANSI sequence
|
|
188
|
+
result += seg.value;
|
|
189
|
+
}
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
const nextCol = col + seg.width;
|
|
193
|
+
if (!inRange && nextCol > start) {
|
|
194
|
+
// Entering range — apply accumulated styles
|
|
195
|
+
inRange = true;
|
|
196
|
+
if (preStyles) {
|
|
197
|
+
result += preStyles;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (inRange && col < effectiveEnd) {
|
|
201
|
+
if (nextCol <= effectiveEnd) {
|
|
202
|
+
result += seg.value;
|
|
203
|
+
}
|
|
204
|
+
// If this char would exceed end, skip it
|
|
205
|
+
}
|
|
206
|
+
col = nextCol;
|
|
207
|
+
if (col >= effectiveEnd && inRange) {
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Close any open styles
|
|
212
|
+
if (preStyles || result.includes("\x1b[")) {
|
|
213
|
+
// Check if there are active styles by looking for non-reset SGR sequences
|
|
214
|
+
const allSegments = parseSegments(result);
|
|
215
|
+
const styles = [];
|
|
216
|
+
for (const s of allSegments) {
|
|
217
|
+
if (s.type === "ansi") {
|
|
218
|
+
const params = s.value.slice(2, -1);
|
|
219
|
+
if (params === "" || params === "0") {
|
|
220
|
+
styles.length = 0;
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
styles.push(s.value);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Also account for preStyles
|
|
228
|
+
if (preStyles) {
|
|
229
|
+
// preStyles were already injected into result, so they're already counted
|
|
230
|
+
}
|
|
231
|
+
if (styles.length > 0) {
|
|
232
|
+
result += "\x1b[0m";
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return result;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Word-wraps a string to `maxWidth` visual columns, preserving ANSI styles across line breaks.
|
|
239
|
+
*
|
|
240
|
+
* @param str - The string to wrap.
|
|
241
|
+
* @param maxWidth - Maximum visual width per line in terminal columns.
|
|
242
|
+
* @param hard - When `true`, breaks mid-word if a single word exceeds `maxWidth`. Defaults to `false`.
|
|
243
|
+
* @returns The wrapped string with `\n` inserted at break points.
|
|
244
|
+
*/
|
|
245
|
+
export function ansiWrap(str, maxWidth, hard = false) {
|
|
246
|
+
// Process line-by-line (preserve existing newlines)
|
|
247
|
+
const inputLines = str.split("\n");
|
|
248
|
+
const outputLines = [];
|
|
249
|
+
for (const line of inputLines) {
|
|
250
|
+
if (stringWidth(line) <= maxWidth) {
|
|
251
|
+
outputLines.push(line);
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (hard) {
|
|
255
|
+
// Hard wrap: break at exact width
|
|
256
|
+
const wrapped = hardWrapLine(line, maxWidth);
|
|
257
|
+
outputLines.push(...wrapped);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
// Soft wrap: break at word boundaries
|
|
261
|
+
const wrapped = softWrapLine(line, maxWidth);
|
|
262
|
+
outputLines.push(...wrapped);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return outputLines.join("\n");
|
|
266
|
+
}
|
|
267
|
+
function hardWrapLine(line, maxWidth) {
|
|
268
|
+
const segments = parseSegments(line);
|
|
269
|
+
const lines = [];
|
|
270
|
+
let current = "";
|
|
271
|
+
let col = 0;
|
|
272
|
+
let activeStyles = [];
|
|
273
|
+
for (const seg of segments) {
|
|
274
|
+
if (seg.type === "ansi") {
|
|
275
|
+
current += seg.value;
|
|
276
|
+
const params = seg.value.slice(2, -1);
|
|
277
|
+
if (params === "" || params === "0") {
|
|
278
|
+
activeStyles = [];
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
activeStyles.push(seg.value);
|
|
282
|
+
}
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
if (col + seg.width > maxWidth && col > 0) {
|
|
286
|
+
// Break here
|
|
287
|
+
if (activeStyles.length > 0) {
|
|
288
|
+
current += "\x1b[0m";
|
|
289
|
+
}
|
|
290
|
+
lines.push(current);
|
|
291
|
+
current = activeStyles.join("") + seg.value;
|
|
292
|
+
col = seg.width;
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
current += seg.value;
|
|
296
|
+
col += seg.width;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (current) {
|
|
300
|
+
lines.push(current);
|
|
301
|
+
}
|
|
302
|
+
return lines;
|
|
303
|
+
}
|
|
304
|
+
function softWrapLine(line, maxWidth) {
|
|
305
|
+
const segments = parseSegments(line);
|
|
306
|
+
const lines = [];
|
|
307
|
+
const words = [];
|
|
308
|
+
let currentWord = [];
|
|
309
|
+
let currentWordWidth = 0;
|
|
310
|
+
let pendingSpaces = [];
|
|
311
|
+
let pendingSpacesWidth = 0;
|
|
312
|
+
for (const seg of segments) {
|
|
313
|
+
if (seg.type === "ansi") {
|
|
314
|
+
currentWord.push(seg);
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (seg.value === " " || seg.value === "\t") {
|
|
318
|
+
if (currentWordWidth > 0) {
|
|
319
|
+
words.push({
|
|
320
|
+
segments: [...pendingSpaces, ...currentWord],
|
|
321
|
+
width: pendingSpacesWidth + currentWordWidth,
|
|
322
|
+
});
|
|
323
|
+
currentWord = [];
|
|
324
|
+
currentWordWidth = 0;
|
|
325
|
+
pendingSpaces = [];
|
|
326
|
+
pendingSpacesWidth = 0;
|
|
327
|
+
}
|
|
328
|
+
pendingSpaces.push(seg);
|
|
329
|
+
pendingSpacesWidth += seg.width;
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
currentWord.push(seg);
|
|
333
|
+
currentWordWidth += seg.width;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
// Final word
|
|
337
|
+
if (currentWordWidth > 0 || currentWord.length > 0) {
|
|
338
|
+
words.push({
|
|
339
|
+
segments: [...pendingSpaces, ...currentWord],
|
|
340
|
+
width: pendingSpacesWidth + currentWordWidth,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
let currentLine = "";
|
|
344
|
+
let col = 0;
|
|
345
|
+
let activeStyles = [];
|
|
346
|
+
for (const word of words) {
|
|
347
|
+
// Calculate the visible width of just this word (excluding leading spaces if it starts a new line)
|
|
348
|
+
const wordVisibleWidth = word.width;
|
|
349
|
+
if (col > 0 && col + wordVisibleWidth > maxWidth) {
|
|
350
|
+
// Break: close styles, start new line
|
|
351
|
+
if (activeStyles.length > 0) {
|
|
352
|
+
currentLine += "\x1b[0m";
|
|
353
|
+
}
|
|
354
|
+
lines.push(currentLine);
|
|
355
|
+
// Start new line with active styles, skip leading spaces
|
|
356
|
+
currentLine = activeStyles.join("");
|
|
357
|
+
col = 0;
|
|
358
|
+
// Add word segments, skipping leading spaces
|
|
359
|
+
let skipSpaces = true;
|
|
360
|
+
for (const seg of word.segments) {
|
|
361
|
+
if (seg.type === "ansi") {
|
|
362
|
+
currentLine += seg.value;
|
|
363
|
+
const params = seg.value.slice(2, -1);
|
|
364
|
+
if (params === "" || params === "0") {
|
|
365
|
+
activeStyles = [];
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
activeStyles.push(seg.value);
|
|
369
|
+
}
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
if (skipSpaces && (seg.value === " " || seg.value === "\t")) {
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
skipSpaces = false;
|
|
376
|
+
currentLine += seg.value;
|
|
377
|
+
col += seg.width;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
// Append word to current line
|
|
382
|
+
for (const seg of word.segments) {
|
|
383
|
+
if (seg.type === "ansi") {
|
|
384
|
+
currentLine += seg.value;
|
|
385
|
+
const params = seg.value.slice(2, -1);
|
|
386
|
+
if (params === "" || params === "0") {
|
|
387
|
+
activeStyles = [];
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
activeStyles.push(seg.value);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
currentLine += seg.value;
|
|
395
|
+
col += seg.width;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
if (currentLine || lines.length === 0) {
|
|
401
|
+
lines.push(currentLine);
|
|
402
|
+
}
|
|
403
|
+
return lines;
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=ansi-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansi-utils.js","sourceRoot":"","sources":["../../src/render/ansi-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rendering Engine
|
|
3
|
+
*
|
|
4
|
+
* ANSI SGR code generation, string width calculation, escape sequence
|
|
5
|
+
* stripping, and ANSI-aware string manipulation utilities.
|
|
6
|
+
*/
|
|
7
|
+
export { type StyleSpec, sgrOpen, sgrClose, applyStyle } from "./sgr.ts";
|
|
8
|
+
export { stripAnsi, stripColor } from "./strip.ts";
|
|
9
|
+
export { charWidth, stringWidth } from "./width.ts";
|
|
10
|
+
export { ansiTruncate, ansiPad, ansiSlice, ansiWrap } from "./ansi-utils.ts";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rendering Engine
|
|
3
|
+
*
|
|
4
|
+
* ANSI SGR code generation, string width calculation, escape sequence
|
|
5
|
+
* stripping, and ANSI-aware string manipulation utilities.
|
|
6
|
+
*/
|
|
7
|
+
export { sgrOpen, sgrClose, applyStyle } from "./sgr.js";
|
|
8
|
+
export { stripAnsi, stripColor } from "./strip.js";
|
|
9
|
+
export { charWidth, stringWidth } from "./width.js";
|
|
10
|
+
export { ansiTruncate, ansiPad, ansiSlice, ansiWrap } from "./ansi-utils.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAkB,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SGR (Select Graphic Rendition) Code Generation
|
|
3
|
+
*
|
|
4
|
+
* Maps style specifications to ANSI escape sequences for terminal styling.
|
|
5
|
+
* Supports 16-color names, 256-color indices, and truecolor hex values.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Specification of terminal text styling attributes.
|
|
9
|
+
*
|
|
10
|
+
* Colors accept ANSI 16 names (`"red"`, `"cyan"`), 256-color indices
|
|
11
|
+
* as numeric strings (`"196"`), or truecolor hex (`"#ff0000"`, `"#f00"`).
|
|
12
|
+
*/
|
|
13
|
+
export type StyleSpec = {
|
|
14
|
+
/** Foreground color. Accepts a named color, 256-color index string, or `#hex`. */
|
|
15
|
+
color?: string | null;
|
|
16
|
+
/** Background color. Accepts a named color, 256-color index string, or `#hex`. */
|
|
17
|
+
bg?: string | null;
|
|
18
|
+
/** Bold / increased intensity. */
|
|
19
|
+
bold?: boolean;
|
|
20
|
+
/** Dim / decreased intensity. */
|
|
21
|
+
dim?: boolean;
|
|
22
|
+
/** Italic text (terminal support varies). */
|
|
23
|
+
italic?: boolean;
|
|
24
|
+
/** Underlined text. */
|
|
25
|
+
underline?: boolean;
|
|
26
|
+
/** Strikethrough text (terminal support varies). */
|
|
27
|
+
strikethrough?: boolean;
|
|
28
|
+
/** Swap foreground and background colors. */
|
|
29
|
+
inverse?: boolean;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Generate the opening SGR escape sequence for a style spec.
|
|
33
|
+
*
|
|
34
|
+
* Combines all attribute and color codes into a single sequence (e.g. `\x1b[1;31;4m`).
|
|
35
|
+
*
|
|
36
|
+
* @param style - The style specification to encode.
|
|
37
|
+
* @returns The opening ANSI escape sequence, or an empty string if no styles are set.
|
|
38
|
+
*/
|
|
39
|
+
export declare function sgrOpen(style: StyleSpec): string;
|
|
40
|
+
/**
|
|
41
|
+
* Generate the closing SGR escape sequence that resets only the attributes
|
|
42
|
+
* set in the given style spec.
|
|
43
|
+
*
|
|
44
|
+
* Uses targeted reset codes (e.g. `22` for bold/dim, `39` for fg) rather
|
|
45
|
+
* than a full `\x1b[0m` reset, so surrounding styles are not disturbed.
|
|
46
|
+
*
|
|
47
|
+
* @param style - The style specification whose attributes should be reset.
|
|
48
|
+
* @returns The closing ANSI escape sequence, or an empty string if no styles were set.
|
|
49
|
+
*/
|
|
50
|
+
export declare function sgrClose(style: StyleSpec): string;
|
|
51
|
+
/**
|
|
52
|
+
* Apply a style to text by wrapping it with the appropriate opening
|
|
53
|
+
* and closing SGR escape sequences.
|
|
54
|
+
*
|
|
55
|
+
* @param text - The text to style.
|
|
56
|
+
* @param style - The style specification to apply.
|
|
57
|
+
* @returns The text wrapped in ANSI escape sequences.
|
|
58
|
+
*/
|
|
59
|
+
export declare function applyStyle(text: string, style: StyleSpec): string;
|
|
60
|
+
//# sourceMappingURL=sgr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sgr.d.ts","sourceRoot":"","sources":["../../src/render/sgr.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG;IACvB,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,kFAAkF;IAClF,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,kCAAkC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iCAAiC;IACjC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,6CAA6C;IAC7C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uBAAuB;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AA4GF;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAsBhD;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAsCjD;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAIjE"}
|