@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.
- package/README.md +418 -0
- package/dist/core/box.d.ts +91 -0
- package/dist/core/box.d.ts.map +1 -0
- package/dist/core/box.js +534 -0
- package/dist/core/box.js.map +1 -0
- package/dist/core/cells.d.ts +24 -0
- package/dist/core/cells.d.ts.map +1 -0
- package/dist/core/cells.js +114 -0
- package/dist/core/cells.js.map +1 -0
- package/dist/core/color.d.ts +158 -0
- package/dist/core/color.d.ts.map +1 -0
- package/dist/core/color.js +825 -0
- package/dist/core/color.js.map +1 -0
- package/dist/core/console.d.ts +100 -0
- package/dist/core/console.d.ts.map +1 -0
- package/dist/core/console.js +353 -0
- package/dist/core/console.js.map +1 -0
- package/dist/core/emoji.d.ts +25 -0
- package/dist/core/emoji.d.ts.map +1 -0
- package/dist/core/emoji.js +392 -0
- package/dist/core/emoji.js.map +1 -0
- package/dist/core/highlighter.d.ts +33 -0
- package/dist/core/highlighter.d.ts.map +1 -0
- package/dist/core/highlighter.js +103 -0
- package/dist/core/highlighter.js.map +1 -0
- package/dist/core/markup.d.ts +69 -0
- package/dist/core/markup.d.ts.map +1 -0
- package/dist/core/markup.js +401 -0
- package/dist/core/markup.js.map +1 -0
- package/dist/core/measure.d.ts +17 -0
- package/dist/core/measure.d.ts.map +1 -0
- package/dist/core/measure.js +50 -0
- package/dist/core/measure.js.map +1 -0
- package/dist/core/protocol.d.ts +32 -0
- package/dist/core/protocol.d.ts.map +1 -0
- package/dist/core/protocol.js +17 -0
- package/dist/core/protocol.js.map +1 -0
- package/dist/core/render.d.ts +51 -0
- package/dist/core/render.d.ts.map +1 -0
- package/dist/core/render.js +69 -0
- package/dist/core/render.js.map +1 -0
- package/dist/core/segment.d.ts +104 -0
- package/dist/core/segment.d.ts.map +1 -0
- package/dist/core/segment.js +364 -0
- package/dist/core/segment.js.map +1 -0
- package/dist/core/spinnerData.d.ts +11 -0
- package/dist/core/spinnerData.d.ts.map +1 -0
- package/dist/core/spinnerData.js +116 -0
- package/dist/core/spinnerData.js.map +1 -0
- package/dist/core/strip.d.ts +159 -0
- package/dist/core/strip.d.ts.map +1 -0
- package/dist/core/strip.js +237 -0
- package/dist/core/strip.js.map +1 -0
- package/dist/core/style.d.ts +115 -0
- package/dist/core/style.d.ts.map +1 -0
- package/dist/core/style.js +662 -0
- package/dist/core/style.js.map +1 -0
- package/dist/core/text.d.ts +91 -0
- package/dist/core/text.d.ts.map +1 -0
- package/dist/core/text.js +610 -0
- package/dist/core/text.js.map +1 -0
- package/dist/index.d.ts +99 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/renderables/align.d.ts +17 -0
- package/dist/renderables/align.d.ts.map +1 -0
- package/dist/renderables/align.js +47 -0
- package/dist/renderables/align.js.map +1 -0
- package/dist/renderables/columns.d.ts +28 -0
- package/dist/renderables/columns.d.ts.map +1 -0
- package/dist/renderables/columns.js +92 -0
- package/dist/renderables/columns.js.map +1 -0
- package/dist/renderables/constrain.d.ts +16 -0
- package/dist/renderables/constrain.d.ts.map +1 -0
- package/dist/renderables/constrain.js +38 -0
- package/dist/renderables/constrain.js.map +1 -0
- package/dist/renderables/flexStrip.d.ts +42 -0
- package/dist/renderables/flexStrip.d.ts.map +1 -0
- package/dist/renderables/flexStrip.js +201 -0
- package/dist/renderables/flexStrip.js.map +1 -0
- package/dist/renderables/group.d.ts +12 -0
- package/dist/renderables/group.d.ts.map +1 -0
- package/dist/renderables/group.js +16 -0
- package/dist/renderables/group.js.map +1 -0
- package/dist/renderables/json.d.ts +23 -0
- package/dist/renderables/json.d.ts.map +1 -0
- package/dist/renderables/json.js +49 -0
- package/dist/renderables/json.js.map +1 -0
- package/dist/renderables/layout.d.ts +37 -0
- package/dist/renderables/layout.d.ts.map +1 -0
- package/dist/renderables/layout.js +151 -0
- package/dist/renderables/layout.js.map +1 -0
- package/dist/renderables/live.d.ts +48 -0
- package/dist/renderables/live.d.ts.map +1 -0
- package/dist/renderables/live.js +131 -0
- package/dist/renderables/live.js.map +1 -0
- package/dist/renderables/markdown.d.ts +25 -0
- package/dist/renderables/markdown.d.ts.map +1 -0
- package/dist/renderables/markdown.js +190 -0
- package/dist/renderables/markdown.js.map +1 -0
- package/dist/renderables/padding.d.ts +26 -0
- package/dist/renderables/padding.d.ts.map +1 -0
- package/dist/renderables/padding.js +92 -0
- package/dist/renderables/padding.js.map +1 -0
- package/dist/renderables/panel.d.ts +42 -0
- package/dist/renderables/panel.d.ts.map +1 -0
- package/dist/renderables/panel.js +202 -0
- package/dist/renderables/panel.js.map +1 -0
- package/dist/renderables/pretty.d.ts +29 -0
- package/dist/renderables/pretty.d.ts.map +1 -0
- package/dist/renderables/pretty.js +141 -0
- package/dist/renderables/pretty.js.map +1 -0
- package/dist/renderables/progress.d.ts +91 -0
- package/dist/renderables/progress.d.ts.map +1 -0
- package/dist/renderables/progress.js +234 -0
- package/dist/renderables/progress.js.map +1 -0
- package/dist/renderables/progressBar.d.ts +32 -0
- package/dist/renderables/progressBar.d.ts.map +1 -0
- package/dist/renderables/progressBar.js +59 -0
- package/dist/renderables/progressBar.js.map +1 -0
- package/dist/renderables/prompt.d.ts +25 -0
- package/dist/renderables/prompt.d.ts.map +1 -0
- package/dist/renderables/prompt.js +109 -0
- package/dist/renderables/prompt.js.map +1 -0
- package/dist/renderables/rule.d.ts +25 -0
- package/dist/renderables/rule.d.ts.map +1 -0
- package/dist/renderables/rule.js +96 -0
- package/dist/renderables/rule.js.map +1 -0
- package/dist/renderables/spinner.d.ts +30 -0
- package/dist/renderables/spinner.d.ts.map +1 -0
- package/dist/renderables/spinner.js +70 -0
- package/dist/renderables/spinner.js.map +1 -0
- package/dist/renderables/status.d.ts +24 -0
- package/dist/renderables/status.d.ts.map +1 -0
- package/dist/renderables/status.js +67 -0
- package/dist/renderables/status.js.map +1 -0
- package/dist/renderables/syntax.d.ts +36 -0
- package/dist/renderables/syntax.d.ts.map +1 -0
- package/dist/renderables/syntax.js +115 -0
- package/dist/renderables/syntax.js.map +1 -0
- package/dist/renderables/table.d.ts +109 -0
- package/dist/renderables/table.d.ts.map +1 -0
- package/dist/renderables/table.js +434 -0
- package/dist/renderables/table.js.map +1 -0
- package/dist/renderables/traceback.d.ts +26 -0
- package/dist/renderables/traceback.d.ts.map +1 -0
- package/dist/renderables/traceback.js +108 -0
- package/dist/renderables/traceback.js.map +1 -0
- package/dist/renderables/tree.d.ts +30 -0
- package/dist/renderables/tree.d.ts.map +1 -0
- package/dist/renderables/tree.js +107 -0
- package/dist/renderables/tree.js.map +1 -0
- package/dist/template-bindings/index.d.ts +61 -0
- package/dist/template-bindings/index.d.ts.map +1 -0
- package/dist/template-bindings/index.js +70 -0
- package/dist/template-bindings/index.js.map +1 -0
- package/dist/template-bindings/style-funcs.d.ts +30 -0
- package/dist/template-bindings/style-funcs.d.ts.map +1 -0
- package/dist/template-bindings/style-funcs.js +172 -0
- package/dist/template-bindings/style-funcs.js.map +1 -0
- package/dist/themes/buildPalette.d.ts +31 -0
- package/dist/themes/buildPalette.d.ts.map +1 -0
- package/dist/themes/buildPalette.js +43 -0
- package/dist/themes/buildPalette.js.map +1 -0
- package/dist/themes/colorMath.d.ts +23 -0
- package/dist/themes/colorMath.d.ts.map +1 -0
- package/dist/themes/colorMath.js +99 -0
- package/dist/themes/colorMath.js.map +1 -0
- package/dist/themes/data/atom-one-dark.d.ts +4 -0
- package/dist/themes/data/atom-one-dark.d.ts.map +1 -0
- package/dist/themes/data/atom-one-dark.js +159 -0
- package/dist/themes/data/atom-one-dark.js.map +1 -0
- package/dist/themes/data/atom-one-light.d.ts +4 -0
- package/dist/themes/data/atom-one-light.d.ts.map +1 -0
- package/dist/themes/data/atom-one-light.js +159 -0
- package/dist/themes/data/atom-one-light.js.map +1 -0
- package/dist/themes/data/catppuccin-latte.d.ts +4 -0
- package/dist/themes/data/catppuccin-latte.d.ts.map +1 -0
- package/dist/themes/data/catppuccin-latte.js +159 -0
- package/dist/themes/data/catppuccin-latte.js.map +1 -0
- package/dist/themes/data/catppuccin-mocha.d.ts +4 -0
- package/dist/themes/data/catppuccin-mocha.d.ts.map +1 -0
- package/dist/themes/data/catppuccin-mocha.js +159 -0
- package/dist/themes/data/catppuccin-mocha.js.map +1 -0
- package/dist/themes/data/dracula.d.ts +4 -0
- package/dist/themes/data/dracula.d.ts.map +1 -0
- package/dist/themes/data/dracula.js +159 -0
- package/dist/themes/data/dracula.js.map +1 -0
- package/dist/themes/data/flexoki.d.ts +4 -0
- package/dist/themes/data/flexoki.d.ts.map +1 -0
- package/dist/themes/data/flexoki.js +159 -0
- package/dist/themes/data/flexoki.js.map +1 -0
- package/dist/themes/data/gruvbox.d.ts +4 -0
- package/dist/themes/data/gruvbox.d.ts.map +1 -0
- package/dist/themes/data/gruvbox.js +159 -0
- package/dist/themes/data/gruvbox.js.map +1 -0
- package/dist/themes/data/index.d.ts +29 -0
- package/dist/themes/data/index.d.ts.map +1 -0
- package/dist/themes/data/index.js +48 -0
- package/dist/themes/data/index.js.map +1 -0
- package/dist/themes/data/monokai.d.ts +4 -0
- package/dist/themes/data/monokai.d.ts.map +1 -0
- package/dist/themes/data/monokai.js +159 -0
- package/dist/themes/data/monokai.js.map +1 -0
- package/dist/themes/data/nord.d.ts +4 -0
- package/dist/themes/data/nord.d.ts.map +1 -0
- package/dist/themes/data/nord.js +159 -0
- package/dist/themes/data/nord.js.map +1 -0
- package/dist/themes/data/rose-pine-dawn.d.ts +4 -0
- package/dist/themes/data/rose-pine-dawn.d.ts.map +1 -0
- package/dist/themes/data/rose-pine-dawn.js +159 -0
- package/dist/themes/data/rose-pine-dawn.js.map +1 -0
- package/dist/themes/data/rose-pine-moon.d.ts +4 -0
- package/dist/themes/data/rose-pine-moon.d.ts.map +1 -0
- package/dist/themes/data/rose-pine-moon.js +159 -0
- package/dist/themes/data/rose-pine-moon.js.map +1 -0
- package/dist/themes/data/rose-pine.d.ts +4 -0
- package/dist/themes/data/rose-pine.d.ts.map +1 -0
- package/dist/themes/data/rose-pine.js +159 -0
- package/dist/themes/data/rose-pine.js.map +1 -0
- package/dist/themes/data/solarized-dark.d.ts +4 -0
- package/dist/themes/data/solarized-dark.d.ts.map +1 -0
- package/dist/themes/data/solarized-dark.js +159 -0
- package/dist/themes/data/solarized-dark.js.map +1 -0
- package/dist/themes/data/solarized-light.d.ts +4 -0
- package/dist/themes/data/solarized-light.d.ts.map +1 -0
- package/dist/themes/data/solarized-light.js +159 -0
- package/dist/themes/data/solarized-light.js.map +1 -0
- package/dist/themes/data/textual-ansi.d.ts +4 -0
- package/dist/themes/data/textual-ansi.d.ts.map +1 -0
- package/dist/themes/data/textual-ansi.js +159 -0
- package/dist/themes/data/textual-ansi.js.map +1 -0
- package/dist/themes/data/textual-dark.d.ts +4 -0
- package/dist/themes/data/textual-dark.d.ts.map +1 -0
- package/dist/themes/data/textual-dark.js +159 -0
- package/dist/themes/data/textual-dark.js.map +1 -0
- package/dist/themes/data/textual-light.d.ts +4 -0
- package/dist/themes/data/textual-light.d.ts.map +1 -0
- package/dist/themes/data/textual-light.js +159 -0
- package/dist/themes/data/textual-light.js.map +1 -0
- package/dist/themes/data/tokyo-night.d.ts +4 -0
- package/dist/themes/data/tokyo-night.d.ts.map +1 -0
- package/dist/themes/data/tokyo-night.js +159 -0
- package/dist/themes/data/tokyo-night.js.map +1 -0
- package/dist/themes/data/types.d.ts +15 -0
- package/dist/themes/data/types.d.ts.map +1 -0
- package/dist/themes/data/types.js +2 -0
- package/dist/themes/data/types.js.map +1 -0
- package/dist/themes/palette.d.ts +20 -0
- package/dist/themes/palette.d.ts.map +1 -0
- package/dist/themes/palette.js +27 -0
- package/dist/themes/palette.js.map +1 -0
- package/dist/themes/paletteResolver.d.ts +35 -0
- package/dist/themes/paletteResolver.d.ts.map +1 -0
- package/dist/themes/paletteResolver.js +88 -0
- package/dist/themes/paletteResolver.js.map +1 -0
- package/dist/themes/registry.d.ts +17 -0
- package/dist/themes/registry.d.ts.map +1 -0
- package/dist/themes/registry.js +33 -0
- package/dist/themes/registry.js.map +1 -0
- package/dist/themes/terminalThemes.d.ts +46 -0
- package/dist/themes/terminalThemes.d.ts.map +1 -0
- package/dist/themes/terminalThemes.js +268 -0
- package/dist/themes/terminalThemes.js.map +1 -0
- package/dist/widgets/button.d.ts +47 -0
- package/dist/widgets/button.d.ts.map +1 -0
- package/dist/widgets/button.js +183 -0
- package/dist/widgets/button.js.map +1 -0
- package/dist/widgets/checkbox.d.ts +43 -0
- package/dist/widgets/checkbox.d.ts.map +1 -0
- package/dist/widgets/checkbox.js +144 -0
- package/dist/widgets/checkbox.js.map +1 -0
- package/dist/widgets/dropdown.d.ts +67 -0
- package/dist/widgets/dropdown.d.ts.map +1 -0
- package/dist/widgets/dropdown.js +373 -0
- package/dist/widgets/dropdown.js.map +1 -0
- package/dist/widgets/event-router.d.ts +73 -0
- package/dist/widgets/event-router.d.ts.map +1 -0
- package/dist/widgets/event-router.js +479 -0
- package/dist/widgets/event-router.js.map +1 -0
- package/dist/widgets/focus-manager.d.ts +26 -0
- package/dist/widgets/focus-manager.d.ts.map +1 -0
- package/dist/widgets/focus-manager.js +179 -0
- package/dist/widgets/focus-manager.js.map +1 -0
- package/dist/widgets/index.d.ts +23 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/dist/widgets/index.js +13 -0
- package/dist/widgets/index.js.map +1 -0
- package/dist/widgets/screen.d.ts +90 -0
- package/dist/widgets/screen.d.ts.map +1 -0
- package/dist/widgets/screen.js +440 -0
- package/dist/widgets/screen.js.map +1 -0
- package/dist/widgets/slider.d.ts +55 -0
- package/dist/widgets/slider.d.ts.map +1 -0
- package/dist/widgets/slider.js +248 -0
- package/dist/widgets/slider.js.map +1 -0
- package/dist/widgets/static-item.d.ts +41 -0
- package/dist/widgets/static-item.d.ts.map +1 -0
- package/dist/widgets/static-item.js +62 -0
- package/dist/widgets/static-item.js.map +1 -0
- package/dist/widgets/text-input.d.ts +50 -0
- package/dist/widgets/text-input.d.ts.map +1 -0
- package/dist/widgets/text-input.js +242 -0
- package/dist/widgets/text-input.js.map +1 -0
- package/dist/widgets/toggle.d.ts +46 -0
- package/dist/widgets/toggle.d.ts.map +1 -0
- package/dist/widgets/toggle.js +169 -0
- package/dist/widgets/toggle.js.map +1 -0
- package/dist/widgets/types.d.ts +92 -0
- package/dist/widgets/types.d.ts.map +1 -0
- package/dist/widgets/types.js +13 -0
- package/dist/widgets/types.js.map +1 -0
- package/dist/widgets/widget-base.d.ts +41 -0
- package/dist/widgets/widget-base.d.ts.map +1 -0
- package/dist/widgets/widget-base.js +159 -0
- package/dist/widgets/widget-base.js.map +1 -0
- 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"}
|