@visx/shape
Version:
visx shape
77 lines • 2.2 kB
JavaScript
import cx from 'classnames';
import { stack as d3stack } from '@visx/vendor/d3-shape';
import { Group } from '@visx/group';
import { getFirstItem, getSecondItem } from "../util/accessors.js";
import getBandwidth from "../util/getBandwidth.js";
import setNumOrAccessor from "../util/setNumberOrNumberAccessor.js";
import stackOrder from "../util/stackOrder.js";
import stackOffset from "../util/stackOffset.js";
import Bar from "./Bar.js";
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
export default function BarStackHorizontal(_ref) {
let {
data,
className,
top,
left,
y,
x0 = getFirstItem,
x1 = getSecondItem,
xScale,
yScale,
color,
keys,
value,
order,
offset,
children,
...restProps
} = _ref;
const stack = d3stack();
if (keys) stack.keys(keys);
if (value) setNumOrAccessor(stack.value, value);
if (order) stack.order(stackOrder(order));
if (offset) stack.offset(stackOffset(offset));
const stacks = stack(data);
const barHeight = getBandwidth(yScale);
const barStacks = stacks.map((barStack, i) => {
const {
key
} = barStack;
return {
index: i,
key,
bars: barStack.map((bar, j) => {
const barWidth = (xScale(x1(bar)) || 0) - (xScale(x0(bar)) || 0);
const barX = xScale(x0(bar));
const barY = 'bandwidth' in yScale ? yScale(y(bar.data)) : Math.max((yScale(y(bar.data)) || 0) - barWidth / 2);
return {
bar,
key,
index: j,
height: barHeight,
width: barWidth,
x: barX || 0,
y: barY || 0,
color: color(barStack.key, j)
};
})
};
});
if (children) return /*#__PURE__*/_jsx(_Fragment, {
children: children(barStacks)
});
return /*#__PURE__*/_jsx(Group, {
className: cx('visx-bar-stack-horizontal', className),
top: top,
left: left,
children: barStacks.map(barStack => barStack.bars.map(bar => /*#__PURE__*/_jsx(Bar, {
x: bar.x,
y: bar.y,
height: bar.height,
width: bar.width,
fill: bar.color,
...restProps
}, `bar-stack-${barStack.index}-${bar.index}`)))
});
}