@wordpress/block-library 8.25.1-next.79a6196f.0 → 8.27.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.
- package/CHANGELOG.md +4 -0
- package/build/avatar/edit.js +2 -2
- package/build/avatar/edit.js.map +1 -1
- package/build/block/edit.js +75 -12
- package/build/block/edit.js.map +1 -1
- package/build/block/{v1/edit.native.js → edit.native.js} +4 -4
- package/build/block/edit.native.js.map +1 -0
- package/build/block/index.js +5 -3
- package/build/block/index.js.map +1 -1
- package/build/button/edit.js +24 -6
- package/build/button/edit.js.map +1 -1
- package/build/button/index.js +1 -0
- package/build/button/index.js.map +1 -1
- package/build/button/save.js +3 -1
- package/build/button/save.js.map +1 -1
- package/build/embed/edit.js +3 -2
- package/build/embed/edit.js.map +1 -1
- package/build/file/index.js +0 -1
- package/build/file/index.js.map +1 -1
- package/build/footnotes/edit.js +2 -1
- package/build/footnotes/edit.js.map +1 -1
- package/build/footnotes/format.js +17 -19
- package/build/footnotes/format.js.map +1 -1
- package/build/heading/edit.js +2 -1
- package/build/heading/edit.js.map +1 -1
- package/build/heading/edit.native.js +141 -0
- package/build/heading/edit.native.js.map +1 -0
- package/build/heading/index.js +1 -0
- package/build/heading/index.js.map +1 -1
- package/build/image/edit.js +8 -4
- package/build/image/edit.js.map +1 -1
- package/build/image/image.js +33 -7
- package/build/image/image.js.map +1 -1
- package/build/image/index.js +6 -3
- package/build/image/index.js.map +1 -1
- package/build/more/index.js +4 -0
- package/build/more/index.js.map +1 -1
- package/build/navigation/edit/index.js +2 -2
- package/build/navigation/edit/index.js.map +1 -1
- package/build/navigation/index.js +0 -1
- package/build/navigation/index.js.map +1 -1
- package/build/paragraph/edit.js +2 -1
- package/build/paragraph/edit.js.map +1 -1
- package/build/paragraph/index.js +1 -1
- package/build/paragraph/transforms.js +1 -1
- package/build/post-content/edit.js +2 -2
- package/build/post-content/edit.js.map +1 -1
- package/build/post-date/edit.js +1 -1
- package/build/post-date/edit.js.map +1 -1
- package/build/post-navigation-link/edit.js +43 -2
- package/build/post-navigation-link/edit.js.map +1 -1
- package/build/post-navigation-link/index.js +8 -0
- package/build/post-navigation-link/index.js.map +1 -1
- package/build/pullquote/index.js +4 -0
- package/build/pullquote/index.js.map +1 -1
- package/build/query/edit/inspector-controls/index.js +3 -3
- package/build/query/edit/inspector-controls/index.js.map +1 -1
- package/build/query/edit/query-content.js +2 -2
- package/build/query/edit/query-content.js.map +1 -1
- package/build/query/edit/query-placeholder.js +6 -7
- package/build/query/edit/query-placeholder.js.map +1 -1
- package/build/query/index.js +1 -2
- package/build/query/index.js.map +1 -1
- package/build/query/variations.js +8 -1
- package/build/query/variations.js.map +1 -1
- package/build/query/view.js +31 -12
- package/build/query/view.js.map +1 -1
- package/build/search/index.js +0 -1
- package/build/search/index.js.map +1 -1
- package/build/table-of-contents/hooks.js +2 -2
- package/build/table-of-contents/hooks.js.map +1 -1
- package/build/template-part/edit/advanced-controls.js +1 -4
- package/build/template-part/edit/advanced-controls.js.map +1 -1
- package/build/template-part/edit/index.js +39 -17
- package/build/template-part/edit/index.js.map +1 -1
- package/build/video/edit.native.js +7 -2
- package/build/video/edit.native.js.map +1 -1
- package/build/video/transforms.js +17 -0
- package/build/video/transforms.js.map +1 -1
- package/build-module/avatar/edit.js +2 -2
- package/build-module/avatar/edit.js.map +1 -1
- package/build-module/block/edit.js +74 -11
- package/build-module/block/edit.js.map +1 -1
- package/build-module/block/{v1/edit.native.js → edit.native.js} +3 -3
- package/build-module/block/edit.native.js.map +1 -0
- package/build-module/block/index.js +5 -3
- package/build-module/block/index.js.map +1 -1
- package/build-module/button/edit.js +25 -7
- package/build-module/button/edit.js.map +1 -1
- package/build-module/button/index.js +1 -0
- package/build-module/button/index.js.map +1 -1
- package/build-module/button/save.js +4 -2
- package/build-module/button/save.js.map +1 -1
- package/build-module/embed/edit.js +3 -2
- package/build-module/embed/edit.js.map +1 -1
- package/build-module/file/index.js +0 -1
- package/build-module/file/index.js.map +1 -1
- package/build-module/footnotes/edit.js +2 -1
- package/build-module/footnotes/edit.js.map +1 -1
- package/build-module/footnotes/format.js +17 -19
- package/build-module/footnotes/format.js.map +1 -1
- package/build-module/heading/edit.js +3 -2
- package/build-module/heading/edit.js.map +1 -1
- package/build-module/heading/edit.native.js +132 -0
- package/build-module/heading/edit.native.js.map +1 -0
- package/build-module/heading/index.js +1 -0
- package/build-module/heading/index.js.map +1 -1
- package/build-module/image/edit.js +9 -5
- package/build-module/image/edit.js.map +1 -1
- package/build-module/image/image.js +33 -7
- package/build-module/image/image.js.map +1 -1
- package/build-module/image/index.js +6 -3
- package/build-module/image/index.js.map +1 -1
- package/build-module/more/index.js +4 -0
- package/build-module/more/index.js.map +1 -1
- package/build-module/navigation/edit/index.js +1 -1
- package/build-module/navigation/edit/index.js.map +1 -1
- package/build-module/navigation/index.js +0 -1
- package/build-module/navigation/index.js.map +1 -1
- package/build-module/paragraph/edit.js +3 -2
- package/build-module/paragraph/edit.js.map +1 -1
- package/build-module/paragraph/index.js +1 -1
- package/build-module/paragraph/transforms.js +1 -1
- package/build-module/post-content/edit.js +1 -1
- package/build-module/post-content/edit.js.map +1 -1
- package/build-module/post-date/edit.js +1 -1
- package/build-module/post-date/edit.js.map +1 -1
- package/build-module/post-navigation-link/edit.js +44 -3
- package/build-module/post-navigation-link/edit.js.map +1 -1
- package/build-module/post-navigation-link/index.js +8 -0
- package/build-module/post-navigation-link/index.js.map +1 -1
- package/build-module/pullquote/index.js +4 -0
- package/build-module/pullquote/index.js.map +1 -1
- package/build-module/query/edit/inspector-controls/index.js +4 -4
- package/build-module/query/edit/inspector-controls/index.js.map +1 -1
- package/build-module/query/edit/query-content.js +2 -2
- package/build-module/query/edit/query-content.js.map +1 -1
- package/build-module/query/edit/query-placeholder.js +7 -8
- package/build-module/query/edit/query-placeholder.js.map +1 -1
- package/build-module/query/index.js +1 -2
- package/build-module/query/index.js.map +1 -1
- package/build-module/query/variations.js +8 -1
- package/build-module/query/variations.js.map +1 -1
- package/build-module/query/view.js +30 -9
- package/build-module/query/view.js.map +1 -1
- package/build-module/search/index.js +0 -1
- package/build-module/search/index.js.map +1 -1
- package/build-module/table-of-contents/hooks.js +2 -2
- package/build-module/table-of-contents/hooks.js.map +1 -1
- package/build-module/template-part/edit/advanced-controls.js +1 -4
- package/build-module/template-part/edit/advanced-controls.js.map +1 -1
- package/build-module/template-part/edit/index.js +38 -16
- package/build-module/template-part/edit/index.js.map +1 -1
- package/build-module/video/edit.native.js +7 -2
- package/build-module/video/edit.native.js.map +1 -1
- package/build-module/video/transforms.js +17 -0
- package/build-module/video/transforms.js.map +1 -1
- package/build-style/common-rtl.css +4 -2
- package/build-style/common.css +4 -2
- package/build-style/cover/style-rtl.css +1 -2
- package/build-style/cover/style.css +1 -2
- package/build-style/editor-rtl.css +6 -4
- package/build-style/editor.css +6 -4
- package/build-style/gallery/style-rtl.css +2 -4
- package/build-style/gallery/style.css +2 -4
- package/build-style/image/editor-rtl.css +6 -0
- package/build-style/image/editor.css +6 -0
- package/build-style/page-list/editor-rtl.css +0 -4
- package/build-style/page-list/editor.css +0 -4
- package/build-style/pullquote/style-rtl.css +10 -1
- package/build-style/pullquote/style.css +10 -1
- package/build-style/search/style-rtl.css +2 -1
- package/build-style/search/style.css +2 -1
- package/build-style/style-rtl.css +19 -11
- package/build-style/style.css +19 -11
- package/build-style/video/style-rtl.css +1 -2
- package/build-style/video/style.css +1 -2
- package/package.json +34 -32
- package/src/avatar/edit.js +16 -18
- package/src/block/block.json +3 -0
- package/src/block/edit.js +96 -14
- package/src/block/{v1/edit.native.js → edit.native.js} +4 -4
- package/src/block/index.js +2 -3
- package/src/block/index.php +3 -31
- package/src/button/block.json +1 -0
- package/src/button/edit.js +76 -43
- package/src/button/save.js +3 -0
- package/src/embed/edit.js +3 -2
- package/src/file/block.json +0 -1
- package/src/file/index.php +11 -57
- package/src/footnotes/edit.js +2 -1
- package/src/footnotes/format.js +34 -31
- package/src/footnotes/index.php +20 -11
- package/src/heading/block.json +1 -0
- package/src/heading/edit.js +18 -14
- package/src/heading/edit.native.js +144 -0
- package/src/image/block.json +7 -3
- package/src/image/edit.js +19 -6
- package/src/image/editor.scss +6 -1
- package/src/image/image.js +101 -42
- package/src/image/index.js +6 -0
- package/src/image/index.php +14 -51
- package/src/more/index.js +6 -0
- package/src/navigation/block.json +0 -1
- package/src/navigation/edit/index.js +2 -2
- package/src/navigation/index.php +777 -28
- package/src/navigation-link/index.php +78 -16
- package/src/page-list/editor.scss +0 -4
- package/src/paragraph/block.json +1 -1
- package/src/paragraph/edit.js +23 -19
- package/src/post-content/edit.js +2 -2
- package/src/post-date/edit.js +38 -33
- package/src/post-navigation-link/block.json +8 -0
- package/src/post-navigation-link/edit.js +63 -1
- package/src/post-navigation-link/index.php +17 -3
- package/src/post-terms/index.php +13 -4
- package/src/pullquote/block.json +4 -0
- package/src/pullquote/style.scss +13 -1
- package/src/query/block.json +1 -2
- package/src/query/edit/inspector-controls/index.js +137 -146
- package/src/query/edit/query-content.js +9 -7
- package/src/query/edit/query-placeholder.js +11 -11
- package/src/query/index.php +33 -71
- package/src/query/variations.js +4 -0
- package/src/query/view.js +24 -19
- package/src/search/block.json +0 -1
- package/src/search/index.php +18 -36
- package/src/table-of-contents/hooks.js +2 -2
- package/src/template-part/edit/advanced-controls.js +2 -3
- package/src/template-part/edit/index.js +77 -50
- package/src/template-part/index.php +2 -2
- package/src/video/edit.native.js +5 -2
- package/src/video/test/edit.native.js +38 -0
- package/src/video/transforms.js +32 -0
- package/tsconfig.json +1 -0
- package/build/block/v1/edit.js +0 -116
- package/build/block/v1/edit.js.map +0 -1
- package/build/block/v1/edit.native.js.map +0 -1
- package/build-module/block/v1/edit.js +0 -108
- package/build-module/block/v1/edit.js.map +0 -1
- package/build-module/block/v1/edit.native.js.map +0 -1
- package/src/block/v1/edit.js +0 -163
package/src/embed/edit.js
CHANGED
|
@@ -127,16 +127,17 @@ const EmbedEdit = ( props ) => {
|
|
|
127
127
|
};
|
|
128
128
|
|
|
129
129
|
useEffect( () => {
|
|
130
|
-
if (
|
|
130
|
+
if ( preview?.html || ! cannotEmbed || fetching ) {
|
|
131
131
|
return;
|
|
132
132
|
}
|
|
133
|
+
|
|
133
134
|
// At this stage, we're not fetching the preview and know it can't be embedded,
|
|
134
135
|
// so try removing any trailing slash, and resubmit.
|
|
135
136
|
const newURL = attributesUrl.replace( /\/$/, '' );
|
|
136
137
|
setURL( newURL );
|
|
137
138
|
setIsEditingURL( false );
|
|
138
139
|
setAttributes( { url: newURL } );
|
|
139
|
-
}, [ preview?.html, attributesUrl, cannotEmbed, fetching ] );
|
|
140
|
+
}, [ preview?.html, attributesUrl, cannotEmbed, fetching, setAttributes ] );
|
|
140
141
|
|
|
141
142
|
// Try a different provider in case the embed url is not supported.
|
|
142
143
|
useEffect( () => {
|
package/src/file/block.json
CHANGED
package/src/file/index.php
CHANGED
|
@@ -14,35 +14,8 @@
|
|
|
14
14
|
*
|
|
15
15
|
* @return string Returns the block content.
|
|
16
16
|
*/
|
|
17
|
-
function render_block_core_file( $attributes, $content
|
|
18
|
-
$is_gutenberg_plugin = defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN;
|
|
19
|
-
$should_load_view_script = ! empty( $attributes['displayPreview'] );
|
|
20
|
-
$view_js_file = 'wp-block-file-view';
|
|
21
|
-
$script_handles = $block->block_type->view_script_handles;
|
|
22
|
-
|
|
23
|
-
if ( $is_gutenberg_plugin ) {
|
|
24
|
-
if ( $should_load_view_script ) {
|
|
25
|
-
gutenberg_enqueue_module( '@wordpress/block-library/file-block' );
|
|
26
|
-
}
|
|
27
|
-
// Remove the view script because we are using the module.
|
|
28
|
-
$block->block_type->view_script_handles = array_diff( $script_handles, array( $view_js_file ) );
|
|
29
|
-
} else {
|
|
30
|
-
// If the script already exists, there is no point in removing it from viewScript.
|
|
31
|
-
if ( ! wp_script_is( $view_js_file ) ) {
|
|
32
|
-
|
|
33
|
-
// If the script is not needed, and it is still in the `view_script_handles`, remove it.
|
|
34
|
-
if ( ! $should_load_view_script && in_array( $view_js_file, $script_handles, true ) ) {
|
|
35
|
-
$block->block_type->view_script_handles = array_diff( $script_handles, array( $view_js_file ) );
|
|
36
|
-
}
|
|
37
|
-
// If the script is needed, but it was previously removed, add it again.
|
|
38
|
-
if ( $should_load_view_script && ! in_array( $view_js_file, $script_handles, true ) ) {
|
|
39
|
-
$block->block_type->view_script_handles = array_merge( $script_handles, array( $view_js_file ) );
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
17
|
+
function render_block_core_file( $attributes, $content ) {
|
|
44
18
|
// Update object's aria-label attribute if present in block HTML.
|
|
45
|
-
|
|
46
19
|
// Match an aria-label attribute from an object tag.
|
|
47
20
|
$pattern = '@<object.+(?<attribute>aria-label="(?<filename>[^"]+)?")@i';
|
|
48
21
|
$content = preg_replace_callback(
|
|
@@ -63,8 +36,10 @@ function render_block_core_file( $attributes, $content, $block ) {
|
|
|
63
36
|
$content
|
|
64
37
|
);
|
|
65
38
|
|
|
66
|
-
// If it
|
|
67
|
-
if ( $
|
|
39
|
+
// If it's interactive, enqueue the script module and add the directives.
|
|
40
|
+
if ( ! empty( $attributes['displayPreview'] ) ) {
|
|
41
|
+
wp_enqueue_script_module( '@wordpress/block-library/file-block' );
|
|
42
|
+
|
|
68
43
|
$processor = new WP_HTML_Tag_Processor( $content );
|
|
69
44
|
$processor->next_tag();
|
|
70
45
|
$processor->set_attribute( 'data-wp-interactive', '{"namespace":"core/file"}' );
|
|
@@ -77,25 +52,6 @@ function render_block_core_file( $attributes, $content, $block ) {
|
|
|
77
52
|
return $content;
|
|
78
53
|
}
|
|
79
54
|
|
|
80
|
-
/**
|
|
81
|
-
* Ensure that the view script has the `wp-interactivity` dependency.
|
|
82
|
-
*
|
|
83
|
-
* @since 6.4.0
|
|
84
|
-
*
|
|
85
|
-
* @global WP_Scripts $wp_scripts
|
|
86
|
-
*/
|
|
87
|
-
function block_core_file_ensure_interactivity_dependency() {
|
|
88
|
-
global $wp_scripts;
|
|
89
|
-
if (
|
|
90
|
-
isset( $wp_scripts->registered['wp-block-file-view'] ) &&
|
|
91
|
-
! in_array( 'wp-interactivity', $wp_scripts->registered['wp-block-file-view']->deps, true )
|
|
92
|
-
) {
|
|
93
|
-
$wp_scripts->registered['wp-block-file-view']->deps[] = 'wp-interactivity';
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
add_action( 'wp_print_scripts', 'block_core_file_ensure_interactivity_dependency' );
|
|
98
|
-
|
|
99
55
|
/**
|
|
100
56
|
* Registers the `core/file` block on server.
|
|
101
57
|
*/
|
|
@@ -107,13 +63,11 @@ function register_block_core_file() {
|
|
|
107
63
|
)
|
|
108
64
|
);
|
|
109
65
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
);
|
|
117
|
-
}
|
|
66
|
+
wp_register_script_module(
|
|
67
|
+
'@wordpress/block-library/file-block',
|
|
68
|
+
gutenberg_url( '/build/interactivity/file.min.js' ),
|
|
69
|
+
array( '@wordpress/interactivity' ),
|
|
70
|
+
defined( 'GUTENBERG_VERSION' ) ? GUTENBERG_VERSION : get_bloginfo( 'version' )
|
|
71
|
+
);
|
|
118
72
|
}
|
|
119
73
|
add_action( 'init', 'register_block_core_file' );
|
package/src/footnotes/edit.js
CHANGED
|
@@ -14,10 +14,11 @@ export default function FootnotesEdit( { context: { postType, postId } } ) {
|
|
|
14
14
|
'meta',
|
|
15
15
|
postId
|
|
16
16
|
);
|
|
17
|
+
const footnotesSupported = 'string' === typeof meta?.footnotes;
|
|
17
18
|
const footnotes = meta?.footnotes ? JSON.parse( meta.footnotes ) : [];
|
|
18
19
|
const blockProps = useBlockProps();
|
|
19
20
|
|
|
20
|
-
if (
|
|
21
|
+
if ( ! footnotesSupported ) {
|
|
21
22
|
return (
|
|
22
23
|
<div { ...blockProps }>
|
|
23
24
|
<Placeholder
|
package/src/footnotes/format.js
CHANGED
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
privateApis,
|
|
16
16
|
} from '@wordpress/block-editor';
|
|
17
17
|
import { useSelect, useDispatch, useRegistry } from '@wordpress/data';
|
|
18
|
+
import { store as coreDataStore } from '@wordpress/core-data';
|
|
18
19
|
import { createBlock, store as blocksStore } from '@wordpress/blocks';
|
|
19
20
|
|
|
20
21
|
/**
|
|
@@ -38,12 +39,12 @@ export const format = {
|
|
|
38
39
|
},
|
|
39
40
|
interactive: true,
|
|
40
41
|
contentEditable: false,
|
|
41
|
-
[ usesContextKey ]: [ 'postType' ],
|
|
42
|
+
[ usesContextKey ]: [ 'postType', 'postId' ],
|
|
42
43
|
edit: function Edit( {
|
|
43
44
|
value,
|
|
44
45
|
onChange,
|
|
45
46
|
isObjectActive,
|
|
46
|
-
context: { postType },
|
|
47
|
+
context: { postType, postId },
|
|
47
48
|
} ) {
|
|
48
49
|
const registry = useRegistry();
|
|
49
50
|
const {
|
|
@@ -53,40 +54,42 @@ export const format = {
|
|
|
53
54
|
getBlockName,
|
|
54
55
|
getBlockParentsByBlockName,
|
|
55
56
|
} = registry.select( blockEditorStore );
|
|
56
|
-
const
|
|
57
|
-
( select ) =>
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
const isFootnotesSupported = useSelect(
|
|
58
|
+
( select ) => {
|
|
59
|
+
if (
|
|
60
|
+
! select( blocksStore ).getBlockType( 'core/footnotes' )
|
|
61
|
+
) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const entityRecord = select( coreDataStore ).getEntityRecord(
|
|
66
|
+
'postType',
|
|
67
|
+
postType,
|
|
68
|
+
postId
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
if ( 'string' !== typeof entityRecord?.meta?.footnotes ) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Checks if the selected block lives within a pattern.
|
|
76
|
+
const {
|
|
77
|
+
getBlockParentsByBlockName: _getBlockParentsByBlockName,
|
|
78
|
+
getSelectedBlockClientId: _getSelectedBlockClientId,
|
|
79
|
+
} = select( blockEditorStore );
|
|
80
|
+
const parentCoreBlocks = _getBlockParentsByBlockName(
|
|
81
|
+
_getSelectedBlockClientId(),
|
|
82
|
+
SYNCED_PATTERN_BLOCK_NAME
|
|
83
|
+
);
|
|
84
|
+
return ! parentCoreBlocks || parentCoreBlocks.length === 0;
|
|
85
|
+
},
|
|
86
|
+
[ postType, postId ]
|
|
60
87
|
);
|
|
61
|
-
/*
|
|
62
|
-
* This useSelect exists because we need to use its return value
|
|
63
|
-
* outside the event callback.
|
|
64
|
-
*/
|
|
65
|
-
const isBlockWithinPattern = useSelect( ( select ) => {
|
|
66
|
-
const {
|
|
67
|
-
getBlockParentsByBlockName: _getBlockParentsByBlockName,
|
|
68
|
-
getSelectedBlockClientId: _getSelectedBlockClientId,
|
|
69
|
-
} = select( blockEditorStore );
|
|
70
|
-
const parentCoreBlocks = _getBlockParentsByBlockName(
|
|
71
|
-
_getSelectedBlockClientId(),
|
|
72
|
-
SYNCED_PATTERN_BLOCK_NAME
|
|
73
|
-
);
|
|
74
|
-
return parentCoreBlocks && parentCoreBlocks.length > 0;
|
|
75
|
-
}, [] );
|
|
76
88
|
|
|
77
89
|
const { selectionChange, insertBlock } =
|
|
78
90
|
useDispatch( blockEditorStore );
|
|
79
91
|
|
|
80
|
-
if ( !
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if ( postType !== 'post' && postType !== 'page' ) {
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Checks if the selected block lives within a pattern.
|
|
89
|
-
if ( isBlockWithinPattern ) {
|
|
92
|
+
if ( ! isFootnotesSupported ) {
|
|
90
93
|
return null;
|
|
91
94
|
}
|
|
92
95
|
|
package/src/footnotes/index.php
CHANGED
|
@@ -68,17 +68,26 @@ function render_block_core_footnotes( $attributes, $content, $block ) {
|
|
|
68
68
|
* @since 6.3.0
|
|
69
69
|
*/
|
|
70
70
|
function register_block_core_footnotes() {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
'
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
71
|
+
$post_types = get_post_types(
|
|
72
|
+
array(
|
|
73
|
+
'show_in_rest' => true,
|
|
74
|
+
'public' => true,
|
|
75
|
+
)
|
|
76
|
+
);
|
|
77
|
+
foreach ( $post_types as $post_type ) {
|
|
78
|
+
// Only register the meta field if the post type supports the editor, custom fields, and revisions.
|
|
79
|
+
if ( post_type_supports( $post_type, 'editor' ) && post_type_supports( $post_type, 'custom-fields' ) && post_type_supports( $post_type, 'revisions' ) ) {
|
|
80
|
+
register_post_meta(
|
|
81
|
+
$post_type,
|
|
82
|
+
'footnotes',
|
|
83
|
+
array(
|
|
84
|
+
'show_in_rest' => true,
|
|
85
|
+
'single' => true,
|
|
86
|
+
'type' => 'string',
|
|
87
|
+
'revisions_enabled' => true,
|
|
88
|
+
)
|
|
89
|
+
);
|
|
90
|
+
}
|
|
82
91
|
}
|
|
83
92
|
register_block_type_from_metadata(
|
|
84
93
|
__DIR__ . '/footnotes',
|
package/src/heading/block.json
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
"description": "Introduce new sections and organize content to help visitors (and search engines) understand the structure of your content.",
|
|
8
8
|
"keywords": [ "title", "subtitle" ],
|
|
9
9
|
"textdomain": "default",
|
|
10
|
+
"usesContext": [ "pattern/overrides" ],
|
|
10
11
|
"attributes": {
|
|
11
12
|
"textAlign": {
|
|
12
13
|
"type": "string"
|
package/src/heading/edit.js
CHANGED
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
useBlockProps,
|
|
18
18
|
store as blockEditorStore,
|
|
19
19
|
HeadingLevelDropdown,
|
|
20
|
+
useBlockEditingMode,
|
|
20
21
|
} from '@wordpress/block-editor';
|
|
21
22
|
|
|
22
23
|
/**
|
|
@@ -40,6 +41,7 @@ function HeadingEdit( {
|
|
|
40
41
|
} ),
|
|
41
42
|
style,
|
|
42
43
|
} );
|
|
44
|
+
const blockEditingMode = useBlockEditingMode();
|
|
43
45
|
|
|
44
46
|
const { canGenerateAnchors } = useSelect( ( select ) => {
|
|
45
47
|
const { getGlobalBlockCount, getSettings } = select( blockEditorStore );
|
|
@@ -90,20 +92,22 @@ function HeadingEdit( {
|
|
|
90
92
|
|
|
91
93
|
return (
|
|
92
94
|
<>
|
|
93
|
-
|
|
94
|
-
<
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
95
|
+
{ blockEditingMode === 'default' && (
|
|
96
|
+
<BlockControls group="block">
|
|
97
|
+
<HeadingLevelDropdown
|
|
98
|
+
value={ level }
|
|
99
|
+
onChange={ ( newLevel ) =>
|
|
100
|
+
setAttributes( { level: newLevel } )
|
|
101
|
+
}
|
|
102
|
+
/>
|
|
103
|
+
<AlignmentControl
|
|
104
|
+
value={ textAlign }
|
|
105
|
+
onChange={ ( nextAlign ) => {
|
|
106
|
+
setAttributes( { textAlign: nextAlign } );
|
|
107
|
+
} }
|
|
108
|
+
/>
|
|
109
|
+
</BlockControls>
|
|
110
|
+
) }
|
|
107
111
|
<RichText
|
|
108
112
|
identifier="content"
|
|
109
113
|
tagName={ tagName }
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import classnames from 'classnames';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* WordPress dependencies
|
|
8
|
+
*/
|
|
9
|
+
import { __ } from '@wordpress/i18n';
|
|
10
|
+
import { useEffect, Platform } from '@wordpress/element';
|
|
11
|
+
import { useDispatch, useSelect } from '@wordpress/data';
|
|
12
|
+
import { createBlock, getDefaultBlockName } from '@wordpress/blocks';
|
|
13
|
+
import {
|
|
14
|
+
AlignmentControl,
|
|
15
|
+
BlockControls,
|
|
16
|
+
RichText,
|
|
17
|
+
useBlockProps,
|
|
18
|
+
store as blockEditorStore,
|
|
19
|
+
HeadingLevelDropdown,
|
|
20
|
+
} from '@wordpress/block-editor';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Internal dependencies
|
|
24
|
+
*/
|
|
25
|
+
import { generateAnchor, setAnchor } from './autogenerate-anchors';
|
|
26
|
+
|
|
27
|
+
function HeadingEdit( {
|
|
28
|
+
attributes,
|
|
29
|
+
setAttributes,
|
|
30
|
+
mergeBlocks,
|
|
31
|
+
onReplace,
|
|
32
|
+
style,
|
|
33
|
+
clientId,
|
|
34
|
+
} ) {
|
|
35
|
+
const { textAlign, content, level, placeholder, anchor } = attributes;
|
|
36
|
+
const tagName = 'h' + level;
|
|
37
|
+
const blockProps = useBlockProps( {
|
|
38
|
+
className: classnames( {
|
|
39
|
+
[ `has-text-align-${ textAlign }` ]: textAlign,
|
|
40
|
+
} ),
|
|
41
|
+
style,
|
|
42
|
+
} );
|
|
43
|
+
|
|
44
|
+
const { canGenerateAnchors } = useSelect( ( select ) => {
|
|
45
|
+
const { getGlobalBlockCount, getSettings } = select( blockEditorStore );
|
|
46
|
+
const settings = getSettings();
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
canGenerateAnchors:
|
|
50
|
+
!! settings.generateAnchors ||
|
|
51
|
+
getGlobalBlockCount( 'core/table-of-contents' ) > 0,
|
|
52
|
+
};
|
|
53
|
+
}, [] );
|
|
54
|
+
|
|
55
|
+
const { __unstableMarkNextChangeAsNotPersistent } =
|
|
56
|
+
useDispatch( blockEditorStore );
|
|
57
|
+
|
|
58
|
+
// Initially set anchor for headings that have content but no anchor set.
|
|
59
|
+
// This is used when transforming a block to heading, or for legacy anchors.
|
|
60
|
+
useEffect( () => {
|
|
61
|
+
if ( ! canGenerateAnchors ) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if ( ! anchor && content ) {
|
|
66
|
+
// This side-effect should not create an undo level.
|
|
67
|
+
__unstableMarkNextChangeAsNotPersistent();
|
|
68
|
+
setAttributes( {
|
|
69
|
+
anchor: generateAnchor( clientId, content ),
|
|
70
|
+
} );
|
|
71
|
+
}
|
|
72
|
+
setAnchor( clientId, anchor );
|
|
73
|
+
|
|
74
|
+
// Remove anchor map when block unmounts.
|
|
75
|
+
return () => setAnchor( clientId, null );
|
|
76
|
+
}, [ anchor, content, clientId, canGenerateAnchors ] );
|
|
77
|
+
|
|
78
|
+
const onContentChange = ( value ) => {
|
|
79
|
+
const newAttrs = { content: value };
|
|
80
|
+
if (
|
|
81
|
+
canGenerateAnchors &&
|
|
82
|
+
( ! anchor ||
|
|
83
|
+
! value ||
|
|
84
|
+
generateAnchor( clientId, content ) === anchor )
|
|
85
|
+
) {
|
|
86
|
+
newAttrs.anchor = generateAnchor( clientId, value );
|
|
87
|
+
}
|
|
88
|
+
setAttributes( newAttrs );
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
return (
|
|
92
|
+
<>
|
|
93
|
+
<BlockControls group="block">
|
|
94
|
+
<HeadingLevelDropdown
|
|
95
|
+
value={ level }
|
|
96
|
+
onChange={ ( newLevel ) =>
|
|
97
|
+
setAttributes( { level: newLevel } )
|
|
98
|
+
}
|
|
99
|
+
/>
|
|
100
|
+
<AlignmentControl
|
|
101
|
+
value={ textAlign }
|
|
102
|
+
onChange={ ( nextAlign ) => {
|
|
103
|
+
setAttributes( { textAlign: nextAlign } );
|
|
104
|
+
} }
|
|
105
|
+
/>
|
|
106
|
+
</BlockControls>
|
|
107
|
+
<RichText
|
|
108
|
+
identifier="content"
|
|
109
|
+
tagName={ tagName }
|
|
110
|
+
value={ content }
|
|
111
|
+
onChange={ onContentChange }
|
|
112
|
+
onMerge={ mergeBlocks }
|
|
113
|
+
onSplit={ ( value, isOriginal ) => {
|
|
114
|
+
let block;
|
|
115
|
+
|
|
116
|
+
if ( isOriginal || value ) {
|
|
117
|
+
block = createBlock( 'core/heading', {
|
|
118
|
+
...attributes,
|
|
119
|
+
content: value,
|
|
120
|
+
} );
|
|
121
|
+
} else {
|
|
122
|
+
block = createBlock(
|
|
123
|
+
getDefaultBlockName() ?? 'core/heading'
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if ( isOriginal ) {
|
|
128
|
+
block.clientId = clientId;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return block;
|
|
132
|
+
} }
|
|
133
|
+
onReplace={ onReplace }
|
|
134
|
+
onRemove={ () => onReplace( [] ) }
|
|
135
|
+
placeholder={ placeholder || __( 'Heading' ) }
|
|
136
|
+
textAlign={ textAlign }
|
|
137
|
+
{ ...( Platform.isNative && { deleteEnter: true } ) } // setup RichText on native mobile to delete the "Enter" key as it's handled by the JS/RN side
|
|
138
|
+
{ ...blockProps }
|
|
139
|
+
/>
|
|
140
|
+
</>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export default HeadingEdit;
|
package/src/image/block.json
CHANGED
|
@@ -4,7 +4,12 @@
|
|
|
4
4
|
"name": "core/image",
|
|
5
5
|
"title": "Image",
|
|
6
6
|
"category": "media",
|
|
7
|
-
"usesContext": [
|
|
7
|
+
"usesContext": [
|
|
8
|
+
"allowResize",
|
|
9
|
+
"imageCrop",
|
|
10
|
+
"fixedHeight",
|
|
11
|
+
"pattern/overrides"
|
|
12
|
+
],
|
|
8
13
|
"description": "Insert an image to make a visual statement.",
|
|
9
14
|
"keywords": [ "img", "photo", "picture" ],
|
|
10
15
|
"textdomain": "default",
|
|
@@ -129,6 +134,5 @@
|
|
|
129
134
|
{ "name": "rounded", "label": "Rounded" }
|
|
130
135
|
],
|
|
131
136
|
"editorStyle": "wp-block-image-editor",
|
|
132
|
-
"style": "wp-block-image"
|
|
133
|
-
"viewScript": "file:./view.min.js"
|
|
137
|
+
"style": "wp-block-image"
|
|
134
138
|
}
|
package/src/image/edit.js
CHANGED
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
} from '@wordpress/block-editor';
|
|
20
20
|
import { useEffect, useRef, useState } from '@wordpress/element';
|
|
21
21
|
import { __ } from '@wordpress/i18n';
|
|
22
|
-
import { image as icon } from '@wordpress/icons';
|
|
22
|
+
import { image as icon, plugins as pluginsIcon } from '@wordpress/icons';
|
|
23
23
|
import { store as noticesStore } from '@wordpress/notices';
|
|
24
24
|
|
|
25
25
|
/**
|
|
@@ -111,6 +111,7 @@ export function ImageEdit( {
|
|
|
111
111
|
aspectRatio,
|
|
112
112
|
scale,
|
|
113
113
|
align,
|
|
114
|
+
metadata,
|
|
114
115
|
} = attributes;
|
|
115
116
|
const [ temporaryURL, setTemporaryURL ] = useState();
|
|
116
117
|
|
|
@@ -332,6 +333,7 @@ export function ImageEdit( {
|
|
|
332
333
|
} );
|
|
333
334
|
|
|
334
335
|
// Much of this description is duplicated from MediaPlaceholder.
|
|
336
|
+
const isUrlAttributeConnected = !! metadata?.bindings?.url;
|
|
335
337
|
const placeholder = ( content ) => {
|
|
336
338
|
return (
|
|
337
339
|
<Placeholder
|
|
@@ -340,11 +342,14 @@ export function ImageEdit( {
|
|
|
340
342
|
!! borderProps.className && ! isSelected,
|
|
341
343
|
} ) }
|
|
342
344
|
withIllustration={ true }
|
|
343
|
-
icon={ icon }
|
|
345
|
+
icon={ isUrlAttributeConnected ? pluginsIcon : icon }
|
|
344
346
|
label={ __( 'Image' ) }
|
|
345
|
-
instructions={
|
|
346
|
-
|
|
347
|
-
|
|
347
|
+
instructions={
|
|
348
|
+
! isUrlAttributeConnected &&
|
|
349
|
+
__(
|
|
350
|
+
'Upload an image file, pick one from your media library, or add one with a URL.'
|
|
351
|
+
)
|
|
352
|
+
}
|
|
348
353
|
style={ {
|
|
349
354
|
aspectRatio:
|
|
350
355
|
! ( width && height ) && aspectRatio
|
|
@@ -356,7 +361,15 @@ export function ImageEdit( {
|
|
|
356
361
|
...borderProps.style,
|
|
357
362
|
} }
|
|
358
363
|
>
|
|
359
|
-
{
|
|
364
|
+
{ isUrlAttributeConnected ? (
|
|
365
|
+
<span
|
|
366
|
+
className={ 'block-bindings-media-placeholder-message' }
|
|
367
|
+
>
|
|
368
|
+
{ __( 'Connected to a custom field' ) }
|
|
369
|
+
</span>
|
|
370
|
+
) : (
|
|
371
|
+
content
|
|
372
|
+
) }
|
|
360
373
|
</Placeholder>
|
|
361
374
|
);
|
|
362
375
|
};
|
package/src/image/editor.scss
CHANGED
|
@@ -27,6 +27,12 @@
|
|
|
27
27
|
opacity: 0;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
+
.block-bindings-media-placeholder-message {
|
|
31
|
+
opacity: 0;
|
|
32
|
+
}
|
|
33
|
+
&.is-selected .block-bindings-media-placeholder-message {
|
|
34
|
+
opacity: 1;
|
|
35
|
+
}
|
|
30
36
|
|
|
31
37
|
// Remove the transition while we still have a legacy placeholder style.
|
|
32
38
|
// Otherwise the content jumps between the 1px placeholder border, and any inherited custom
|
|
@@ -38,7 +44,6 @@
|
|
|
38
44
|
}
|
|
39
45
|
}
|
|
40
46
|
|
|
41
|
-
|
|
42
47
|
figure.wp-block-image:not(.wp-block) {
|
|
43
48
|
margin: 0;
|
|
44
49
|
}
|