@promptctl/rich-js 0.1.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.
Files changed (318) hide show
  1. package/README.md +418 -0
  2. package/dist/core/box.d.ts +91 -0
  3. package/dist/core/box.d.ts.map +1 -0
  4. package/dist/core/box.js +534 -0
  5. package/dist/core/box.js.map +1 -0
  6. package/dist/core/cells.d.ts +24 -0
  7. package/dist/core/cells.d.ts.map +1 -0
  8. package/dist/core/cells.js +114 -0
  9. package/dist/core/cells.js.map +1 -0
  10. package/dist/core/color.d.ts +158 -0
  11. package/dist/core/color.d.ts.map +1 -0
  12. package/dist/core/color.js +825 -0
  13. package/dist/core/color.js.map +1 -0
  14. package/dist/core/console.d.ts +100 -0
  15. package/dist/core/console.d.ts.map +1 -0
  16. package/dist/core/console.js +353 -0
  17. package/dist/core/console.js.map +1 -0
  18. package/dist/core/emoji.d.ts +25 -0
  19. package/dist/core/emoji.d.ts.map +1 -0
  20. package/dist/core/emoji.js +392 -0
  21. package/dist/core/emoji.js.map +1 -0
  22. package/dist/core/highlighter.d.ts +33 -0
  23. package/dist/core/highlighter.d.ts.map +1 -0
  24. package/dist/core/highlighter.js +103 -0
  25. package/dist/core/highlighter.js.map +1 -0
  26. package/dist/core/markup.d.ts +69 -0
  27. package/dist/core/markup.d.ts.map +1 -0
  28. package/dist/core/markup.js +401 -0
  29. package/dist/core/markup.js.map +1 -0
  30. package/dist/core/measure.d.ts +17 -0
  31. package/dist/core/measure.d.ts.map +1 -0
  32. package/dist/core/measure.js +50 -0
  33. package/dist/core/measure.js.map +1 -0
  34. package/dist/core/protocol.d.ts +32 -0
  35. package/dist/core/protocol.d.ts.map +1 -0
  36. package/dist/core/protocol.js +17 -0
  37. package/dist/core/protocol.js.map +1 -0
  38. package/dist/core/render.d.ts +51 -0
  39. package/dist/core/render.d.ts.map +1 -0
  40. package/dist/core/render.js +69 -0
  41. package/dist/core/render.js.map +1 -0
  42. package/dist/core/segment.d.ts +104 -0
  43. package/dist/core/segment.d.ts.map +1 -0
  44. package/dist/core/segment.js +364 -0
  45. package/dist/core/segment.js.map +1 -0
  46. package/dist/core/spinnerData.d.ts +11 -0
  47. package/dist/core/spinnerData.d.ts.map +1 -0
  48. package/dist/core/spinnerData.js +116 -0
  49. package/dist/core/spinnerData.js.map +1 -0
  50. package/dist/core/strip.d.ts +159 -0
  51. package/dist/core/strip.d.ts.map +1 -0
  52. package/dist/core/strip.js +237 -0
  53. package/dist/core/strip.js.map +1 -0
  54. package/dist/core/style.d.ts +115 -0
  55. package/dist/core/style.d.ts.map +1 -0
  56. package/dist/core/style.js +662 -0
  57. package/dist/core/style.js.map +1 -0
  58. package/dist/core/text.d.ts +91 -0
  59. package/dist/core/text.d.ts.map +1 -0
  60. package/dist/core/text.js +610 -0
  61. package/dist/core/text.js.map +1 -0
  62. package/dist/index.d.ts +99 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +72 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/renderables/align.d.ts +17 -0
  67. package/dist/renderables/align.d.ts.map +1 -0
  68. package/dist/renderables/align.js +47 -0
  69. package/dist/renderables/align.js.map +1 -0
  70. package/dist/renderables/columns.d.ts +28 -0
  71. package/dist/renderables/columns.d.ts.map +1 -0
  72. package/dist/renderables/columns.js +92 -0
  73. package/dist/renderables/columns.js.map +1 -0
  74. package/dist/renderables/constrain.d.ts +16 -0
  75. package/dist/renderables/constrain.d.ts.map +1 -0
  76. package/dist/renderables/constrain.js +38 -0
  77. package/dist/renderables/constrain.js.map +1 -0
  78. package/dist/renderables/flexStrip.d.ts +42 -0
  79. package/dist/renderables/flexStrip.d.ts.map +1 -0
  80. package/dist/renderables/flexStrip.js +201 -0
  81. package/dist/renderables/flexStrip.js.map +1 -0
  82. package/dist/renderables/group.d.ts +12 -0
  83. package/dist/renderables/group.d.ts.map +1 -0
  84. package/dist/renderables/group.js +16 -0
  85. package/dist/renderables/group.js.map +1 -0
  86. package/dist/renderables/json.d.ts +23 -0
  87. package/dist/renderables/json.d.ts.map +1 -0
  88. package/dist/renderables/json.js +49 -0
  89. package/dist/renderables/json.js.map +1 -0
  90. package/dist/renderables/layout.d.ts +37 -0
  91. package/dist/renderables/layout.d.ts.map +1 -0
  92. package/dist/renderables/layout.js +151 -0
  93. package/dist/renderables/layout.js.map +1 -0
  94. package/dist/renderables/live.d.ts +48 -0
  95. package/dist/renderables/live.d.ts.map +1 -0
  96. package/dist/renderables/live.js +131 -0
  97. package/dist/renderables/live.js.map +1 -0
  98. package/dist/renderables/markdown.d.ts +25 -0
  99. package/dist/renderables/markdown.d.ts.map +1 -0
  100. package/dist/renderables/markdown.js +190 -0
  101. package/dist/renderables/markdown.js.map +1 -0
  102. package/dist/renderables/padding.d.ts +26 -0
  103. package/dist/renderables/padding.d.ts.map +1 -0
  104. package/dist/renderables/padding.js +92 -0
  105. package/dist/renderables/padding.js.map +1 -0
  106. package/dist/renderables/panel.d.ts +42 -0
  107. package/dist/renderables/panel.d.ts.map +1 -0
  108. package/dist/renderables/panel.js +202 -0
  109. package/dist/renderables/panel.js.map +1 -0
  110. package/dist/renderables/pretty.d.ts +29 -0
  111. package/dist/renderables/pretty.d.ts.map +1 -0
  112. package/dist/renderables/pretty.js +141 -0
  113. package/dist/renderables/pretty.js.map +1 -0
  114. package/dist/renderables/progress.d.ts +91 -0
  115. package/dist/renderables/progress.d.ts.map +1 -0
  116. package/dist/renderables/progress.js +234 -0
  117. package/dist/renderables/progress.js.map +1 -0
  118. package/dist/renderables/progressBar.d.ts +32 -0
  119. package/dist/renderables/progressBar.d.ts.map +1 -0
  120. package/dist/renderables/progressBar.js +59 -0
  121. package/dist/renderables/progressBar.js.map +1 -0
  122. package/dist/renderables/prompt.d.ts +25 -0
  123. package/dist/renderables/prompt.d.ts.map +1 -0
  124. package/dist/renderables/prompt.js +109 -0
  125. package/dist/renderables/prompt.js.map +1 -0
  126. package/dist/renderables/rule.d.ts +25 -0
  127. package/dist/renderables/rule.d.ts.map +1 -0
  128. package/dist/renderables/rule.js +96 -0
  129. package/dist/renderables/rule.js.map +1 -0
  130. package/dist/renderables/spinner.d.ts +30 -0
  131. package/dist/renderables/spinner.d.ts.map +1 -0
  132. package/dist/renderables/spinner.js +70 -0
  133. package/dist/renderables/spinner.js.map +1 -0
  134. package/dist/renderables/status.d.ts +24 -0
  135. package/dist/renderables/status.d.ts.map +1 -0
  136. package/dist/renderables/status.js +67 -0
  137. package/dist/renderables/status.js.map +1 -0
  138. package/dist/renderables/syntax.d.ts +36 -0
  139. package/dist/renderables/syntax.d.ts.map +1 -0
  140. package/dist/renderables/syntax.js +115 -0
  141. package/dist/renderables/syntax.js.map +1 -0
  142. package/dist/renderables/table.d.ts +109 -0
  143. package/dist/renderables/table.d.ts.map +1 -0
  144. package/dist/renderables/table.js +434 -0
  145. package/dist/renderables/table.js.map +1 -0
  146. package/dist/renderables/traceback.d.ts +26 -0
  147. package/dist/renderables/traceback.d.ts.map +1 -0
  148. package/dist/renderables/traceback.js +108 -0
  149. package/dist/renderables/traceback.js.map +1 -0
  150. package/dist/renderables/tree.d.ts +30 -0
  151. package/dist/renderables/tree.d.ts.map +1 -0
  152. package/dist/renderables/tree.js +107 -0
  153. package/dist/renderables/tree.js.map +1 -0
  154. package/dist/template-bindings/index.d.ts +61 -0
  155. package/dist/template-bindings/index.d.ts.map +1 -0
  156. package/dist/template-bindings/index.js +70 -0
  157. package/dist/template-bindings/index.js.map +1 -0
  158. package/dist/template-bindings/style-funcs.d.ts +30 -0
  159. package/dist/template-bindings/style-funcs.d.ts.map +1 -0
  160. package/dist/template-bindings/style-funcs.js +172 -0
  161. package/dist/template-bindings/style-funcs.js.map +1 -0
  162. package/dist/themes/buildPalette.d.ts +31 -0
  163. package/dist/themes/buildPalette.d.ts.map +1 -0
  164. package/dist/themes/buildPalette.js +43 -0
  165. package/dist/themes/buildPalette.js.map +1 -0
  166. package/dist/themes/colorMath.d.ts +23 -0
  167. package/dist/themes/colorMath.d.ts.map +1 -0
  168. package/dist/themes/colorMath.js +99 -0
  169. package/dist/themes/colorMath.js.map +1 -0
  170. package/dist/themes/data/atom-one-dark.d.ts +4 -0
  171. package/dist/themes/data/atom-one-dark.d.ts.map +1 -0
  172. package/dist/themes/data/atom-one-dark.js +159 -0
  173. package/dist/themes/data/atom-one-dark.js.map +1 -0
  174. package/dist/themes/data/atom-one-light.d.ts +4 -0
  175. package/dist/themes/data/atom-one-light.d.ts.map +1 -0
  176. package/dist/themes/data/atom-one-light.js +159 -0
  177. package/dist/themes/data/atom-one-light.js.map +1 -0
  178. package/dist/themes/data/catppuccin-latte.d.ts +4 -0
  179. package/dist/themes/data/catppuccin-latte.d.ts.map +1 -0
  180. package/dist/themes/data/catppuccin-latte.js +159 -0
  181. package/dist/themes/data/catppuccin-latte.js.map +1 -0
  182. package/dist/themes/data/catppuccin-mocha.d.ts +4 -0
  183. package/dist/themes/data/catppuccin-mocha.d.ts.map +1 -0
  184. package/dist/themes/data/catppuccin-mocha.js +159 -0
  185. package/dist/themes/data/catppuccin-mocha.js.map +1 -0
  186. package/dist/themes/data/dracula.d.ts +4 -0
  187. package/dist/themes/data/dracula.d.ts.map +1 -0
  188. package/dist/themes/data/dracula.js +159 -0
  189. package/dist/themes/data/dracula.js.map +1 -0
  190. package/dist/themes/data/flexoki.d.ts +4 -0
  191. package/dist/themes/data/flexoki.d.ts.map +1 -0
  192. package/dist/themes/data/flexoki.js +159 -0
  193. package/dist/themes/data/flexoki.js.map +1 -0
  194. package/dist/themes/data/gruvbox.d.ts +4 -0
  195. package/dist/themes/data/gruvbox.d.ts.map +1 -0
  196. package/dist/themes/data/gruvbox.js +159 -0
  197. package/dist/themes/data/gruvbox.js.map +1 -0
  198. package/dist/themes/data/index.d.ts +29 -0
  199. package/dist/themes/data/index.d.ts.map +1 -0
  200. package/dist/themes/data/index.js +48 -0
  201. package/dist/themes/data/index.js.map +1 -0
  202. package/dist/themes/data/monokai.d.ts +4 -0
  203. package/dist/themes/data/monokai.d.ts.map +1 -0
  204. package/dist/themes/data/monokai.js +159 -0
  205. package/dist/themes/data/monokai.js.map +1 -0
  206. package/dist/themes/data/nord.d.ts +4 -0
  207. package/dist/themes/data/nord.d.ts.map +1 -0
  208. package/dist/themes/data/nord.js +159 -0
  209. package/dist/themes/data/nord.js.map +1 -0
  210. package/dist/themes/data/rose-pine-dawn.d.ts +4 -0
  211. package/dist/themes/data/rose-pine-dawn.d.ts.map +1 -0
  212. package/dist/themes/data/rose-pine-dawn.js +159 -0
  213. package/dist/themes/data/rose-pine-dawn.js.map +1 -0
  214. package/dist/themes/data/rose-pine-moon.d.ts +4 -0
  215. package/dist/themes/data/rose-pine-moon.d.ts.map +1 -0
  216. package/dist/themes/data/rose-pine-moon.js +159 -0
  217. package/dist/themes/data/rose-pine-moon.js.map +1 -0
  218. package/dist/themes/data/rose-pine.d.ts +4 -0
  219. package/dist/themes/data/rose-pine.d.ts.map +1 -0
  220. package/dist/themes/data/rose-pine.js +159 -0
  221. package/dist/themes/data/rose-pine.js.map +1 -0
  222. package/dist/themes/data/solarized-dark.d.ts +4 -0
  223. package/dist/themes/data/solarized-dark.d.ts.map +1 -0
  224. package/dist/themes/data/solarized-dark.js +159 -0
  225. package/dist/themes/data/solarized-dark.js.map +1 -0
  226. package/dist/themes/data/solarized-light.d.ts +4 -0
  227. package/dist/themes/data/solarized-light.d.ts.map +1 -0
  228. package/dist/themes/data/solarized-light.js +159 -0
  229. package/dist/themes/data/solarized-light.js.map +1 -0
  230. package/dist/themes/data/textual-ansi.d.ts +4 -0
  231. package/dist/themes/data/textual-ansi.d.ts.map +1 -0
  232. package/dist/themes/data/textual-ansi.js +159 -0
  233. package/dist/themes/data/textual-ansi.js.map +1 -0
  234. package/dist/themes/data/textual-dark.d.ts +4 -0
  235. package/dist/themes/data/textual-dark.d.ts.map +1 -0
  236. package/dist/themes/data/textual-dark.js +159 -0
  237. package/dist/themes/data/textual-dark.js.map +1 -0
  238. package/dist/themes/data/textual-light.d.ts +4 -0
  239. package/dist/themes/data/textual-light.d.ts.map +1 -0
  240. package/dist/themes/data/textual-light.js +159 -0
  241. package/dist/themes/data/textual-light.js.map +1 -0
  242. package/dist/themes/data/tokyo-night.d.ts +4 -0
  243. package/dist/themes/data/tokyo-night.d.ts.map +1 -0
  244. package/dist/themes/data/tokyo-night.js +159 -0
  245. package/dist/themes/data/tokyo-night.js.map +1 -0
  246. package/dist/themes/data/types.d.ts +15 -0
  247. package/dist/themes/data/types.d.ts.map +1 -0
  248. package/dist/themes/data/types.js +2 -0
  249. package/dist/themes/data/types.js.map +1 -0
  250. package/dist/themes/palette.d.ts +20 -0
  251. package/dist/themes/palette.d.ts.map +1 -0
  252. package/dist/themes/palette.js +27 -0
  253. package/dist/themes/palette.js.map +1 -0
  254. package/dist/themes/paletteResolver.d.ts +35 -0
  255. package/dist/themes/paletteResolver.d.ts.map +1 -0
  256. package/dist/themes/paletteResolver.js +88 -0
  257. package/dist/themes/paletteResolver.js.map +1 -0
  258. package/dist/themes/registry.d.ts +17 -0
  259. package/dist/themes/registry.d.ts.map +1 -0
  260. package/dist/themes/registry.js +33 -0
  261. package/dist/themes/registry.js.map +1 -0
  262. package/dist/themes/terminalThemes.d.ts +46 -0
  263. package/dist/themes/terminalThemes.d.ts.map +1 -0
  264. package/dist/themes/terminalThemes.js +268 -0
  265. package/dist/themes/terminalThemes.js.map +1 -0
  266. package/dist/widgets/button.d.ts +47 -0
  267. package/dist/widgets/button.d.ts.map +1 -0
  268. package/dist/widgets/button.js +183 -0
  269. package/dist/widgets/button.js.map +1 -0
  270. package/dist/widgets/checkbox.d.ts +43 -0
  271. package/dist/widgets/checkbox.d.ts.map +1 -0
  272. package/dist/widgets/checkbox.js +144 -0
  273. package/dist/widgets/checkbox.js.map +1 -0
  274. package/dist/widgets/dropdown.d.ts +67 -0
  275. package/dist/widgets/dropdown.d.ts.map +1 -0
  276. package/dist/widgets/dropdown.js +373 -0
  277. package/dist/widgets/dropdown.js.map +1 -0
  278. package/dist/widgets/event-router.d.ts +73 -0
  279. package/dist/widgets/event-router.d.ts.map +1 -0
  280. package/dist/widgets/event-router.js +479 -0
  281. package/dist/widgets/event-router.js.map +1 -0
  282. package/dist/widgets/focus-manager.d.ts +26 -0
  283. package/dist/widgets/focus-manager.d.ts.map +1 -0
  284. package/dist/widgets/focus-manager.js +179 -0
  285. package/dist/widgets/focus-manager.js.map +1 -0
  286. package/dist/widgets/index.d.ts +23 -0
  287. package/dist/widgets/index.d.ts.map +1 -0
  288. package/dist/widgets/index.js +13 -0
  289. package/dist/widgets/index.js.map +1 -0
  290. package/dist/widgets/screen.d.ts +90 -0
  291. package/dist/widgets/screen.d.ts.map +1 -0
  292. package/dist/widgets/screen.js +440 -0
  293. package/dist/widgets/screen.js.map +1 -0
  294. package/dist/widgets/slider.d.ts +55 -0
  295. package/dist/widgets/slider.d.ts.map +1 -0
  296. package/dist/widgets/slider.js +248 -0
  297. package/dist/widgets/slider.js.map +1 -0
  298. package/dist/widgets/static-item.d.ts +41 -0
  299. package/dist/widgets/static-item.d.ts.map +1 -0
  300. package/dist/widgets/static-item.js +62 -0
  301. package/dist/widgets/static-item.js.map +1 -0
  302. package/dist/widgets/text-input.d.ts +50 -0
  303. package/dist/widgets/text-input.d.ts.map +1 -0
  304. package/dist/widgets/text-input.js +242 -0
  305. package/dist/widgets/text-input.js.map +1 -0
  306. package/dist/widgets/toggle.d.ts +46 -0
  307. package/dist/widgets/toggle.d.ts.map +1 -0
  308. package/dist/widgets/toggle.js +169 -0
  309. package/dist/widgets/toggle.js.map +1 -0
  310. package/dist/widgets/types.d.ts +92 -0
  311. package/dist/widgets/types.d.ts.map +1 -0
  312. package/dist/widgets/types.js +13 -0
  313. package/dist/widgets/types.js.map +1 -0
  314. package/dist/widgets/widget-base.d.ts +41 -0
  315. package/dist/widgets/widget-base.d.ts.map +1 -0
  316. package/dist/widgets/widget-base.js +159 -0
  317. package/dist/widgets/widget-base.js.map +1 -0
  318. package/package.json +76 -0
