Skip to content

Commit 9312d25

Browse files
committed
Block styles: remove __unstableElementContext in favour of useStyleOverride
1 parent bc90aed commit 9312d25

File tree

8 files changed

+69
-107
lines changed

8 files changed

+69
-107
lines changed

packages/block-editor/src/components/block-list/index.js

+4-18
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,7 @@ import {
1717
useMergeRefs,
1818
useDebounce,
1919
} from '@wordpress/compose';
20-
import {
21-
createContext,
22-
useState,
23-
useMemo,
24-
useCallback,
25-
} from '@wordpress/element';
20+
import { createContext, useMemo, useCallback } from '@wordpress/element';
2621

2722
/**
2823
* Internal dependencies
@@ -40,13 +35,10 @@ import {
4035
} from '../block-edit/context';
4136
import { useTypingObserver } from '../observe-typing';
4237

43-
const elementContext = createContext();
44-
4538
export const IntersectionObserver = createContext();
4639
const pendingBlockVisibilityUpdatesPerRegistry = new WeakMap();
4740

4841
function Root( { className, ...settings } ) {
49-
const [ element, setElement ] = useState();
5042
const isLargeViewport = useViewportMatch( 'medium' );
5143
const { isOutlineMode, isFocusMode, editorMode } = useSelect(
5244
( select ) => {
@@ -115,13 +107,9 @@ function Root( { className, ...settings } ) {
115107
settings
116108
);
117109
return (
118-
<elementContext.Provider value={ element }>
119-
<IntersectionObserver.Provider value={ intersectionObserver }>
120-
<div { ...innerBlocksProps } />
121-
{ /* Ensure element and layout styles are always at the end of the document */ }
122-
<div ref={ setElement } />
123-
</IntersectionObserver.Provider>
124-
</elementContext.Provider>
110+
<IntersectionObserver.Provider value={ intersectionObserver }>
111+
<div { ...innerBlocksProps } />
112+
</IntersectionObserver.Provider>
125113
);
126114
}
127115

@@ -133,8 +121,6 @@ export default function BlockList( settings ) {
133121
);
134122
}
135123

136-
BlockList.__unstableElementContext = elementContext;
137-
138124
function Items( {
139125
placeholder,
140126
rootClientId,

packages/block-editor/src/hooks/layout.js

+4-26
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,14 @@ import classnames from 'classnames';
99
import { createHigherOrderComponent, useInstanceId } from '@wordpress/compose';
1010
import { addFilter } from '@wordpress/hooks';
1111
import { getBlockSupport, hasBlockSupport } from '@wordpress/blocks';
12-
import { useSelect, useDispatch } from '@wordpress/data';
12+
import { useSelect } from '@wordpress/data';
1313
import {
1414
Button,
1515
ButtonGroup,
1616
ToggleControl,
1717
PanelBody,
1818
} from '@wordpress/components';
1919
import { __ } from '@wordpress/i18n';
20-
import { useEffect } from '@wordpress/element';
2120

2221
/**
2322
* Internal dependencies
@@ -29,8 +28,7 @@ import { getLayoutType, getLayoutTypes } from '../layouts';
2928
import { useBlockEditingMode } from '../components/block-editing-mode';
3029
import { LAYOUT_DEFINITIONS } from '../layouts/definitions';
3130
import { kebabCase } from '../utils/object';
32-
import { useBlockSettings } from './utils';
33-
import { unlock } from '../lock-unlock';
31+
import { useBlockSettings, useStyleOverride } from './utils';
3432

3533
const layoutBlockSupportKey = 'layout';
3634

@@ -402,17 +400,7 @@ export const withLayoutStyles = createHigherOrderComponent(
402400
layoutClasses
403401
);
404402

405-
const { setStyleOverride, deleteStyleOverride } = unlock(
406-
useDispatch( blockEditorStore )
407-
);
408-
409-
useEffect( () => {
410-
if ( ! css ) return;
411-
setStyleOverride( id, { css } );
412-
return () => {
413-
deleteStyleOverride( id );
414-
};
415-
}, [ id, css, setStyleOverride, deleteStyleOverride ] );
403+
useStyleOverride( { id, css } );
416404

417405
return (
418406
<BlockListBlock
@@ -466,17 +454,7 @@ export const withChildLayoutStyles = createHigherOrderComponent(
466454
shouldRenderChildLayoutStyles && !! css, // Only attach a container class if there is generated CSS to be attached.
467455
} );
468456

469-
const { setStyleOverride, deleteStyleOverride } = unlock(
470-
useDispatch( blockEditorStore )
471-
);
472-
473-
useEffect( () => {
474-
if ( ! css ) return;
475-
setStyleOverride( id, { css } );
476-
return () => {
477-
deleteStyleOverride( id );
478-
};
479-
}, [ id, css, setStyleOverride, deleteStyleOverride ] );
457+
useStyleOverride( { id, css } );
480458

481459
return <BlockListBlock { ...props } className={ className } />;
482460
},

packages/block-editor/src/hooks/position.js

+5-18
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,16 @@ import {
1414
} from '@wordpress/components';
1515
import { createHigherOrderComponent, useInstanceId } from '@wordpress/compose';
1616
import { useSelect } from '@wordpress/data';
17-
import {
18-
useContext,
19-
useMemo,
20-
createPortal,
21-
Platform,
22-
} from '@wordpress/element';
17+
import { useMemo, Platform } from '@wordpress/element';
2318
import { addFilter } from '@wordpress/hooks';
2419

2520
/**
2621
* Internal dependencies
2722
*/
28-
import BlockList from '../components/block-list';
2923
import useSetting from '../components/use-setting';
3024
import InspectorControls from '../components/inspector-controls';
3125
import useBlockDisplayInformation from '../components/use-block-display-information';
32-
import { cleanEmptyObject } from './utils';
26+
import { cleanEmptyObject, useStyleOverride } from './utils';
3327
import { unlock } from '../lock-unlock';
3428
import { store as blockEditorStore } from '../store';
3529

@@ -365,7 +359,6 @@ export const withPositionStyles = createHigherOrderComponent(
365359
hasPositionBlockSupport && ! useIsPositionDisabled( props );
366360

367361
const id = useInstanceId( BlockListBlock );
368-
const element = useContext( BlockList.__unstableElementContext );
369362

370363
// Higher specificity to override defaults in editor UI.
371364
const positionSelector = `.wp-container-${ id }.wp-container-${ id }`;
@@ -389,15 +382,9 @@ export const withPositionStyles = createHigherOrderComponent(
389382
!! attributes?.style?.position?.type,
390383
} );
391384

392-
return (
393-
<>
394-
{ allowPositionStyles &&
395-
element &&
396-
!! css &&
397-
createPortal( <style>{ css }</style>, element ) }
398-
<BlockListBlock { ...props } className={ className } />
399-
</>
400-
);
385+
useStyleOverride( { id, css } );
386+
387+
return <BlockListBlock { ...props } className={ className } />;
401388
},
402389
'withPositionStyles'
403390
);

