@wordpress/editor 13.2.0 → 13.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/error-boundary/index.js +24 -30
  3. package/build/components/error-boundary/index.js.map +1 -1
  4. package/build/components/media-categories/index.js +237 -0
  5. package/build/components/media-categories/index.js.map +1 -0
  6. package/build/components/page-attributes/parent.js +1 -1
  7. package/build/components/page-attributes/parent.js.map +1 -1
  8. package/build/components/post-publish-panel/postpublish.js +1 -0
  9. package/build/components/post-publish-panel/postpublish.js.map +1 -1
  10. package/build/components/post-slug/index.js +1 -0
  11. package/build/components/post-slug/index.js.map +1 -1
  12. package/build/components/post-taxonomies/hierarchical-term-selector.js +7 -3
  13. package/build/components/post-taxonomies/hierarchical-term-selector.js.map +1 -1
  14. package/build/components/post-template/index.js +7 -4
  15. package/build/components/post-template/index.js.map +1 -1
  16. package/build/components/post-url/index.js +1 -0
  17. package/build/components/post-url/index.js.map +1 -1
  18. package/build/components/provider/index.js +26 -8
  19. package/build/components/provider/index.js.map +1 -1
  20. package/build/components/provider/index.native.js +21 -14
  21. package/build/components/provider/index.native.js.map +1 -1
  22. package/build/components/provider/use-block-editor-settings.js +7 -4
  23. package/build/components/provider/use-block-editor-settings.js.map +1 -1
  24. package/build/components/provider/use-block-editor-settings.native.js +1 -2
  25. package/build/components/provider/use-block-editor-settings.native.js.map +1 -1
  26. package/build/components/table-of-contents/index.js +3 -1
  27. package/build/components/table-of-contents/index.js.map +1 -1
  28. package/build/components/unsaved-changes-warning/index.js +1 -1
  29. package/build/components/unsaved-changes-warning/index.js.map +1 -1
  30. package/build/experiments.js +20 -0
  31. package/build/experiments.js.map +1 -0
  32. package/build/hooks/default-autocompleters.js +2 -7
  33. package/build/hooks/default-autocompleters.js.map +1 -1
  34. package/build/index.js +14 -0
  35. package/build/index.js.map +1 -1
  36. package/build/index.native.js +14 -0
  37. package/build/index.native.js.map +1 -1
  38. package/build/lockUnlock.js +19 -0
  39. package/build/lockUnlock.js.map +1 -0
  40. package/build/store/defaults.js +1 -2
  41. package/build/store/defaults.js.map +1 -1
  42. package/build/store/selectors.js +1 -1
  43. package/build/store/selectors.js.map +1 -1
  44. package/build/utils/terms.js +9 -5
  45. package/build/utils/terms.js.map +1 -1
  46. package/build-module/components/error-boundary/index.js +24 -30
  47. package/build-module/components/error-boundary/index.js.map +1 -1
  48. package/build-module/components/media-categories/index.js +225 -0
  49. package/build-module/components/media-categories/index.js.map +1 -0
  50. package/build-module/components/page-attributes/parent.js +2 -2
  51. package/build-module/components/page-attributes/parent.js.map +1 -1
  52. package/build-module/components/post-publish-panel/postpublish.js +1 -0
  53. package/build-module/components/post-publish-panel/postpublish.js.map +1 -1
  54. package/build-module/components/post-slug/index.js +1 -0
  55. package/build-module/components/post-slug/index.js.map +1 -1
  56. package/build-module/components/post-taxonomies/hierarchical-term-selector.js +8 -5
  57. package/build-module/components/post-taxonomies/hierarchical-term-selector.js.map +1 -1
  58. package/build-module/components/post-template/index.js +8 -5
  59. package/build-module/components/post-template/index.js.map +1 -1
  60. package/build-module/components/post-url/index.js +1 -0
  61. package/build-module/components/post-url/index.js.map +1 -1
  62. package/build-module/components/provider/index.js +21 -9
  63. package/build-module/components/provider/index.js.map +1 -1
  64. package/build-module/components/provider/index.native.js +20 -12
  65. package/build-module/components/provider/index.native.js.map +1 -1
  66. package/build-module/components/provider/use-block-editor-settings.js +5 -5
  67. package/build-module/components/provider/use-block-editor-settings.js.map +1 -1
  68. package/build-module/components/provider/use-block-editor-settings.native.js +1 -2
  69. package/build-module/components/provider/use-block-editor-settings.native.js.map +1 -1
  70. package/build-module/components/table-of-contents/index.js +3 -1
  71. package/build-module/components/table-of-contents/index.js.map +1 -1
  72. package/build-module/components/unsaved-changes-warning/index.js +1 -1
  73. package/build-module/components/unsaved-changes-warning/index.js.map +1 -1
  74. package/build-module/experiments.js +10 -0
  75. package/build-module/experiments.js.map +1 -0
  76. package/build-module/hooks/default-autocompleters.js +2 -6
  77. package/build-module/hooks/default-autocompleters.js.map +1 -1
  78. package/build-module/index.js +1 -0
  79. package/build-module/index.js.map +1 -1
  80. package/build-module/index.native.js +1 -0
  81. package/build-module/index.native.js.map +1 -1
  82. package/build-module/lockUnlock.js +9 -0
  83. package/build-module/lockUnlock.js.map +1 -0
  84. package/build-module/store/defaults.js +1 -2
  85. package/build-module/store/defaults.js.map +1 -1
  86. package/build-module/store/selectors.js +1 -1
  87. package/build-module/store/selectors.js.map +1 -1
  88. package/build-module/utils/terms.js +9 -6
  89. package/build-module/utils/terms.js.map +1 -1
  90. package/build-style/style-rtl.css +0 -3
  91. package/build-style/style.css +0 -3
  92. package/package.json +30 -29
  93. package/src/components/autosave-monitor/test/index.js +8 -2
  94. package/src/components/editor-help/test/index.native.js +5 -5
  95. package/src/components/error-boundary/index.js +24 -37
  96. package/src/components/media-categories/index.js +247 -0
  97. package/src/components/page-attributes/parent.js +2 -2
  98. package/src/components/page-attributes/test/order.js +4 -14
  99. package/src/components/post-preview-button/test/index.js +5 -17
  100. package/src/components/post-publish-button/test/index.js +5 -17
  101. package/src/components/post-publish-panel/postpublish.js +1 -0
  102. package/src/components/post-publish-panel/style.scss +1 -5
  103. package/src/components/post-publish-panel/test/__snapshots__/index.js.snap +2 -18
  104. package/src/components/post-saved-state/test/index.js +1 -5
  105. package/src/components/post-slug/index.js +1 -0
  106. package/src/components/post-taxonomies/hierarchical-term-selector.js +23 -17
  107. package/src/components/post-template/index.js +3 -4
  108. package/src/components/post-url/index.js +1 -0
  109. package/src/components/provider/index.js +120 -91
  110. package/src/components/provider/index.native.js +26 -17
  111. package/src/components/provider/use-block-editor-settings.js +60 -49
  112. package/src/components/provider/use-block-editor-settings.native.js +1 -2
  113. package/src/components/table-of-contents/index.js +3 -1
  114. package/src/components/unsaved-changes-warning/index.js +1 -1
  115. package/src/experiments.js +10 -0
  116. package/src/hooks/default-autocompleters.js +1 -6
  117. package/src/index.js +1 -0
  118. package/src/index.native.js +1 -0
  119. package/src/lockUnlock.js +9 -0
  120. package/src/store/defaults.js +0 -1
  121. package/src/store/selectors.js +1 -1
  122. package/src/utils/terms.js +8 -5
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { get, unescape as unescapeString } from 'lodash';
4
+ import { get } from 'lodash';
5
5
 