@@ -0,0 +1,534 @@
1
+ /**
2
+ * Box-drawing character sets for borders and table grids.
3
+ */
4
+ import { Segment } from "./segment.js";
5
+ // [LAW:one-type-per-behavior] Box is a single type for all border styles — instances differ by data
6
+ export class Box {
7
+ topLeft;
8
+ top;
9
+ topDivider;
10
+ topRight;
11
+ headLeft;
12
+ headVertical;
13
+ headRight;
14
+ midLeft;
15
+ mid;
16
+ midVertical;
17
+ midRight;
18
+ bottomLeft;
19
+ bottom;
20
+ bottomDivider;
21
+ bottomRight;
22
+ left;
23
+ right;
24
+ vertical;
25
+ constructor(chars) {
26
+ this.topLeft = chars.topLeft;
27
+ this.top = chars.top;
28
+ this.topDivider = chars.topDivider;
29
+ this.topRight = chars.topRight;
30
+ this.headLeft = chars.headLeft;
31
+ this.headVertical = chars.headVertical;
32
+ this.headRight = chars.headRight;
33
+ this.midLeft = chars.midLeft;
34
+ this.mid = chars.mid;
35
+ this.midVertical = chars.midVertical;
36
+ this.midRight = chars.midRight;
37
+ this.bottomLeft = chars.bottomLeft;
38
+ this.bottom = chars.bottom;
39
+ this.bottomDivider = chars.bottomDivider;
40
+ this.bottomRight = chars.bottomRight;
41
+ this.left = chars.left;
42
+ this.right = chars.right;
43
+ this.vertical = chars.vertical;
44
+ }
45
+ /**
46
+ * Renders the top border row for given column widths.
47
+ */
48
+ getTop(widths, style, edge = true) {
49
+ const segments = [];
50
+ if (edge)
51
+ segments.push(new Segment(this.topLeft, style));
52
+ for (let i = 0; i < widths.length; i++) {
53
+ if (i > 0)
54
+ segments.push(new Segment(this.topDivider, style));
55
+ segments.push(new Segment(this.top.repeat(widths[i]), style));
56
+ }
57
+ if (edge)
58
+ segments.push(new Segment(this.topRight, style));
59
+ segments.push(Segment.line());
60
+ return segments;
61
+ }
62
+ /**
63
+ * Renders a separator row.
64
+ */
65
+ getRow(widths, level, style, edge = true) {
66
+ const [left, horizontal, cross, right] = this.getRowChars(level);
67
+ const segments = [];
68
+ if (edge)
69
+ segments.push(new Segment(left, style));
70
+ for (let i = 0; i < widths.length; i++) {
71
+ if (i > 0)
72
+ segments.push(new Segment(cross, style));
73
+ segments.push(new Segment(horizontal.repeat(widths[i]), style));
74
+ }
75
+ if (edge)
76
+ segments.push(new Segment(right, style));
77
+ segments.push(Segment.line());
78
+ return segments;
79
+ }
80
+ /**
81
+ * Renders the bottom border row.
82
+ */
83
+ getBottom(widths, style, edge = true) {
84
+ const segments = [];
85
+ if (edge)
86
+ segments.push(new Segment(this.bottomLeft, style));
87
+ for (let i = 0; i < widths.length; i++) {
88
+ if (i > 0)
89
+ segments.push(new Segment(this.bottomDivider, style));
90
+ segments.push(new Segment(this.bottom.repeat(widths[i]), style));
91
+ }
92
+ if (edge)
93
+ segments.push(new Segment(this.bottomRight, style));
94
+ segments.push(Segment.line());
95
+ return segments;
96
+ }
97
+ /**
98
+ * Returns a new Box with characters substituted for ASCII or safe alternatives.
99
+ * asciiOnly: all characters become ASCII (+, -, |)
100
+ * safe: problematic characters (e.g. rounded corners) replaced with square equivalents
101
+ */
102
+ substitute(options = {}) {
103
+ if (options.asciiOnly)
104
+ return ASCII;
105
+ if (options.safe)
106
+ return this.safeSubstitute();
107
+ return this;
108
+ }
109
+ safeSubstitute() {
110
+ // Replace rounded corners and other characters that may not render
111
+ // on Windows legacy terminal with safe square equivalents
112
+ const replacements = {
113
+ "╭": "┌",
114
+ "╮": "┐",
115
+ "╰": "└",
116
+ "╯": "┘",
117
+ };
118
+ const replace = (ch) => replacements[ch] ?? ch;
119
+ return new Box({
120
+ topLeft: replace(this.topLeft),
121
+ top: replace(this.top),
122
+ topDivider: replace(this.topDivider),
123
+ topRight: replace(this.topRight),
124
+ headLeft: replace(this.headLeft),
125
+ headVertical: replace(this.headVertical),
126
+ headRight: replace(this.headRight),
127
+ midLeft: replace(this.midLeft),
128
+ mid: replace(this.mid),
129
+ midVertical: replace(this.midVertical),
130
+ midRight: replace(this.midRight),
131
+ bottomLeft: replace(this.bottomLeft),
132
+ bottom: replace(this.bottom),
133
+ bottomDivider: replace(this.bottomDivider),
134
+ bottomRight: replace(this.bottomRight),
135
+ left: replace(this.left),
136
+ right: replace(this.right),
137
+ vertical: replace(this.vertical),
138
+ });
139
+ }
140
+ getRowChars(level) {
141
+ switch (level) {
142
+ case "head":
143
+ return [this.headLeft, this.mid, this.headVertical, this.headRight];
144
+ case "row":
145
+ return [this.midLeft, this.mid, this.midVertical, this.midRight];
146
+ case "mid":
147
+ return [this.midLeft, this.mid, this.midVertical, this.midRight];
148
+ case "foot":
149
+ return [this.midLeft, this.mid, this.midVertical, this.midRight];
150
+ }
151
+ }
152
+ }
153
+ // --- Pre-built box styles ---
154
+ export const ASCII = new Box({
155
+ topLeft: "+",
156
+ top: "-",
157
+ topDivider: "+",
158
+ topRight: "+",
159
+ headLeft: "|",
160
+ headVertical: "|",
161
+ headRight: "|",
162
+ midLeft: "|",
163
+ mid: "-",
164
+ midVertical: "+",
165
+ midRight: "|",
166
+ bottomLeft: "+",
167
+ bottom: "-",
168
+ bottomDivider: "+",
169
+ bottomRight: "+",
170
+ left: "|",
171
+ right: "|",
172
+ vertical: "|",
173
+ });
174
+ export const ASCII2 = new Box({
175
+ topLeft: "+",
176
+ top: "-",
177
+ topDivider: "+",
178
+ topRight: "+",
179
+ headLeft: "|",
180
+ headVertical: "|",
181
+ headRight: "|",
182
+ midLeft: "+",
183
+ mid: "-",
184
+ midVertical: "+",
185
+ midRight: "+",
186
+ bottomLeft: "+",
187
+ bottom: "-",
188
+ bottomDivider: "+",
189
+ bottomRight: "+",
190
+ left: "|",
191
+ right: "|",
192
+ vertical: "|",
193
+ });
194
+ export const ASCII_DOUBLE_HEAD = new Box({
195
+ topLeft: "+",
196
+ top: "-",
197
+ topDivider: "+",
198
+ topRight: "+",
199
+ headLeft: "|",
200
+ headVertical: "|",
201
+ headRight: "|",
202
+ midLeft: "+",
203
+ mid: "=",
204
+ midVertical: "+",
205
+ midRight: "+",
206
+ bottomLeft: "+",
207
+ bottom: "-",
208
+ bottomDivider: "+",
209
+ bottomRight: "+",
210
+ left: "|",
211
+ right: "|",
212
+ vertical: "|",
213
+ });
214
+ export const SQUARE = new Box({
215
+ topLeft: "┌",
216
+ top: "─",
217
+ topDivider: "┬",
218
+ topRight: "┐",
219
+ headLeft: "│",
220
+ headVertical: "│",
221
+ headRight: "│",
222
+ midLeft: "├",
223
+ mid: "─",
224
+ midVertical: "┼",
225
+ midRight: "┤",
226
+ bottomLeft: "└",
227
+ bottom: "─",
228
+ bottomDivider: "┴",
229
+ bottomRight: "┘",
230
+ left: "│",
231
+ right: "│",
232
+ vertical: "│",
233
+ });
234
+ export const SQUARE_DOUBLE_HEAD = new Box({
235
+ topLeft: "┌",
236
+ top: "─",
237
+ topDivider: "┬",
238
+ topRight: "┐",
239
+ headLeft: "│",
240
+ headVertical: "│",
241
+ headRight: "│",
242
+ midLeft: "╞",
243
+ mid: "═",
244
+ midVertical: "╪",
245
+ midRight: "╡",
246
+ bottomLeft: "└",
247
+ bottom: "─",
248
+ bottomDivider: "┴",
249
+ bottomRight: "┘",
250
+ left: "│",
251
+ right: "│",
252
+ vertical: "│",
253
+ });
254
+ export const MINIMAL = new Box({
255
+ topLeft: " ",
256
+ top: " ",
257
+ topDivider: " ",
258
+ topRight: " ",
259
+ headLeft: " ",
260
+ headVertical: " ",
261
+ headRight: " ",
262
+ midLeft: " ",
263
+ mid: "─",
264
+ midVertical: "─",
265
+ midRight: " ",
266
+ bottomLeft: " ",
267
+ bottom: " ",
268
+ bottomDivider: " ",
269
+ bottomRight: " ",
270
+ left: " ",
271
+ right: " ",
272
+ vertical: " ",
273
+ });
274
+ export const MINIMAL_HEAVY_HEAD = new Box({
275
+ topLeft: " ",
276
+ top: " ",
277
+ topDivider: " ",
278
+ topRight: " ",
279
+ headLeft: " ",
280
+ headVertical: " ",
281
+ headRight: " ",
282
+ midLeft: " ",
283
+ mid: "━",
284
+ midVertical: "━",
285
+ midRight: " ",
286
+ bottomLeft: " ",
287
+ bottom: " ",
288
+ bottomDivider: " ",
289
+ bottomRight: " ",
290
+ left: " ",
291
+ right: " ",
292
+ vertical: " ",
293
+ });
294
+ export const MINIMAL_DOUBLE_HEAD = new Box({
295
+ topLeft: " ",
296
+ top: " ",
297
+ topDivider: " ",
298
+ topRight: " ",
299
+ headLeft: " ",
300
+ headVertical: " ",
301
+ headRight: " ",
302
+ midLeft: " ",
303
+ mid: "═",
304
+ midVertical: "═",
305
+ midRight: " ",
306
+ bottomLeft: " ",
307
+ bottom: " ",
308
+ bottomDivider: " ",
309
+ bottomRight: " ",
310
+ left: " ",
311
+ right: " ",
312
+ vertical: " ",
313
+ });
314
+ export const SIMPLE = new Box({
315
+ topLeft: " ",
316
+ top: " ",
317
+ topDivider: " ",
318
+ topRight: " ",
319
+ headLeft: " ",
320
+ headVertical: " ",
321
+ headRight: " ",
322
+ midLeft: " ",
323
+ mid: "─",
324
+ midVertical: " ",
325
+ midRight: " ",
326
+ bottomLeft: " ",
327
+ bottom: "─",
328
+ bottomDivider: " ",
329
+ bottomRight: " ",
330
+ left: " ",
331
+ right: " ",
332
+ vertical: " ",
333
+ });
334
+ export const SIMPLE_HEAD = new Box({
335
+ topLeft: " ",
336
+ top: " ",
337
+ topDivider: " ",
338
+ topRight: " ",
339
+ headLeft: " ",
340
+ headVertical: " ",
341
+ headRight: " ",
342
+ midLeft: " ",
343
+ mid: "─",
344
+ midVertical: " ",
345
+ midRight: " ",
346
+ bottomLeft: " ",
347
+ bottom: " ",
348
+ bottomDivider: " ",
349
+ bottomRight: " ",
350
+ left: " ",
351
+ right: " ",
352
+ vertical: " ",
353
+ });
354
+ export const SIMPLE_HEAVY = new Box({
355
+ topLeft: " ",
356
+ top: " ",
357
+ topDivider: " ",
358
+ topRight: " ",
359
+ headLeft: " ",
360
+ headVertical: " ",
361
+ headRight: " ",
362
+ midLeft: " ",
363
+ mid: "━",
364
+ midVertical: " ",
365
+ midRight: " ",
366
+ bottomLeft: " ",
367
+ bottom: "━",
368
+ bottomDivider: " ",
369
+ bottomRight: " ",
370
+ left: " ",
371
+ right: " ",
372
+ vertical: " ",
373
+ });
374
+ export const HORIZONTALS = new Box({
375
+ topLeft: " ",
376
+ top: "─",
377
+ topDivider: "─",
378
+ topRight: " ",
379
+ headLeft: " ",
380
+ headVertical: " ",
381
+ headRight: " ",
382
+ midLeft: " ",
383
+ mid: "─",
384
+ midVertical: "─",
385
+ midRight: " ",
386
+ bottomLeft: " ",
387
+ bottom: "─",
388
+ bottomDivider: "─",
389
+ bottomRight: " ",
390
+ left: " ",
391
+ right: " ",
392
+ vertical: " ",
393
+ });
394
+ export const ROUNDED = new Box({
395
+ topLeft: "╭",
396
+ top: "─",
397
+ topDivider: "┬",
398
+ topRight: "╮",
399
+ headLeft: "│",
400
+ headVertical: "│",
401
+ headRight: "│",
402
+ midLeft: "├",
403
+ mid: "─",
404
+ midVertical: "┼",
405
+ midRight: "┤",
406
+ bottomLeft: "╰",
407
+ bottom: "─",
408
+ bottomDivider: "┴",
409
+ bottomRight: "╯",
410
+ left: "│",
411
+ right: "│",
412
+ vertical: "│",
413
+ });
414
+ export const HEAVY = new Box({
415
+ topLeft: "┏",
416
+ top: "━",
417
+ topDivider: "┳",
418
+ topRight: "┓",
419
+ headLeft: "┃",
420
+ headVertical: "┃",
421
+ headRight: "┃",
422
+ midLeft: "┣",
423
+ mid: "━",
424
+ midVertical: "╋",
425
+ midRight: "┫",
426
+ bottomLeft: "┗",
427
+ bottom: "━",
428
+ bottomDivider: "┻",
429
+ bottomRight: "┛",
430
+ left: "┃",
431
+ right: "┃",
432
+ vertical: "┃",
433
+ });
434
+ export const HEAVY_EDGE = new Box({
435
+ topLeft: "┏",
436
+ top: "━",
437
+ topDivider: "┯",
438
+ topRight: "┓",
439
+ headLeft: "┃",
440
+ headVertical: "│",
441
+ headRight: "┃",
442
+ midLeft: "┠",
443
+ mid: "─",
444
+ midVertical: "┼",
445
+ midRight: "┨",
446
+ bottomLeft: "┗",
447
+ bottom: "━",
448
+ bottomDivider: "┷",
449
+ bottomRight: "┛",
450
+ left: "┃",
451
+ right: "┃",
452
+ vertical: "│",
453
+ });
454
+ export const HEAVY_HEAD = new Box({
455
+ topLeft: "┏",
456
+ top: "━",
457
+ topDivider: "┳",
458
+ topRight: "┓",
459
+ headLeft: "┃",
460
+ headVertical: "┃",
461
+ headRight: "┃",
462
+ midLeft: "┡",
463
+ mid: "━",
464
+ midVertical: "╇",
465
+ midRight: "┩",
466
+ bottomLeft: "└",
467
+ bottom: "─",
468
+ bottomDivider: "┴",
469
+ bottomRight: "┘",
470
+ left: "│",
471
+ right: "│",
472
+ vertical: "│",
473
+ });
474
+ export const DOUBLE = new Box({
475
+ topLeft: "╔",
476
+ top: "═",
477
+ topDivider: "╦",
478
+ topRight: "╗",
479
+ headLeft: "║",
480
+ headVertical: "║",
481
+ headRight: "║",
482
+ midLeft: "╠",
483
+ mid: "═",
484
+ midVertical: "╬",
485
+ midRight: "╣",
486
+ bottomLeft: "╚",
487
+ bottom: "═",
488
+ bottomDivider: "╩",
489
+ bottomRight: "╝",
490
+ left: "║",
491
+ right: "║",
492
+ vertical: "║",
493
+ });
494
+ export const DOUBLE_EDGE = new Box({
495
+ topLeft: "╔",
496
+ top: "═",
497
+ topDivider: "╤",
498
+ topRight: "╗",
499
+ headLeft: "║",
500
+ headVertical: "│",
501
+ headRight: "║",
502
+ midLeft: "╟",
503
+ mid: "─",
504
+ midVertical: "┼",
505
+ midRight: "╢",
506
+ bottomLeft: "╚",
507
+ bottom: "═",
508
+ bottomDivider: "╧",
509
+ bottomRight: "╝",
510
+ left: "║",
511
+ right: "║",
512
+ vertical: "│",
513
+ });
514
+ export const MARKDOWN = new Box({
515
+ topLeft: " ",
516
+ top: " ",
517
+ topDivider: " ",
518
+ topRight: " ",
519
+ headLeft: "|",
520
+ headVertical: "|",
521
+ headRight: "|",
522
+ midLeft: "|",
523
+ mid: "-",
524
+ midVertical: "|",
525
+ midRight: "|",
526
+ bottomLeft: " ",
527
+ bottom: " ",
528
+ bottomDivider: " ",
529
+ bottomRight: " ",
530
+ left: "|",
531
+ right: "|",
532
+ vertical: "|",
533
+ });
534
+ //# sourceMappingURL=box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box.js","sourceRoot":"","sources":["../../src/core/box.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Terminal cell width calculation.
3
+ * Handles ASCII, CJK (double-width), and emoji characters.
4
+ */
5
+ /**
6
+ * Returns the terminal cell width of a string.
7
+ */
8
+ export declare function cellLen(text: string): number;
9
+ /**
10
+ * Pads or crops a string to exactly `totalWidth` terminal cells.
11
+ * Invariant: cellLen(setCellSize(text, n)) === n (unless n is 0)
12
+ */
13
+ export declare function setCellSize(text: string, totalWidth: number): string;
14
+ /**
15
+ * Splits text at a cell position. Returns [left, right].
16
+ * When the position falls mid-wide-character, the left side is padded
17
+ * to reach exactly `position` cells. The wide char remains in the right side.
18
+ */
19
+ export declare function splitText(text: string, position: number): [string, string];
20
+ /**
21
+ * Wraps text into lines of at most `maxWidth` cells.
22
+ */
23
+ export declare function chopCells(text: string, maxWidth: number): string[];
24
+ //# sourceMappingURL=cells.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cells.d.ts","sourceRoot":"","sources":["../../src/core/cells.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAa5C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CASpE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,CAAC,MAAM,EAAE,MAAM,CAAC,CAuBlB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBlE"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Terminal cell width calculation.
3
+ * Handles ASCII, CJK (double-width), and emoji characters.
4
+ */
5
+ import stringWidth from "string-width";
6
+ // [LAW:one-source-of-truth] string-width is the single authority for cell width
7
+ const cellLenCache = new Map();
8
+ const CACHE_MAX = 4096;
9
+ /**
10
+ * Returns the terminal cell width of a string.
11
+ */
12
+ export function cellLen(text) {
13
+ if (text.length === 0)
14
+ return 0;
15
+ // Fast path for pure ASCII
16
+ if (text.length <= 64) {
17
+ const cached = cellLenCache.get(text);
18
+ if (cached !== undefined)
19
+ return cached;
20
+ }
21
+ const width = stringWidth(text);
22
+ if (text.length <= 64) {
23
+ if (cellLenCache.size >= CACHE_MAX)
24
+ cellLenCache.clear();
25
+ cellLenCache.set(text, width);
26
+ }
27
+ return width;
28
+ }
29
+ /**
30
+ * Pads or crops a string to exactly `totalWidth` terminal cells.
31
+ * Invariant: cellLen(setCellSize(text, n)) === n (unless n is 0)
32
+ */
33
+ export function setCellSize(text, totalWidth) {
34
+ if (totalWidth === 0)
35
+ return "";
36
+ const currentWidth = cellLen(text);
37
+ if (currentWidth === totalWidth)
38
+ return text;
39
+ if (currentWidth < totalWidth) {
40
+ return text + " ".repeat(totalWidth - currentWidth);
41
+ }
42
+ // Crop: walk characters, tracking cell width
43
+ return cropToWidth(text, totalWidth);
44
+ }
45
+ /**
46
+ * Splits text at a cell position. Returns [left, right].
47
+ * When the position falls mid-wide-character, the left side is padded
48
+ * to reach exactly `position` cells. The wide char remains in the right side.
49
+ */
50
+ export function splitText(text, position) {
51
+ if (position <= 0)
52
+ return ["", text];
53
+ const totalWidth = cellLen(text);
54
+ if (position >= totalWidth)
55
+ return [text, ""];
56
+ // Walk characters tracking cell width and source char index
57
+ let width = 0;
58
+ let charIndex = 0;
59
+ for (const char of text) {
60
+ const charWidth = cellLen(char);
61
+ if (width + charWidth > position)
62
+ break;
63
+ width += charWidth;
64
+ charIndex += char.length;
65
+ }
66
+ const left = text.slice(0, charIndex);
67
+ const right = text.slice(charIndex);
68
+ // If we stopped short of position (mid-wide-char), pad left with spaces
69
+ if (width < position) {
70
+ return [left + " ".repeat(position - width), right];
71
+ }
72
+ return [left, right];
73
+ }
74
+ /**
75
+ * Wraps text into lines of at most `maxWidth` cells.
76
+ */
77
+ export function chopCells(text, maxWidth) {
78
+ if (maxWidth <= 0 || text.length === 0)
79
+ return [text];
80
+ const totalWidth = cellLen(text);
81
+ if (totalWidth <= maxWidth)
82
+ return [text];
83
+ const lines = [];
84
+ let remaining = text;
85
+ while (remaining.length > 0) {
86
+ const remainingWidth = cellLen(remaining);
87
+ if (remainingWidth <= maxWidth) {
88
+ lines.push(remaining);
89
+ break;
90
+ }
91
+ const [line, rest] = splitText(remaining, maxWidth);
92
+ lines.push(line);
93
+ remaining = rest;
94
+ }
95
+ return lines;
96
+ }
97
+ // --- internal ---
98
+ function cropToWidth(text, targetWidth) {
99
+ let width = 0;
100
+ let i = 0;
101
+ // Use the string's code point iterator to handle surrogate pairs
102
+ for (const char of text) {
103
+ const charWidth = cellLen(char);
104
+ if (width + charWidth > targetWidth)
105
+ break;
106
+ width += charWidth;
107
+ i += char.length;
108
+ }
109
+ const cropped = text.slice(0, i);
110
+ // Pad if we couldn't hit the exact width (wide char boundary)
111
+ const diff = targetWidth - width;
112
+ return diff > 0 ? cropped + " ".repeat(diff) : cropped;
113
+ }
114
+ //# sourceMappingURL=cells.js.map