@opentuah/solid
v0.1.95
Published
SolidJS renderer for OpenTUI
Readme
@opentuah/solid
Solid.js support for OpenTUI.
Installation
bun install solid-js @opentuah/solidUsage
- Add jsx config to tsconfig.json:
{
"compilerOptions": {
"jsx": "preserve",
"jsxImportSource": "@opentuah/solid"
}
}- Add preload script to bunfig.toml:
preload = ["@opentuah/solid/preload"]- Add render function to index.tsx:
import { render } from "@opentuah/solid"
render(() => <text>Hello, World!</text>)import solidPlugin from "@opentuah/solid/bun-plugin"
await Bun.build({
entrypoints: ["./index.tsx"],
target: "bun",
outdir: "./build",
plugins: [solidPlugin],
compile: {
target: "bun-darwin-arm64",
outfile: "app-macos",
},
})Table of Contents
Core Concepts
Components
OpenTUI Solid exposes intrinsic JSX elements that map to OpenTUI renderables:
- Layout & Display:
text,box,scrollbox,ascii_font - Input:
input,textarea,select,tab_select - Code & Diff:
code,line_number,diff - Text Modifiers:
span,strong,b,em,i,u,br,a
API Reference
render(node, rendererOrConfig?)
Render a Solid component tree into a CLI renderer. If rendererOrConfig is omitted, a renderer is created with default options.
import { render } from "@opentuah/solid"
render(() => <App />)Parameters:
node: Function returning a JSX element.rendererOrConfig?:CliRendererinstance orCliRendererConfig.
testRender(node, options?)
Create a test renderer for snapshots and interaction tests.
import { testRender } from "@opentuah/solid"
const testSetup = await testRender(() => <App />, { width: 40, height: 10 })extend(components)
Register custom renderables as JSX intrinsic elements.
import { extend } from "@opentuah/solid"
extend({ customBox: CustomBoxRenderable })getComponentCatalogue()
Returns the current component catalogue that powers JSX tag lookup.
Hooks
useRenderer()onResize(callback)useTerminalDimensions()useKeyboard(handler, options?)usePaste(handler)useSelectionHandler(handler)useTimeline(options?)
Portal
Render children into a different mount node, useful for overlays and tooltips.
import { Portal } from "@opentuah/solid"
;<Portal mount={renderer.root}>
<box border>Overlay</box>
</Portal>Dynamic
Render arbitrary intrinsic elements or components dynamically.
import { Dynamic } from "@opentuah/solid"
;<Dynamic component={isMultiline() ? "textarea" : "input"} />Components
Layout & Display
text: styled text containerbox: layout container with borders, padding, and flex settingsscrollbox: scrollable containerascii_font: ASCII art text renderer
Input
input: single-line text inputtextarea: multi-line text inputselect: list selectiontab_select: tab-based selection
Code & Diff
code: syntax-highlighted code blocksline_number: line-numbered code display with diff/diagnostic helpersdiff: unified or split diff viewer
Text Modifiers
These must appear inside a text component:
span: inline styled textstrong/b: bold textem/i: italic textu: underline textbr: line breaka: link text withhref
