import Node from '../node/Node';
import HTMLElement from '../html-element/HTMLElement';
import IDocumentFragment from '../document-fragment/IDocumentFragment';
import INode from '../node/INode';
import IHTMLTemplateElement from './IHTMLTemplateElement';
/**
* HTML Template Element.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLTemplateElement.
*/
export default class HTMLTemplateElement extends HTMLElement implements IHTMLTemplateElement {
private _contentElement: IDocumentFragment = null;
/**
* Returns the content.
*
* @returns Content.
*/
public get content(): IDocumentFragment {
if (!this._contentElement) {
this._contentElement = this.ownerDocument.createDocumentFragment();
}
return this._contentElement;
}
/**
* Previous sibling.
*
* @returns Node.
*/
public get previousSibling(): INode {
return this.content.previousSibling;
}
/**
* Next sibling.
*
* @returns Node.
*/
public get nextSibling(): INode {
return this.content.nextSibling;
}
/**
* First child.
*
* @returns Node.
*/
public get firstChild(): INode {
return this.content.firstChild;
}
/**
* Last child.
*
* @returns Node.
*/
public get lastChild(): INode {
return this.content.lastChild;
}
/**
* Append a child node to childNodes.
*
* @param node Node to append.
* @returns Appended node.
*/
public appendChild(node: INode): INode {
return this.content.appendChild(node);
}
/**
* Remove Child element from childNodes array.
*
* @param node Node to remove.
*/
public removeChild(node: Node): INode {
return this.content.removeChild(node);
}
/**
* Inserts a node before another.
*
* @param newNode Node to insert.
* @param referenceNode Node to insert before.
* @returns Inserted node.
*/
public insertBefore(newNode: INode, referenceNode: INode): INode {
return this.content.insertBefore(newNode, referenceNode);
}
/**
* Replaces a node with another.
*
* @param newChild New child.
* @param oldChild Old child.
* @returns Replaced node.
*/
public replaceChild(newChild: INode, oldChild: INode): INode {
return this.content.replaceChild(newChild, oldChild);
}
/**
* Clones a node.
*
* @override
* @param [deep=false] "true" to clone deep.
* @returns Cloned node.
*/
public cloneNode(deep = false): IHTMLTemplateElement {
return super.cloneNode(deep);
}
}