@@ -0,0 +1,117 @@
1+let nativeRenderLibrary;
2+const textEncoder = new TextEncoder();
3+
4+const renderLibrary = () => {
5+ nativeRenderLibrary ??= resolveRenderLib();
6+ return nativeRenderLibrary;
7+};
8+
9+const subscribe = (target, event, callback) => () => {
10+ const listener = () => callback();
11+ target.on(event, listener);
12+ return () => target.off(event, listener);
13+};
14+
15+export const createBox = renderer => options => renderAfter => () => {
16+ const renderable = new BoxRenderable(renderer, {
17+ width: options.width,
18+ height: options.height,
19+ flexShrink: options.flexShrink,
20+ backgroundColor: options.backgroundColor,
21+ renderAfter(buffer) {
22+ renderAfter(this)(buffer)();
23+ },
24+ });
25+ renderable.focusable = options.focusable;
26+ return renderable;
27+};
28+
29+export const metrics = renderer => () => {
30+ const resolution = renderer.resolution;
31+ return {
32+ columns: renderer.terminalWidth,
33+ rows: renderer.terminalHeight,
34+ width: renderer.width,
35+ height: renderer.height,
36+ resolution: resolution === null ? null : {
37+ width: resolution.width,
38+ height: resolution.height,
39+ },
40+ };
41+};
42+
43+export const bounds = renderable => () => ({
44+ x: renderable.screenX,
45+ y: renderable.screenY,
46+ width: renderable.width,
47+ height: renderable.height,
48+ visible: renderable.visible,
49+ destroyed: renderable.isDestroyed,
50+ focused: renderable.focused,
51+});
52+
53+export const capabilities = renderer => () => {
54+ const terminalCapabilities = renderer.capabilities;
55+ return terminalCapabilities === null ? null : {
56+ kittyGraphics: terminalCapabilities.kitty_graphics,
57+ rgb: terminalCapabilities.rgb,
58+ remote: terminalCapabilities.remote,
59+ multiplexer: terminalCapabilities.multiplexer !== "none",
60+ };
61+};
62+
63+export const controlState = renderer => () => renderer.controlState;
64+
65+export const isDestroyed = renderer => () => renderer.isDestroyed;
66+
67+export const focused = renderer => () => renderer.currentFocusedRenderable;
68+
69+export const focus = renderable => () => {
70+ renderable.focus();
71+};
72+
73+export const blur = renderable => () => {
74+ renderable.blur();
75+};
76+
77+export const setHeight = renderable => height => () => {
78+ renderable.height = height;
79+};
80+
81+export const requestRender = renderer => () => {
82+ renderer.requestRender();
83+};
84+
85+export const writeControl = renderer => control => () => {
86+ renderLibrary().writeOut(renderer.rendererPtr, textEncoder.encode(control));
87+};
88+
89+export const prependInputHandler = renderer => callback => () => {
90+ const handler = sequence => callback(sequence)();
91+ renderer.prependInputHandler(handler);
92+ return () => renderer.removeInputHandler(handler);
93+};
94+
95+export const onFrame = renderer => callback => subscribe(renderer, "frame", callback);
96+
97+export const onResize = renderer => callback => subscribe(renderer, "resize", callback);
98+
99+export const onRendererDestroy = renderer => callback => subscribe(renderer, "destroy", callback);
100+
101+export const onDestroyed = renderable => callback => subscribe(renderable, "destroyed", callback);
102+
103+export const rgba = red => green => blue => alpha => RGBA.fromInts(red, green, blue, alpha);
104+
105+export const drawText = buffer => text => x => y => foreground => background => () => {
106+ buffer.drawText(text, x, y, foreground, background, 0);
107+};
108+
109+export const pushScissor = buffer => rect => () => {
110+ buffer.pushScissorRect(rect.x, rect.y, rect.width, rect.height);
111+};
112+
113+export const popScissor = buffer => () => {
114+ buffer.popScissorRect();
115+};
116+
117+import { BoxRenderable, RGBA, resolveRenderLib } from "@opentui/core";