59 lines
No EOL
1.5 KiB
JavaScript
59 lines
No EOL
1.5 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = composeClasses;
|
|
/* eslint no-restricted-syntax: 0, prefer-template: 0, guard-for-in: 0
|
|
---
|
|
These rules are preventing the performance optimizations below.
|
|
*/
|
|
|
|
/**
|
|
* Compose classes from multiple sources.
|
|
*
|
|
* @example
|
|
* ```tsx
|
|
* const slots = {
|
|
* root: ['root', 'primary'],
|
|
* label: ['label'],
|
|
* };
|
|
*
|
|
* const getUtilityClass = (slot) => `MuiButton-${slot}`;
|
|
*
|
|
* const classes = {
|
|
* root: 'my-root-class',
|
|
* };
|
|
*
|
|
* const output = composeClasses(slots, getUtilityClass, classes);
|
|
* // {
|
|
* // root: 'MuiButton-root MuiButton-primary my-root-class',
|
|
* // label: 'MuiButton-label',
|
|
* // }
|
|
* ```
|
|
*
|
|
* @param slots a list of classes for each possible slot
|
|
* @param getUtilityClass a function to resolve the class based on the slot name
|
|
* @param classes the input classes from props
|
|
* @returns the resolved classes for all slots
|
|
*/
|
|
function composeClasses(slots, getUtilityClass, classes = undefined) {
|
|
const output = {};
|
|
for (const slotName in slots) {
|
|
const slot = slots[slotName];
|
|
let buffer = '';
|
|
let start = true;
|
|
for (let i = 0; i < slot.length; i += 1) {
|
|
const value = slot[i];
|
|
if (value) {
|
|
buffer += (start === true ? '' : ' ') + getUtilityClass(value);
|
|
start = false;
|
|
if (classes && classes[value]) {
|
|
buffer += ' ' + classes[value];
|
|
}
|
|
}
|
|
}
|
|
output[slotName] = buffer;
|
|
}
|
|
return output;
|
|
} |