@effect-tui/react 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +138 -0
- package/dist/jsx-dev-runtime.d.ts +3 -0
- package/dist/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/jsx-dev-runtime.js +3 -0
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.d.ts +47 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +6 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/src/codeblock.d.ts +9 -0
- package/dist/src/codeblock.d.ts.map +1 -0
- package/dist/src/codeblock.js +24 -0
- package/dist/src/codeblock.js.map +1 -0
- package/dist/src/constants.d.ts +3 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +3 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/debug/DiagnosticsPanel.d.ts +7 -0
- package/dist/src/debug/DiagnosticsPanel.d.ts.map +1 -0
- package/dist/src/debug/DiagnosticsPanel.js +13 -0
- package/dist/src/debug/DiagnosticsPanel.js.map +1 -0
- package/dist/src/highlight.d.ts +20 -0
- package/dist/src/highlight.d.ts.map +1 -0
- package/dist/src/highlight.js +51 -0
- package/dist/src/highlight.js.map +1 -0
- package/dist/src/hooks/index.d.ts +4 -0
- package/dist/src/hooks/index.d.ts.map +1 -0
- package/dist/src/hooks/index.js +3 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/use-keyboard.d.ts +18 -0
- package/dist/src/hooks/use-keyboard.d.ts.map +1 -0
- package/dist/src/hooks/use-keyboard.js +26 -0
- package/dist/src/hooks/use-keyboard.js.map +1 -0
- package/dist/src/hooks/use-paste.d.ts +5 -0
- package/dist/src/hooks/use-paste.d.ts.map +1 -0
- package/dist/src/hooks/use-paste.js +14 -0
- package/dist/src/hooks/use-paste.js.map +1 -0
- package/dist/src/hooks/useFrameStats.d.ts +7 -0
- package/dist/src/hooks/useFrameStats.d.ts.map +1 -0
- package/dist/src/hooks/useFrameStats.js +28 -0
- package/dist/src/hooks/useFrameStats.js.map +1 -0
- package/dist/src/hosts/base.d.ts +22 -0
- package/dist/src/hosts/base.d.ts.map +1 -0
- package/dist/src/hosts/base.js +53 -0
- package/dist/src/hosts/base.js.map +1 -0
- package/dist/src/hosts/box.d.ts +26 -0
- package/dist/src/hosts/box.d.ts.map +1 -0
- package/dist/src/hosts/box.js +84 -0
- package/dist/src/hosts/box.js.map +1 -0
- package/dist/src/hosts/canvas.d.ts +48 -0
- package/dist/src/hosts/canvas.d.ts.map +1 -0
- package/dist/src/hosts/canvas.js +109 -0
- package/dist/src/hosts/canvas.js.map +1 -0
- package/dist/src/hosts/codeblock.d.ts +32 -0
- package/dist/src/hosts/codeblock.d.ts.map +1 -0
- package/dist/src/hosts/codeblock.js +118 -0
- package/dist/src/hosts/codeblock.js.map +1 -0
- package/dist/src/hosts/hstack.d.ts +18 -0
- package/dist/src/hosts/hstack.d.ts.map +1 -0
- package/dist/src/hosts/hstack.js +45 -0
- package/dist/src/hosts/hstack.js.map +1 -0
- package/dist/src/hosts/index.d.ts +16 -0
- package/dist/src/hosts/index.d.ts.map +1 -0
- package/dist/src/hosts/index.js +40 -0
- package/dist/src/hosts/index.js.map +1 -0
- package/dist/src/hosts/spacer.d.ts +19 -0
- package/dist/src/hosts/spacer.d.ts.map +1 -0
- package/dist/src/hosts/spacer.js +28 -0
- package/dist/src/hosts/spacer.js.map +1 -0
- package/dist/src/hosts/text.d.ts +43 -0
- package/dist/src/hosts/text.d.ts.map +1 -0
- package/dist/src/hosts/text.js +148 -0
- package/dist/src/hosts/text.js.map +1 -0
- package/dist/src/hosts/vstack.d.ts +18 -0
- package/dist/src/hosts/vstack.d.ts.map +1 -0
- package/dist/src/hosts/vstack.js +45 -0
- package/dist/src/hosts/vstack.js.map +1 -0
- package/dist/src/hosts/zstack.d.ts +20 -0
- package/dist/src/hosts/zstack.d.ts.map +1 -0
- package/dist/src/hosts/zstack.js +65 -0
- package/dist/src/hosts/zstack.js.map +1 -0
- package/dist/src/index.d.ts +20 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/inline/index.d.ts +32 -0
- package/dist/src/inline/index.d.ts.map +1 -0
- package/dist/src/inline/index.js +111 -0
- package/dist/src/inline/index.js.map +1 -0
- package/dist/src/jsx.d.ts +2 -0
- package/dist/src/jsx.d.ts.map +1 -0
- package/dist/src/jsx.js +4 -0
- package/dist/src/jsx.js.map +1 -0
- package/dist/src/motion/color-motion-value.d.ts +32 -0
- package/dist/src/motion/color-motion-value.d.ts.map +1 -0
- package/dist/src/motion/color-motion-value.js +80 -0
- package/dist/src/motion/color-motion-value.js.map +1 -0
- package/dist/src/motion/color.d.ts +30 -0
- package/dist/src/motion/color.d.ts.map +1 -0
- package/dist/src/motion/color.js +172 -0
- package/dist/src/motion/color.js.map +1 -0
- package/dist/src/motion/color.test.d.ts +2 -0
- package/dist/src/motion/color.test.d.ts.map +1 -0
- package/dist/src/motion/color.test.js +97 -0
- package/dist/src/motion/color.test.js.map +1 -0
- package/dist/src/motion/event-emitter.d.ts +18 -0
- package/dist/src/motion/event-emitter.d.ts.map +1 -0
- package/dist/src/motion/event-emitter.js +30 -0
- package/dist/src/motion/event-emitter.js.map +1 -0
- package/dist/src/motion/frame.d.ts +9 -0
- package/dist/src/motion/frame.d.ts.map +1 -0
- package/dist/src/motion/frame.js +51 -0
- package/dist/src/motion/frame.js.map +1 -0
- package/dist/src/motion/hooks.d.ts +75 -0
- package/dist/src/motion/hooks.d.ts.map +1 -0
- package/dist/src/motion/hooks.js +190 -0
- package/dist/src/motion/hooks.js.map +1 -0
- package/dist/src/motion/index.d.ts +4 -0
- package/dist/src/motion/index.d.ts.map +1 -0
- package/dist/src/motion/index.js +7 -0
- package/dist/src/motion/index.js.map +1 -0
- package/dist/src/motion/motion-value.d.ts +40 -0
- package/dist/src/motion/motion-value.d.ts.map +1 -0
- package/dist/src/motion/motion-value.js +109 -0
- package/dist/src/motion/motion-value.js.map +1 -0
- package/dist/src/motion/motion-value.test.d.ts +2 -0
- package/dist/src/motion/motion-value.test.d.ts.map +1 -0
- package/dist/src/motion/motion-value.test.js +177 -0
- package/dist/src/motion/motion-value.test.js.map +1 -0
- package/dist/src/motion/spring-math.d.ts +28 -0
- package/dist/src/motion/spring-math.d.ts.map +1 -0
- package/dist/src/motion/spring-math.js +81 -0
- package/dist/src/motion/spring-math.js.map +1 -0
- package/dist/src/motion/types.d.ts +25 -0
- package/dist/src/motion/types.d.ts.map +1 -0
- package/dist/src/motion/types.js +13 -0
- package/dist/src/motion/types.js.map +1 -0
- package/dist/src/output.d.ts +47 -0
- package/dist/src/output.d.ts.map +1 -0
- package/dist/src/output.js +125 -0
- package/dist/src/output.js.map +1 -0
- package/dist/src/profiler.d.ts +6 -0
- package/dist/src/profiler.d.ts.map +1 -0
- package/dist/src/profiler.js +73 -0
- package/dist/src/profiler.js.map +1 -0
- package/dist/src/reconciler/host-config.d.ts +16 -0
- package/dist/src/reconciler/host-config.d.ts.map +1 -0
- package/dist/src/reconciler/host-config.js +174 -0
- package/dist/src/reconciler/host-config.js.map +1 -0
- package/dist/src/reconciler/types.d.ts +52 -0
- package/dist/src/reconciler/types.d.ts.map +1 -0
- package/dist/src/reconciler/types.js +2 -0
- package/dist/src/reconciler/types.js.map +1 -0
- package/dist/src/renderer.d.ts +101 -0
- package/dist/src/renderer.d.ts.map +1 -0
- package/dist/src/renderer.js +509 -0
- package/dist/src/renderer.js.map +1 -0
- package/dist/src/terminal.d.ts +37 -0
- package/dist/src/terminal.d.ts.map +1 -0
- package/dist/src/terminal.js +65 -0
- package/dist/src/terminal.js.map +1 -0
- package/dist/src/test/index.d.ts +3 -0
- package/dist/src/test/index.d.ts.map +1 -0
- package/dist/src/test/index.js +3 -0
- package/dist/src/test/index.js.map +1 -0
- package/dist/src/test/mock-streams.d.ts +44 -0
- package/dist/src/test/mock-streams.d.ts.map +1 -0
- package/dist/src/test/mock-streams.js +136 -0
- package/dist/src/test/mock-streams.js.map +1 -0
- package/dist/src/test/render-tui.d.ts +47 -0
- package/dist/src/test/render-tui.d.ts.map +1 -0
- package/dist/src/test/render-tui.js +76 -0
- package/dist/src/test/render-tui.js.map +1 -0
- package/dist/src/trace/SpanTree.d.ts +10 -0
- package/dist/src/trace/SpanTree.d.ts.map +1 -0
- package/dist/src/trace/SpanTree.js +104 -0
- package/dist/src/trace/SpanTree.js.map +1 -0
- package/dist/src/trace/index.d.ts +30 -0
- package/dist/src/trace/index.d.ts.map +1 -0
- package/dist/src/trace/index.js +142 -0
- package/dist/src/trace/index.js.map +1 -0
- package/dist/src/trace/location.d.ts +9 -0
- package/dist/src/trace/location.d.ts.map +1 -0
- package/dist/src/trace/location.js +88 -0
- package/dist/src/trace/location.js.map +1 -0
- package/dist/src/trace/span-processor.d.ts +16 -0
- package/dist/src/trace/span-processor.d.ts.map +1 -0
- package/dist/src/trace/span-processor.js +54 -0
- package/dist/src/trace/span-processor.js.map +1 -0
- package/dist/src/trace/span-state.d.ts +79 -0
- package/dist/src/trace/span-state.d.ts.map +1 -0
- package/dist/src/trace/span-state.js +229 -0
- package/dist/src/trace/span-state.js.map +1 -0
- package/dist/src/trace/tui-logger.d.ts +8 -0
- package/dist/src/trace/tui-logger.d.ts.map +1 -0
- package/dist/src/trace/tui-logger.js +70 -0
- package/dist/src/trace/tui-logger.js.map +1 -0
- package/dist/src/utils/border.d.ts +31 -0
- package/dist/src/utils/border.d.ts.map +1 -0
- package/dist/src/utils/border.js +81 -0
- package/dist/src/utils/border.js.map +1 -0
- package/dist/src/utils/flex-layout.d.ts +20 -0
- package/dist/src/utils/flex-layout.d.ts.map +1 -0
- package/dist/src/utils/flex-layout.js +85 -0
- package/dist/src/utils/flex-layout.js.map +1 -0
- package/dist/src/utils/index.d.ts +5 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +5 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/padding.d.ts +26 -0
- package/dist/src/utils/padding.d.ts.map +1 -0
- package/dist/src/utils/padding.js +34 -0
- package/dist/src/utils/padding.js.map +1 -0
- package/dist/src/utils/styles.d.ts +13 -0
- package/dist/src/utils/styles.d.ts.map +1 -0
- package/dist/src/utils/styles.js +5 -0
- package/dist/src/utils/styles.js.map +1 -0
- package/dist/src/visualize/index.d.ts +50 -0
- package/dist/src/visualize/index.d.ts.map +1 -0
- package/dist/src/visualize/index.js +194 -0
- package/dist/src/visualize/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +94 -0
- package/src/codeblock.tsx +47 -0
- package/src/constants.ts +2 -0
- package/src/debug/DiagnosticsPanel.tsx +38 -0
- package/src/highlight.ts +76 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/use-keyboard.ts +37 -0
- package/src/hooks/use-paste.ts +14 -0
- package/src/hooks/useFrameStats.ts +32 -0
- package/src/hosts/base.ts +65 -0
- package/src/hosts/box.ts +105 -0
- package/src/hosts/canvas.ts +155 -0
- package/src/hosts/codeblock.ts +145 -0
- package/src/hosts/hstack.ts +64 -0
- package/src/hosts/index.ts +45 -0
- package/src/hosts/spacer.ts +40 -0
- package/src/hosts/text.ts +175 -0
- package/src/hosts/vstack.ts +64 -0
- package/src/hosts/zstack.ts +77 -0
- package/src/index.ts +62 -0
- package/src/inline/index.tsx +181 -0
- package/src/jsx.ts +3 -0
- package/src/motion/color-motion-value.ts +90 -0
- package/src/motion/color.test.ts +115 -0
- package/src/motion/color.ts +191 -0
- package/src/motion/event-emitter.ts +35 -0
- package/src/motion/frame.ts +59 -0
- package/src/motion/hooks.ts +237 -0
- package/src/motion/index.ts +17 -0
- package/src/motion/motion-value.test.ts +222 -0
- package/src/motion/motion-value.ts +140 -0
- package/src/motion/spring-math.ts +114 -0
- package/src/motion/types.ts +34 -0
- package/src/output.ts +156 -0
- package/src/profiler.ts +88 -0
- package/src/reconciler/host-config.ts +277 -0
- package/src/reconciler/types.ts +66 -0
- package/src/renderer.ts +661 -0
- package/src/terminal.ts +67 -0
- package/src/test/index.ts +8 -0
- package/src/test/mock-streams.ts +149 -0
- package/src/test/render-tui.ts +118 -0
- package/src/trace/SpanTree.tsx +195 -0
- package/src/trace/index.tsx +205 -0
- package/src/trace/location.ts +90 -0
- package/src/trace/span-processor.ts +65 -0
- package/src/trace/span-state.ts +286 -0
- package/src/trace/tui-logger.ts +72 -0
- package/src/utils/border.ts +108 -0
- package/src/utils/flex-layout.ts +125 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/padding.ts +45 -0
- package/src/utils/styles.ts +14 -0
- package/src/visualize/index.tsx +305 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Border utilities shared between box and canvas hosts.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get border characters for a given border style.
|
|
6
|
+
* Returns empty strings for "none" (drawing code should skip when border is "none").
|
|
7
|
+
*/
|
|
8
|
+
export function borderChars(kind) {
|
|
9
|
+
switch (kind) {
|
|
10
|
+
case "rounded":
|
|
11
|
+
return { tl: "╭", tr: "╮", bl: "╰", br: "╯", h: "─", v: "│" };
|
|
12
|
+
case "square":
|
|
13
|
+
return { tl: "┌", tr: "┐", bl: "└", br: "┘", h: "─", v: "│" };
|
|
14
|
+
case "ascii":
|
|
15
|
+
return { tl: "+", tr: "+", bl: "+", br: "+", h: "-", v: "|" };
|
|
16
|
+
default:
|
|
17
|
+
return { tl: "", tr: "", bl: "", br: "", h: "", v: "" };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Draw a border around a rectangle.
|
|
22
|
+
* If clip is provided, only draws within the clip bounds (for canvas).
|
|
23
|
+
* If clip is not provided, draws the full border (for box).
|
|
24
|
+
*/
|
|
25
|
+
export function drawBorder(buffer, x, y, w, h, chars, style, clip) {
|
|
26
|
+
if (w < 2 || h < 2)
|
|
27
|
+
return;
|
|
28
|
+
const tlcp = chars.tl.codePointAt(0);
|
|
29
|
+
const trcp = chars.tr.codePointAt(0);
|
|
30
|
+
const blcp = chars.bl.codePointAt(0);
|
|
31
|
+
const brcp = chars.br.codePointAt(0);
|
|
32
|
+
const hcp = chars.h.codePointAt(0);
|
|
33
|
+
const vcp = chars.v.codePointAt(0);
|
|
34
|
+
if (clip) {
|
|
35
|
+
// Clipped drawing (for canvas)
|
|
36
|
+
const { ox, oy, w: cw, h: ch } = clip;
|
|
37
|
+
const inBounds = (px, py) => px >= ox && px < ox + cw && py >= oy && py < oy + ch;
|
|
38
|
+
// Corners
|
|
39
|
+
if (inBounds(x, y))
|
|
40
|
+
buffer.drawCP(x, y, tlcp, style);
|
|
41
|
+
if (inBounds(x + w - 1, y))
|
|
42
|
+
buffer.drawCP(x + w - 1, y, trcp, style);
|
|
43
|
+
if (inBounds(x, y + h - 1))
|
|
44
|
+
buffer.drawCP(x, y + h - 1, blcp, style);
|
|
45
|
+
if (inBounds(x + w - 1, y + h - 1))
|
|
46
|
+
buffer.drawCP(x + w - 1, y + h - 1, brcp, style);
|
|
47
|
+
// Horizontal lines
|
|
48
|
+
for (let col = 1; col < w - 1; col++) {
|
|
49
|
+
const xx = x + col;
|
|
50
|
+
if (inBounds(xx, y))
|
|
51
|
+
buffer.drawCP(xx, y, hcp, style);
|
|
52
|
+
if (inBounds(xx, y + h - 1))
|
|
53
|
+
buffer.drawCP(xx, y + h - 1, hcp, style);
|
|
54
|
+
}
|
|
55
|
+
// Vertical lines
|
|
56
|
+
for (let row = 1; row < h - 1; row++) {
|
|
57
|
+
const yy = y + row;
|
|
58
|
+
if (inBounds(x, yy))
|
|
59
|
+
buffer.drawCP(x, yy, vcp, style);
|
|
60
|
+
if (inBounds(x + w - 1, yy))
|
|
61
|
+
buffer.drawCP(x + w - 1, yy, vcp, style);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// Full drawing (for box)
|
|
66
|
+
// Corners
|
|
67
|
+
buffer.drawCP(x, y, tlcp, style);
|
|
68
|
+
buffer.drawCP(x + w - 1, y, trcp, style);
|
|
69
|
+
buffer.drawCP(x, y + h - 1, blcp, style);
|
|
70
|
+
buffer.drawCP(x + w - 1, y + h - 1, brcp, style);
|
|
71
|
+
// Horizontal lines
|
|
72
|
+
buffer.fillRect(x + 1, y, w - 2, 1, hcp, style);
|
|
73
|
+
buffer.fillRect(x + 1, y + h - 1, w - 2, 1, hcp, style);
|
|
74
|
+
// Vertical lines
|
|
75
|
+
for (let yy = y + 1; yy < y + h - 1; yy++) {
|
|
76
|
+
buffer.drawCP(x, yy, vcp, style);
|
|
77
|
+
buffer.drawCP(x + w - 1, yy, vcp, style);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=border.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"border.js","sourceRoot":"","sources":["../../../src/utils/border.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic flex layout algorithm for VStack and HStack.
|
|
3
|
+
*/
|
|
4
|
+
import type { HostInstance, Rect, Size } from "../reconciler/types.js";
|
|
5
|
+
export type FlexAxis = "vertical" | "horizontal";
|
|
6
|
+
export type FlexAlignment = "start" | "center" | "end";
|
|
7
|
+
export interface FlexMeasureResult {
|
|
8
|
+
sizes: Size[];
|
|
9
|
+
totalSize: Size;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Measure children along a flex axis.
|
|
13
|
+
* Returns cached sizes and total size.
|
|
14
|
+
*/
|
|
15
|
+
export declare function measureFlex(axis: FlexAxis, children: HostInstance[], spacing: number, maxMain: number, maxCross: number): FlexMeasureResult;
|
|
16
|
+
/**
|
|
17
|
+
* Layout children along a flex axis using cached sizes.
|
|
18
|
+
*/
|
|
19
|
+
export declare function layoutFlex(axis: FlexAxis, children: HostInstance[], cachedSizes: Size[], rect: Rect, spacing: number, alignment: FlexAlignment, stretchCross: boolean): void;
|
|
20
|
+
//# sourceMappingURL=flex-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flex-layout.d.ts","sourceRoot":"","sources":["../../../src/utils/flex-layout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAGtE,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAA;AAChD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAA;AAEtD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,SAAS,EAAE,IAAI,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,iBAAiB,CA2BnB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,YAAY,EAAE,EACxB,WAAW,EAAE,IAAI,EAAE,EACnB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,aAAa,EACxB,YAAY,EAAE,OAAO,GACpB,IAAI,CA2DN"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic flex layout algorithm for VStack and HStack.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Measure children along a flex axis.
|
|
6
|
+
* Returns cached sizes and total size.
|
|
7
|
+
*/
|
|
8
|
+
export function measureFlex(axis, children, spacing, maxMain, maxCross) {
|
|
9
|
+
const sizes = [];
|
|
10
|
+
let totalMain = 0;
|
|
11
|
+
let maxChildCross = 0;
|
|
12
|
+
for (let i = 0; i < children.length; i++) {
|
|
13
|
+
const child = children[i];
|
|
14
|
+
const remainingMain = Math.max(0, maxMain - totalMain);
|
|
15
|
+
// For vertical: maxW=maxCross, maxH=remainingMain
|
|
16
|
+
// For horizontal: maxW=remainingMain, maxH=maxCross
|
|
17
|
+
const [childMaxW, childMaxH] = axis === "vertical" ? [maxCross, remainingMain] : [remainingMain, maxCross];
|
|
18
|
+
const size = child.measure(childMaxW, childMaxH);
|
|
19
|
+
sizes.push(size);
|
|
20
|
+
const childMain = axis === "vertical" ? size.h : size.w;
|
|
21
|
+
const childCross = axis === "vertical" ? size.w : size.h;
|
|
22
|
+
totalMain += childMain;
|
|
23
|
+
if (i < children.length - 1)
|
|
24
|
+
totalMain += spacing;
|
|
25
|
+
maxChildCross = Math.max(maxChildCross, childCross);
|
|
26
|
+
}
|
|
27
|
+
const totalSize = axis === "vertical" ? { w: maxChildCross, h: totalMain } : { w: totalMain, h: maxChildCross };
|
|
28
|
+
return { sizes, totalSize };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Layout children along a flex axis using cached sizes.
|
|
32
|
+
*/
|
|
33
|
+
export function layoutFlex(axis, children, cachedSizes, rect, spacing, alignment, stretchCross) {
|
|
34
|
+
// Calculate totals
|
|
35
|
+
let totalNaturalMain = 0;
|
|
36
|
+
let totalFlexGrow = 0;
|
|
37
|
+
const totalSpacing = Math.max(0, (children.length - 1) * spacing);
|
|
38
|
+
for (let i = 0; i < children.length; i++) {
|
|
39
|
+
const child = children[i];
|
|
40
|
+
const size = cachedSizes[i] ?? child.measure(rect.w, rect.h);
|
|
41
|
+
const childMain = axis === "vertical" ? size.h : size.w;
|
|
42
|
+
totalNaturalMain += childMain;
|
|
43
|
+
totalFlexGrow += child.flexGrow ?? 0;
|
|
44
|
+
}
|
|
45
|
+
// Calculate extra space to distribute
|
|
46
|
+
const availableMain = axis === "vertical" ? rect.h : rect.w;
|
|
47
|
+
const extraSpace = Math.max(0, availableMain - totalNaturalMain - totalSpacing);
|
|
48
|
+
// Layout children
|
|
49
|
+
let mainPos = axis === "vertical" ? rect.y : rect.x;
|
|
50
|
+
for (let i = 0; i < children.length; i++) {
|
|
51
|
+
const child = children[i];
|
|
52
|
+
const size = cachedSizes[i] ?? { w: 0, h: 0 };
|
|
53
|
+
const flexGrow = child.flexGrow ?? 0;
|
|
54
|
+
const flexExtra = totalFlexGrow > 0 ? (extraSpace * flexGrow) / totalFlexGrow : 0;
|
|
55
|
+
const childMain = (axis === "vertical" ? size.h : size.w) + flexExtra;
|
|
56
|
+
const childCross = axis === "vertical" ? size.w : size.h;
|
|
57
|
+
const crossSize = axis === "vertical" ? rect.w : rect.h;
|
|
58
|
+
const crossStart = axis === "vertical" ? rect.x : rect.y;
|
|
59
|
+
// Calculate cross position based on alignment
|
|
60
|
+
let crossPos = crossStart;
|
|
61
|
+
if (alignment === "center") {
|
|
62
|
+
crossPos = crossStart + Math.floor((crossSize - childCross) / 2);
|
|
63
|
+
}
|
|
64
|
+
else if (alignment === "end") {
|
|
65
|
+
crossPos = crossStart + crossSize - childCross;
|
|
66
|
+
}
|
|
67
|
+
// Build child rect
|
|
68
|
+
const childRect = axis === "vertical"
|
|
69
|
+
? {
|
|
70
|
+
x: crossPos,
|
|
71
|
+
y: mainPos,
|
|
72
|
+
w: stretchCross ? crossSize : childCross,
|
|
73
|
+
h: childMain,
|
|
74
|
+
}
|
|
75
|
+
: {
|
|
76
|
+
x: mainPos,
|
|
77
|
+
y: crossPos,
|
|
78
|
+
w: childMain,
|
|
79
|
+
h: stretchCross ? crossSize : childCross,
|
|
80
|
+
};
|
|
81
|
+
child.layout(childRect);
|
|
82
|
+
mainPos += childMain + spacing;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=flex-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flex-layout.js","sourceRoot":"","sources":["../../../src/utils/flex-layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { type BorderKind, type BorderChars, borderChars, type ClipRect, drawBorder } from "./border.js";
|
|
2
|
+
export { type Padding, type PaddingInput, resolvePadding } from "./padding.js";
|
|
3
|
+
export { type StyleOptions } from "./styles.js";
|
|
4
|
+
export { type FlexAxis, type FlexAlignment, type FlexMeasureResult, measureFlex, layoutFlex } from "./flex-layout.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACvG,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,WAAW,EAAiB,UAAU,EAAE,MAAM,aAAa,CAAA;AACvG,OAAO,EAAmC,cAAc,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EAAqB,MAAM,aAAa,CAAA;AAC/C,OAAO,EAA6D,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Padding utilities shared between box, canvas, and codeblock hosts.
|
|
3
|
+
*/
|
|
4
|
+
export interface Padding {
|
|
5
|
+
top: number;
|
|
6
|
+
right: number;
|
|
7
|
+
bottom: number;
|
|
8
|
+
left: number;
|
|
9
|
+
}
|
|
10
|
+
export type PaddingInput = number | {
|
|
11
|
+
x?: number;
|
|
12
|
+
y?: number;
|
|
13
|
+
top?: number;
|
|
14
|
+
right?: number;
|
|
15
|
+
bottom?: number;
|
|
16
|
+
left?: number;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Resolve padding input to a normalized Padding object.
|
|
20
|
+
* Supports:
|
|
21
|
+
* - number: uniform padding on all sides
|
|
22
|
+
* - { x, y }: horizontal and vertical padding
|
|
23
|
+
* - { top, right, bottom, left }: individual sides
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolvePadding(p?: PaddingInput): Padding;
|
|
26
|
+
//# sourceMappingURL=padding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"padding.d.ts","sourceRoot":"","sources":["../../../src/utils/padding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,MAAM,YAAY,GACpB,MAAM,GACN;IAAE,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5F;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAsBxD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Padding utilities shared between box, canvas, and codeblock hosts.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Resolve padding input to a normalized Padding object.
|
|
6
|
+
* Supports:
|
|
7
|
+
* - number: uniform padding on all sides
|
|
8
|
+
* - { x, y }: horizontal and vertical padding
|
|
9
|
+
* - { top, right, bottom, left }: individual sides
|
|
10
|
+
*/
|
|
11
|
+
export function resolvePadding(p) {
|
|
12
|
+
if (p === undefined) {
|
|
13
|
+
return { top: 0, right: 0, bottom: 0, left: 0 };
|
|
14
|
+
}
|
|
15
|
+
if (typeof p === "number") {
|
|
16
|
+
return { top: p, right: p, bottom: p, left: p };
|
|
17
|
+
}
|
|
18
|
+
// x/y shorthand takes precedence if specified
|
|
19
|
+
if (p.x !== undefined || p.y !== undefined) {
|
|
20
|
+
return {
|
|
21
|
+
top: p.y ?? 0,
|
|
22
|
+
bottom: p.y ?? 0,
|
|
23
|
+
left: p.x ?? 0,
|
|
24
|
+
right: p.x ?? 0,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
top: p.top ?? 0,
|
|
29
|
+
right: p.right ?? 0,
|
|
30
|
+
bottom: p.bottom ?? 0,
|
|
31
|
+
left: p.left ?? 0,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=padding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"padding.js","sourceRoot":"","sources":["../../../src/utils/padding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,CAAgB;IAC7C,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpB,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;IACjD,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;IACjD,CAAC;IACD,8CAA8C;IAC9C,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO;YACL,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACb,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACd,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAChB,CAAA;IACH,CAAC;IACD,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;QACnB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;QACrB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;KAClB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Style utilities for building palette-compatible style objects.
|
|
3
|
+
*/
|
|
4
|
+
import type { ColorValue } from "@effect-tui/core";
|
|
5
|
+
export interface StyleOptions {
|
|
6
|
+
fg?: ColorValue;
|
|
7
|
+
bg?: ColorValue;
|
|
8
|
+
bold?: boolean;
|
|
9
|
+
italic?: boolean;
|
|
10
|
+
underline?: boolean;
|
|
11
|
+
inverse?: boolean;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/utils/styles.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/utils/styles.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
interface VisualizeOptions {
|
|
3
|
+
/** Show the result value below completion status */
|
|
4
|
+
showResult?: boolean;
|
|
5
|
+
}
|
|
6
|
+
interface InlineRendererService {
|
|
7
|
+
readonly stdout: NodeJS.WriteStream;
|
|
8
|
+
readonly stdin: NodeJS.ReadStream;
|
|
9
|
+
}
|
|
10
|
+
declare const InlineRenderer_base: Context.TagClass<InlineRenderer, "@effect-tui/react/InlineRenderer", InlineRendererService>;
|
|
11
|
+
/**
|
|
12
|
+
* Service that manages terminal state for inline rendering.
|
|
13
|
+
* Hides cursor on acquire, shows cursor on release.
|
|
14
|
+
*/
|
|
15
|
+
export declare class InlineRenderer extends InlineRenderer_base {
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Layer that provides InlineRenderer service.
|
|
19
|
+
* Manages terminal state: hides cursor on start, restores on finalize.
|
|
20
|
+
*/
|
|
21
|
+
export declare const InlineRendererLive: Layer.Layer<InlineRenderer>;
|
|
22
|
+
/**
|
|
23
|
+
* Wrap an Effect with inline visualization.
|
|
24
|
+
* Shows a spinner while running, then success/failure status.
|
|
25
|
+
* Returns the effect's result or propagates its error.
|
|
26
|
+
*
|
|
27
|
+
* Requires InlineRenderer service (use InlineRendererLive layer).
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* const program = Effect.gen(function* () {
|
|
32
|
+
* const result = yield* visualize("Fetching data", fetchData)
|
|
33
|
+
* yield* visualize("Processing", processData(result))
|
|
34
|
+
* }).pipe(Effect.provide(InlineRendererLive))
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare const visualize: <A, E, R>(label: string, effect: Effect.Effect<A, E, R>, options?: VisualizeOptions) => Effect.Effect<A, E, R | InlineRenderer>;
|
|
38
|
+
/**
|
|
39
|
+
* Self-contained visualize that manages its own terminal state.
|
|
40
|
+
* Use this for single visualize() calls. For multiple sequential calls,
|
|
41
|
+
* use visualize() with InlineRendererLive layer for better cursor handling.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* const result = yield* visualizeSingle("Fetching data", fetchData)
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare const visualizeSingle: <A, E, R>(label: string, effect: Effect.Effect<A, E, R>, options?: VisualizeOptions) => Effect.Effect<A, E, R>;
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/visualize/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAS,OAAO,EAAY,MAAM,EAAe,KAAK,EAAU,MAAM,QAAQ,CAAA;AAYrF,UAAU,gBAAgB;IACxB,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AA2HD,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAA;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAA;CAClC;;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAGjC;CAAG;AAEN;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,CA2B1D,CAAA;AAMD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAC/B,OAAO,MAAM,EACb,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,UAAU,gBAAgB,KACzB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,cAAc,CAuErC,CAAA;AAMJ;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EACrC,OAAO,MAAM,EACb,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,UAAU,gBAAgB,KACzB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAC6F,CAAA"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@effect-tui/react/jsx-runtime";
|
|
2
|
+
// Effect visualization wrapper using React
|
|
3
|
+
// Uses Effect Layer for proper terminal state management across multiple calls
|
|
4
|
+
import { useState, useEffect } from "react";
|
|
5
|
+
import { Cause, Context, Duration, Effect, Exit, Fiber, Layer, Option } from "effect";
|
|
6
|
+
import { Colors } from "@effect-tui/core";
|
|
7
|
+
import { createRenderer, createRoot } from "../renderer.js";
|
|
8
|
+
import { ANSI } from "../terminal.js";
|
|
9
|
+
const SPINNER_FRAMES = ["⠋", "⠙", "⠸", "⠴", "⠦", "⠇"];
|
|
10
|
+
const SPIN_INTERVAL_MS = 80;
|
|
11
|
+
const ELAPSED_INTERVAL_MS = 16;
|
|
12
|
+
const COMPLETION_DELAY_MS = 360;
|
|
13
|
+
// Bridges Effect execution with React rendering
|
|
14
|
+
class VisualizerState {
|
|
15
|
+
status = "pending";
|
|
16
|
+
spinnerIndex = 0;
|
|
17
|
+
elapsedMs = 0;
|
|
18
|
+
errorSummary;
|
|
19
|
+
result;
|
|
20
|
+
showResult = false;
|
|
21
|
+
listeners = new Set();
|
|
22
|
+
update(patch) {
|
|
23
|
+
Object.assign(this, patch);
|
|
24
|
+
this.listeners.forEach((l) => l());
|
|
25
|
+
}
|
|
26
|
+
subscribe(listener) {
|
|
27
|
+
this.listeners.add(listener);
|
|
28
|
+
return () => this.listeners.delete(listener);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const formatDuration = (ms) => Duration.format(Duration.millis(Math.max(0, Math.round(ms))));
|
|
32
|
+
const formatResult = (value) => {
|
|
33
|
+
if (value === undefined)
|
|
34
|
+
return "undefined";
|
|
35
|
+
if (value === null)
|
|
36
|
+
return "null";
|
|
37
|
+
if (typeof value === "string")
|
|
38
|
+
return JSON.stringify(value);
|
|
39
|
+
if (typeof value === "number" || typeof value === "boolean")
|
|
40
|
+
return String(value);
|
|
41
|
+
try {
|
|
42
|
+
return JSON.stringify(value);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return String(value);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const summarizeCause = (cause) => {
|
|
49
|
+
const failure = Cause.failureOption(cause);
|
|
50
|
+
if (Option.isSome(failure)) {
|
|
51
|
+
const error = failure.value;
|
|
52
|
+
if (error && typeof error === "object" && "_tag" in error && "message" in error) {
|
|
53
|
+
const message = String(error.message).trim();
|
|
54
|
+
return message ? `${error._tag}: ${message}` : String(error._tag);
|
|
55
|
+
}
|
|
56
|
+
if (error && typeof error === "object" && "message" in error) {
|
|
57
|
+
return String(error.message);
|
|
58
|
+
}
|
|
59
|
+
return String(error);
|
|
60
|
+
}
|
|
61
|
+
const pretty = Cause.pretty(cause, { renderErrorCause: false });
|
|
62
|
+
const firstLine = pretty.split("\n").find((line) => line.trim().length > 0);
|
|
63
|
+
return firstLine ?? "Unknown failure";
|
|
64
|
+
};
|
|
65
|
+
function Visualizer({ state, label }) {
|
|
66
|
+
const [, forceUpdate] = useState(0);
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
return state.subscribe(() => forceUpdate((n) => n + 1));
|
|
69
|
+
}, [state]);
|
|
70
|
+
const elapsed = formatDuration(state.elapsedMs);
|
|
71
|
+
if (state.status === "pending") {
|
|
72
|
+
return (_jsxs("vstack", { children: [_jsxs("hstack", { spacing: 1, children: [_jsx("text", { fg: Colors.brightCyan, children: SPINNER_FRAMES[state.spinnerIndex] }), _jsx("text", { bold: true, fg: Colors.brightWhite, children: label })] }), _jsxs("text", { fg: Colors.gray(10), children: ["\u2514 Running\u2026 ", elapsed] })] }));
|
|
73
|
+
}
|
|
74
|
+
if (state.status === "success") {
|
|
75
|
+
const showingResult = state.showResult && state.result !== undefined;
|
|
76
|
+
return (_jsxs("vstack", { children: [_jsxs("hstack", { spacing: 1, children: [_jsx("text", { bold: true, fg: Colors.brightGreen, children: "\u2713" }), _jsx("text", { bold: true, fg: Colors.brightGreen, children: label })] }), showingResult && _jsxs("text", { fg: Colors.gray(20), children: ["\u251C ", formatResult(state.result)] }), _jsxs("text", { fg: Colors.green, children: [showingResult ? "└" : "└", " Completed in ", elapsed] })] }));
|
|
77
|
+
}
|
|
78
|
+
// failure
|
|
79
|
+
return (_jsxs("vstack", { children: [_jsxs("hstack", { spacing: 1, children: [_jsx("text", { bold: true, fg: Colors.brightRed, children: "\u2717" }), _jsx("text", { bold: true, fg: Colors.brightRed, children: label })] }), _jsxs("text", { fg: Colors.red, children: ["\u251C ", state.errorSummary ?? "Failed"] }), _jsxs("text", { fg: Colors.red, children: ["\u2514 Failed after ", elapsed] })] }));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Service that manages terminal state for inline rendering.
|
|
83
|
+
* Hides cursor on acquire, shows cursor on release.
|
|
84
|
+
*/
|
|
85
|
+
export class InlineRenderer extends Context.Tag("@effect-tui/react/InlineRenderer")() {
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Layer that provides InlineRenderer service.
|
|
89
|
+
* Manages terminal state: hides cursor on start, restores on finalize.
|
|
90
|
+
*/
|
|
91
|
+
export const InlineRendererLive = Layer.scoped(InlineRenderer, Effect.gen(function* () {
|
|
92
|
+
const stdout = process.stdout;
|
|
93
|
+
const stdin = process.stdin;
|
|
94
|
+
// Setup: hide cursor, enable raw mode
|
|
95
|
+
stdout.write(ANSI.cursor.hide);
|
|
96
|
+
if (stdin.isTTY && stdin.setRawMode) {
|
|
97
|
+
stdin.setRawMode(true);
|
|
98
|
+
stdin.resume();
|
|
99
|
+
}
|
|
100
|
+
// Teardown on scope close: show cursor, disable raw mode, pause stdin
|
|
101
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => {
|
|
102
|
+
stdout.write(ANSI.cursor.show);
|
|
103
|
+
if (stdin.isTTY && stdin.setRawMode) {
|
|
104
|
+
stdin.setRawMode(false);
|
|
105
|
+
}
|
|
106
|
+
// Pause stdin so Node can exit
|
|
107
|
+
stdin.pause();
|
|
108
|
+
}));
|
|
109
|
+
return { stdout, stdin };
|
|
110
|
+
}));
|
|
111
|
+
// ============================================================================
|
|
112
|
+
// visualize() - uses InlineRenderer service
|
|
113
|
+
// ============================================================================
|
|
114
|
+
/**
|
|
115
|
+
* Wrap an Effect with inline visualization.
|
|
116
|
+
* Shows a spinner while running, then success/failure status.
|
|
117
|
+
* Returns the effect's result or propagates its error.
|
|
118
|
+
*
|
|
119
|
+
* Requires InlineRenderer service (use InlineRendererLive layer).
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```ts
|
|
123
|
+
* const program = Effect.gen(function* () {
|
|
124
|
+
* const result = yield* visualize("Fetching data", fetchData)
|
|
125
|
+
* yield* visualize("Processing", processData(result))
|
|
126
|
+
* }).pipe(Effect.provide(InlineRendererLive))
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
export const visualize = (label, effect, options) => Effect.gen(function* () {
|
|
130
|
+
const { stdout, stdin } = yield* InlineRenderer;
|
|
131
|
+
// Create renderer with skipTerminalSetup (Layer manages terminal state)
|
|
132
|
+
const renderer = createRenderer({
|
|
133
|
+
mode: "inline",
|
|
134
|
+
stdout,
|
|
135
|
+
stdin,
|
|
136
|
+
skipTerminalSetup: true,
|
|
137
|
+
});
|
|
138
|
+
const root = createRoot(renderer);
|
|
139
|
+
const state = new VisualizerState();
|
|
140
|
+
state.showResult = options?.showResult ?? false;
|
|
141
|
+
// Mount React component
|
|
142
|
+
root.render(_jsx(Visualizer, { state: state, label: label }));
|
|
143
|
+
// Spinner tick fiber
|
|
144
|
+
const startTime = Date.now();
|
|
145
|
+
const spinnerFiber = yield* Effect.fork(Effect.forever(Effect.gen(function* () {
|
|
146
|
+
yield* Effect.sleep(SPIN_INTERVAL_MS);
|
|
147
|
+
state.update({
|
|
148
|
+
spinnerIndex: (state.spinnerIndex + 1) % SPINNER_FRAMES.length,
|
|
149
|
+
});
|
|
150
|
+
renderer.requestRender();
|
|
151
|
+
})));
|
|
152
|
+
// High-frequency elapsed timer so duration display stays smooth
|
|
153
|
+
const elapsedFiber = yield* Effect.fork(Effect.forever(Effect.gen(function* () {
|
|
154
|
+
yield* Effect.sleep(ELAPSED_INTERVAL_MS);
|
|
155
|
+
state.update({ elapsedMs: Date.now() - startTime });
|
|
156
|
+
renderer.requestRender();
|
|
157
|
+
})));
|
|
158
|
+
// Run the actual effect
|
|
159
|
+
const exit = yield* Effect.exit(effect);
|
|
160
|
+
// Stop spinner, update state to final
|
|
161
|
+
yield* Fiber.interrupt(spinnerFiber);
|
|
162
|
+
yield* Fiber.interrupt(elapsedFiber);
|
|
163
|
+
const isSuccess = Exit.isSuccess(exit);
|
|
164
|
+
state.update(isSuccess
|
|
165
|
+
? { status: "success", elapsedMs: Date.now() - startTime, result: exit.value }
|
|
166
|
+
: { status: "failure", elapsedMs: Date.now() - startTime, errorSummary: summarizeCause(exit.cause) });
|
|
167
|
+
renderer.requestRender();
|
|
168
|
+
renderer.flush(); // Ensure final state is rendered
|
|
169
|
+
// Wait for completion animation
|
|
170
|
+
yield* Effect.sleep(COMPLETION_DELAY_MS);
|
|
171
|
+
// Stop renderer (doesn't touch terminal state since skipTerminalSetup)
|
|
172
|
+
renderer.stop();
|
|
173
|
+
// Write newline to advance cursor past the output
|
|
174
|
+
stdout.write("\n");
|
|
175
|
+
// Return result or propagate failure
|
|
176
|
+
if (Exit.isSuccess(exit))
|
|
177
|
+
return exit.value;
|
|
178
|
+
return yield* Effect.failCause(exit.cause);
|
|
179
|
+
});
|
|
180
|
+
// ============================================================================
|
|
181
|
+
// Convenience: self-contained visualize that provides its own layer
|
|
182
|
+
// ============================================================================
|
|
183
|
+
/**
|
|
184
|
+
* Self-contained visualize that manages its own terminal state.
|
|
185
|
+
* Use this for single visualize() calls. For multiple sequential calls,
|
|
186
|
+
* use visualize() with InlineRendererLive layer for better cursor handling.
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* ```ts
|
|
190
|
+
* const result = yield* visualizeSingle("Fetching data", fetchData)
|
|
191
|
+
* ```
|
|
192
|
+
*/
|
|
193
|
+
export const visualizeSingle = (label, effect, options) => Effect.scoped(visualize(label, effect, options).pipe(Effect.provide(InlineRendererLive)));
|
|
194
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/visualize/index.tsx"],"names":[],"mappings":"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"}
|