6
6
  /**
7
7
  * WordPress dependencies
@@ -14,11 +14,13 @@ import {
14
14
  TextControl,
15
15
  TreeSelect,
16
16
  withFilters,
17
+ __experimentalVStack as VStack,
17
18
  } from '@wordpress/components';
18
19
  import { useDispatch, useSelect } from '@wordpress/data';
19
20
  import { useDebounce } from '@wordpress/compose';
20
21
  import { store as coreStore } from '@wordpress/core-data';
21
22
  import { speak } from '@wordpress/a11y';
23
+ import { decodeEntities } from '@wordpress/html-entities';
22
24
 
23
25
  /**
24
26
  * Internal dependencies
@@ -364,7 +366,7 @@ export function HierarchicalTermSelector( { slug } ) {
364
366
  const termId = parseInt( term.id, 10 );
365
367
  onChange( termId );
366
368
  } }
367
- label={ unescapeString( term.name ) }
369
+ label={ decodeEntities( term.name ) }
368
370
  />
369
371
  { !! term.children.length && (
370
372
  <div className="editor-post-taxonomies__hierarchical-terms-subchoices">
@@ -415,6 +417,7 @@ export function HierarchicalTermSelector( { slug } ) {
415
417
  <>
416
418
  { showFilter && (
417
419
  <TextControl
420
+ __nextHasNoMarginBottom
418
421
  className="editor-post-taxonomies__hierarchical-terms-filter"
419
422
  label={ filterLabel }
420
423
  value={ filterValue }
@@ -443,22 +446,25 @@ export function HierarchicalTermSelector( { slug } ) {
443
446
  ) }
444
447
  { showForm && (
445
448
  <form onSubmit={ onAddTerm }>
446
- <TextControl
447
- className="editor-post-taxonomies__hierarchical-terms-input"
448
- label={ newTermLabel }
449
- value={ formName }
450
- onChange={ onChangeFormName }
451
- required
452
- />
453
- { !! availableTerms.length && (
454
- <TreeSelect
455
- label={ parentSelectLabel }
456
- noOptionLabel={ noParentOption }
457
- onChange={ onChangeFormParent }
458
- selectedId={ formParent }
459
- tree={ availableTermsTree }
449
+ <VStack>
450
+ <TextControl
451
+ __nextHasNoMarginBottom
452
+ className="editor-post-taxonomies__hierarchical-terms-input"
453
+ label={ newTermLabel }
454
+ value={ formName }
455
+ onChange={ onChangeFormName }
456
+ required
460
457
  />
461
- ) }
458
+ { !! availableTerms.length && (
459
+ <TreeSelect
460
+ label={ parentSelectLabel }
461
+ noOptionLabel={ noParentOption }
462
+ onChange={ onChangeFormParent }
463
+ selectedId={ formParent }
464
+ tree={ availableTermsTree }
465
+ />
466
+ ) }
467
+ </VStack>
462
468
  <Button
463
469
  variant="secondary"
464
470
  type="submit"
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { isEmpty, map } from 'lodash';
4
+ import { isEmpty } from 'lodash';
5
5
 
6
6
  /**
7
7
  * WordPress dependencies
@@ -52,9 +52,8 @@ export function PostTemplate() {
52
52
  template: templateSlug || '',
53
53
  } );
54
54
  } }
55
- options={ map(
56
- availableTemplates,
57
- ( templateName, templateSlug ) => ( {
55
+ options={ Object.entries( availableTemplates ?? {} ).map(
56
+ ( [ templateSlug, templateName ] ) => ( {
58
57
  value: templateSlug,
59
58
  label: templateName,
60
59
  } )
@@ -51,6 +51,7 @@ export default function PostURL( { onClose } ) {
51
51
  <InspectorPopoverHeader title={ __( 'URL' ) } onClose={ onClose } />
52
52
  { isEditable && (
53
53
  <TextControl
54
+ __nextHasNoMarginBottom
54
55
  label={ __( 'Permalink' ) }
55
56
  value={ forceEmptyField ? '' : postSlug }
56
57
  autoComplete="off"
@@ -8,6 +8,7 @@ import { EntityProvider, useEntityBlockEditor } from '@wordpress/core-data';
8
8
  import {
9
9
  BlockEditorProvider,
10
10
  BlockContextProvider,
11
+ experiments as blockEditorExperiments,
11
12
  } from '@wordpress/block-editor';
12
13
  import { ReusableBlocksMenuItems } from '@wordpress/reusable-blocks';
13
14
  import { store as noticesStore } from '@wordpress/notices';
@@ -18,107 +19,135 @@ import { store as noticesStore } from '@wordpress/notices';
18
19
  import withRegistryProvider from './with-registry-provider';
19
20
  import { store as editorStore } from '../../store';
20
21
  import useBlockEditorSettings from './use-block-editor-settings';
22
+ import { unlock } from '../../lockUnlock';
21
23
 
22
- function EditorProvider( {
23
- __unstableTemplate,
24
- post,
25
- settings,
26
- recovery,
27
- initialEdits,
28
- children,
29
- } ) {
30
- const defaultBlockContext = useMemo( () => {
31
- if ( post.type === 'wp_template' ) {
32
- return {};
33
- }
34
- return { postId: post.id, postType: post.type };
35
- }, [ post.id, post.type ] );
36
- const { selection, isReady } = useSelect( ( select ) => {
37
- const { getEditorSelection, __unstableIsEditorReady } =
38
- select( editorStore );
39
- return {
40
- isReady: __unstableIsEditorReady(),
41
- selection: getEditorSelection(),
42
- };
43
- }, [] );
44
- const { id, type } = __unstableTemplate ?? post;
45
- const [ blocks, onInput, onChange ] = useEntityBlockEditor(
46
- 'postType',
47
- type,
48
- { id }
49
- );
50
- const editorSettings = useBlockEditorSettings(
24
+ const { ExperimentalBlockEditorProvider } = unlock( blockEditorExperiments );
25
+
26
+ export const ExperimentalEditorProvider = withRegistryProvider(
27
+ ( {
28
+ __unstableTemplate,
29
+ post,
51
30
  settings,
52
- !! __unstableTemplate
53
- );
54
- const {
55
- updatePostLock,
56
- setupEditor,
57
- updateEditorSettings,
58
- __experimentalTearDownEditor,
59
- } = useDispatch( editorStore );
60
- const { createWarningNotice } = useDispatch( noticesStore );
31
+ recovery,
32
+ initialEdits,
33
+ children,
34
+ BlockEditorProviderComponent = ExperimentalBlockEditorProvider,
35
+ } ) => {
36
+ const defaultBlockContext = useMemo( () => {
37
+ if ( post.type === 'wp_template' ) {
38
+ return {};
39
+ }
40
+ return { postId: post.id, postType: post.type };
41
+ }, [ post.id, post.type ] );
42
+ const { editorSettings, selection, isReady } = useSelect(
43
+ ( select ) => {
44
+ const {
45
+ getEditorSettings,
46
+ getEditorSelection,
47
+ __unstableIsEditorReady,
48
+ } = select( editorStore );
49
+ return {
50
+ editorSettings: getEditorSettings(),
51
+ isReady: __unstableIsEditorReady(),
52
+ selection: getEditorSelection(),
53
+ };
54
+ },
55
+ []
56
+ );
57
+ const { id, type } = __unstableTemplate ?? post;
58
+ const [ blocks, onInput, onChange ] = useEntityBlockEditor(
59
+ 'postType',
60
+ type,
61
+ { id }
62
+ );
63
+ const blockEditorSettings = useBlockEditorSettings(
64
+ editorSettings,
65
+ !! __unstableTemplate
66
+ );
67
+ const {
68
+ updatePostLock,
69
+ setupEditor,
70
+ updateEditorSettings,
71
+ __experimentalTearDownEditor,
72
+ } = useDispatch( editorStore );
73
+ const { createWarningNotice } = useDispatch( noticesStore );
61
74
 
62
- // Initialize and tear down the editor.
63
- // Ideally this should be synced on each change and not just something you do once.
64
- useLayoutEffect( () => {
65
- // Assume that we don't need to initialize in the case of an error recovery.
66
- if ( recovery ) {
67
- return;
68
- }
75
+ // Initialize and tear down the editor.
76
+ // Ideally this should be synced on each change and not just something you do once.
77
+ useLayoutEffect( () => {
78
+ // Assume that we don't need to initialize in the case of an error recovery.
79
+ if ( recovery ) {
80
+ return;
81
+ }
69
82
 
70
- updatePostLock( settings.postLock );
71
- setupEditor( post, initialEdits, settings.template );
72
- if ( settings.autosave ) {
73
- createWarningNotice(
74
- __(
75
- 'There is an autosave of this post that is more recent than the version below.'
76
- ),
77
- {
78
- id: 'autosave-exists',
79
- actions: [
80
- {
81
- label: __( 'View the autosave' ),
82
- url: settings.autosave.editLink,
83
- },
84
- ],
85
- }
86
- );
87
- }
83
+ updatePostLock( settings.postLock );
84
+ setupEditor( post, initialEdits, settings.template );
85
+ if ( settings.autosave ) {
86
+ createWarningNotice(
87
+ __(
88
+ 'There is an autosave of this post that is more recent than the version below.'
89
+ ),
90
+ {
91
+ id: 'autosave-exists',
92
+ actions: [
93
+ {
94
+ label: __( 'View the autosave' ),
95
+ url: settings.autosave.editLink,
96
+ },
97
+ ],
98
+ }
99
+ );
100
+ }
101
+
102
+ return () => {
103
+ __experimentalTearDownEditor();
104
+ };
105
+ }, [] );
88
106
 
89
- return () => {
90
- __experimentalTearDownEditor();
91
- };
92
- }, [] );
107
+ // Synchronize the editor settings as they change.
108
+ useEffect( () => {
109
+ updateEditorSettings( settings );
110
+ }, [ settings ] );
93
111
 
94
- // Synchronize the editor settings as they change.
95
- useEffect( () => {
96
- updateEditorSettings( settings );
97
- }, [ settings ] );
112
+ if ( ! isReady ) {
113
+ return null;
114
+ }
98
115
 
99
- if ( ! isReady ) {
100
- return null;
116
+ return (
117
+ <EntityProvider kind="root" type="site">
118
+ <EntityProvider
119
+ kind="postType"
120
+ type={ post.type }
121
+ id={ post.id }
122
+ >
123
+ <BlockContextProvider value={ defaultBlockContext }>
124
+ <BlockEditorProviderComponent
125
+ value={ blocks }
126
+ onChange={ onChange }
127
+ onInput={ onInput }
128
+ selection={ selection }
129
+ settings={ blockEditorSettings }
130
+ useSubRegistry={ false }
131
+ >
132
+ { children }
133
+ <ReusableBlocksMenuItems />
134
+ </BlockEditorProviderComponent>
135
+ </BlockContextProvider>
136
+ </EntityProvider>
137
+ </EntityProvider>
138
+ );
101
139
  }
140
+ );
102
141
 
142
+ export function EditorProvider( props ) {
103
143
  return (
104
- <EntityProvider kind="root" type="site">
105
- <EntityProvider kind="postType" type={ post.type } id={ post.id }>
106
- <BlockContextProvider value={ defaultBlockContext }>
107
- <BlockEditorProvider
108
- value={ blocks }
109
- onChange={ onChange }
110
- onInput={ onInput }
111
- selection={ selection }
112
- settings={ editorSettings }
113
- useSubRegistry={ false }
114
- >
115
- { children }
116
- <ReusableBlocksMenuItems />
117
- </BlockEditorProvider>
118
- </BlockContextProvider>
119
- </EntityProvider>
120
- </EntityProvider>
144
+ <ExperimentalEditorProvider
145
+ { ...props }
146
+ BlockEditorProviderComponent={ BlockEditorProvider }
147
+ >
148
+ { props.children }
149
+ </ExperimentalEditorProvider>
121
150
  );
122
151
  }
123
152
 
124
- export default withRegistryProvider( EditorProvider );
153
+ export default EditorProvider;
@@ -92,11 +92,16 @@ class NativeEditorProvider extends Component {
92
92
  }
93
93
 
94
94
  componentDidMount() {
95
- const { capabilities, locale, hostAppNamespace, updateSettings } =
96
- this.props;
95
+ const {
96
+ capabilities,
97
+ locale,
98
+ hostAppNamespace,
99
+ updateEditorSettings,
100
+ updateBlockEditorSettings,
101
+ } = this.props;
97
102
 
98
- updateSettings( {
99
- ...capabilities,
103
+ updateEditorSettings( {
104
+ capabilities,
100
105
  ...this.getThemeColors( this.props ),
101
106
  locale,
102
107
  hostAppNamespace,
@@ -152,7 +157,9 @@ class NativeEditorProvider extends Component {
152
157
  window.wp.galleryBlockV2Enabled =
153
158
  galleryWithImageBlocks;
154
159
  }
155
- updateSettings( this.getThemeColors( editorSettings ) );
160
+ updateEditorSettings(
161
+ this.getThemeColors( editorSettings )
162
+ );
156
163
  }
157
164
  );
158
165
 
@@ -177,7 +184,7 @@ class NativeEditorProvider extends Component {
177
184
  const impressions = { ...NEW_BLOCK_TYPES, ...storedImpressions };
178
185
 
179
186
  // Persist impressions to JavaScript store.
180
- updateSettings( { impressions } );
187
+ updateBlockEditorSettings( { impressions } );
181
188
 
182
189
  // Persist impressions to native store if they do not include latest
183
190
  // `NEW_BLOCK_TYPES` configuration.
@@ -318,7 +325,7 @@ class NativeEditorProvider extends Component {
318
325
  }
319
326
 
320
327
  updateCapabilitiesAction( capabilities ) {
321
- this.props.updateSettings( capabilities );
328
+ this.props.updateEditorSettings( { capabilities } );
322
329
  }
323
330
 
324
331
  render() {
@@ -345,24 +352,21 @@ class NativeEditorProvider extends Component {
345
352
  }
346
353
  }
347
354
 
348
- export default compose( [
355
+ const ComposedNativeProvider = compose( [
349
356
  withSelect( ( select ) => {
350
357
  const {
351
358
  __unstableIsEditorReady: isEditorReady,
352
359
  getEditorBlocks,
353
360
  getEditedPostAttribute,
354
361
  getEditedPostContent,
362
+ getEditorSettings,
355
363
  } = select( editorStore );
356
364
  const { getEditorMode } = select( editPostStore );
357
365
 
358
- const {
359
- getBlockIndex,
360
- getSelectedBlockClientId,
361
- getGlobalBlockCount,
362
- getSettings: getBlockEditorSettings,
363
- } = select( blockEditorStore );
366
+ const { getBlockIndex, getSelectedBlockClientId, getGlobalBlockCount } =
367
+ select( blockEditorStore );
364
368
 
365
- const settings = getBlockEditorSettings();
369
+ const settings = getEditorSettings();
366
370
  const defaultEditorColors = settings?.colors ?? [];
367
371
  const defaultEditorGradients = settings?.gradients ?? [];
368
372
 
@@ -381,7 +385,8 @@ export default compose( [
381
385
  };
382
386
  } ),
383
387
  withDispatch( ( dispatch ) => {
384
- const { editPost, resetEditorBlocks } = dispatch( editorStore );
388
+ const { editPost, resetEditorBlocks, updateEditorSettings } =
389
+ dispatch( editorStore );
385
390
  const {
386
391
  updateSettings,
387
392
  clearSelectedBlock,
@@ -393,7 +398,8 @@ export default compose( [
393
398
  const { createSuccessNotice } = dispatch( noticesStore );
394
399
 
395
400
  return {
396
- updateSettings,
401
+ updateBlockEditorSettings: updateSettings,
402
+ updateEditorSettings,
397
403
  addEntities,
398
404
  clearSelectedBlock,
399
405
  insertBlock,
@@ -414,3 +420,6 @@ export default compose( [
414
420
  };
415
421
  } ),
416
422
  ] )( NativeEditorProvider );
423
+
424
+ export default ComposedNativeProvider;
425
+ export { ComposedNativeProvider as ExperimentalEditorProvider };
@@ -7,18 +7,75 @@ import {
7
7
  store as coreStore,
8
8
  __experimentalFetchLinkSuggestions as fetchLinkSuggestions,
9
9
  __experimentalFetchUrlData as fetchUrlData,
10
- __experimentalFetchMedia as fetchMedia,
11
10
  } from '@wordpress/core-data';
12
11
  import { __ } from '@wordpress/i18n';
13
12
 
14
13
  /**
15
14
  * Internal dependencies
16
15
  */
