# Solid API Reference ## Rendering ### render(node, rendererOrConfig?) Renders a Solid component tree into a CLI renderer. ```tsx import { render } from "@opentui/solid" // Simple usage - creates renderer automatically render(() => ) // With config render(() => , { exitOnCtrlC: false, targetFPS: 60, }) // With existing renderer import { createCliRenderer } from "@opentui/core" const renderer = await createCliRenderer() render(() => , renderer) ``` ### testRender(node, options?) Create a test renderer for snapshots and tests. ```tsx import { testRender } from "@opentui/solid" const testSetup = await testRender(() => , { width: 40, height: 10, }) // Access test utilities testSetup.snapshot() // Get current render testSetup.renderer // Access renderer ``` ### extend(components) Register custom renderables as JSX intrinsic elements. ```tsx import { extend } from "@opentui/solid" import { CustomRenderable } from "./custom" extend({ custom: CustomRenderable, }) // Now usable in JSX ``` ### getComponentCatalogue() Returns the current component catalogue. ```tsx import { getComponentCatalogue } from "@opentui/solid" const catalogue = getComponentCatalogue() console.log(Object.keys(catalogue)) ``` ## Hooks ### useRenderer() Access the OpenTUI renderer instance. ```tsx import { useRenderer } from "@opentui/solid" import { onMount } from "solid-js" function App() { const renderer = useRenderer() onMount(() => { console.log(`Terminal: ${renderer.width}x${renderer.height}`) renderer.console.show() }) return Hello } ``` ### useKeyboard(handler, options?) Handle keyboard events. ```tsx import { useKeyboard, useRenderer } from "@opentui/solid" function App() { const renderer = useRenderer() useKeyboard((key) => { if (key.name === "escape") { renderer.destroy() // Never use process.exit() directly! } if (key.ctrl && key.name === "s") { saveDocument() } }) return Press ESC to exit } // With release events function GameControls() { const [pressed, setPressed] = createSignal(new Set()) useKeyboard( (event) => { setPressed(keys => { const newKeys = new Set(keys) if (event.eventType === "release") { newKeys.delete(event.name) } else { newKeys.add(event.name) } return newKeys }) }, { release: true } ) return Pressed: {Array.from(pressed()).join(", ")} } ``` ### usePaste(handler) Handle paste events. ```tsx import { usePaste } from "@opentui/solid" function PasteHandler() { usePaste((text) => { console.log("Pasted:", text) }) return Paste something } ``` ### onResize(callback) Handle terminal resize events. ```tsx import { onResize } from "@opentui/solid" function App() { onResize((width, height) => { console.log(`Resized to ${width}x${height}`) }) return Resize the terminal } ``` ### useTerminalDimensions() Get reactive terminal dimensions. ```tsx import { useTerminalDimensions } from "@opentui/solid" function ResponsiveLayout() { const dimensions = useTerminalDimensions() return ( 80 ? "row" : "column"}> Width: {dimensions().width} Height: {dimensions().height} ) } ``` ### useSelectionHandler(handler) Handle text selection events. ```tsx import { useSelectionHandler } from "@opentui/solid" function SelectableText() { useSelectionHandler((selection) => { console.log("Selected:", selection.text) }) return Select this text } ``` ### useTimeline(options?) Create animations with the timeline system. ```tsx import { useTimeline } from "@opentui/solid" import { createSignal, onMount } from "solid-js" function AnimatedBox() { const [width, setWidth] = createSignal(0) const timeline = useTimeline({ duration: 2000, loop: false, }) onMount(() => { timeline.add( { width: 0 }, { width: 50, duration: 2000, ease: "easeOutQuad", onUpdate: (anim) => { setWidth(Math.round(anim.targets[0].width)) }, } ) }) return } ``` ## Components ### Text Component ```tsx {/* Use nested modifier tags for styling */} Red Bold Italic Underline
Link
``` > **Note**: Do NOT use `bold`, `italic`, `underline` as props on ``. Use nested modifier tags like ``, ``, `` instead. ### Box Component ```tsx {}} onMouseUp={(e) => {}} > {children} ``` ### Scrollbox Component ```tsx {(item) => {item}} ``` ### Input Component ```tsx setValue(newValue)} placeholder="Enter text..." focused width={30} /> ``` ### Textarea Component ```tsx