@carbon/react
Version:
React components for the Carbon Design System
123 lines (116 loc) • 3.6 kB
JavaScript
/**
* 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 };