|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type ClassNamesArg = undefined | string | Record<string, boolean> | ClassNamesArg[]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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; |
|
} |
|
|