@tdb/util
Version:
Shared helpers and utilities.
94 lines (84 loc) • 1.98 kB
text/typescript
import { R } from '../../libs';
import { IStyle } from './types';
import { value as valueUtil } from '../value';
/**
* Takes an array of input CSS values and converts them to
* [top, right, bottom, left] values.
*
* Input:
* - single value (eg. 0 or '5em')
* - 4-part array (eg. [10, null, 0, 5])
* - Y/X array (eg. [20, 5])
*
*/
export const arrayToEdges: IStyle['arrayToEdges'] = value => {
if (value === undefined || value === null) {
return undefined;
}
if (R.is(String, value) && valueUtil.isBlank(value)) {
return undefined;
}
if (Array.isArray(value) && value.length === 0) {
return undefined;
}
if (!Array.isArray(value)) {
value = value.toString().split(' ');
}
const edges = value
.map(item =>
typeof item === 'string' && item.endsWith('px')
? item.replace(/px$/, '')
: item,
)
.map(item => valueUtil.toNumber(item));
let top: number | undefined;
let right: number | undefined;
let bottom: number | undefined;
let left: number | undefined;
const getEdge = (index: number): number | undefined => {
const edge = edges[index];
if (edge === null || edge === 'null' || edge === '') {
return undefined;
}
return edge;
};
switch (edges.length) {
case 1:
top = getEdge(0);
bottom = getEdge(0);
left = getEdge(0);
right = getEdge(0);
break;
case 2:
top = getEdge(0);
bottom = getEdge(0);
left = getEdge(1);
right = getEdge(1);
break;
case 3:
top = getEdge(0);
left = getEdge(1);
right = getEdge(1);
bottom = getEdge(2);
break;
default:
top = getEdge(0);
right = getEdge(1);
bottom = getEdge(2);
left = getEdge(3);
}
if (
top === undefined &&
right === undefined &&
bottom === undefined &&
left === undefined
) {
return undefined;
}
return {
top,
right,
bottom,
left,
};
};