export function addClass(element : HTMLElement, class_name : string) : void {
const {className: current_value} = element;
const current_list = current_value.split(" ").filter(function(v) : boolean { return v.length >= 1; });
if(current_list.indexOf(class_name) !== -1) {
return;
}
current_list.push(class_name);
element.className = current_list.join(" ");
}
export function removeClass(element : HTMLElement, class_name : string) : void {
const { className: attr } = element;
const current_list = attr.split(" ").filter(function(v) : boolean { return v.length >= 1 && v !== class_name; });
element.className = current_list.join(" ");
}
function remove(element : Node) : Node {
return element.parentNode.removeChild(element);
}
function contains(target : Node, child : Node) : boolean {
let head = child.parentNode;
while(head) {
if (head === target) return true;
head = head.parentNode;
}
return false;
}
function stylize(node : HTMLElement, style : CSSStyleDeclaration) : HTMLElement {
const apply = node.style.setProperty.bind(node.style);
for(const property in style) {
const value = style[property];
apply(property, value);
}
return node;
}
function create(tag : string, style? : any, classes? : Array) : HTMLElement {
const element = document.createElement(tag);
element.setAttribute("util-dom", "true");
if(style) {
stylize(element, style);
}
for(let i = 0, l = classes || [], c = l.length; i < c; i++) {
const class_name = l[i];
addClass(element, class_name);
}
return element;
}
export default {
classes: { add: addClass, remove: removeClass },
create, remove, contains, stylize
};