packages/block-editor/src/hooks/style.js

+17-28
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import classnames from 'classnames';
66
/**
77
* WordPress dependencies
88
*/
9-
import { useContext, useMemo, createPortal } from '@wordpress/element';
9+
import { useMemo } from '@wordpress/element';
1010
import { addFilter } from '@wordpress/hooks';
1111
import {
1212
getBlockSupport,
@@ -19,7 +19,6 @@ import { getCSSRules, compileCSS } from '@wordpress/style-engine';
1919
/**
2020
* Internal dependencies
2121
*/
22-
import BlockList from '../components/block-list';
2322
import { BACKGROUND_SUPPORT_KEY, BackgroundImagePanel } from './background';
2423
import { BORDER_SUPPORT_KEY, BorderPanel } from './border';
2524
import { COLOR_SUPPORT_KEY, ColorEdit } from './color';
@@ -34,7 +33,7 @@ import {
3433
DimensionsPanel,
3534
} from './dimensions';
3635
import useDisplayBlockControls from '../components/use-display-block-controls';
37-
import { shouldSkipSerialization } from './utils';
36+
import { shouldSkipSerialization, useStyleOverride } from './utils';
3837
import { scopeSelector } from '../components/global-styles/utils';
3938
import { useBlockEditingMode } from '../components/block-editing-mode';
4039

@@ -484,33 +483,23 @@ const withElementsStyles = createHigherOrderComponent(
484483
: undefined;
485484
}, [ baseElementSelector, blockElementStyles, props.name ] );
486485

487-
const element = useContext( BlockList.__unstableElementContext );
486+
useStyleOverride( {
487+
id: blockElementsContainerIdentifier,
488+
css: styles,
489+
} );
488490

489491
return (
490-
<>
491-
{ styles &&
492-
element &&
493-
createPortal(
494-
<style
495-
dangerouslySetInnerHTML={ {
496-
__html: styles,
497-
} }
498-
/>,
499-
element
500-
) }
501-
502-
<BlockListBlock
503-
{ ...props }
504-
className={
505-
props.attributes.style?.elements
506-
? classnames(
507-
props.className,
508-
blockElementsContainerIdentifier
509-
)
510-
: props.className
511-
}
512-
/>
513-
</>
492+
<BlockListBlock
493+
{ ...props }
494+
className={
495+
props.attributes.style?.elements
496+
? classnames(
497+
props.className,
498+
blockElementsContainerIdentifier
499+
)
500+
: props.className
501+
}
502+
/>
514503
);
515504
},
516505
'withElementsStyles'

packages/block-editor/src/hooks/utils.js

+17-1
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22
* WordPress dependencies
33
*/
44
import { getBlockSupport } from '@wordpress/blocks';
5-
import { useMemo } from '@wordpress/element';
5+
import { useMemo, useEffect } from '@wordpress/element';
6+
import { useDispatch } from '@wordpress/data';
67

