UNPKG

@antv/g2

Version:

the Grammar of Graphics in Javascript

50 lines (43 loc) 1.45 kB
import { CompositionComponent as CC } from '../runtime'; import { SpaceFlexComposition } from '../spec'; import { mergeData } from './utils'; export type SpaceFlexOptions = Omit<SpaceFlexComposition, 'type'>; /** * @todo Propagate more options to children. */ export const SpaceFlex: CC<SpaceFlexOptions> = () => { return (options) => { const { children } = options; if (!Array.isArray(children)) return []; const { direction = 'row', ratio = children.map(() => 1), padding = 0, data: flexData, } = options; const [mainStart, mainSize, crossSize, crossStart] = direction === 'col' ? ['y', 'height', 'width', 'x'] : ['x', 'width', 'height', 'y']; const sum = ratio.reduce((total, value) => total + value); const totalSize = options[mainSize] - padding * (children.length - 1); const sizes = ratio.map((value) => totalSize * (value / sum)); const newChildren = []; let next = options[mainStart] || 0; for (let i = 0; i < sizes.length; i += 1) { const { data, ...rest } = children[i]; const newData = mergeData(data, flexData); newChildren.push({ [mainStart]: next, [mainSize]: sizes[i], [crossStart]: options[crossStart] || 0, [crossSize]: options[crossSize], data: newData, ...rest, }); next += sizes[i] + padding; } return newChildren; }; }; SpaceFlex.props = {};