split-pane-react-test
Version:
Resizable split panes for React.js.
54 lines (53 loc) • 2.12 kB
JavaScript
/**
* Element names may consist of Latin letters, digits, dashes and underscores.
* CSS class is formed as block name plus two underscores plus element name: .block__elem
* @param block
* @param element
*/
function getBEMElement(block, element) {
return `${block}__${element}`;
}
/**
* CSS class is formed as block’s or element’s name plus two dashes:
* .block--mod or .block__elem--mod and .block--color-black with .block--color-red.
* Spaces in complicated modifiers are replaced by dash.
* @param blockOrElement
* @param modifier
*/
function getBEMModifier(blockOrElement, modifier) {
return `${blockOrElement}--${modifier}`;
}
export const splitClassName = 'react-split';
export const splitDragClassName = getBEMModifier(splitClassName, 'dragging');
export const splitVerticalClassName = getBEMModifier(splitClassName, 'vertical');
export const splitHorizontalClassName = getBEMModifier(splitClassName, 'horizontal');
export const paneClassName = getBEMElement(splitClassName, 'pane');
export const sashClassName = getBEMElement(splitClassName, 'sash');
export const sashVerticalClassName = getBEMModifier(sashClassName, 'vertical');
export const sashHorizontalClassName = getBEMModifier(sashClassName, 'horizontal');
export const sashDisabledClassName = getBEMModifier(sashClassName, 'disabled');
export const sashHoverClassName = getBEMModifier(sashClassName, 'hover');
export function classNames(...args) {
const classList = [];
for (const arg of args) {
if (!arg)
continue;
const argType = typeof arg;
if (argType === 'string' || argType === 'number') {
classList.push(`${arg}`);
continue;
}
if (argType === 'object') {
if (arg.toString !== Object.prototype.toString) {
classList.push(arg.toString());
continue;
}
for (const key in arg) {
if (Object.hasOwnProperty.call(arg, key) && arg[key]) {
classList.push(key);
}
}
}
}
return classList.join(' ');
}