: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
// If axial gap is not enabled, treat the 'top' value as the shorthand gap value.
if (!isAxialGap && nextBoxGapValue?.hasOwnProperty('top')) {
setGapValue(nextBoxGapValue.top);
top: nextBoxGapValue?.top,
left: nextBoxGapValue?.left
const resetGapValue = () => setGapValue(undefined);
const hasGapValue = () => !!value?.spacing?.blockGap;
const showMinHeightControl = useHasMinHeight(settings);
const minHeightValue = decodeValue(inheritedValue?.dimensions?.minHeight);
const setMinHeightValue = newValue => {
const tempValue = setImmutably(value, ['dimensions', 'minHeight'], newValue);
// Apply min-height, while removing any applied aspect ratio.
onChange(setImmutably(tempValue, ['dimensions', 'aspectRatio'], undefined));
const resetMinHeightValue = () => {
setMinHeightValue(undefined);
const hasMinHeightValue = () => !!value?.dimensions?.minHeight;
const showAspectRatioControl = useHasAspectRatio(settings);
const aspectRatioValue = decodeValue(inheritedValue?.dimensions?.aspectRatio);
const setAspectRatioValue = newValue => {
const tempValue = setImmutably(value, ['dimensions', 'aspectRatio'], newValue);
// Apply aspect-ratio, while removing any applied min-height.
onChange(setImmutably(tempValue, ['dimensions', 'minHeight'], undefined));
const hasAspectRatioValue = () => !!value?.dimensions?.aspectRatio;
const showChildLayoutControl = useHasChildLayout(settings);
const childLayout = inheritedValue?.layout;
const setChildLayout = newChildLayout => {
const resetAllFilter = (0,external_wp_element_namespaceObject.useCallback)(previousValue => {
layout: utils_cleanEmptyObject({
...previousValue?.layout,
...previousValue?.spacing,
...previousValue?.dimensions,
const onMouseLeaveControls = () => onVisualize(false);
//Reset to 0 in case the value was negative.
setMinMarginValue(minimumMargin);
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(Wrapper, {
resetAllFilter: resetAllFilter,
children: [(showContentSizeControl || showWideSizeControl) && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", {
className: "span-columns",
children: (0,external_wp_i18n_namespaceObject.__)('Set the width of the main content area.')
}), showContentSizeControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
className: "single-column",
label: (0,external_wp_i18n_namespaceObject.__)('Content size'),
hasValue: hasUserSetContentSizeValue,
onDeselect: resetContentSizeValue,
isShownByDefault: (_defaultControls$cont = defaultControls.contentSize) !== null && _defaultControls$cont !== void 0 ? _defaultControls$cont : dimensions_panel_DEFAULT_CONTROLS.contentSize,
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, {
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalUnitControl, {
label: (0,external_wp_i18n_namespaceObject.__)('Content'),
__unstableInputWidth: "80px",
value: contentSizeValue || '',
onChange: nextContentSize => {
setContentSizeValue(nextContentSize);
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalView, {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_icon, {
}), showWideSizeControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
className: "single-column",
label: (0,external_wp_i18n_namespaceObject.__)('Wide size'),
hasValue: hasUserSetWideSizeValue,
onDeselect: resetWideSizeValue,
isShownByDefault: (_defaultControls$wide = defaultControls.wideSize) !== null && _defaultControls$wide !== void 0 ? _defaultControls$wide : dimensions_panel_DEFAULT_CONTROLS.wideSize,
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalHStack, {
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalUnitControl, {
label: (0,external_wp_i18n_namespaceObject.__)('Wide'),
__unstableInputWidth: "80px",
value: wideSizeValue || '',
onChange: nextWideSize => {
setWideSizeValue(nextWideSize);
}), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalView, {
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_icon, {
}), showPaddingControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
hasValue: hasPaddingValue,
label: (0,external_wp_i18n_namespaceObject.__)('Padding'),
onDeselect: resetPaddingValue,
isShownByDefault: (_defaultControls$padd = defaultControls.padding) !== null && _defaultControls$padd !== void 0 ? _defaultControls$padd : dimensions_panel_DEFAULT_CONTROLS.padding,
'tools-panel-item-spacing': showSpacingPresetsControl
children: [!showSpacingPresetsControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalBoxControl, {
onChange: setPaddingValues,
label: (0,external_wp_i18n_namespaceObject.__)('Padding'),
splitOnAxis: isAxialPadding,
onMouseOver: onMouseOverPadding,
onMouseOut: onMouseLeaveControls
}), showSpacingPresetsControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SpacingSizesControl, {
onChange: setPaddingValues,
label: (0,external_wp_i18n_namespaceObject.__)('Padding'),
onMouseOver: onMouseOverPadding,
onMouseOut: onMouseLeaveControls
}), showMarginControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
hasValue: hasMarginValue,
label: (0,external_wp_i18n_namespaceObject.__)('Margin'),
onDeselect: resetMarginValue,
isShownByDefault: (_defaultControls$marg = defaultControls.margin) !== null && _defaultControls$marg !== void 0 ? _defaultControls$marg : dimensions_panel_DEFAULT_CONTROLS.margin,
'tools-panel-item-spacing': showSpacingPresetsControl
children: [!showSpacingPresetsControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalBoxControl, {
onChange: setMarginValues,
label: (0,external_wp_i18n_namespaceObject.__)('Margin'),
splitOnAxis: isAxialMargin,
onMouseOver: onMouseOverMargin,
onMouseOut: onMouseLeaveControls
}), showSpacingPresetsControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SpacingSizesControl, {
onChange: setMarginValues,
minimumCustomValue: -Infinity,
label: (0,external_wp_i18n_namespaceObject.__)('Margin'),
onMouseOver: onMouseOverMargin,
onMouseOut: onMouseLeaveControls
}), showGapControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
label: (0,external_wp_i18n_namespaceObject.__)('Block spacing'),
onDeselect: resetGapValue,
isShownByDefault: (_defaultControls$bloc = defaultControls.blockGap) !== null && _defaultControls$bloc !== void 0 ? _defaultControls$bloc : dimensions_panel_DEFAULT_CONTROLS.blockGap,
'tools-panel-item-spacing': showSpacingPresetsControl
children: [!showSpacingPresetsControl && (isAxialGap ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalBoxControl, {
label: (0,external_wp_i18n_namespaceObject.__)('Block spacing'),
}) : /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalUnitControl, {
label: (0,external_wp_i18n_namespaceObject.__)('Block spacing'),
__unstableInputWidth: "80px",
})), showSpacingPresetsControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SpacingSizesControl, {
label: (0,external_wp_i18n_namespaceObject.__)('Block spacing'),
sides: isAxialGap ? gapSides : ['top'] // Use 'top' as the shorthand property in non-axial configurations.
}), showChildLayoutControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ChildLayoutControl, {
onChange: setChildLayout,
parentLayout: settings?.parentLayout,
isShownByDefault: (_defaultControls$chil = defaultControls.childLayout) !== null && _defaultControls$chil !== void 0 ? _defaultControls$chil : dimensions_panel_DEFAULT_CONTROLS.childLayout
}), showMinHeightControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_components_namespaceObject.__experimentalToolsPanelItem, {
hasValue: hasMinHeightValue,
label: (0,external_wp_i18n_namespaceObject.__)('Minimum height'),
onDeselect: resetMinHeightValue,
isShownByDefault: (_defaultControls$minH = defaultControls.minHeight) !== null && _defaultControls$minH !== void 0 ? _defaultControls$minH : dimensions_panel_DEFAULT_CONTROLS.minHeight,
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(HeightControl, {
label: (0,external_wp_i18n_namespaceObject.__)('Minimum height'),
onChange: setMinHeightValue
}), showAspectRatioControl && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(AspectRatioTool, {
hasValue: hasAspectRatioValue,
onChange: setAspectRatioValue,
isShownByDefault: (_defaultControls$aspe = defaultControls.aspectRatio) !== null && _defaultControls$aspe !== void 0 ? _defaultControls$aspe : dimensions_panel_DEFAULT_CONTROLS.aspectRatio
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/spacing-visualizer.js
function SpacingVisualizer({
const blockElement = useBlockElement(clientId);
const [style, updateStyle] = (0,external_wp_element_namespaceObject.useReducer)(() => computeStyle(blockElement));
(0,external_wp_element_namespaceObject.useLayoutEffect)(() => {
// It's not sufficient to read the computed spacing value when value.spacing changes as
// useEffect may run before the browser recomputes CSS. We therefore combine
// useLayoutEffect and two rAF calls to ensure that we read the spacing after the current
// paint but before the next paint.
// See https://github.com/WordPress/gutenberg/pull/59227.
window.requestAnimationFrame(() => window.requestAnimationFrame(updateStyle));
}, [blockElement, value]);
const previousValue = (0,external_wp_element_namespaceObject.useRef)(value);
const [isActive, setIsActive] = (0,external_wp_element_namespaceObject.useState)(false);
(0,external_wp_element_namespaceObject.useEffect)(() => {
if (external_wp_isShallowEqual_default()(value, previousValue.current) || forceShow) {
previousValue.current = value;
const timeout = setTimeout(() => {
if (!isActive && !forceShow) {
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(cover, {
__unstablePopoverSlot: "block-toolbar",
children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", {
className: "block-editor__spacing-visualizer",
function spacing_visualizer_getComputedCSS(element, property) {
return element.ownerDocument.defaultView.getComputedStyle(element).getPropertyValue(property);
function MarginVisualizer({
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SpacingVisualizer, {
value: value?.spacing?.margin,
computeStyle: blockElement => {
const top = spacing_visualizer_getComputedCSS(blockElement, 'margin-top');
const right = spacing_visualizer_getComputedCSS(blockElement, 'margin-right');
const bottom = spacing_visualizer_getComputedCSS(blockElement, 'margin-bottom');
const left = spacing_visualizer_getComputedCSS(blockElement, 'margin-left');
borderBottomWidth: bottom,
top: top ? `-${top}` : 0,
right: right ? `-${right}` : 0,
bottom: bottom ? `-${bottom}` : 0,
left: left ? `-${left}` : 0
function PaddingVisualizer({
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SpacingVisualizer, {
value: value?.spacing?.padding,
computeStyle: blockElement => ({
borderTopWidth: spacing_visualizer_getComputedCSS(blockElement, 'padding-top'),
borderRightWidth: spacing_visualizer_getComputedCSS(blockElement, 'padding-right'),
borderBottomWidth: spacing_visualizer_getComputedCSS(blockElement, 'padding-bottom'),
borderLeftWidth: spacing_visualizer_getComputedCSS(blockElement, 'padding-left')
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-editor/build-module/hooks/dimensions.js
const DIMENSIONS_SUPPORT_KEY = 'dimensions';
const SPACING_SUPPORT_KEY = 'spacing';
const dimensions_ALL_SIDES = (/* unused pure expression or super */ null && (['top', 'right', 'bottom', 'left']));
const dimensions_AXIAL_SIDES = (/* unused pure expression or super */ null && (['vertical', 'horizontal']));
function useVisualizer() {
const [property, setProperty] = (0,external_wp_element_namespaceObject.useState)(false);
} = unlock((0,external_wp_data_namespaceObject.useDispatch)(store));
(0,external_wp_element_namespaceObject.useEffect)(() => {
}, [property, showBlockInterface, hideBlockInterface]);
return [property, setProperty];
function DimensionsInspectorControl({
const attributesResetAllFilter = (0,external_wp_element_namespaceObject.useCallback)(attributes => {
const existingStyle = attributes.style;
const updatedStyle = resetAllFilter(existingStyle);
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(inspector_controls, {
resetAllFilter: attributesResetAllFilter,
function dimensions_DimensionsPanel({
const isEnabled = useHasDimensionsPanel(settings);
const value = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).getBlockAttributes(clientId)?.style, [clientId]);
const [visualizedProperty, setVisualizedProperty] = useVisualizer();
const onChange = newStyle => {
style: utils_cleanEmptyObject(newStyle)
const defaultDimensionsControls = (0,external_wp_blocks_namespaceObject.getBlockSupport)(name, [DIMENSIONS_SUPPORT_KEY, '__experimentalDefaultControls']);
const defaultSpacingControls = (0,external_wp_blocks_namespaceObject.getBlockSupport)(name, [SPACING_SUPPORT_KEY, '__experimentalDefaultControls']);
const defaultControls = {
...defaultDimensionsControls,
...defaultSpacingControls
return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, {
children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DimensionsPanel, {
as: DimensionsInspectorControl,
defaultControls: defaultControls,
onVisualize: setVisualizedProperty
}), !!settings?.spacing?.padding && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PaddingVisualizer, {
forceShow: visualizedProperty === 'padding',
}), !!settings?.spacing?.margin && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(MarginVisualizer, {
forceShow: visualizedProperty === 'margin',
* Determine whether there is block support for dimensions.
* @param {string} blockName Block name.
* @param {string} feature Background image feature to check for.
* @return {boolean} Whether there is support.
function hasDimensionsSupport(blockName, feature = 'any') {
if (external_wp_element_namespaceObject.Platform.OS !== 'web') {
const support = (0,external_wp_blocks_namespaceObject.getBlockSupport)(blockName, DIMENSIONS_SUPPORT_KEY);
return !!(support?.aspectRatio || !!support?.minHeight);
return !!support?.[feature];