78
/**
89
* Internal dependencies
910
*/
1011
import { useSetting } from '../components';
1112
import { useSettingsForBlockElement } from '../components/global-styles/hooks';
1213
import { getValueFromObjectPath, setImmutably } from '../utils/object';
14+
import { store as blockEditorStore } from '../store';
15+
import { unlock } from '../lock-unlock';
1316

1417
/**
1518
* Removed falsy values from nested object.
@@ -115,6 +118,19 @@ export function shouldSkipSerialization( blockType, featureSet, feature ) {
115118
return skipSerialization;
116119
}
117120

121+
export function useStyleOverride( { id, css } ) {
122+
const { setStyleOverride, deleteStyleOverride } = unlock(
123+
useDispatch( blockEditorStore )
124+
);
125+
useEffect( () => {
126+
if ( ! css ) return;
127+
setStyleOverride( id, { css } );
128+
return () => {
129+
deleteStyleOverride( id );
130+
};
131+
}, [ id, css, setStyleOverride, deleteStyleOverride ] );
132+
}
133+
118134
/**
119135
* Based on the block and its context, returns an object of all the block settings.
120136
* This object can be passed as a prop to all the Styles UI components

packages/block-editor/src/private-apis.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { ComposedPrivateInserter as PrivateInserter } from './components/inserte
1111
import { PrivateListView } from './components/list-view';
1212
import BlockInfo from './components/block-info-slot-fill';
1313
import { useShouldContextualToolbarShow } from './utils/use-should-contextual-toolbar-show';
14-
import { cleanEmptyObject } from './hooks/utils';
14+
import { cleanEmptyObject, useStyleOverride } from './hooks/utils';
1515
import BlockQuickNavigation from './components/block-quick-navigation';
1616
import { LayoutStyle } from './components/block-list/layout';
1717
import { BlockRemovalWarningModal } from './components/block-removal-warning-modal';
@@ -41,6 +41,7 @@ lock( privateApis, {
4141
BlockInfo,
4242
useShouldContextualToolbarShow,
4343
cleanEmptyObject,
44+
useStyleOverride,
4445
BlockQuickNavigation,
4546
LayoutStyle,
4647
BlockRemovalWarningModal,

packages/block-library/src/gallery/edit.js

+6-5
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ import {
6060
import useImageSizes from './use-image-sizes';
6161
import useGetNewImages from './use-get-new-images';
6262
import useGetMedia from './use-get-media';
63-
import GapStyles from './gap-styles';
63+
import useGapStyles from './gap-styles';
6464

6565
const MAX_COLUMNS = 8;
6666
const linkOptions = [
@@ -535,6 +535,11 @@ function GalleryEdit( props ) {
535535
...nativeInnerBlockProps,
536536
} );
537537

538+
useGapStyles( {
539+
blockGap: attributes.style?.spacing?.blockGap,
540+
clientId,
541+
} );
542+
538543
if ( ! hasImages ) {
539544
return (
540545
<View { ...innerBlocksProps }>
@@ -653,10 +658,6 @@ function GalleryEdit( props ) {
653658
addToGallery={ hasImageIds }
654659
/>
655660
</BlockControls>
656-
<GapStyles
657-
blockGap={ attributes.style?.spacing?.blockGap }
658-
clientId={ clientId }
659-
/>
660661
</>
661662
) }
662663
<Gallery

packages/block-library/src/gallery/gap-styles.js

+14-10
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@
22
* WordPress dependencies
33
*/
44
import {
5-
BlockList,
65
__experimentalGetGapCSSValue as getGapCSSValue,
6+
privateApis as blockEditorPrivateApis,
77
} from '@wordpress/block-editor';
8-
import { useContext, createPortal } from '@wordpress/element';
98

10-
export default function GapStyles( { blockGap, clientId } ) {
11-
const styleElement = useContext( BlockList.__unstableElementContext );
9+
/**
10+
* Internal dependencies
11+
*/
12+
import { unlock } from '../lock-unlock';
13+
14+
const { useStyleOverride } = unlock( blockEditorPrivateApis );
15+
16+
export default function useGapStyles( { blockGap, clientId } ) {
1217
// --gallery-block--gutter-size is deprecated. --wp--style--gallery-gap-default should be used by themes that want to set a default
1318
// gap on the gallery.
1419
const fallbackValue = `var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )`;
@@ -35,11 +40,10 @@ export default function GapStyles( { blockGap, clientId } ) {
3540
gap: ${ gapValue }
3641
}`;
3742

38-
const GapStyle = () => {
39-
return <style>{ gap }</style>;
40-
};
43+
useStyleOverride( {
44+
id: `gallery-gap-${ clientId }`,
45+
css: gap,
46+
} );
4147

42-
return gap && styleElement
43-
? createPortal( <GapStyle />, styleElement )
44-
: null;
48+
return null;
4549
}

0 commit comments

Comments
 (0)