export interface Ref { 'set': ( data: T ) => void; 'get': () => T; 'addAdditionalElement': ( elements: HTMLElement, predicate: ( value: T ) => boolean ) => void; 'addConditionalElementBind': ( elements: HTMLElement, predicate: ( value: T ) => boolean ) => void; 'addConditionalClasses': ( element: HTMLElement, predicate: ( value: T ) => boolean, onTrue: string[], onFalse: string[] ) => void; 'resetConditionalClasses': () => void; 'resetConditionalElementBinds': () => void; 'bind': ( element: HTMLInputElement, castFunction: ( val: string ) => T ) => void; 'onChange': ( callback: () => void ) => void; } export interface ListRef { 'set': ( data: T[] ) => void; 'get': () => T[]; 'sort': ( compare: ( a: T, b: T ) => number ) => void; 'resetSort': () => void; 'filter': ( predicate: ( value: T ) => boolean ) => void; 'setTemplate': ( newTemplate: RenderTemplate ) => void; 'onChange': ( callback: () => void ) => void; } export type HTMLTagNames = keyof HTMLElementTagNameMap; export interface RenderTemplate { /** * What kind of element to render. Not all HTML elements supported (couldn't be arsed to do it) */ 'type': HTMLTagNames; /** * The attribute of the element to render. Leave blank if type is not object * Will be ignored if you also set children. If no children or attribute set, * will simply treat type as string and render accordingly */ 'attribute'?: string; /** * Children to render. Can be used to nest */ 'children': RenderTemplate[]; /** * CSS classes to append to the element */ 'cssClasses': string[]; } export interface StringIndexedObject { [key: string]: unknown }