UNPKG

@hitachivantara/uikit-react-core

Version:

Core React components for the NEXT Design System.

89 lines (88 loc) 2.74 kB
import { jsx, jsxs, Fragment } from "react/jsx-runtime"; import { useRef, useMemo, useCallback, Children } from "react"; import MuiDivider from "@mui/material/Divider"; import { useTheme } from "@mui/material/styles"; import { useDefaultProps } from "@hitachivantara/uikit-react-utils"; import { useWidth } from "../hooks/useWidth.js"; import { useClasses } from "./Stack.styles.js"; import { staticClasses } from "./Stack.styles.js"; import { HvFocus } from "../Focus/Focus.js"; const getDirection = (direction, width, breakpoints) => { if (typeof direction === "string") return direction; for (let i = breakpoints.indexOf(width); i >= 0; i -= 1) { if (direction[breakpoints[i]] !== void 0) { return direction[breakpoints[i]]; } } return "column"; }; const HvStack = (props) => { const { classes: classesProp, className, children, direction: directionProp = "column", spacing = "sm", divider = false, withNavigation = false, dividerProps = {}, ...others } = useDefaultProps("HvStack", props); const { classes, cx } = useClasses(classesProp); const width = useWidth(); const containerRef = useRef(null); const { breakpoints } = useTheme(); const direction = useMemo( () => getDirection(directionProp, width, breakpoints.keys), [directionProp, width, breakpoints] ); const getDividerComponent = useCallback(() => { if (typeof divider === "boolean" && divider) { return /* @__PURE__ */ jsx( MuiDivider, { orientation: direction === "column" ? "horizontal" : "vertical", flexItem: direction === "row", classes: { root: classes.divider }, ...dividerProps } ); } return divider; }, [classes.divider, divider, dividerProps, direction]); return /* @__PURE__ */ jsx( "div", { ref: containerRef, className: cx( classes.root, classes[direction], classes[spacing], className ), ...others, children: Children.map(children, (child, i) => { return /* @__PURE__ */ jsxs(Fragment, { children: [ divider && i !== 0 && getDividerComponent(), withNavigation ? /* @__PURE__ */ jsx( HvFocus, { rootRef: containerRef, focusDisabled: false, strategy: "grid", navigationJump: direction === "column" ? 1 : Children.count(children) || 0, filterClass: "child", children: /* @__PURE__ */ jsx("div", { className: "child", children: child }) } ) : child ] }); }) } ); }; export { HvStack, staticClasses as stackClasses };