You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.4 KiB
61 lines
1.4 KiB
import * as React from 'react';
|
|
import { SpaceContext } from './context';
|
|
|
|
export interface ItemProps {
|
|
className: string;
|
|
children: React.ReactNode;
|
|
index: number;
|
|
direction?: 'horizontal' | 'vertical';
|
|
marginDirection: 'marginLeft' | 'marginRight';
|
|
split?: React.ReactNode;
|
|
wrap?: boolean;
|
|
style?: React.CSSProperties;
|
|
}
|
|
|
|
const Item: React.FC<ItemProps> = ({
|
|
className,
|
|
direction,
|
|
index,
|
|
marginDirection,
|
|
children,
|
|
split,
|
|
wrap,
|
|
style: customStyle,
|
|
}) => {
|
|
const { horizontalSize, verticalSize, latestIndex, supportFlexGap } =
|
|
React.useContext(SpaceContext);
|
|
|
|
let style: React.CSSProperties = {};
|
|
|
|
if (!supportFlexGap) {
|
|
if (direction === 'vertical') {
|
|
if (index < latestIndex) {
|
|
style = { marginBottom: horizontalSize / (split ? 2 : 1) };
|
|
}
|
|
} else {
|
|
style = {
|
|
...(index < latestIndex && { [marginDirection]: horizontalSize / (split ? 2 : 1) }),
|
|
...(wrap && { paddingBottom: verticalSize }),
|
|
};
|
|
}
|
|
}
|
|
|
|
if (children === null || children === undefined) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<div className={className} style={{ ...style, ...customStyle }}>
|
|
{children}
|
|
</div>
|
|
{index < latestIndex && split && (
|
|
<span className={`${className}-split`} style={style}>
|
|
{split}
|
|
</span>
|
|
)}
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default Item;
|
|
|