2
0
mirror of https://github.com/iconify/iconify.git synced 2024-10-24 01:22:04 +00:00
iconify/components/svg-framework/src/render/classes.ts
2022-05-12 22:39:56 +03:00

59 lines
1.5 KiB
TypeScript

import type { IconifyIconName } from '@iconify/utils/lib/icon/name';
import type { IconifyElement } from '../scanner/config';
/**
* Get classes to add from icon name
*/
export function iconClasses(iconName: IconifyIconName): Set<string> {
const classesToAdd: Set<string> = new Set(['iconify']);
['provider', 'prefix'].forEach((attr: keyof typeof iconName) => {
if (iconName[attr]) {
classesToAdd.add('iconify--' + iconName[attr]);
}
});
return classesToAdd;
}
/**
* Add classes to SVG, removing previously added classes, keeping custom classes
*/
export function applyClasses(
svg: IconifyElement,
classes: Set<string>,
previouslyAddedClasses: Set<string>,
placeholder?: IconifyElement
): string[] {
const svgClasses = svg.classList;
// Copy classes from placeholder
if (placeholder) {
const placeholderClasses = placeholder.classList;
Array.from(placeholderClasses).forEach((item) => {
svgClasses.add(item);
});
}
// Add new classes
const addedClasses: string[] = [];
classes.forEach((item: string) => {
if (!svgClasses.contains(item)) {
// Add new class
svgClasses.add(item);
addedClasses.push(item);
} else if (previouslyAddedClasses.has(item)) {
// Was added before: keep it
addedClasses.push(item);
}
});
// Remove previously added classes
previouslyAddedClasses.forEach((item) => {
if (!classes.has(item)) {
// Class that was added before, but no longer needed
svgClasses.remove(item);
}
});
return addedClasses;
}