Skip to content

Commit

Permalink
Add full functionality of classnames package to classList
Browse files Browse the repository at this point in the history
  • Loading branch information
kcirtaptrick committed Sep 13, 2021
1 parent 6426924 commit 7c6f5ba
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 13 deletions.
12 changes: 8 additions & 4 deletions packages/dom-expressions/src/client.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,16 @@ export function spread<T>(
export function assign(node: Element, props: any, isSVG?: Boolean, skipChildren?: Boolean): void;
export function setAttribute(node: Element, name: string, value: string): void;
export function setAttributeNS(node: Element, namespace: string, name: string, value: string): void;
export function addEventListener(node: Element, name: string, handler: () => void, delegate: boolean): void;
export function classList(
export function addEventListener(
node: Element,
value: { [k: string]: boolean },
prev?: { [k: string]: boolean }
name: string,
handler: () => void,
delegate: boolean
): void;
type ClassList =
| { [k: string]: boolean }
| (ClassList | string | number | boolean | null | undefined)[];
export function classList(node: Element, value: ClassList, prev?: { [k: string]: boolean }): void;
export function style(
node: Element,
value: { [k: string]: string },
Expand Down
32 changes: 23 additions & 9 deletions packages/dom-expressions/src/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,22 +84,36 @@ export function addEventListener(node, name, handler, delegate) {
}

export function classList(node, value, prev = {}) {
const classKeys = Object.keys(value),
prevKeys = Object.keys(prev);
const prevKeys = Object.keys(prev);
let i, len;
for (i = 0, len = prevKeys.length; i < len; i++) {
const key = prevKeys[i];
if (!key || key === "undefined" || key in value) continue;
toggleClassKey(node, key, false);
delete prev[key];
}
for (i = 0, len = classKeys.length; i < len; i++) {
const key = classKeys[i],
classValue = !!value[key];
if (!key || key === "undefined" || prev[key] === classValue) continue;
toggleClassKey(node, key, classValue);
prev[key] = classValue;
}
(function setClasses(classes) {
if (classes instanceof Array) {
for (const key of classes) {
// classList setting classes for all numbers except for 0 may be
// unexpected behavior, you must explicity omit 0 using `n || false`
if (!key && key !== 0) continue;
if (typeof key === 'object') { // Both objects and arrays
setClasses(key);
continue;
}
toggleClassKey(node, key, true);
prev[key] = true;
}
} else if (typeof classes === 'object') {
for (const [key, enabled] of Object.entries(classes)) {
if (!enabled) continue;
toggleClassKey(node, key, true);
prev[key] = true
}
}
})(value);

return prev;
}

Expand Down

0 comments on commit 7c6f5ba

Please sign in to comment.