16
+ import inserterMediaCategories from '../media-categories';
17
17
  import { mediaUpload } from '../../utils';
18
18
  import { store as editorStore } from '../../store';
19
19
 
20
20
  const EMPTY_BLOCKS_LIST = [];
21
21
 
22
+ const BLOCK_EDITOR_SETTINGS = [
23
+ '__experimentalBlockDirectory',
24
+ '__experimentalBlockInspectorAnimation',
25
+ '__experimentalDiscussionSettings',
26
+ '__experimentalFeatures',
27
+ '__experimentalGlobalStylesBaseStyles',
28
+ '__experimentalPreferredStyleVariations',
29
+ '__experimentalSetIsInserterOpened',
30
+ '__unstableGalleryWithImageBlocks',
31
+ 'alignWide',
32
+ 'allowedBlockTypes',
33
+ 'blockInspectorTabs',
34
+ 'allowedMimeTypes',
35
+ 'bodyPlaceholder',
36
+ 'canLockBlocks',
37
+ 'capabilities',
38
+ 'clearBlockSelection',
39
+ 'codeEditingEnabled',
40
+ 'colors',
41
+ 'disableCustomColors',
42
+ 'disableCustomFontSizes',
43
+ 'disableCustomSpacingSizes',
44
+ 'disableCustomGradients',
45
+ 'disableLayoutStyles',
46
+ 'enableCustomLineHeight',
47
+ 'enableCustomSpacing',
48
+ 'enableCustomUnits',
49
+ 'enableOpenverseMediaCategory',
50
+ 'focusMode',
51
+ 'fontSizes',
52
+ 'gradients',
53
+ 'generateAnchors',
54
+ 'hasFixedToolbar',
55
+ 'hasInlineToolbar',
56
+ 'isDistractionFree',
57
+ 'imageDefaultSize',
58
+ 'imageDimensions',
59
+ 'imageEditing',
60
+ 'imageSizes',
61
+ 'isRTL',
62
+ 'keepCaretInsideBlock',
63
+ 'locale',
64
+ 'maxWidth',
65
+ 'onUpdateDefaultBlockStyles',
66
+ 'postsPerPage',
67
+ 'readOnly',
68
+ 'styles',
69
+ 'template',
70
+ 'templateLock',
71
+ 'titlePlaceholder',
72
+ 'supportsLayout',
73
+ 'widgetTypesToHideFromLegacyWidgetBlock',
74
+ '__unstableHasCustomAppender',
75
+ '__unstableIsPreviewMode',
76
+ '__unstableResolvedAssets',
77
+ ];
78
+
22
79
  /**
23
80
  * React hook used to compute the block editor settings to use for the post editor.
24
81
  *
@@ -133,51 +190,7 @@ function useBlockEditorSettings( settings, hasTemplate ) {
133
190
  () => ( {
134
191
  ...Object.fromEntries(
135
192
  Object.entries( settings ).filter( ( [ key ] ) =>
136
- [
137
- '__experimentalBlockDirectory',
138
- '__experimentalDiscussionSettings',
139
- '__experimentalFeatures',
140
- '__experimentalPreferredStyleVariations',
141
- '__experimentalSetIsInserterOpened',
142
- '__unstableGalleryWithImageBlocks',
143
- 'alignWide',
144
- 'allowedBlockTypes',
145
- 'blockInspectorTabs',
146
- 'bodyPlaceholder',
147
- 'canLockBlocks',
148
- 'codeEditingEnabled',
149
- 'colors',
150
- 'disableCustomColors',
151
- 'disableCustomFontSizes',
152
- 'disableCustomSpacingSizes',
153
- 'disableCustomGradients',
154
- 'disableLayoutStyles',
155
- 'enableCustomLineHeight',
156
- 'enableCustomSpacing',
157
- 'enableCustomUnits',
158
- 'focusMode',
159
- 'fontSizes',
160
- 'gradients',
161
- 'generateAnchors',
162
- 'hasFixedToolbar',
163
- 'isDistractionFree',
164
- 'hasInlineToolbar',
165
- 'imageDefaultSize',
166
- 'imageDimensions',
167
- 'imageEditing',
168
- 'imageSizes',
169
- 'isRTL',
170
- 'keepCaretInsideBlock',
171
- 'maxWidth',
172
- 'onUpdateDefaultBlockStyles',
173
- 'styles',
174
- 'template',
175
- 'templateLock',
176
- 'titlePlaceholder',
177
- 'supportsLayout',
178
- 'widgetTypesToHideFromLegacyWidgetBlock',
179
- '__unstableResolvedAssets',
180
- ].includes( key )
193
+ BLOCK_EDITOR_SETTINGS.includes( key )
181
194
  )
182
195
  ),
183
196
  mediaUpload: hasUploadPermissions ? mediaUpload : undefined,
@@ -186,9 +199,7 @@ function useBlockEditorSettings( settings, hasTemplate ) {
186
199
  __experimentalBlockPatternCategories: blockPatternCategories,
187
200
  __experimentalFetchLinkSuggestions: ( search, searchOptions ) =>
188
201
  fetchLinkSuggestions( search, searchOptions, settings ),
189
- // TODO: We should find a proper way to consolidate similar cases
190
- // like reusable blocks, fetch entities, etc.
191
- __unstableFetchMedia: fetchMedia,
202
+ inserterMediaCategories,
192
203
  __experimentalFetchRichUrlData: fetchUrlData,
193
204
  __experimentalCanUserUseUnfilteredHTML: canUseUnfilteredHTML,
194
205
  __experimentalUndo: undo,
@@ -14,10 +14,9 @@ import { store as editorStore } from '../../store';
14
14
  const EMPTY_BLOCKS_LIST = [];
15
15
 
16
16
  function useNativeBlockEditorSettings( settings, hasTemplate ) {
17
- const capabilities = settings.capabilities ?? {};
18
17
  const editorSettings = useBlockEditorSettings( settings, hasTemplate );
18
+ const supportReusableBlock = settings.capabilities?.reusableBlock === true;
19
19
 
20
- const supportReusableBlock = capabilities.reusableBlock === true;
21
20
  const { reusableBlocks, isTitleSelected } = useSelect(
22
21
  ( select ) => {
23
22
  return {
@@ -23,7 +23,9 @@ function TableOfContents(
23
23
  );
24
24
  return (
25
25
  <Dropdown
26
- position={ repositionDropdown ? 'middle right right' : 'bottom' }
26
+ popoverProps={ {
27
+ placement: repositionDropdown ? 'right' : 'bottom',
28
+ } }
27
29
  className="table-of-contents"
28
30
  contentClassName="table-of-contents__popover"
29
31
  renderToggle={ ( { isOpen, onToggle } ) => (
@@ -26,7 +26,7 @@ export default function UnsavedChangesWarning() {
26
26
  *
27
27
  * @param {Event} event `beforeunload` event.
28
28
  *
29
- * @return {?string} Warning prompt message, if unsaved changes exist.
29
+ * @return {string | undefined} Warning prompt message, if unsaved changes exist.
30
30
  */
