@opentui/solid 0.1.101 → 0.1.103
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/dist/index.d.ts +10 -0
- package/index.d.ts +1 -0
- package/index.js +153 -2
- package/package.json +2 -2
- package/src/scrollback.d.ts +12 -0
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export function writeSolidToScrollback(renderer: any, node: any, options?: {}): void;
|
|
1
2
|
export function useTimeline(options?: {}): Timeline;
|
|
2
3
|
export function useTerminalDimensions(): import("solid-js").Accessor<{
|
|
3
4
|
width: any;
|
|
@@ -57,6 +58,15 @@ export var createTextNode: any;
|
|
|
57
58
|
export function createSolidSlotRegistry(renderer: any, context: any, options?: {}): import("@opentui/core").SlotRegistry<any, object, any>;
|
|
58
59
|
export function createSlotNode(): SlotRenderable;
|
|
59
60
|
export function createSlot(registry: any, options?: {}): (props: any) => any;
|
|
61
|
+
export function createScrollbackWriter(node: any, options?: {}): (ctx: any) => {
|
|
62
|
+
root: BoxRenderable;
|
|
63
|
+
width: number;
|
|
64
|
+
height: number;
|
|
65
|
+
rowColumns: any;
|
|
66
|
+
startOnNewLine: any;
|
|
67
|
+
trailingNewline: any;
|
|
68
|
+
teardown: () => void;
|
|
69
|
+
};
|
|
60
70
|
export var createElement: any;
|
|
61
71
|
export function createDynamic(component: any, props: any): import("solid-js").Accessor<any>;
|
|
62
72
|
declare var createComponent2: typeof createComponent;
|
package/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export declare const testRender: (node: () => JSX.Element, renderConfig?: TestRe
|
|
|
13
13
|
}>;
|
|
14
14
|
export * from "./src/reconciler.js";
|
|
15
15
|
export * from "./src/elements/index.js";
|
|
16
|
+
export * from "./src/scrollback.js";
|
|
16
17
|
export * from "./src/time-to-first-draw.js";
|
|
17
18
|
export * from "./src/plugins/slot.js";
|
|
18
19
|
export * from "./src/types/elements.js";
|
package/index.js
CHANGED
|
@@ -951,6 +951,155 @@ function extend(objects) {
|
|
|
951
951
|
function getComponentCatalogue() {
|
|
952
952
|
return componentCatalogue;
|
|
953
953
|
}
|
|
954
|
+
// src/scrollback.ts
|
|
955
|
+
import {
|
|
956
|
+
BoxRenderable as BoxRenderable2,
|
|
957
|
+
RootRenderable
|
|
958
|
+
} from "@opentui/core";
|
|
959
|
+
import { createSignal as createSignal2 } from "solid-js";
|
|
960
|
+
var solidScrollbackRootCounter = 0;
|
|
961
|
+
var MAX_AUTO_HEIGHT_PASSES = 4;
|
|
962
|
+
function normalizeSnapshotDimension(value, axis) {
|
|
963
|
+
if (value === undefined) {
|
|
964
|
+
return;
|
|
965
|
+
}
|
|
966
|
+
if (!Number.isFinite(value)) {
|
|
967
|
+
throw new Error(`createScrollbackWriter requires a finite ${axis}`);
|
|
968
|
+
}
|
|
969
|
+
return Math.max(1, Math.trunc(value));
|
|
970
|
+
}
|
|
971
|
+
function createSnapshotRendererValue(renderContext, root, width, height, firstLineOffset) {
|
|
972
|
+
const [snapshotWidth] = createSignal2(width);
|
|
973
|
+
const [snapshotHeight, setSnapshotHeight] = createSignal2(height);
|
|
974
|
+
const renderer = Object.create(renderContext);
|
|
975
|
+
let offset = firstLineOffset;
|
|
976
|
+
Object.defineProperties(renderer, {
|
|
977
|
+
root: {
|
|
978
|
+
value: root,
|
|
979
|
+
enumerable: true,
|
|
980
|
+
configurable: true
|
|
981
|
+
},
|
|
982
|
+
width: {
|
|
983
|
+
get: snapshotWidth,
|
|
984
|
+
enumerable: true,
|
|
985
|
+
configurable: true
|
|
986
|
+
},
|
|
987
|
+
height: {
|
|
988
|
+
get: snapshotHeight,
|
|
989
|
+
enumerable: true,
|
|
990
|
+
configurable: true
|
|
991
|
+
},
|
|
992
|
+
claimFirstLineOffset: {
|
|
993
|
+
value: () => {
|
|
994
|
+
const out = offset;
|
|
995
|
+
offset = 0;
|
|
996
|
+
return out;
|
|
997
|
+
},
|
|
998
|
+
enumerable: true,
|
|
999
|
+
configurable: true
|
|
1000
|
+
}
|
|
1001
|
+
});
|
|
1002
|
+
return {
|
|
1003
|
+
renderer,
|
|
1004
|
+
getHeight: snapshotHeight,
|
|
1005
|
+
setHeight(nextHeight) {
|
|
1006
|
+
setSnapshotHeight(nextHeight);
|
|
1007
|
+
renderer.emit("resize", snapshotWidth(), nextHeight);
|
|
1008
|
+
}
|
|
1009
|
+
};
|
|
1010
|
+
}
|
|
1011
|
+
function runLifecyclePasses(renderContext) {
|
|
1012
|
+
for (const renderable of renderContext.getLifecyclePasses()) {
|
|
1013
|
+
renderable.onLifecyclePass?.call(renderable);
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
function clearLifecyclePasses(renderContext) {
|
|
1017
|
+
for (const renderable of [...renderContext.getLifecyclePasses()]) {
|
|
1018
|
+
renderContext.unregisterLifecyclePass(renderable);
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
function measureSnapshotHeight(renderContext, root) {
|
|
1022
|
+
const measureRoot = new RootRenderable(renderContext);
|
|
1023
|
+
try {
|
|
1024
|
+
measureRoot.add(root);
|
|
1025
|
+
runLifecyclePasses(renderContext);
|
|
1026
|
+
measureRoot.calculateLayout();
|
|
1027
|
+
return Math.max(1, Math.trunc(root.getLayoutNode().getComputedLayout().height));
|
|
1028
|
+
} finally {
|
|
1029
|
+
if (root.parent === measureRoot) {
|
|
1030
|
+
measureRoot.remove(root.id);
|
|
1031
|
+
}
|
|
1032
|
+
measureRoot.destroyRecursively();
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
function resolveSnapshotHeight(renderContext, root, snapshotRenderer) {
|
|
1036
|
+
for (let pass = 0;pass < MAX_AUTO_HEIGHT_PASSES; pass++) {
|
|
1037
|
+
const measuredHeight = measureSnapshotHeight(renderContext, root);
|
|
1038
|
+
if (measuredHeight === snapshotRenderer.getHeight()) {
|
|
1039
|
+
clearLifecyclePasses(renderContext);
|
|
1040
|
+
return measuredHeight;
|
|
1041
|
+
}
|
|
1042
|
+
snapshotRenderer.setHeight(measuredHeight);
|
|
1043
|
+
}
|
|
1044
|
+
return measureSnapshotHeight(renderContext, root);
|
|
1045
|
+
}
|
|
1046
|
+
function createScrollbackWriter(node, options = {}) {
|
|
1047
|
+
return (ctx) => {
|
|
1048
|
+
const width = normalizeSnapshotDimension(options.width, "width") ?? Math.max(1, Math.trunc(ctx.width));
|
|
1049
|
+
const height = normalizeSnapshotDimension(options.height, "height");
|
|
1050
|
+
const startOnNewLine = options.startOnNewLine ?? true;
|
|
1051
|
+
const firstLineWidth = !startOnNewLine && ctx.tailColumn > 0 && ctx.tailColumn < ctx.width ? Math.min(width, ctx.width - ctx.tailColumn) : width;
|
|
1052
|
+
const firstLineOffset = width - firstLineWidth;
|
|
1053
|
+
const root = new BoxRenderable2(ctx.renderContext, {
|
|
1054
|
+
id: `solid-scrollback-root-${solidScrollbackRootCounter++}`,
|
|
1055
|
+
position: "absolute",
|
|
1056
|
+
left: 0,
|
|
1057
|
+
top: 0,
|
|
1058
|
+
width,
|
|
1059
|
+
height: height ?? "auto",
|
|
1060
|
+
border: false,
|
|
1061
|
+
backgroundColor: "transparent",
|
|
1062
|
+
shouldFill: false,
|
|
1063
|
+
flexDirection: "column"
|
|
1064
|
+
});
|
|
1065
|
+
const snapshotRenderer = createSnapshotRendererValue(ctx.renderContext, root, width, height ?? Math.max(1, ctx.renderContext.height), firstLineOffset);
|
|
1066
|
+
let dispose;
|
|
1067
|
+
let disposed = false;
|
|
1068
|
+
const teardown = () => {
|
|
1069
|
+
if (disposed) {
|
|
1070
|
+
return;
|
|
1071
|
+
}
|
|
1072
|
+
disposed = true;
|
|
1073
|
+
dispose?.();
|
|
1074
|
+
};
|
|
1075
|
+
try {
|
|
1076
|
+
dispose = _render(() => createComponent2(RendererContext.Provider, {
|
|
1077
|
+
get value() {
|
|
1078
|
+
return snapshotRenderer.renderer;
|
|
1079
|
+
},
|
|
1080
|
+
get children() {
|
|
1081
|
+
return node(ctx);
|
|
1082
|
+
}
|
|
1083
|
+
}), root);
|
|
1084
|
+
return {
|
|
1085
|
+
root,
|
|
1086
|
+
width,
|
|
1087
|
+
height: height ?? resolveSnapshotHeight(ctx.renderContext, root, snapshotRenderer),
|
|
1088
|
+
rowColumns: options.rowColumns,
|
|
1089
|
+
startOnNewLine,
|
|
1090
|
+
trailingNewline: options.trailingNewline,
|
|
1091
|
+
teardown
|
|
1092
|
+
};
|
|
1093
|
+
} catch (error) {
|
|
1094
|
+
teardown();
|
|
1095
|
+
root.destroyRecursively();
|
|
1096
|
+
throw error;
|
|
1097
|
+
}
|
|
1098
|
+
};
|
|
1099
|
+
}
|
|
1100
|
+
function writeSolidToScrollback(renderer, node, options = {}) {
|
|
1101
|
+
renderer.writeToScrollback(createScrollbackWriter(node, options));
|
|
1102
|
+
}
|
|
954
1103
|
// src/time-to-first-draw.tsx
|
|
955
1104
|
import { TimeToFirstDrawRenderable } from "@opentui/core";
|
|
956
1105
|
extend({
|
|
@@ -965,7 +1114,7 @@ var TimeToFirstDraw = (props) => {
|
|
|
965
1114
|
};
|
|
966
1115
|
// src/plugins/slot.tsx
|
|
967
1116
|
import { createSlotRegistry } from "@opentui/core";
|
|
968
|
-
import { children, createMemo as createMemo3, createSignal as
|
|
1117
|
+
import { children, createMemo as createMemo3, createSignal as createSignal3, ErrorBoundary, For, onCleanup as onCleanup3, splitProps as splitProps2 } from "solid-js";
|
|
969
1118
|
var EMPTY_ENTRY_IDS = [];
|
|
970
1119
|
function createSolidSlotRegistry(renderer, context, options = {}) {
|
|
971
1120
|
return createSlotRegistry(renderer, "solid:slot-registry", context, options);
|
|
@@ -984,7 +1133,7 @@ function Slot(props) {
|
|
|
984
1133
|
const [local, slotProps] = splitProps2(props, ["registry", "name", "mode", "children", "pluginFailurePlaceholder"]);
|
|
985
1134
|
const registry = () => local.registry;
|
|
986
1135
|
const pluginFailurePlaceholder = () => local.pluginFailurePlaceholder;
|
|
987
|
-
const [version, setVersion] =
|
|
1136
|
+
const [version, setVersion] = createSignal3(0);
|
|
988
1137
|
let queued = false;
|
|
989
1138
|
let disposed = false;
|
|
990
1139
|
const unsubscribe = registry().subscribe(() => {
|
|
@@ -1202,6 +1351,7 @@ var testRender = async (node, renderConfig = {}) => {
|
|
|
1202
1351
|
return testSetup;
|
|
1203
1352
|
};
|
|
1204
1353
|
export {
|
|
1354
|
+
writeSolidToScrollback,
|
|
1205
1355
|
useTimeline,
|
|
1206
1356
|
useTerminalDimensions,
|
|
1207
1357
|
useSelectionHandler,
|
|
@@ -1229,6 +1379,7 @@ export {
|
|
|
1229
1379
|
createSolidSlotRegistry,
|
|
1230
1380
|
createSlotNode,
|
|
1231
1381
|
createSlot,
|
|
1382
|
+
createScrollbackWriter,
|
|
1232
1383
|
createElement,
|
|
1233
1384
|
createDynamic,
|
|
1234
1385
|
createComponent2 as createComponent,
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"version": "0.1.
|
|
7
|
+
"version": "0.1.103",
|
|
8
8
|
"description": "SolidJS renderer for OpenTUI",
|
|
9
9
|
"license": "MIT",
|
|
10
10
|
"repository": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@babel/core": "7.28.0",
|
|
37
37
|
"@babel/preset-typescript": "7.27.1",
|
|
38
|
-
"@opentui/core": "0.1.
|
|
38
|
+
"@opentui/core": "0.1.103",
|
|
39
39
|
"babel-plugin-module-resolver": "5.0.2",
|
|
40
40
|
"babel-preset-solid": "1.9.10",
|
|
41
41
|
"entities": "7.0.1",
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type CliRenderer, type ScrollbackRenderContext, type ScrollbackWriter } from "@opentui/core";
|
|
2
|
+
import { type JSX } from "solid-js";
|
|
3
|
+
export interface SolidScrollbackWriterOptions {
|
|
4
|
+
width?: number;
|
|
5
|
+
height?: number;
|
|
6
|
+
rowColumns?: number;
|
|
7
|
+
startOnNewLine?: boolean;
|
|
8
|
+
trailingNewline?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export type SolidScrollbackNode = (ctx: ScrollbackRenderContext) => JSX.Element;
|
|
11
|
+
export declare function createScrollbackWriter(node: SolidScrollbackNode, options?: SolidScrollbackWriterOptions): ScrollbackWriter;
|
|
12
|
+
export declare function writeSolidToScrollback(renderer: CliRenderer, node: SolidScrollbackNode, options?: SolidScrollbackWriterOptions): void;
|