@wordpress/components
Version:
UI components for WordPress.
121 lines (112 loc) • 2.4 kB
JavaScript
/**
* WordPress dependencies
*/
import { useInstanceId } from '@wordpress/compose';
import { forwardRef } from '@wordpress/element';
/**
* Internal dependencies
*/
import Backdrop from './backdrop';
import Label from './label';
import {
Container,
Root,
Prefix,
Suffix,
LabelWrapper,
} from './styles/input-control-styles';
function useUniqueId( idProp ) {
const instanceId = useInstanceId( InputBase );
const id = `input-base-control-${ instanceId }`;
return idProp || id;
}
// Adapter to map props for the new ui/flex compopnent.
function getUIFlexProps( { labelPosition } ) {
const props = {};
switch ( labelPosition ) {
case 'top':
props.direction = 'column';
props.gap = 0;
break;
case 'bottom':
props.direction = 'column-reverse';
props.gap = 0;
break;
case 'edge':
props.justify = 'space-between';
break;
}
return props;
}
export function InputBase(
{
__unstableInputWidth,
children,
className,
disabled = false,
hideLabelFromVision = false,
labelPosition,
id: idProp,
isFocused = false,
label,
prefix,
size = 'default',
suffix,
...props
},
ref
) {
const id = useUniqueId( idProp );
const hideLabel = hideLabelFromVision || ! label;
return (
<Root
{ ...props }
{ ...getUIFlexProps( { labelPosition } ) }
className={ className }
isFocused={ isFocused }
labelPosition={ labelPosition }
ref={ ref }
__unstableVersion="next"
>
<LabelWrapper>
<Label
className="components-input-control__label"
hideLabelFromVision={ hideLabelFromVision }
labelPosition={ labelPosition }
htmlFor={ id }
size={ size }
>
{ label }
</Label>
</LabelWrapper>
<Container
__unstableInputWidth={ __unstableInputWidth }
className="components-input-control__container"
disabled={ disabled }
hideLabel={ hideLabel }
isFocused={ isFocused }
labelPosition={ labelPosition }
>
{ prefix && (
<Prefix className="components-input-control__prefix">
{ prefix }
</Prefix>
) }
{ children }
{ suffix && (
<Suffix className="components-input-control__suffix">
{ suffix }
</Suffix>
) }
<Backdrop
aria-hidden="true"
disabled={ disabled }
isFocused={ isFocused }
label={ label }
size={ size }
/>
</Container>
</Root>
);
}
export default forwardRef( InputBase );