import { type CSSProperties, type ReactElement, type PropsWithChildren } from "react";
import { type Key, type Keyed } from "@synnaxlabs/x";
import { type ItemFrameProps } from './Item';
import { type ItemProps } from './types';
import { Text } from '../text';
import { type RenderProp } from '../util/renderProp';
type RenderF<K extends Key = Key, E extends Keyed<K> = Keyed<K>> = RenderProp<{
    key: string | number | symbol;
    entry: E;
    style: CSSProperties;
}>;
export interface ColumnSpec<K extends Key = Key, E extends Keyed<K> = Keyed<K>> {
    /** The key of the object to render. */
    key: keyof E | string;
    /** A custom render function for each item in the colummn. */
    render?: RenderF<K, E>;
    stringer?: (entry: E) => string;
    /** The name/title of the column. */
    name: string;
    /** Whether the column is visible by default. */
    visible?: boolean;
    /**
     * The width of the column in pixels. Used to structure the list as a table.
     * If not provided, the column will be sized to fit the content. This should
     * always be specified when the render function is provided.
     */
    width?: number;
    cWidth?: number;
    shade?: Text.Shade;
}
interface ColumnContextValue<K extends Key = Key, E extends Keyed<K> = Keyed<K>> {
    columns: Array<ColumnSpec<K, E>>;
}
export declare const ColumnContext: import("react").Context<ColumnContextValue<Key, Keyed<Key>> | null>;
export interface ColumnHeaderProps<K extends Key, E extends Keyed<K>> extends PropsWithChildren<{}> {
    hide?: boolean;
    columns: Array<ColumnSpec<K, E>>;
}
export declare const Column: {
    /**
     * The header for a column list.
     *
     * @param columns - The columns to render. See {@link ListColumnT}.
     */
    Header: <K extends Key, E extends Keyed<K>>({ hide, columns: initialColumns, children, }: ColumnHeaderProps<K, E>) => ReactElement;
    /**
     * The item to use for a column list. This should be used as the child render prop
     * in a list render implmentation e.g. {@link List.Core.Virtual}.
     *
     * @param props - implements the {@link ItemProps} interface. All these props
     * should be provided by the list render implementation.
     */
    Item: <K_1 extends Key = Key, E_1 extends Keyed<K_1> = Keyed<K_1>>({ entry, onSelect, className, ...props }: ItemProps<K_1, E_1> & ItemFrameProps<K_1, E_1>) => ReactElement;
    /** The default height of a column list item. */
    itemHeight: number;
};
export {};
