import HTMLAnchorElement from '../nodes/html-anchor-element/HTMLAnchorElement.js';
import HTMLElement from '../nodes/html-element/HTMLElement.js';
import HTMLAudioElement from '../nodes/html-audio-element/HTMLAudioElement.js';
import HTMLBaseElement from '../nodes/html-base-element/HTMLBaseElement.js';
import HTMLTemplateElement from '../nodes/html-template-element/HTMLTemplateElement.js';
import HTMLFormElement from '../nodes/html-form-element/HTMLFormElement.js';
import HTMLInputElement from '../nodes/html-input-element/HTMLInputElement.js';
import HTMLTextAreaElement from '../nodes/html-text-area-element/HTMLTextAreaElement.js';
import HTMLScriptElement from '../nodes/html-script-element/HTMLScriptElement.js';
import HTMLImageElement from '../nodes/html-image-element/HTMLImageElement.js';
import HTMLLinkElement from '../nodes/html-link-element/HTMLLinkElement.js';
import HTMLStyleElement from '../nodes/html-style-element/HTMLStyleElement.js';
import HTMLLabelElement from '../nodes/html-label-element/HTMLLabelElement.js';
import HTMLSlotElement from '../nodes/html-slot-element/HTMLSlotElement.js';
import HTMLMetaElement from '../nodes/html-meta-element/HTMLMetaElement.js';
import HTMLButtonElement from '../nodes/html-button-element/HTMLButtonElement.js';
import HTMLDialogElement from '../nodes/html-dialog-element/HTMLDialogElement.js';
import HTMLIFrameElement from '../nodes/html-iframe-element/HTMLIFrameElement.js';
import HTMLOptGroupElement from '../nodes/html-opt-group-element/HTMLOptGroupElement.js';
import HTMLOptionElement from '../nodes/html-option-element/HTMLOptionElement.js';
import HTMLSelectElement from '../nodes/html-select-element/HTMLSelectElement.js';
import HTMLVideoElement from '../nodes/html-video-element/HTMLVideoElement.js';

// Makes it work with custom elements when they declare their own interface.
declare global {
	/* eslint-disable @typescript-eslint/naming-convention */
	/* eslint-disable @typescript-eslint/no-empty-interface */
	interface HTMLElementTagNameMap {}
	/* eslint-enable @typescript-eslint/naming-convention */
	/* eslint-enable @typescript-eslint/no-empty-interface */
}

export default interface IHTMLElementTagNameMap extends HTMLElementTagNameMap {
	a: HTMLAnchorElement;
	abbr: HTMLElement;
	address: HTMLElement;
	area: HTMLElement;
	article: HTMLElement;
	aside: HTMLElement;
	audio: HTMLAudioElement;
	b: HTMLElement;
	base: HTMLBaseElement;
	bdi: HTMLElement;
	bdo: HTMLElement;
	blockquaote: HTMLElement;
	body: HTMLElement;
	template: HTMLTemplateElement;
	form: HTMLFormElement;
	input: HTMLInputElement;
	textarea: HTMLTextAreaElement;
	script: HTMLScriptElement;
	img: HTMLImageElement;
	link: HTMLLinkElement;
	style: HTMLStyleElement;
	label: HTMLLabelElement;
	slot: HTMLSlotElement;
	meta: HTMLMetaElement;
	blockquote: HTMLElement;
	br: HTMLElement;
	button: HTMLButtonElement;
	canvas: HTMLElement;
	caption: HTMLElement;
	cite: HTMLElement;
	code: HTMLElement;
	col: HTMLElement;
	colgroup: HTMLElement;
	data: HTMLElement;
	datalist: HTMLElement;
	dd: HTMLElement;
	del: HTMLElement;
	details: HTMLElement;
	dfn: HTMLElement;
	dialog: HTMLDialogElement;
	div: HTMLElement;
	dl: HTMLElement;
	dt: HTMLElement;
	em: HTMLElement;
	embed: HTMLElement;
	fieldset: HTMLElement;
	figcaption: HTMLElement;
	figure: HTMLElement;
	footer: HTMLElement;
	h1: HTMLElement;
	h2: HTMLElement;
	h3: HTMLElement;
	h4: HTMLElement;
	h5: HTMLElement;
	h6: HTMLElement;
	head: HTMLElement;
	header: HTMLElement;
	hgroup: HTMLElement;
	hr: HTMLElement;
	html: HTMLElement;
	i: HTMLElement;
	iframe: HTMLIFrameElement;
	ins: HTMLElement;
	kbd: HTMLElement;
	legend: HTMLElement;
	li: HTMLElement;
	main: HTMLElement;
	map: HTMLElement;
	mark: HTMLElement;
	math: HTMLElement;
	menu: HTMLElement;
	menuitem: HTMLElement;
	meter: HTMLElement;
	nav: HTMLElement;
	noscript: HTMLElement;
	object: HTMLElement;
	ol: HTMLElement;
	optgroup: HTMLOptGroupElement;
	option: HTMLOptionElement;
	output: HTMLElement;
	p: HTMLElement;
	param: HTMLElement;
	picture: HTMLElement;
	pre: HTMLElement;
	progress: HTMLElement;
	q: HTMLElement;
	rb: HTMLElement;
	rp: HTMLElement;
	rt: HTMLElement;
	rtc: HTMLElement;
	ruby: HTMLElement;
	s: HTMLElement;
	samp: HTMLElement;
	section: HTMLElement;
	select: HTMLSelectElement;
	small: HTMLElement;
	source: HTMLElement;
	span: HTMLElement;
	strong: HTMLElement;
	sub: HTMLElement;
	summary: HTMLElement;
	sup: HTMLElement;
	table: HTMLElement;
	tbody: HTMLElement;
	td: HTMLElement;
	tfoot: HTMLElement;
	th: HTMLElement;
	thead: HTMLElement;
	time: HTMLElement;
	title: HTMLElement;
	tr: HTMLElement;
	track: HTMLElement;
	u: HTMLElement;
	ul: HTMLElement;
	var: HTMLElement;
	video: HTMLVideoElement;
	wbr: HTMLElement;
}
