UNPKG

@carbon/react

Version:

React components for the Carbon Design System

123 lines (116 loc) 3.6 kB
/** * Copyright IBM Corp. 2016, 2023 * * This source code is licensed under the Apache-2.0 license found in the * LICENSE file in the root directory of this source tree. */ import { extends as _extends } from '../../_virtual/_rollupPluginBabelHelpers.js'; import cx from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; import { usePrefix } from '../../internal/usePrefix.js'; const sizes = ['xs', 'sm', 'md', 'lg', 'xl', '2xl']; const densities = ['condensed', 'normal']; /** * Density of components within this layout */ /** * Size of components within this layout */ const Layout = /*#__PURE__*/React.forwardRef(function Layout({ as: BaseComponent = 'div', children, className, density, size, ...rest }, forwardRef) { const prefix = usePrefix(); const classes = cx(className, `${prefix}--layout`, { [`${prefix}--layout--size-${size}`]: size && sizes.includes(size), [`${prefix}--layout--density-${density}`]: density && densities.includes(density) }); return /*#__PURE__*/React.createElement(BaseComponent, _extends({}, rest, { ref: forwardRef, className: classes }), children); }); Layout.propTypes = { /** * Specify a custom component or element to be rendered as the top-level * element in the component */ as: PropTypes.oneOfType([PropTypes.func, PropTypes.string, PropTypes.elementType]), /** * Provide child elements to be rendered inside of `Layout` */ children: PropTypes.node, /** * Provide a custom class name to be used on the outermost element rendered by * the component */ className: PropTypes.string, /** * Specify the desired density of components within this layout */ density: PropTypes.oneOf(densities), /** * Specify the desired size of components within this layout */ size: PropTypes.oneOf(sizes) }; const LayoutConstraint = /*#__PURE__*/React.forwardRef(function Layout({ as: BaseComponent = 'div', children, className, density, size, ...rest }, forwardRef) { const prefix = usePrefix(); const classes = cx(className, Object.entries({ size, density }).map(([group, constraints]) => ({ [`${prefix}--layout-constraint--${group}__default-${constraints?.default}`]: constraints?.default, [`${prefix}--layout-constraint--${group}__min-${constraints?.min}`]: constraints?.min, [`${prefix}--layout-constraint--${group}__max-${constraints?.max}`]: constraints?.max }))); return /*#__PURE__*/React.createElement(BaseComponent, _extends({}, rest, { ref: forwardRef, className: classes }), children); }); LayoutConstraint.propTypes = { /** * Specify a custom component or element to be rendered as the top-level * element in the component */ as: PropTypes.oneOfType([PropTypes.func, PropTypes.string, PropTypes.elementType]), /** * Provide child elements to be rendered inside of `LayoutConstraint` */ children: PropTypes.node, /** * Provide a custom class name to be used on the outermost element rendered by * the component */ className: PropTypes.string, /** * Specify the desired layout density constraints of this element's children */ density: PropTypes.shape({ min: PropTypes.oneOf(densities), default: PropTypes.oneOf(densities), max: PropTypes.oneOf(densities) }), /** * Specify the desired layout size constraints of this element's children */ size: PropTypes.shape({ min: PropTypes.oneOf(sizes), default: PropTypes.oneOf(sizes), max: PropTypes.oneOf(sizes) }) }; export { Layout, LayoutConstraint };