Skip to content

create

Creates a responsive table element with automatic column width adjustment and custom cell rendering.

Example

ts
import { Table, Text, Term } from "@monstermann/signals-tui";

interface User {
    id: number;
    name: string;
    email: string;
}

const users: User[] = [
    { id: 1, name: "Alice", email: "alice@example.com" },
    { id: 2, name: "Bob", email: "bob@example.com" },
];

const table = Table.create({
    row: 0,
    col: 0,
    width: 80,
    height: 20,
    columns: [
        { name: "id", minWidth: 5, align: "center" },
        { name: "name", minWidth: 10 },
        { name: "email" },
    ],
    data: users,
    getBodyCell: (ctx) => {
        return String(ctx.data[ctx.col]);
    },
    renderBodyCell: (ctx) => {
        return [Text.create(ctx.content)];
    },
});

Term.render(() => {
    table.render();
    // Or pass lines to a List element instead:
    // table.lines()
});

Options

ts
interface TableOptions<T extends object, U extends string>
    extends ElementOptions {
    columns: MaybeReactive<TableColumn<U>[]>;
    data: MaybeReactive<T[]>;
    gap?: MaybeReactive<Text[]>;
    getBodyCell: (ctx: {
        col: NoInfer<U>;
        colIdx: number;
        data: NoInfer<T>;
        rowIdx: number;
    }) => string;
    renderBodyCell?: (ctx: {
        col: NoInfer<U>;
        colIdx: number;
        content: string;
        data: NoInfer<T>;
        rawContent: string;
        rowIdx: number;
        width: number;
    }) => Text[];
}

Table

ts
interface Table<T extends object> extends Element {
    gap: Memo<number>;
    lines: Memo<TableLine<T>[]>;
    widths: Memo<number[]>;
    render: () => void;
}

interface TableLine<T extends object> {
    data: T;
    line: Text[];
}