@itwin/itwinui-react
Version:
A react component library for iTwinUI
108 lines (107 loc) • 2.81 kB
JavaScript
import * as React from 'react';
import cx from 'classnames';
import { useSafeContext, supportsHas, Box } from '../../utils/index.js';
let getSurfaceElevationValue = (elevation) => {
switch (elevation) {
case 0:
return 'none';
case 1:
return 'var(--iui-shadow-1)';
case 2:
return 'var(--iui-shadow-2)';
case 3:
return 'var(--iui-shadow-3)';
case 4:
return 'var(--iui-shadow-4)';
case 5:
return 'var(--iui-shadow-5)';
default:
return;
}
};
let getBorderValue = (border) => {
if ('string' == typeof border) return border;
if (false === border) return 'none';
};
let SurfaceHeader = React.forwardRef((props, ref) => {
let { children, className, ...rest } = props;
let { setHasLayout } = useSafeContext(SurfaceContext);
React.useEffect(() => {
if (!supportsHas()) setHasLayout(true);
}, [setHasLayout]);
return React.createElement(
Box,
{
className: cx('iui-surface-header', className),
ref: ref,
...rest,
},
children,
);
});
if ('development' === process.env.NODE_ENV)
SurfaceHeader.displayName = 'Surface.Header';
let SurfaceBody = React.forwardRef((props, ref) => {
let { children, className, isPadded = false, ...rest } = props;
let { setHasLayout } = useSafeContext(SurfaceContext);
React.useEffect(() => {
if (!supportsHas()) setHasLayout(true);
}, [setHasLayout]);
return React.createElement(
Box,
{
className: cx('iui-surface-body', className),
ref: ref,
'data-iui-padded': isPadded ? 'true' : void 0,
...rest,
},
children,
);
});
if ('development' === process.env.NODE_ENV)
SurfaceBody.displayName = 'Surface.Body';
export const Surface = Object.assign(
React.forwardRef((props, ref) => {
let {
elevation,
border = true,
className,
style,
children,
...rest
} = props;
let [hasLayout, setHasLayout] = React.useState(false);
let _style = {
'--iui-surface-elevation': getSurfaceElevationValue(elevation),
'--iui-surface-border': getBorderValue(border),
...style,
};
return React.createElement(
Box,
{
className: cx('iui-surface', className),
style: _style,
ref: ref,
'data-iui-layout': hasLayout ? 'true' : void 0,
...rest,
},
React.createElement(
SurfaceContext.Provider,
{
value: {
setHasLayout,
},
},
children,
),
);
}),
{
Header: SurfaceHeader,
Body: SurfaceBody,
},
);
if ('development' === process.env.NODE_ENV) Surface.displayName = 'Surface';
let SurfaceContext = React.createContext(void 0);
if ('development' === process.env.NODE_ENV)
SurfaceContext.displayName = 'SurfaceContext';