UNPKG

@pisell/layout

Version:

基于 Fusion 设计系统的自然布局体系

61 lines 3.46 kB
import _extends from "@babel/runtime/helpers/extends"; import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose"; var _excluded = ["children", "mode", "noPadding", "style"]; import React, { Children, forwardRef, isValidElement, useContext, useRef } from 'react'; import classNames from 'classnames'; import Context from "../common/context"; import { wrapUnit } from "../utils"; /** * Content 的高度默认占据 一个屏幕的剩余空间,即使里面内容不足也应该背景色撑满 * @param props * @param ref */ var PageContent = function PageContent(props, ref) { var _navNode, _navNode$props, _asideNode, _asideNode$props, _classNames, _classNames2, _classNames3; var children = props.children, mode = props.mode, noPadding = props.noPadding, style = props.style, others = _objectWithoutPropertiesLoose(props, _excluded); var _useContext = useContext(Context), prefix = _useContext.prefix; var sectionWrapperRef = useRef(null); var navNode; var asideNode; var newChildren = Children.map(children, function (child) { var tm; if ( /*#__PURE__*/isValidElement(child)) { var _child$type; // @ts-ignore tm = child === null || child === void 0 ? void 0 : (_child$type = child.type) === null || _child$type === void 0 ? void 0 : _child$type.typeMark; if (tm === 'Nav') { navNode = child; } else if (tm === 'Aside') { asideNode = child; } } return tm !== 'Nav' && tm !== 'Aside' ? child : null; }); var navWidth = ((_navNode = navNode) === null || _navNode === void 0 ? void 0 : (_navNode$props = _navNode.props) === null || _navNode$props === void 0 ? void 0 : _navNode$props.width) || 0; var asideWidth = ((_asideNode = asideNode) === null || _asideNode === void 0 ? void 0 : (_asideNode$props = _asideNode.props) === null || _asideNode$props === void 0 ? void 0 : _asideNode$props.width) || 0; var centerMode = !!(asideNode || navNode); var mainCls = classNames((_classNames = {}, _classNames[prefix + "page-main"] = true, _classNames)); var contentHelpCls = classNames((_classNames2 = {}, _classNames2[prefix + "page-bg-" + mode] = !!mode, _classNames2[prefix + "page-min-height-helper"] = true, _classNames2[prefix + "page-content--with-aside"] = asideNode, _classNames2[prefix + "page-content--with-nav"] = navNode, _classNames2[prefix + "page-content--center-mode"] = navNode || asideNode, _classNames2[prefix + "page-content--single-col"] = !navNode && !asideNode, _classNames2)); var contentCls = classNames((_classNames3 = {}, _classNames3[prefix + "page-content"] = true, _classNames3[prefix + "page-content-no-padding"] = noPadding, _classNames3[prefix + "page-content--with-nav"] = navNode, _classNames3)); return /*#__PURE__*/React.createElement("div", _extends({ ref: ref, className: contentHelpCls }, others), /*#__PURE__*/React.createElement("div", { className: contentCls, style: _extends({}, centerMode ? { gridTemplateColumns: (navWidth ? wrapUnit(navWidth) : '') + " 1fr " + (asideWidth ? wrapUnit(asideWidth) : '') } : null, style) }, navNode, /*#__PURE__*/React.createElement("main", { ref: sectionWrapperRef, className: mainCls }, newChildren), asideNode)); }; var RefPageContent = /*#__PURE__*/forwardRef(PageContent); RefPageContent.displayName = 'Content'; RefPageContent.typeMark = 'Content'; export default RefPageContent;