@opentui/solid 0.1.101 → 0.1.102

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 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 createSignal2, ErrorBoundary, For, onCleanup as onCleanup3, splitProps as splitProps2 } from "solid-js";
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] = createSignal2(0);
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.101",
7
+ "version": "0.1.102",
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.101",
38
+ "@opentui/core": "0.1.102",
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;