@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,201 @@
1
+ /**
2
+ * FlexStrip — wrap-to-width horizontal layout for `StyledRenderable` items.
3
+ *
4
+ * Pack as many items as fit on a line, then break and continue. Each line is
5
+ * an independent sub-strip: optional `Joiner` end-caps fire at every line
6
+ * boundary (not just the strip's first/last position), so a line break looks
7
+ * the same as an endpoint to the joiner. Composes with the Strip + Joiner
8
+ * primitive in `core/strip` — same `Joiner` protocol, no new join semantics.
9
+ *
10
+ * [LAW:dataflow-not-control-flow] The pack walk is the same shape every
11
+ * render: measure each item, render every joiner form (start-cap, end-cap,
12
+ * mid-join) up-front, then sweep items into lines. Line breaks are decided by
13
+ * width data, not by control-flow special cases.
14
+ *
15
+ * [LAW:one-source-of-truth] The Strip primitive owns the join protocol;
16
+ * FlexStrip reuses it verbatim. There is no second concept of "join."
17
+ */
18
+ import { Segment } from "../core/segment.js";
19
+ function renderToBlock(r, options) {
20
+ const segments = [...r.render(options)];
21
+ let width = 0;
22
+ for (const s of segments)
23
+ width += s.cellLength;
24
+ return { segments, width };
25
+ }
26
+ const EMPTY_BLOCK = { segments: [], width: 0 };
27
+ const PAD_LEFT_BY_ALIGN = {
28
+ left: () => 0,
29
+ justify: () => 0,
30
+ center: (spare) => Math.floor(spare / 2),
31
+ right: (spare) => spare,
32
+ };
33
+ function computePadLeft(align, spare) {
34
+ return PAD_LEFT_BY_ALIGN[align](spare);
35
+ }
36
+ // Return per-slot fill widths (length = itemCount - 1, possibly empty).
37
+ // Non-justify cases produce all zeros — the emit loop runs the same way.
38
+ function computeSlotFills(align, isFinalLine, spare, itemCount) {
39
+ const slots = Math.max(0, itemCount - 1);
40
+ const distribute = align === "justify" && !isFinalLine && slots > 0 && spare > 0;
41
+ const totalFill = distribute ? spare : 0;
42
+ const base = slots > 0 ? Math.floor(totalFill / slots) : 0;
43
+ const extra = totalFill - base * slots;
44
+ return Array.from({ length: slots }, (_, k) => base + (k < extra ? 1 : 0));
45
+ }
46
+ export class FlexStrip {
47
+ items;
48
+ joiner;
49
+ gap;
50
+ align;
51
+ constructor(items, options) {
52
+ this.items = items;
53
+ this.joiner = options?.joiner;
54
+ this.gap = options?.gap ?? 0;
55
+ this.align = options?.align ?? "left";
56
+ }
57
+ *render(options) {
58
+ const items = this.items;
59
+ if (items.length === 0)
60
+ return;
61
+ const maxWidth = Math.max(1, options.maxWidth);
62
+ const gap = this.gap;
63
+ const joiner = this.joiner;
64
+ // Pre-render every item and every joiner form we might need. Doing this
65
+ // up-front turns packing into a pure data computation over widths.
66
+ const itemBlocks = items.map((it) => renderToBlock(it, options));
67
+ const startCap = (i) => joiner ? renderToBlock(joiner.join(null, items[i]), options) : EMPTY_BLOCK;
68
+ const endCap = (i) => joiner ? renderToBlock(joiner.join(items[i], null), options) : EMPTY_BLOCK;
69
+ const midJoin = (i, j) => joiner ? renderToBlock(joiner.join(items[i], items[j]), options) : EMPTY_BLOCK;
70
+ const lines = [];
71
+ let line = null;
72
+ const gapBlock = gap > 0
73
+ ? { segments: [new Segment(" ".repeat(gap))], width: gap }
74
+ : EMPTY_BLOCK;
75
+ for (let i = 0; i < items.length; i++) {
76
+ const item = itemBlocks[i];
77
+ if (line === null) {
78
+ const sc = startCap(i);
79
+ const ec = endCap(i);
80
+ const blocks = sc.width > 0 ? [sc, item] : [item];
81
+ const itemBlockIndices = [blocks.length - 1];
82
+ line = { blocks, width: sc.width + item.width, lastIndex: i, itemBlockIndices };
83
+ // Tentatively reserve space for the line's eventual end-cap by
84
+ // tracking it separately below — `line.width` is the open width
85
+ // (without end-cap). We test fit using width + endCap on each step.
86
+ // Always start a new line with at least the first item (overflow ok
87
+ // per ticket: graceful fallback when an item is wider than terminal).
88
+ // Stash end-cap for the close step.
89
+ line.endCap = ec;
90
+ continue;
91
+ }
92
+ const prev = line.lastIndex;
93
+ const mid = midJoin(prev, i);
94
+ const newEndCap = endCap(i);
95
+ const addCost = (gap > 0 ? gap : 0) + mid.width + (gap > 0 ? gap : 0) + item.width;
96
+ const closedWidthIfAdded = line.width + addCost + newEndCap.width;
97
+ if (closedWidthIfAdded <= maxWidth) {
98
+ if (gap > 0)
99
+ line.blocks.push(gapBlock);
100
+ if (mid.width > 0)
101
+ line.blocks.push(mid);
102
+ if (gap > 0)
103
+ line.blocks.push(gapBlock);
104
+ line.blocks.push(item);
105
+ line.itemBlockIndices.push(line.blocks.length - 1);
106
+ line.width += addCost;
107
+ line.lastIndex = i;
108
+ line.endCap = newEndCap;
109
+ }
110
+ else {
111
+ // Close current line and start a new one with this item.
112
+ const closing = line.endCap;
113
+ if (closing.width > 0)
114
+ line.blocks.push(closing);
115
+ line.width += closing.width;
116
+ lines.push(line);
117
+ const sc = startCap(i);
118
+ const ec = endCap(i);
119
+ const blocks = sc.width > 0 ? [sc, item] : [item];
120
+ const itemBlockIndices = [blocks.length - 1];
121
+ line = { blocks, width: sc.width + item.width, lastIndex: i, itemBlockIndices };
122
+ line.endCap = ec;
123
+ }
124
+ }
125
+ // Close final line. `line` is non-null here: the loop runs at least once
126
+ // (items.length > 0 was handled above).
127
+ const finalLine = line;
128
+ {
129
+ const closing = finalLine.endCap;
130
+ if (closing.width > 0)
131
+ finalLine.blocks.push(closing);
132
+ finalLine.width += closing.width;
133
+ lines.push(finalLine);
134
+ }
135
+ // [LAW:dataflow-not-control-flow] Single emission path for every line:
136
+ // emit pad, walk every block, optionally emit a per-slot fill before each
137
+ // non-first item. Variability lives in two precomputed value sequences
138
+ // (`padLeft` and `slotFills`); the emit loop has no per-mode branch.
139
+ //
140
+ // - `padLeft` pushes the line right by 0 (left/justify), spare/2 (center),
141
+ // or full spare (right). Justify-on-final-line follows the left rule.
142
+ // - `slotFills[k]` is the cells of fill emitted before the (k+1)-th item.
143
+ // Always 0 unless align=justify on a non-final line with ≥2 items.
144
+ //
145
+ // Putting the variability in data means the emit loop is the same shape
146
+ // every render, and "what happens between two items" can never accidentally
147
+ // become "what happens between joiner halves" — the data decides.
148
+ const align = this.align;
149
+ for (let li = 0; li < lines.length; li++) {
150
+ const ln = lines[li];
151
+ const isLast = li === lines.length - 1;
152
+ const spare = Math.max(0, maxWidth - ln.width);
153
+ const padLeft = computePadLeft(align, spare);
154
+ const slotFills = computeSlotFills(align, isLast, spare, ln.itemBlockIndices.length);
155
+ const itemRankOf = new Map();
156
+ ln.itemBlockIndices.forEach((blockIdx, rank) => itemRankOf.set(blockIdx, rank));
157
+ if (padLeft > 0)
158
+ yield new Segment(" ".repeat(padLeft));
159
+ for (let bi = 0; bi < ln.blocks.length; bi++) {
160
+ const rank = itemRankOf.get(bi);
161
+ if (rank !== undefined && rank > 0) {
162
+ const fill = slotFills[rank - 1];
163
+ if (fill > 0)
164
+ yield new Segment(" ".repeat(fill));
165
+ }
166
+ yield* ln.blocks[bi].segments;
167
+ }
168
+ yield Segment.line();
169
+ }
170
+ }
171
+ measure(options) {
172
+ const items = this.items;
173
+ if (items.length === 0)
174
+ return { minimum: 0, maximum: 0 };
175
+ let minimum = 0;
176
+ let maximum = 0;
177
+ for (let i = 0; i < items.length; i++) {
178
+ const itemWidth = renderToBlock(items[i], options).width;
179
+ const sc = this.joiner
180
+ ? renderToBlock(this.joiner.join(null, items[i]), options).width
181
+ : 0;
182
+ const ec = this.joiner
183
+ ? renderToBlock(this.joiner.join(items[i], null), options).width
184
+ : 0;
185
+ minimum = Math.max(minimum, itemWidth + sc + ec);
186
+ maximum += itemWidth;
187
+ if (i > 0) {
188
+ maximum += this.gap * 2;
189
+ if (this.joiner) {
190
+ maximum += renderToBlock(this.joiner.join(items[i - 1], items[i]), options).width;
191
+ }
192
+ }
193
+ }
194
+ if (this.joiner) {
195
+ maximum += renderToBlock(this.joiner.join(null, items[0]), options).width;
196
+ maximum += renderToBlock(this.joiner.join(items[items.length - 1], null), options).width;
197
+ }
198
+ return { minimum, maximum };
199
+ }
200
+ }
201
+ //# sourceMappingURL=flexStrip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flexStrip.js","sourceRoot":"","sources":["../../src/renderables/flexStrip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Group — renders multiple renderables in sequence.
3
+ * No visual chrome — purely a container.
4
+ */
5
+ import { Segment } from "../core/segment.js";
6
+ import type { Renderable, RenderOptions } from "../core/protocol.js";
7
+ export declare class Group implements Renderable {
8
+ readonly renderables: Renderable[];
9
+ constructor(...renderables: Renderable[]);
10
+ render(options: RenderOptions): Iterable<Segment>;
11
+ }
12
+ //# sourceMappingURL=group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../src/renderables/group.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,KAAM,YAAW,UAAU;IACtC,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;gBAEvB,GAAG,WAAW,EAAE,UAAU,EAAE;IAIvC,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC;CAKnD"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Group — renders multiple renderables in sequence.
3
+ * No visual chrome — purely a container.
4
+ */
5
+ export class Group {
6
+ renderables;
7
+ constructor(...renderables) {
8
+ this.renderables = renderables;
9
+ }
10
+ *render(options) {
11
+ for (const renderable of this.renderables) {
12
+ yield* renderable.render(options);
13
+ }
14
+ }
15
+ }
16
+ //# sourceMappingURL=group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.js","sourceRoot":"","sources":["../../src/renderables/group.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,OAAO,KAAK;IACP,WAAW,CAAe;IAEnC,YAAY,GAAG,WAAyB;QACtC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,CAAC,MAAM,CAAC,OAAsB;QAC5B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * JSON — renders JSON data with syntax highlighting and pretty-printing.
3
+ */
4
+ import { Segment } from "../core/segment.js";
5
+ import { RichText } from "../core/text.js";
6
+ import type { Renderable, Measurable, RenderOptions } from "../core/protocol.js";
7
+ export interface JSONOptions {
8
+ indent?: number;
9
+ sortKeys?: boolean;
10
+ highlight?: boolean;
11
+ }
12
+ export declare class JSONRenderable implements Renderable, Measurable {
13
+ readonly text: RichText;
14
+ private constructor();
15
+ static fromString(jsonString: string, options?: JSONOptions): JSONRenderable;
16
+ static fromData(data: unknown, options?: JSONOptions): JSONRenderable;
17
+ render(options: RenderOptions): Iterable<Segment>;
18
+ measure(options: RenderOptions): {
19
+ minimum: number;
20
+ maximum: number;
21
+ };
22
+ }
23
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/renderables/json.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAID,qBAAa,cAAe,YAAW,UAAU,EAAE,UAAU;IAC3D,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAExB,OAAO;IAIP,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc;IAS5E,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc;IA4BpE,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC;IAIlD,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAGtE"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * JSON — renders JSON data with syntax highlighting and pretty-printing.
3
+ */
4
+ import { RichText } from "../core/text.js";
5
+ import { JSONHighlighter } from "../core/highlighter.js";
6
+ const highlighter = new JSONHighlighter();
7
+ export class JSONRenderable {
8
+ text;
9
+ constructor(text) {
10
+ this.text = text;
11
+ }
12
+ static fromString(jsonString, options) {
13
+ const indent = options?.indent ?? 2;
14
+ const sortKeys = options?.sortKeys ?? false;
15
+ // Parse and re-serialize for consistent formatting
16
+ const data = JSON.parse(jsonString);
17
+ return JSONRenderable.fromData(data, { ...options, indent, sortKeys });
18
+ }
19
+ static fromData(data, options) {
20
+ const indent = options?.indent ?? 2;
21
+ const sortKeys = options?.sortKeys ?? false;
22
+ const doHighlight = options?.highlight !== false;
23
+ const replacer = sortKeys
24
+ ? (_key, value) => {
25
+ if (value !== null && typeof value === "object" && !Array.isArray(value)) {
26
+ const sorted = {};
27
+ for (const k of Object.keys(value).sort()) {
28
+ sorted[k] = value[k];
29
+ }
30
+ return sorted;
31
+ }
32
+ return value;
33
+ }
34
+ : undefined;
35
+ const jsonStr = JSON.stringify(data, replacer, indent);
36
+ const text = new RichText(jsonStr, { end: "" });
37
+ if (doHighlight) {
38
+ highlighter.highlight(text);
39
+ }
40
+ return new JSONRenderable(text);
41
+ }
42
+ *render(options) {
43
+ yield* this.text.render(options);
44
+ }
45
+ measure(options) {
46
+ return this.text.measure(options);
47
+ }
48
+ }
49
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/renderables/json.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAazD,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;AAE1C,MAAM,OAAO,cAAc;IAChB,IAAI,CAAW;IAExB,YAAoB,IAAc;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,UAAkB,EAAE,OAAqB;QACzD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,KAAK,CAAC;QAE5C,mDAAmD;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAY,CAAC;QAC/C,OAAO,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAa,EAAE,OAAqB;QAClD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,KAAK,CAAC;QAC5C,MAAM,WAAW,GAAG,OAAO,EAAE,SAAS,KAAK,KAAK,CAAC;QAEjD,MAAM,QAAQ,GAAG,QAAQ;YACvB,CAAC,CAAC,CAAC,IAAY,EAAE,KAAc,EAAE,EAAE;gBAC/B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzE,MAAM,MAAM,GAA4B,EAAE,CAAC;oBAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;wBACrE,MAAM,CAAC,CAAC,CAAC,GAAI,KAAiC,CAAC,CAAC,CAAC,CAAC;oBACpD,CAAC;oBACD,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACH,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QAEhD,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,CAAC,MAAM,CAAC,OAAsB;QAC5B,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,CAAC,OAAsB;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Layout — divides the screen into rectangular regions.
3
+ */
4
+ import { Segment } from "../core/segment.js";
5
+ import type { Renderable, Measurable, RenderOptions } from "../core/protocol.js";
6
+ export interface LayoutOptions {
7
+ name?: string;
8
+ ratio?: number;
9
+ size?: number;
10
+ minimumSize?: number;
11
+ visible?: boolean;
12
+ }
13
+ export declare class Layout implements Renderable, Measurable {
14
+ name: string | undefined;
15
+ ratio: number;
16
+ size: number | undefined;
17
+ minimumSize: number;
18
+ visible: boolean;
19
+ private _renderable;
20
+ private _children;
21
+ private _splitDirection;
22
+ constructor(renderable?: Renderable | string, options?: LayoutOptions);
23
+ get children(): Layout[];
24
+ splitColumn(...layouts: Layout[]): void;
25
+ splitRow(...layouts: Layout[]): void;
26
+ update(renderable: Renderable | string): void;
27
+ getByName(name: string): Layout | undefined;
28
+ render(options: RenderOptions): Iterable<Segment>;
29
+ private _renderColumn;
30
+ private _renderRow;
31
+ private _distributeSpace;
32
+ measure(options: RenderOptions): {
33
+ minimum: number;
34
+ maximum: number;
35
+ };
36
+ }
37
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/renderables/layout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,MAAO,YAAW,UAAU,EAAE,UAAU;IACnD,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,eAAe,CAA+B;gBAE1C,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa;IAerE,IAAI,QAAQ,IAAI,MAAM,EAAE,CAEvB;IAED,WAAW,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,QAAQ,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKpC,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAM7C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAS1C,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC;IAqBlD,OAAO,CAAE,aAAa;IAmBtB,OAAO,CAAE,UAAU;IAsCnB,OAAO,CAAC,gBAAgB;IAoCxB,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAGtE"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Layout — divides the screen into rectangular regions.
3
+ */
4
+ import { Segment } from "../core/segment.js";
5
+ import { RichText } from "../core/text.js";
6
+ export class Layout {
7
+ name;
8
+ ratio;
9
+ size;
10
+ minimumSize;
11
+ visible;
12
+ _renderable;
13
+ _children;
14
+ _splitDirection;
15
+ constructor(renderable, options) {
16
+ if (renderable !== undefined) {
17
+ this._renderable = typeof renderable === "string"
18
+ ? new RichText(renderable, { end: "" })
19
+ : renderable;
20
+ }
21
+ this.name = options?.name;
22
+ this.ratio = options?.ratio ?? 1;
23
+ this.size = options?.size;
24
+ this.minimumSize = options?.minimumSize ?? 1;
25
+ this.visible = options?.visible !== false;
26
+ this._children = [];
27
+ this._splitDirection = undefined;
28
+ }
29
+ get children() {
30
+ return this._children;
31
+ }
32
+ splitColumn(...layouts) {
33
+ this._children = layouts;
34
+ this._splitDirection = "column";
35
+ }
36
+ splitRow(...layouts) {
37
+ this._children = layouts;
38
+ this._splitDirection = "row";
39
+ }
40
+ update(renderable) {
41
+ this._renderable = typeof renderable === "string"
42
+ ? new RichText(renderable, { end: "" })
43
+ : renderable;
44
+ }
45
+ getByName(name) {
46
+ if (this.name === name)
47
+ return this;
48
+ for (const child of this._children) {
49
+ const found = child.getByName(name);
50
+ if (found)
51
+ return found;
52
+ }
53
+ return undefined;
54
+ }
55
+ *render(options) {
56
+ if (!this.visible)
57
+ return;
58
+ if (this._children.length === 0) {
59
+ // Leaf node — render content
60
+ if (this._renderable) {
61
+ yield* this._renderable.render(options);
62
+ }
63
+ return;
64
+ }
65
+ const visibleChildren = this._children.filter((c) => c.visible);
66
+ if (visibleChildren.length === 0)
67
+ return;
68
+ if (this._splitDirection === "row") {
69
+ yield* this._renderRow(visibleChildren, options);
70
+ }
71
+ else {
72
+ yield* this._renderColumn(visibleChildren, options);
73
+ }
74
+ }
75
+ *_renderColumn(children, options) {
76
+ // Vertical stacking: each child gets full width, proportional height
77
+ const totalHeight = options.maxHeight ?? options.height ?? 24;
78
+ const heights = this._distributeSpace(children, totalHeight);
79
+ for (let i = 0; i < children.length; i++) {
80
+ const child = children[i];
81
+ const childOptions = {
82
+ ...options,
83
+ maxHeight: heights[i],
84
+ height: heights[i],
85
+ };
86
+ yield* child.render(childOptions);
87
+ }
88
+ }
89
+ *_renderRow(children, options) {
90
+ // Horizontal side-by-side: distribute width
91
+ const widths = this._distributeSpace(children, options.maxWidth);
92
+ // Render each child and collect their lines
93
+ const childLines = [];
94
+ let maxLines = 0;
95
+ for (let i = 0; i < children.length; i++) {
96
+ const child = children[i];
97
+ const childWidth = widths[i];
98
+ const childOptions = { ...options, maxWidth: childWidth };
99
+ const segs = [...child.render(childOptions)];
100
+ const lines = Segment.splitLines(segs);
101
+ childLines.push(lines);
102
+ maxLines = Math.max(maxLines, lines.length);
103
+ }
104
+ // Merge lines side by side
105
+ for (let lineIdx = 0; lineIdx < maxLines; lineIdx++) {
106
+ for (let childIdx = 0; childIdx < children.length; childIdx++) {
107
+ const lines = childLines[childIdx];
108
+ const width = widths[childIdx];
109
+ const line = lines[lineIdx];
110
+ if (line) {
111
+ const adjusted = Segment.adjustLineLength(line, width);
112
+ yield* adjusted;
113
+ }
114
+ else {
115
+ yield new Segment(" ".repeat(width));
116
+ }
117
+ }
118
+ yield Segment.line();
119
+ }
120
+ }
121
+ _distributeSpace(children, totalSpace) {
122
+ const sizes = new Array(children.length).fill(0);
123
+ let remaining = totalSpace;
124
+ // Fixed-size children first
125
+ const flexChildren = [];
126
+ for (let i = 0; i < children.length; i++) {
127
+ const child = children[i];
128
+ if (child.size !== undefined) {
129
+ sizes[i] = Math.min(child.size, remaining);
130
+ remaining -= sizes[i];
131
+ }
132
+ else {
133
+ flexChildren.push(i);
134
+ }
135
+ }
136
+ // Distribute remaining by ratio
137
+ if (flexChildren.length > 0 && remaining > 0) {
138
+ const totalRatio = flexChildren.reduce((s, idx) => s + children[idx].ratio, 0);
139
+ for (const idx of flexChildren) {
140
+ const child = children[idx];
141
+ const allocated = Math.max(child.minimumSize, Math.floor(remaining * child.ratio / totalRatio));
142
+ sizes[idx] = allocated;
143
+ }
144
+ }
145
+ return sizes;
146
+ }
147
+ measure(options) {
148
+ return { minimum: this.minimumSize, maximum: options.maxWidth };
149
+ }
150
+ }
151
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/renderables/layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Live — animates a portion of the terminal by continuously re-rendering.
3
+ *
4
+ * Two modes:
5
+ * - **Inline** (default): clears and redraws N lines in the current scroll
6
+ * region. Good for spinners/progress bars below other output.
7
+ * - **Alt-screen** (`altScreen: true`): enters the alternate screen buffer
8
+ * on start, cursor-homes on each refresh (no clear flicker), and restores
9
+ * the original buffer on stop. Good for full-screen TUI apps.
10
+ */
11
+ import { Console } from "../core/console.js";
12
+ import type { Renderable } from "../core/protocol.js";
13
+ export interface LiveOptions {
14
+ refreshPerSecond?: number;
15
+ autoRefresh?: boolean;
16
+ transient?: boolean;
17
+ console?: Console;
18
+ verticalOverflow?: "crop" | "ellipsis" | "visible";
19
+ /** When true, Live enters the alternate screen buffer on start() and
20
+ * restores the original on stop(). Refresh uses cursor-home instead of
21
+ * cursor-up-and-clear, eliminating flicker for full-screen layouts. */
22
+ altScreen?: boolean;
23
+ }
24
+ export declare class Live {
25
+ private _renderable;
26
+ private _console;
27
+ private _refreshPerSecond;
28
+ private _autoRefresh;
29
+ private _transient;
30
+ private _verticalOverflow;
31
+ private _altScreen;
32
+ private _timer;
33
+ private _lastLineCount;
34
+ private _started;
35
+ private _firstRefresh;
36
+ constructor(renderable?: Renderable, options?: LiveOptions);
37
+ get console(): Console;
38
+ get renderable(): Renderable | undefined;
39
+ start(): void;
40
+ stop(): void;
41
+ update(renderable?: Renderable, options?: {
42
+ refresh?: boolean;
43
+ }): void;
44
+ refresh(): void;
45
+ private _clearLast;
46
+ private _writeCursorControl;
47
+ }
48
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/renderables/live.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IACnD;;4EAEwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,IAAI;IACf,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,aAAa,CAAU;gBAEnB,UAAU,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,WAAW;IAa1D,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,UAAU,IAAI,UAAU,GAAG,SAAS,CAEvC;IAED,KAAK,IAAI,IAAI;IAiBb,IAAI,IAAI,IAAI;IAqBZ,MAAM,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAStE,OAAO,IAAI,IAAI;IAyCf,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,mBAAmB;CAG5B"}