File size: 1,302 Bytes
932ae62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/**

 * @typedef {  string | string[] | Record<string, boolean> } ClassList

 */

/**

 * @param { HTMLElement } element

 * @param { ClassList } classList

 * @param { string[] } requiredClasses

 */
export function applyClasses(element, classList, ...requiredClasses) {
	classList ??= "";

	let str;
	if (typeof classList === "string") {
		str = classList;
	} else if (classList instanceof Array) {
		str = classList.join(" ");
	} else {
		str = Object.entries(classList).reduce((p, c) => {
			if (c[1]) {
				p += (p.length ? " " : "") + c[0];
			}
			return p;
		}, "");
	}
	element.className = str;
	if (requiredClasses) {
		element.classList.add(...requiredClasses);
	}
}

/**

 * @param { HTMLElement } element

 * @param { { onHide?: (el: HTMLElement) => void, onShow?: (el: HTMLElement, value) => void } } [param1]

 * @returns

 */
export function toggleElement(element, { onHide, onShow } = {}) {
	let placeholder;
	let hidden;
	return (value) => {
		if (value) {
			if (hidden) {
				hidden = false;
				placeholder.replaceWith(element);
			}
			onShow?.(element, value);
		} else {
			if (!placeholder) {
				placeholder = document.createComment("");
			}
			hidden = true;
			element.replaceWith(placeholder);
			onHide?.(element);
		}
	};
}