Input components are interactive in the editor and control panel. On the OBS layer, they render as static display-only text showing their current value (since viewers can’t interact with the overlay).
A clickable button with variant styling.
<Button label="Save" onClick={() => handleSave()} />
<Button label="Reset Score" variant="destructive" onClick={() => setStorage({ ...storage, score: 0 })} />
<Button label="Secondary Action" variant="secondary" onClick={() => {}} />
<Button label="Outline Style" variant="outline" onClick={() => {}} />
variant
'default' | 'secondary' | 'outline' | 'destructive'
default:"default"
Visual style. Use "destructive" for dangerous actions like resets or
deletes.
Buttons don’t render at all on the OBS layer — there’s no one to click them.
TextField
Single-line text input with an optional label.
<TextField
label="Display Name"
placeholder="Enter a name..."
value={storage.name ?? ""}
onChange={(value) => setStorage({ ...storage, name: value })}
/>
Called when the value changes.
TextArea
Multi-line text input. Use for longer content like descriptions or messages.
<TextArea
label="Description"
placeholder="Write something..."
value={storage.description ?? ""}
rows={4}
onChange={(value) => setStorage({ ...storage, description: value })}
/>
Label above the textarea.
Called when the value changes.
NumberField
Numeric input with optional min, max, and step constraints.
<NumberField
label="Font Size"
value={storage.fontSize ?? 16}
min={8}
max={72}
step={1}
onChange={(value) => setStorage({ ...storage, fontSize: value })}
/>
Called when the value changes.
Toggle
On/off switch with an optional label.
<Toggle
label="Show on stream"
checked={storage.visible ?? false}
onChange={(checked) => setStorage({ ...storage, visible: checked })}
/>
Label next to the switch.
Whether the toggle is on.
onChange
(checked: boolean) => void
Called when toggled.
Dropdown
Select from a list of predefined options.
<Dropdown
label="Position"
value={storage.position ?? "top-left"}
options={[
{ label: "Top Left", value: "top-left" },
{ label: "Top Right", value: "top-right" },
{ label: "Bottom Left", value: "bottom-left" },
{ label: "Bottom Right", value: "bottom-right" },
]}
onChange={(value) => setStorage({ ...storage, position: value })}
/>
Currently selected value.
options
Array<{ label: string; value: string }>
required
Available options.
Called when selection changes.