export type EventCleanup = () => void export interface SelectorItem { html: string | HTMLElement | number value?: string | number default?: boolean readonly $control_option?: SelectorItem[] readonly $control_item?: HTMLDivElement readonly $control_value?: HTMLDivElement } export interface ComponentOption { html?: string | HTMLElement | number disable?: boolean name?: string index?: number style?: Partial tooltip?: string | number position?: string selector?: SelectorItem[] click?: (this: Host, component: Component, event: Event) => unknown mounted?: (this: Host, element: HTMLDivElement) => unknown beforeUnmount?: (this: Host, element: HTMLDivElement) => unknown onSelect?: (this: Host, item: SelectorItem, element: HTMLDivElement, event: Event) => unknown } export type ComponentInput = ComponentOption | ((art: Host) => ComponentOption) export interface ControlOption extends Omit, 'position'> { position: 'top' | 'left' | 'right' } export type ControlInput = ControlOption | ((art: Host) => ControlOption) export interface ComponentEntry { $ref: HTMLDivElement events: EventCleanup[] option: ComponentOption } export interface Component { id: number art: Host name?: string $parent?: HTMLElement cache: Map> show: boolean toggle: () => void add: (input: ComponentInput) => HTMLDivElement | undefined remove: (name: string) => void update: (option: ComponentOption) => ReturnType selector?: (option: ComponentOption, element: HTMLDivElement, events: EventCleanup[]) => void } export interface Controls extends Omit, 'add' | 'update' | 'selector'> { isHover: boolean timer: number setting?: HTMLDivElement thumbnails?: HTMLDivElement init: () => void add: (input: ControlInput) => undefined update: (option: ComponentOption) => undefined check: (target?: SelectorItem) => void selector: (option: ComponentOption, element: HTMLDivElement, events: EventCleanup[]) => void }