@wordpress/block-editor
Version:
121 lines (110 loc) • 2.89 kB
JavaScript
/**
* WordPress dependencies
*/
import {
BaseControl,
__experimentalHStack as HStack,
} from '@wordpress/components';
import { useState } from '@wordpress/element';
import { __, _x, sprintf } from '@wordpress/i18n';
/**
* Internal dependencies
*/
import AxialInputControls from './input-controls/axial';
import SeparatedInputControls from './input-controls/separated';
import SingleInputControl from './input-controls/single';
import SidesDropdown from './sides-dropdown';
import useSpacingSizes from './hooks/use-spacing-sizes';
import {
ALL_SIDES,
DEFAULT_VALUES,
LABELS,
VIEWS,
getInitialView,
} from './utils';
export default function SpacingSizesControl( {
inputProps,
label: labelProp,
minimumCustomValue = 0,
onChange,
onMouseOut,
onMouseOver,
showSideInLabel = true,
sides = ALL_SIDES,
useSelect,
values,
} ) {
const spacingSizes = useSpacingSizes();
const inputValues = values || DEFAULT_VALUES;
const hasOneSide = sides?.length === 1;
const hasOnlyAxialSides =
sides?.includes( 'horizontal' ) &&
sides?.includes( 'vertical' ) &&
sides?.length === 2;
const [ view, setView ] = useState( getInitialView( inputValues, sides ) );
const handleOnChange = ( nextValue ) => {
const newValues = { ...values, ...nextValue };
onChange( newValues );
};
const inputControlProps = {
...inputProps,
minimumCustomValue,
onChange: handleOnChange,
onMouseOut,
onMouseOver,
sides,
spacingSizes,
type: labelProp,
useSelect,
values: inputValues,
};
const renderControls = () => {
if ( view === VIEWS.axial ) {
return <AxialInputControls { ...inputControlProps } />;
}
if ( view === VIEWS.custom ) {
return <SeparatedInputControls { ...inputControlProps } />;
}
return (
<SingleInputControl
side={ view }
{ ...inputControlProps }
showSideInLabel={ showSideInLabel }
/>
);
};
const sideLabel =
ALL_SIDES.includes( view ) && showSideInLabel ? LABELS[ view ] : '';
const label = sprintf(
// translators: 2. Type of spacing being modified (Padding, margin, etc). 1: The side of the block being modified (top, bottom, left etc.).
__( '%1$s %2$s' ),
labelProp,
sideLabel
).trim();
const dropdownLabelText = sprintf(
// translators: %s: The current spacing property e.g. "Padding", "Margin".
_x( '%s options', 'Button label to reveal side configuration options' ),
labelProp
);
return (
<fieldset className="spacing-sizes-control">
<HStack className="spacing-sizes-control__header">
<BaseControl.VisualLabel
as="legend"
className="spacing-sizes-control__label"
>
{ label }
</BaseControl.VisualLabel>
{ ! hasOneSide && ! hasOnlyAxialSides && (
<SidesDropdown
label={ dropdownLabelText }
onChange={ setView }
sides={ sides }
value={ view }
/>
) }
</HStack>
{ renderControls() }
</fieldset>
);
}