# 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
}>
Visible content
```
### Switch/Match
```tsx
import { Switch, Match } from "solid-js"
Loading...
Error!
Success!
```
### Index
```tsx
import { Index } from "solid-js"
{(item, index) => (
{index}: {item().name}
)}
```
## Special Components
### Portal
```tsx
import { Portal } from "@opentui/solid"
Portal content
```
### Dynamic
```tsx
import { Dynamic } from "@opentui/solid"
```