31
31
  const warnIfUnsavedChanges = ( event ) => {
32
32
  // We need to call the selector directly in the listener to avoid race
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { ExperimentalEditorProvider } from './components/provider';
5
+ import { lock } from './lockUnlock';
6
+
7
+ export const experiments = {};
8
+ lock( experiments, {
9
+ ExperimentalEditorProvider,
10
+ } );
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { clone } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
@@ -15,7 +10,7 @@ import { userAutocompleter } from '../components';
15
10
 
16
11
  function setDefaultCompleters( completers = [] ) {
17
12
  // Provide copies so filters may directly modify them.
18
- completers.push( clone( userAutocompleter ) );
13
+ completers.push( { ...userAutocompleter } );
19
14
 
20
15
  return completers;
21
16
  }
package/src/index.js CHANGED
@@ -6,6 +6,7 @@ import './hooks';
6
6
  export { storeConfig, store } from './store';
7
7
  export * from './components';
8
8
  export * from './utils';
9
+ export * from './experiments';
9
10
 
10
11
  /*
11
12
  * Backward compatibility
@@ -13,3 +13,4 @@ import './hooks';
13
13
  export { store } from './store';
14
14
  export * from './components';
15
15
  export * from './utils';
16
+ export * from './experiments';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __dangerousOptInToUnstableAPIsOnlyForCoreModules } from '@wordpress/experiments';
5
+ export const { lock, unlock } =
6
+ __dangerousOptInToUnstableAPIsOnlyForCoreModules(
7
+ 'I know using unstable features means my plugin or theme will inevitably break on the next WordPress release.',
8
+ '@wordpress/editor'
9
+ );