@carbon/ibm-products
Version:
Carbon for IBM Products
78 lines (76 loc) • 3.07 kB
JavaScript
/**
* Copyright IBM Corp. 2020, 2026
*
* This source code is licensed under the Apache-2.0 license found in the
* LICENSE file in the root directory of this source tree.
*/
const require_runtime = require("../../../_virtual/_rolldown/runtime.js");
let react = require("react");
react = require_runtime.__toESM(react);
let prop_types = require("prop-types");
prop_types = require_runtime.__toESM(prop_types);
//#region src/global/js/utils/Wrap.tsx
/**
* Copyright IBM Corp. 2021, 2024
*
* This source code is licensed under the Apache-2.0 license found in the
* LICENSE file in the root directory of this source tree.
*/
const isEmpty = (children) => {
let result = true;
react.default.Children.forEach(children, (child) => {
if (child) result &&= child?.type?.displayName === "Wrap" && isEmpty(child?.props?.children);
});
return result;
};
/**
* A simple conditional wrapper that encloses its children in a <div> (or other
* element if specified), passing any supplied attributes to the <div> (or other
* element). The component renders nothing at all if there are no children or
* the children are empty/falsy, or if all the non-falsy children are themselves
* Wrap components that do not wish to render. This behavior can be overridden
* by setting neverRender or alwaysRender to true. Note that if a ref is passed,
* the ref.current will be set to the wrapper element if it renders, and will
* remain undefined if it does not render.
*/
const Wrap = react.default.forwardRef(({ alwaysRender, children, element: Wrapper = "div", neverRender, className, title, ...rest }, ref) => (neverRender || isEmpty(children)) && !alwaysRender ? null : /* @__PURE__ */ react.default.createElement(Wrapper, {
className,
...rest,
ref,
title
}, children));
Wrap.displayName = "Wrap";
Wrap.propTypes = {
/**
* Specify whether the wrapper element should render even if there are no
* children or the children are themselves empty wrappers. Useful if there
* are some conditions in which the wrapper element is still required. Note
* that this prop takes precedence over neverRender if both are set to true.
*/
alwaysRender: prop_types.default.bool,
/**
* The content of the wrapper element. If no children are supplied, or the
* resulting value(s) are falsy, or if all the non-falsy children are Wrap
* components that decide not to render, nothing will be rendered in the DOM.
*/
children: prop_types.default.node,
className: prop_types.default.string,
/**
* The element name or component to use as a wrapper for the content.
*/
element: prop_types.default.elementType,
/**
* Specify whether nothing should be rendered even if there are children
* in the content. Useful if there are some circumstances in which the
* component should not render at all. Note that if alwaysRender is also
* set to true then it will take precedence and the wrapper element and
* content will be rendered.
*/
neverRender: prop_types.default.bool,
/**
* The title attribute the content.
*/
title: prop_types.default.string
};
//#endregion
exports.Wrap = Wrap;