Skip to main content

Event Types

XFrames events follow the React synthetic event pattern. Event data is available on event.nativeEvent. All event types are imported from @xframes/common.

import {
CheckboxChangeEvent,
ComboChangeEvent,
InputTextChangeEvent,
SliderChangeEvent,
MultiSliderChangeEvent,
TabItemChangeEvent,
TableSortEvent,
TableFilterEvent,
TableRowClickEvent,
TableItemActionEvent,
} from "@xframes/common";

Form control events

Form controls use the onChange prop. Each widget has its own event type with a specific nativeEvent shape.

CheckboxChangeEvent

Fired when a checkbox is toggled.

FieldTypeDescription
valuebooleanThe new checked state
const handleChange = useCallback((event: CheckboxChangeEvent) => {
console.log("Checked:", event.nativeEvent.value);
}, []);

<XFrames.Checkbox label="Enable" defaultChecked={false} onChange={handleChange} />

InputTextChangeEvent

Fired when text content changes. Used by both InputText and ColorPicker.

FieldTypeDescription
valuestringThe current text value
const handleChange = useCallback((event: InputTextChangeEvent) => {
console.log("Text:", event.nativeEvent.value);
}, []);

<XFrames.InputText defaultValue="" onChange={handleChange} />

Components: InputText, ColorPicker

ComboChangeEvent

Fired when a different option is selected in a dropdown.

FieldTypeDescription
valuenumberZero-based index of the selected option
const options = ["Red", "Green", "Blue"];

const handleChange = useCallback((event: ComboChangeEvent) => {
const selected = options[event.nativeEvent.value];
console.log("Selected:", selected);
}, []);

<XFrames.Combo options={options} initialSelectedIndex={0} onChange={handleChange} />

SliderChangeEvent

Fired when a slider value changes.

FieldTypeDescription
valuenumberThe new slider value
const handleChange = useCallback((event: SliderChangeEvent) => {
console.log("Value:", event.nativeEvent.value);
}, []);

<XFrames.Slider
defaultValue={50}
min={0}
max={100}
sliderType="default"
onChange={handleChange}
/>

MultiSliderChangeEvent

Fired when any handle in a multi-slider changes.

FieldTypeDescription
valuesPrimitive[]Array of all slider values (2, 3, or 4 elements)
const handleChange = useCallback((event: MultiSliderChangeEvent) => {
const [r, g, b] = event.nativeEvent.values;
console.log("RGB:", r, g, b);
}, []);

<XFrames.MultiSlider
numValues={3}
defaultValues={[128, 128, 128]}
min={0}
max={255}
onChange={handleChange}
/>

TabItemChangeEvent

Fired when a closeable tab's open state changes.

FieldTypeDescription
valuebooleanfalse when the tab is closed via the close button
const [showTab, setShowTab] = useState(true);

const handleChange = useCallback((event: TabItemChangeEvent) => {
if (!event.nativeEvent.value) {
setShowTab(false);
}
}, []);

<XFrames.TabItem label="Notes" closeable onChange={handleChange}>
{/* tab content */}
</XFrames.TabItem>

Table events

Table has four dedicated event types, each with its own prop name.

TableSortEvent

Fired when the user clicks a column header to sort. Sorting is handled internally by ImGui — this event is informational.

Prop: onSort

FieldTypeDescription
columnIndexnumberIndex of the sorted column
sortDirectionnumberSort direction (ascending or descending)
const handleSort = useCallback((event: TableSortEvent) => {
console.log(`Column ${event.nativeEvent.columnIndex} sorted, direction: ${event.nativeEvent.sortDirection}`);
}, []);

<XFrames.Table columns={columns} data={data} onSort={handleSort} />

TableFilterEvent

Fired when a column filter value changes. Filtering is handled internally — this event is informational.

Prop: onFilter

FieldTypeDescription
columnIndexnumberIndex of the filtered column
filterTextstringThe current filter text
const handleFilter = useCallback((event: TableFilterEvent) => {
console.log(`Column ${event.nativeEvent.columnIndex} filter: "${event.nativeEvent.filterText}"`);
}, []);

<XFrames.Table columns={columns} data={data} filterable onFilter={handleFilter} />

TableRowClickEvent

Fired when a table row is clicked.

Prop: onRowClick

FieldTypeDescription
rowIndexnumberZero-based index of the clicked row
const handleRowClick = useCallback((event: TableRowClickEvent) => {
console.log(`Row clicked: ${event.nativeEvent.rowIndex}`);
}, []);

<XFrames.Table columns={columns} data={data} onRowClick={handleRowClick} />

TableItemActionEvent

Fired when a context menu item is clicked on a table row. Requires the contextMenuItems prop.

Prop: onItemAction

FieldTypeDescription
rowIndexnumberZero-based index of the row
actionIdstringThe id of the clicked menu item
const menuItems = [
{ id: "edit", label: "Edit" },
{ id: "delete", label: "Delete" },
];

const handleAction = useCallback((event: TableItemActionEvent) => {
const { rowIndex, actionId } = event.nativeEvent;
console.log(`Action "${actionId}" on row ${rowIndex}`);
}, []);

<XFrames.Table
columns={columns}
data={data}
contextMenuItems={menuItems}
onItemAction={handleAction}
/>

Simple callbacks

Some components use plain callback props instead of synthetic events:

PropSignatureComponents
onClick() => voidButton, TreeNode, Node
<XFrames.Button label="Save" onClick={() => console.log("clicked")} />

Next steps