UNPKG

@tdb/util

Version:
94 lines (84 loc) 1.98 kB
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, }; };