interface Item {
    /** DOMElement for the header title */
    titleElement?: HTMLElement;
    /** DOMElement for the header content */
    contentElement?: HTMLElement;
    /** Material icon keyword */
    icon?: string;
    /** Tab header */
    title?: string;
    /** Width */
    width?: number;
}

interface Options {
    /** Tabs definition */
    data: Item[],
    /** Position */
    position: 'top' | 'bottom' | null,
    /** Show the add new tab button. Default: false */
    allowCreate: boolean,
    /** Allow drag and drop to change the tabs position. Default: false */
    allowChangePosition: boolean,
    /** On click event */
    onclick: (el: HTMLElement, instance: Tabs, index: number, header: HTMLElement, content: HTMLElement) => void;
    /** On load event */
    onload: (el: HTMLElement, instance: Tabs) => void,
    /** On change event */
    onchange: (el: HTMLElement, instance: Tabs, index: number, header: HTMLElement, content: HTMLElement) => void;
    /** On create new tab event */
    oncreate: (el: HTMLElement, div: HTMLElement) => void;
    /** On delete tab event */
    ondelete: (el: HTMLElement, index: number) => void;
    /**
     * On before create new tab event
     * @return {string} Header title
     */
    onbeforecreate: (el: HTMLElement, title: string | undefined) => string | false;
    /** On change tab position event */
    onchangeposition: (headers: HTMLElement[], from: number, to: number) => void;
    /** Enable animation. Default: false */
    animation: boolean,
    /** Hide headers. Default: false */
    hideHeaders: boolean,
    /** Content padding */
    padding: number,
    /** Design */
    palette?: 'modern' | null,
    /** Max container width */
    maxWidth: number,
}

export type Tabs = (el: HTMLElement, options: Options) => {
    /** Set the border to a header */
    setBorder: (index: number) => void;
    /** Open a tab by number */
    open: (index: number) => void;
    /** Open a tab by its header DOM element */
    selectIndex: (element: HTMLElement) => void;
    /** Rename a header title */
    rename: (index: number, title: string) => void;
    /** Create a new tab */
    create: (title: string, url: string) => void;
    /** Remove a tab */
    remove: (index: number) => void;
    /** Automatic name the next tab number */
    nextNumber: () => void;
    /** Delete tab element */
    deleteElement: (index: number) => void;
    /** Append tab element */
    appendElement: (title?: string, callback?: Function, openTab?: boolean, position?: number) => void;
    /** Get the active tab index */
    getActive: () => number;
    /** Update the content of a tab */
    updateContent: (index: number, newContent: string) => void;
    /** Update tab position */
    updatePosition: (from: number, to: number, ignoreEvents?: boolean, openTab?: boolean) => void;
    /** Update DOM position */
    move: (from: number, to: number, ignoreEvents?: boolean, openTab?: boolean) => void;
}
