@crossed/ui
Version:
A universal & performant styling library for React Native, Next.js & React
89 lines (88 loc) • 2.59 kB
JavaScript
import { jsx } from "react/jsx-runtime";
import { cloneElement, isValidElement, memo, useMemo, Children } from "react";
import { withStaticProperties } from "@crossed/core";
import { Divider, XBox, YBox } from "../layout";
import { composeStyles, createStyles } from "@crossed/styled";
const stylesVertical = createStyles(() => ({
first: {
base: {
borderBottomWidth: 0,
borderBottomLeftRadius: 0,
borderBottomRightRadius: 0
}
},
middle: {
base: { borderBottomWidth: 0, borderRadius: 0, borderTopWidth: 0 }
},
last: {
base: {
borderTopWidth: 0,
borderTopLeftRadius: 0,
borderTopRightRadius: 0
}
}
}));
const stylesHorizontal = createStyles(() => ({
first: {
base: {
borderRightWidth: 0,
borderTopRightRadius: 0,
borderBottomRightRadius: 0
}
},
middle: {
base: { borderLeftWidth: 0, borderRadius: 0, borderRightWidth: 0 }
},
last: {
base: {
borderLeftWidth: 0,
borderTopLeftRadius: 0,
borderBottomLeftRadius: 0
}
}
}));
const GroupRoot = memo(
({ orientation = "vertical", children, ...props }) => {
const childrenModified = useMemo(() => {
return Children.toArray(children).map((child, i, a) => {
if (!isValidElement(child))
return child;
const size = a.length;
const isFirst = i === 0;
const isLast = i === size - 1;
const isMiddle = !isFirst && !isLast;
const props2 = {
style: composeStyles(
child.props.style,
orientation === "vertical" && [
isFirst && !isLast && stylesVertical.first,
isLast && !isFirst && stylesVertical.last,
isMiddle && stylesVertical.middle
],
orientation === "horizontal" && [
isFirst && !isLast && stylesHorizontal.first,
isLast && !isFirst && stylesHorizontal.last,
isMiddle && stylesHorizontal.middle
]
)
};
if (child.type === Divider) {
props2.direction = orientation === "horizontal" ? "vertical" : "horizontal";
delete props2.style;
}
return cloneElement(child, props2);
});
}, [children, orientation]);
const Container = useMemo(
() => orientation === "vertical" ? YBox : XBox,
[orientation]
);
return /* @__PURE__ */ jsx(Container, { ...props, children: childrenModified });
}
);
const Group = withStaticProperties(GroupRoot, {});
export {
Group,
GroupRoot
};
//# sourceMappingURL=Group.js.map