mirror of
https://github.com/stackblitz/bolt.new
synced 2024-11-27 14:32:46 +00:00
62 lines
1.2 KiB
TypeScript
62 lines
1.2 KiB
TypeScript
/**
|
|
* Copyright (c) 2018 Jed Watson.
|
|
* Licensed under the MIT License (MIT), see:
|
|
*
|
|
* @link http://jedwatson.github.io/classnames
|
|
*/
|
|
|
|
type ClassNamesArg = undefined | string | Record<string, boolean> | ClassNamesArg[];
|
|
|
|
/**
|
|
* A simple JavaScript utility for conditionally joining classNames together.
|
|
*
|
|
* @param args A series of classes or object with key that are class and values
|
|
* that are interpreted as boolean to decide whether or not the class
|
|
* should be included in the final class.
|
|
*/
|
|
export function classNames(...args: ClassNamesArg[]): string {
|
|
let classes = '';
|
|
|
|
for (const arg of args) {
|
|
classes = appendClass(classes, parseValue(arg));
|
|
}
|
|
|
|
return classes;
|
|
}
|
|
|
|
function parseValue(arg: ClassNamesArg) {
|
|
if (typeof arg === 'string' || typeof arg === 'number') {
|
|
return arg;
|
|
}
|
|
|
|
if (typeof arg !== 'object') {
|
|
return '';
|
|
}
|
|
|
|
if (Array.isArray(arg)) {
|
|
return classNames(...arg);
|
|
}
|
|
|
|
let classes = '';
|
|
|
|
for (const key in arg) {
|
|
if (arg[key]) {
|
|
classes = appendClass(classes, key);
|
|
}
|
|
}
|
|
|
|
return classes;
|
|
}
|
|
|
|
function appendClass(value: string, newClass: string | undefined) {
|
|
if (!newClass) {
|
|
return value;
|
|
}
|
|
|
|
if (value) {
|
|
return value + ' ' + newClass;
|
|
}
|
|
|
|
return value + newClass;
|
|
}
|