@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.
Files changed (267) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/dist/capabilities/index.d.ts +62 -0
  4. package/dist/capabilities/index.d.ts.map +1 -0
  5. package/dist/capabilities/index.js +182 -0
  6. package/dist/capabilities/index.js.map +1 -0
  7. package/dist/colors.d.ts +32 -0
  8. package/dist/colors.d.ts.map +1 -0
  9. package/dist/colors.js +40 -0
  10. package/dist/colors.js.map +1 -0
  11. package/dist/components/columns.d.ts +28 -0
  12. package/dist/components/columns.d.ts.map +1 -0
  13. package/dist/components/columns.js +70 -0
  14. package/dist/components/columns.js.map +1 -0
  15. package/dist/components/confirmPrompt.d.ts +38 -0
  16. package/dist/components/confirmPrompt.d.ts.map +1 -0
  17. package/dist/components/confirmPrompt.js +109 -0
  18. package/dist/components/confirmPrompt.js.map +1 -0
  19. package/dist/components/diff.d.ts +37 -0
  20. package/dist/components/diff.d.ts.map +1 -0
  21. package/dist/components/diff.js +36 -0
  22. package/dist/components/diff.js.map +1 -0
  23. package/dist/components/helpLayout.d.ts +59 -0
  24. package/dist/components/helpLayout.d.ts.map +1 -0
  25. package/dist/components/helpLayout.js +103 -0
  26. package/dist/components/helpLayout.js.map +1 -0
  27. package/dist/components/index.d.ts +38 -0
  28. package/dist/components/index.d.ts.map +1 -0
  29. package/dist/components/index.js +23 -0
  30. package/dist/components/index.js.map +1 -0
  31. package/dist/components/keyValue.d.ts +31 -0
  32. package/dist/components/keyValue.d.ts.map +1 -0
  33. package/dist/components/keyValue.js +36 -0
  34. package/dist/components/keyValue.js.map +1 -0
  35. package/dist/components/list.d.ts +30 -0
  36. package/dist/components/list.d.ts.map +1 -0
  37. package/dist/components/list.js +80 -0
  38. package/dist/components/list.js.map +1 -0
  39. package/dist/components/message.d.ts +33 -0
  40. package/dist/components/message.d.ts.map +1 -0
  41. package/dist/components/message.js +86 -0
  42. package/dist/components/message.js.map +1 -0
  43. package/dist/components/panel.d.ts +28 -0
  44. package/dist/components/panel.d.ts.map +1 -0
  45. package/dist/components/panel.js +30 -0
  46. package/dist/components/panel.js.map +1 -0
  47. package/dist/components/progressBar.d.ts +44 -0
  48. package/dist/components/progressBar.d.ts.map +1 -0
  49. package/dist/components/progressBar.js +154 -0
  50. package/dist/components/progressBar.js.map +1 -0
  51. package/dist/components/section.d.ts +22 -0
  52. package/dist/components/section.d.ts.map +1 -0
  53. package/dist/components/section.js +48 -0
  54. package/dist/components/section.js.map +1 -0
  55. package/dist/components/selectPrompt.d.ts +58 -0
  56. package/dist/components/selectPrompt.d.ts.map +1 -0
  57. package/dist/components/selectPrompt.js +206 -0
  58. package/dist/components/selectPrompt.js.map +1 -0
  59. package/dist/components/spinner.d.ts +38 -0
  60. package/dist/components/spinner.d.ts.map +1 -0
  61. package/dist/components/spinner.js +125 -0
  62. package/dist/components/spinner.js.map +1 -0
  63. package/dist/components/statusList.d.ts +22 -0
  64. package/dist/components/statusList.d.ts.map +1 -0
  65. package/dist/components/statusList.js +43 -0
  66. package/dist/components/statusList.js.map +1 -0
  67. package/dist/components/table.d.ts +39 -0
  68. package/dist/components/table.d.ts.map +1 -0
  69. package/dist/components/table.js +132 -0
  70. package/dist/components/table.js.map +1 -0
  71. package/dist/components/textPrompt.d.ts +43 -0
  72. package/dist/components/textPrompt.d.ts.map +1 -0
  73. package/dist/components/textPrompt.js +123 -0
  74. package/dist/components/textPrompt.js.map +1 -0
  75. package/dist/components/tree.d.ts +30 -0
  76. package/dist/components/tree.d.ts.map +1 -0
  77. package/dist/components/tree.js +49 -0
  78. package/dist/components/tree.js.map +1 -0
  79. package/dist/ds-index.d.ts +113 -0
  80. package/dist/ds-index.d.ts.map +1 -0
  81. package/dist/ds-index.js +112 -0
  82. package/dist/ds-index.js.map +1 -0
  83. package/dist/help.d.ts +32 -0
  84. package/dist/help.d.ts.map +1 -0
  85. package/dist/help.js +34 -0
  86. package/dist/help.js.map +1 -0
  87. package/dist/hyper-theme.d.ts +8 -0
  88. package/dist/hyper-theme.d.ts.map +1 -0
  89. package/dist/hyper-theme.js +30 -0
  90. package/dist/hyper-theme.js.map +1 -0
  91. package/dist/index.d.ts +50 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +39 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/md.d.ts +12 -0
  96. package/dist/md.d.ts.map +1 -0
  97. package/dist/md.js +19 -0
  98. package/dist/md.js.map +1 -0
  99. package/dist/messages.d.ts +20 -0
  100. package/dist/messages.d.ts.map +1 -0
  101. package/dist/messages.js +65 -0
  102. package/dist/messages.js.map +1 -0
  103. package/dist/palette.d.ts +20 -0
  104. package/dist/palette.d.ts.map +1 -0
  105. package/dist/palette.js +22 -0
  106. package/dist/palette.js.map +1 -0
  107. package/dist/primitives/align.d.ts +23 -0
  108. package/dist/primitives/align.d.ts.map +1 -0
  109. package/dist/primitives/align.js +40 -0
  110. package/dist/primitives/align.js.map +1 -0
  111. package/dist/primitives/badge.d.ts +24 -0
  112. package/dist/primitives/badge.d.ts.map +1 -0
  113. package/dist/primitives/badge.js +40 -0
  114. package/dist/primitives/badge.js.map +1 -0
  115. package/dist/primitives/border.d.ts +29 -0
  116. package/dist/primitives/border.d.ts.map +1 -0
  117. package/dist/primitives/border.js +100 -0
  118. package/dist/primitives/border.js.map +1 -0
  119. package/dist/primitives/context.d.ts +48 -0
  120. package/dist/primitives/context.d.ts.map +1 -0
  121. package/dist/primitives/context.js +64 -0
  122. package/dist/primitives/context.js.map +1 -0
  123. package/dist/primitives/divider.d.ts +25 -0
  124. package/dist/primitives/divider.d.ts.map +1 -0
  125. package/dist/primitives/divider.js +56 -0
  126. package/dist/primitives/divider.js.map +1 -0
  127. package/dist/primitives/indent.d.ts +16 -0
  128. package/dist/primitives/indent.d.ts.map +1 -0
  129. package/dist/primitives/indent.js +25 -0
  130. package/dist/primitives/indent.js.map +1 -0
  131. package/dist/primitives/index.d.ts +32 -0
  132. package/dist/primitives/index.d.ts.map +1 -0
  133. package/dist/primitives/index.js +22 -0
  134. package/dist/primitives/index.js.map +1 -0
  135. package/dist/primitives/line.d.ts +21 -0
  136. package/dist/primitives/line.d.ts.map +1 -0
  137. package/dist/primitives/line.js +29 -0
  138. package/dist/primitives/line.js.map +1 -0
  139. package/dist/primitives/markdown.d.ts +91 -0
  140. package/dist/primitives/markdown.d.ts.map +1 -0
  141. package/dist/primitives/markdown.js +62 -0
  142. package/dist/primitives/markdown.js.map +1 -0
  143. package/dist/primitives/pad.d.ts +24 -0
  144. package/dist/primitives/pad.d.ts.map +1 -0
  145. package/dist/primitives/pad.js +20 -0
  146. package/dist/primitives/pad.js.map +1 -0
  147. package/dist/primitives/stack.d.ts +22 -0
  148. package/dist/primitives/stack.d.ts.map +1 -0
  149. package/dist/primitives/stack.js +21 -0
  150. package/dist/primitives/stack.js.map +1 -0
  151. package/dist/primitives/styledText.d.ts +36 -0
  152. package/dist/primitives/styledText.d.ts.map +1 -0
  153. package/dist/primitives/styledText.js +42 -0
  154. package/dist/primitives/styledText.js.map +1 -0
  155. package/dist/primitives/symbol.d.ts +15 -0
  156. package/dist/primitives/symbol.d.ts.map +1 -0
  157. package/dist/primitives/symbol.js +18 -0
  158. package/dist/primitives/symbol.js.map +1 -0
  159. package/dist/primitives/truncate.d.ts +23 -0
  160. package/dist/primitives/truncate.d.ts.map +1 -0
  161. package/dist/primitives/truncate.js +99 -0
  162. package/dist/primitives/truncate.js.map +1 -0
  163. package/dist/primitives/wrap.d.ts +23 -0
  164. package/dist/primitives/wrap.d.ts.map +1 -0
  165. package/dist/primitives/wrap.js +30 -0
  166. package/dist/primitives/wrap.js.map +1 -0
  167. package/dist/render/ansi-utils.d.ts +49 -0
  168. package/dist/render/ansi-utils.d.ts.map +1 -0
  169. package/dist/render/ansi-utils.js +405 -0
  170. package/dist/render/ansi-utils.js.map +1 -0
  171. package/dist/render/index.d.ts +11 -0
  172. package/dist/render/index.d.ts.map +1 -0
  173. package/dist/render/index.js +11 -0
  174. package/dist/render/index.js.map +1 -0
  175. package/dist/render/sgr.d.ts +60 -0
  176. package/dist/render/sgr.d.ts.map +1 -0
  177. package/dist/render/sgr.js +191 -0
  178. package/dist/render/sgr.js.map +1 -0
  179. package/dist/render/strip.d.ts +24 -0
  180. package/dist/render/strip.d.ts.map +1 -0
  181. package/dist/render/strip.js +81 -0
  182. package/dist/render/strip.js.map +1 -0
  183. package/dist/render/width.d.ts +30 -0
  184. package/dist/render/width.d.ts.map +1 -0
  185. package/dist/render/width.js +149 -0
  186. package/dist/render/width.js.map +1 -0
  187. package/dist/shortcuts.d.ts +76 -0
  188. package/dist/shortcuts.d.ts.map +1 -0
  189. package/dist/shortcuts.js +117 -0
  190. package/dist/shortcuts.js.map +1 -0
  191. package/dist/styles.d.ts +43 -0
  192. package/dist/styles.d.ts.map +1 -0
  193. package/dist/styles.js +44 -0
  194. package/dist/styles.js.map +1 -0
  195. package/dist/symbols.d.ts +19 -0
  196. package/dist/symbols.d.ts.map +1 -0
  197. package/dist/symbols.js +21 -0
  198. package/dist/symbols.js.map +1 -0
  199. package/dist/test/compare.d.ts +28 -0
  200. package/dist/test/compare.d.ts.map +1 -0
  201. package/dist/test/compare.js +37 -0
  202. package/dist/test/compare.js.map +1 -0
  203. package/dist/test/index.d.ts +16 -0
  204. package/dist/test/index.d.ts.map +1 -0
  205. package/dist/test/index.js +14 -0
  206. package/dist/test/index.js.map +1 -0
  207. package/dist/test/mock.d.ts +50 -0
  208. package/dist/test/mock.d.ts.map +1 -0
  209. package/dist/test/mock.js +135 -0
  210. package/dist/test/mock.js.map +1 -0
  211. package/dist/test/render.d.ts +29 -0
  212. package/dist/test/render.d.ts.map +1 -0
  213. package/dist/test/render.js +87 -0
  214. package/dist/test/render.js.map +1 -0
  215. package/dist/test/snapshot.d.ts +16 -0
  216. package/dist/test/snapshot.d.ts.map +1 -0
  217. package/dist/test/snapshot.js +216 -0
  218. package/dist/test/snapshot.js.map +1 -0
  219. package/dist/theme/builtins.d.ts +10 -0
  220. package/dist/theme/builtins.d.ts.map +1 -0
  221. package/dist/theme/builtins.js +102 -0
  222. package/dist/theme/builtins.js.map +1 -0
  223. package/dist/theme/engine.d.ts +51 -0
  224. package/dist/theme/engine.d.ts.map +1 -0
  225. package/dist/theme/engine.js +123 -0
  226. package/dist/theme/engine.js.map +1 -0
  227. package/dist/theme/index.d.ts +10 -0
  228. package/dist/theme/index.d.ts.map +1 -0
  229. package/dist/theme/index.js +12 -0
  230. package/dist/theme/index.js.map +1 -0
  231. package/dist/theme/merge.d.ts +24 -0
  232. package/dist/theme/merge.d.ts.map +1 -0
  233. package/dist/theme/merge.js +66 -0
  234. package/dist/theme/merge.js.map +1 -0
  235. package/dist/theme/types.d.ts +44 -0
  236. package/dist/theme/types.d.ts.map +1 -0
  237. package/dist/theme/types.js +8 -0
  238. package/dist/theme/types.js.map +1 -0
  239. package/dist/theme.d.ts +9 -0
  240. package/dist/theme.d.ts.map +1 -0
  241. package/dist/theme.js +53 -0
  242. package/dist/theme.js.map +1 -0
  243. package/dist/tokens/defaults.d.ts +13 -0
  244. package/dist/tokens/defaults.d.ts.map +1 -0
  245. package/dist/tokens/defaults.js +248 -0
  246. package/dist/tokens/defaults.js.map +1 -0
  247. package/dist/tokens/index.d.ts +10 -0
  248. package/dist/tokens/index.d.ts.map +1 -0
  249. package/dist/tokens/index.js +10 -0
  250. package/dist/tokens/index.js.map +1 -0
  251. package/dist/tokens/resolver.d.ts +100 -0
  252. package/dist/tokens/resolver.d.ts.map +1 -0
  253. package/dist/tokens/resolver.js +138 -0
  254. package/dist/tokens/resolver.js.map +1 -0
  255. package/dist/tokens/types.d.ts +265 -0
  256. package/dist/tokens/types.d.ts.map +1 -0
  257. package/dist/tokens/types.js +10 -0
  258. package/dist/tokens/types.js.map +1 -0
  259. package/dist/tokens.d.ts +26 -0
  260. package/dist/tokens.d.ts.map +1 -0
  261. package/dist/tokens.js +30 -0
  262. package/dist/tokens.js.map +1 -0
  263. package/dist/types.d.ts +38 -0
  264. package/dist/types.d.ts.map +1 -0
  265. package/dist/types.js +11 -0
  266. package/dist/types.js.map +1 -0
  267. 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"}