@wordpress/block-library 10.1.1-next.v.202607070741.0 → 10.2.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 +9 -0
- package/build/accordion/block.json +1 -0
- package/build/button/edit.cjs +18 -8
- package/build/button/edit.cjs.map +2 -2
- package/build/cover/block.json +11 -0
- package/build/cover/edit/block-controls.cjs +11 -4
- package/build/cover/edit/block-controls.cjs.map +2 -2
- package/build/cover/edit/embed-video-url-input.cjs +5 -3
- package/build/cover/edit/embed-video-url-input.cjs.map +3 -3
- package/build/cover/edit/index.cjs +1 -1
- package/build/cover/edit/index.cjs.map +2 -2
- package/build/cover/embed-video-utils.cjs +17 -7
- package/build/cover/embed-video-utils.cjs.map +2 -2
- package/build/details/transforms.cjs +1 -3
- package/build/details/transforms.cjs.map +2 -2
- package/build/embed/embed-placeholder.cjs +0 -1
- package/build/embed/embed-placeholder.cjs.map +2 -2
- package/build/file/edit.cjs +4 -3
- package/build/file/edit.cjs.map +2 -2
- package/build/file/transforms.cjs +25 -60
- package/build/file/transforms.cjs.map +2 -2
- package/build/gallery/block.json +4 -2
- package/build/gallery/edit.cjs +1 -1
- package/build/gallery/edit.cjs.map +3 -3
- package/build/gallery/gap-styles.cjs +49 -13
- package/build/gallery/gap-styles.cjs.map +3 -3
- package/build/group/transforms.cjs +1 -1
- package/build/group/transforms.cjs.map +2 -2
- package/build/icon/components/custom-inserter/icon-grid.cjs +25 -12
- package/build/icon/components/custom-inserter/icon-grid.cjs.map +2 -2
- package/build/icon/components/custom-inserter/index.cjs +100 -31
- package/build/icon/components/custom-inserter/index.cjs.map +3 -3
- package/build/icon/edit.cjs +11 -12
- package/build/icon/edit.cjs.map +2 -2
- package/build/image/block.json +1 -1
- package/build/image/edit.cjs +0 -34
- package/build/image/edit.cjs.map +2 -2
- package/build/image/image.cjs +4 -23
- package/build/image/image.cjs.map +3 -3
- package/build/image/transforms.cjs +78 -0
- package/build/image/transforms.cjs.map +3 -3
- package/build/index.cjs +18 -8
- package/build/index.cjs.map +2 -2
- package/build/latest-posts/edit.cjs +5 -8
- package/build/latest-posts/edit.cjs.map +2 -2
- package/build/list-item/edit.cjs +1 -1
- package/build/list-item/edit.cjs.map +2 -2
- package/build/list-item/hooks/use-enter.cjs +14 -17
- package/build/list-item/hooks/use-enter.cjs.map +3 -3
- package/build/list-item/hooks/use-space.cjs +3 -2
- package/build/list-item/hooks/use-space.cjs.map +3 -3
- package/build/paragraph/block.json +1 -0
- package/build/paragraph/use-enter.cjs +3 -7
- package/build/paragraph/use-enter.cjs.map +3 -3
- package/build/playlist/block.json +29 -10
- package/build/playlist/edit.cjs +216 -14
- package/build/playlist/edit.cjs.map +3 -3
- package/build/playlist/index.cjs +1 -1
- package/build/playlist/index.cjs.map +2 -2
- package/build/playlist/utils.cjs +19 -5
- package/build/playlist/utils.cjs.map +2 -2
- package/build/playlist/view.cjs +83 -13
- package/build/playlist/view.cjs.map +2 -2
- package/build/playlist-track/block.json +4 -2
- package/build/playlist-track/edit.cjs +94 -64
- package/build/playlist-track/edit.cjs.map +2 -2
- package/build/post-content/block.json +1 -0
- package/build/post-template/block.json +2 -1
- package/build/post-template/edit.cjs +10 -1
- package/build/post-template/edit.cjs.map +2 -2
- package/build/pullquote/block.json +3 -1
- package/build/query/block.json +3 -2
- package/build/query/edit/inspector-controls/index.cjs +38 -4
- package/build/query/edit/inspector-controls/index.cjs.map +2 -2
- package/build/query/edit/inspector-controls/offset-controls.cjs +0 -1
- package/build/query/edit/inspector-controls/offset-controls.cjs.map +2 -2
- package/build/query/edit/inspector-controls/pages-control.cjs +0 -1
- package/build/query/edit/inspector-controls/pages-control.cjs.map +2 -2
- package/build/query/edit/query-content.cjs +10 -3
- package/build/query/edit/query-content.cjs.map +2 -2
- package/build/query/index.cjs +2 -1
- package/build/query/index.cjs.map +2 -2
- package/build/quote/block.json +3 -1
- package/build/quote/transforms.cjs +1 -3
- package/build/quote/transforms.cjs.map +2 -2
- package/build/rss/edit.cjs +0 -1
- package/build/rss/edit.cjs.map +2 -2
- package/build/tab-list/block.json +2 -2
- package/build/tab-list/edit.cjs +65 -11
- package/build/tab-list/edit.cjs.map +3 -3
- package/build/tab-panel/block.json +1 -6
- package/build/tab-panel/edit.cjs +15 -15
- package/build/tab-panel/edit.cjs.map +2 -2
- package/build/tab-panels/block.json +0 -1
- package/build/tabs/block.json +0 -5
- package/build/tabs/edit.cjs +4 -39
- package/build/tabs/edit.cjs.map +3 -3
- package/build/tabs/use-tab-list-items-sync.cjs +19 -1
- package/build/tabs/use-tab-list-items-sync.cjs.map +2 -2
- package/build/term-name/block.json +1 -3
- package/build/term-name/deprecated.cjs +105 -0
- package/build/term-name/deprecated.cjs.map +7 -0
- package/build/term-name/edit.cjs +11 -37
- package/build/term-name/edit.cjs.map +3 -3
- package/build/term-name/index.cjs +3 -1
- package/build/term-name/index.cjs.map +3 -3
- package/build/utils/waveform-player.cjs +138 -22
- package/build/utils/waveform-player.cjs.map +2 -2
- package/build/utils/waveform-utils.cjs +315 -17
- package/build/utils/waveform-utils.cjs.map +2 -2
- package/build/video/edit.cjs +2 -11
- package/build/video/edit.cjs.map +3 -3
- package/build-module/accordion/block.json +1 -0
- package/build-module/button/edit.mjs +19 -14
- package/build-module/button/edit.mjs.map +2 -2
- package/build-module/cover/block.json +11 -0
- package/build-module/cover/edit/block-controls.mjs +11 -4
- package/build-module/cover/edit/block-controls.mjs.map +2 -2
- package/build-module/cover/edit/embed-video-url-input.mjs +5 -4
- package/build-module/cover/edit/embed-video-url-input.mjs.map +2 -2
- package/build-module/cover/edit/index.mjs +1 -1
- package/build-module/cover/edit/index.mjs.map +2 -2
- package/build-module/cover/embed-video-utils.mjs +16 -7
- package/build-module/cover/embed-video-utils.mjs.map +2 -2
- package/build-module/details/transforms.mjs +2 -7
- package/build-module/details/transforms.mjs.map +2 -2
- package/build-module/embed/embed-placeholder.mjs +0 -1
- package/build-module/embed/embed-placeholder.mjs.map +2 -2
- package/build-module/file/edit.mjs +4 -3
- package/build-module/file/edit.mjs.map +2 -2
- package/build-module/file/transforms.mjs +25 -60
- package/build-module/file/transforms.mjs.map +2 -2
- package/build-module/gallery/block.json +4 -2
- package/build-module/gallery/edit.mjs +3 -3
- package/build-module/gallery/edit.mjs.map +2 -2
- package/build-module/gallery/gap-styles.mjs +53 -14
- package/build-module/gallery/gap-styles.mjs.map +2 -2
- package/build-module/group/transforms.mjs +2 -5
- package/build-module/group/transforms.mjs.map +2 -2
- package/build-module/icon/components/custom-inserter/icon-grid.mjs +25 -12
- package/build-module/icon/components/custom-inserter/icon-grid.mjs.map +2 -2
- package/build-module/icon/components/custom-inserter/index.mjs +102 -33
- package/build-module/icon/components/custom-inserter/index.mjs.map +2 -2
- package/build-module/icon/edit.mjs +11 -12
- package/build-module/icon/edit.mjs.map +2 -2
- package/build-module/image/block.json +1 -1
- package/build-module/image/edit.mjs +0 -34
- package/build-module/image/edit.mjs.map +2 -2
- package/build-module/image/image.mjs +4 -13
- package/build-module/image/image.mjs.map +2 -2
- package/build-module/image/transforms.mjs +78 -0
- package/build-module/image/transforms.mjs.map +2 -2
- package/build-module/index.mjs +18 -8
- package/build-module/index.mjs.map +2 -2
- package/build-module/latest-posts/edit.mjs +5 -8
- package/build-module/latest-posts/edit.mjs.map +2 -2
- package/build-module/list-item/edit.mjs +1 -1
- package/build-module/list-item/edit.mjs.map +2 -2
- package/build-module/list-item/hooks/use-enter.mjs +15 -21
- package/build-module/list-item/hooks/use-enter.mjs.map +2 -2
- package/build-module/list-item/hooks/use-space.mjs +4 -6
- package/build-module/list-item/hooks/use-space.mjs.map +2 -2
- package/build-module/paragraph/block.json +1 -0
- package/build-module/paragraph/use-enter.mjs +4 -11
- package/build-module/paragraph/use-enter.mjs.map +2 -2
- package/build-module/playlist/block.json +29 -10
- package/build-module/playlist/edit.mjs +220 -16
- package/build-module/playlist/edit.mjs.map +2 -2
- package/build-module/playlist/index.mjs +1 -1
- package/build-module/playlist/index.mjs.map +2 -2
- package/build-module/playlist/utils.mjs +17 -4
- package/build-module/playlist/utils.mjs.map +2 -2
- package/build-module/playlist/view.mjs +89 -14
- package/build-module/playlist/view.mjs.map +2 -2
- package/build-module/playlist-track/block.json +4 -2
- package/build-module/playlist-track/edit.mjs +96 -65
- package/build-module/playlist-track/edit.mjs.map +2 -2
- package/build-module/post-content/block.json +1 -0
- package/build-module/post-template/block.json +2 -1
- package/build-module/post-template/edit.mjs +10 -1
- package/build-module/post-template/edit.mjs.map +2 -2
- package/build-module/pullquote/block.json +3 -1
- package/build-module/query/block.json +3 -2
- package/build-module/query/edit/inspector-controls/index.mjs +40 -5
- package/build-module/query/edit/inspector-controls/index.mjs.map +2 -2
- package/build-module/query/edit/inspector-controls/offset-controls.mjs +0 -1
- package/build-module/query/edit/inspector-controls/offset-controls.mjs.map +2 -2
- package/build-module/query/edit/inspector-controls/pages-control.mjs +0 -1
- package/build-module/query/edit/inspector-controls/pages-control.mjs.map +2 -2
- package/build-module/query/edit/query-content.mjs +10 -3
- package/build-module/query/edit/query-content.mjs.map +2 -2
- package/build-module/query/index.mjs +2 -1
- package/build-module/query/index.mjs.map +2 -2
- package/build-module/quote/block.json +3 -1
- package/build-module/quote/transforms.mjs +2 -4
- package/build-module/quote/transforms.mjs.map +2 -2
- package/build-module/rss/edit.mjs +0 -1
- package/build-module/rss/edit.mjs.map +2 -2
- package/build-module/tab-list/block.json +2 -2
- package/build-module/tab-list/edit.mjs +72 -13
- package/build-module/tab-list/edit.mjs.map +2 -2
- package/build-module/tab-panel/block.json +1 -6
- package/build-module/tab-panel/edit.mjs +16 -16
- package/build-module/tab-panel/edit.mjs.map +2 -2
- package/build-module/tab-panels/block.json +0 -1
- package/build-module/tabs/block.json +0 -5
- package/build-module/tabs/edit.mjs +5 -45
- package/build-module/tabs/edit.mjs.map +2 -2
- package/build-module/tabs/use-tab-list-items-sync.mjs +19 -1
- package/build-module/tabs/use-tab-list-items-sync.mjs.map +2 -2
- package/build-module/term-name/block.json +1 -3
- package/build-module/term-name/deprecated.mjs +74 -0
- package/build-module/term-name/deprecated.mjs.map +7 -0
- package/build-module/term-name/edit.mjs +11 -28
- package/build-module/term-name/edit.mjs.map +2 -2
- package/build-module/term-name/index.mjs +3 -1
- package/build-module/term-name/index.mjs.map +2 -2
- package/build-module/utils/waveform-player.mjs +144 -23
- package/build-module/utils/waveform-player.mjs.map +2 -2
- package/build-module/utils/waveform-utils.mjs +310 -16
- package/build-module/utils/waveform-utils.mjs.map +2 -2
- package/build-module/video/edit.mjs +2 -11
- package/build-module/video/edit.mjs.map +2 -2
- package/build-style/editor-rtl.css +46 -21
- package/build-style/editor.css +46 -21
- package/build-style/icon/editor-rtl.css +80 -7
- package/build-style/icon/editor.css +80 -7
- package/build-style/more/editor-rtl.css +2 -2
- package/build-style/more/editor.css +2 -2
- package/build-style/navigation/editor-rtl.css +3 -4
- package/build-style/navigation/editor.css +3 -4
- package/build-style/navigation-link/editor-rtl.css +1 -1
- package/build-style/navigation-link/editor.css +1 -1
- package/build-style/nextpage/editor-rtl.css +2 -2
- package/build-style/nextpage/editor.css +2 -2
- package/build-style/playlist/editor-rtl.css +6 -0
- package/build-style/playlist/editor.css +6 -0
- package/build-style/playlist/style-rtl.css +37 -1
- package/build-style/playlist/style.css +37 -1
- package/build-style/playlist-track/style-rtl.css +10 -0
- package/build-style/playlist-track/style.css +10 -0
- package/build-style/style-rtl.css +47 -1
- package/build-style/style.css +47 -1
- package/build-style/video/editor-rtl.css +1 -1
- package/build-style/video/editor.css +1 -1
- package/build-types/table-of-contents/list.d.ts +1 -1
- package/build-types/table-of-contents/list.d.ts.map +1 -1
- package/package.json +46 -44
- package/src/accordion/README.md +1 -0
- package/src/accordion/block.json +1 -0
- package/src/button/edit.js +21 -15
- package/src/cover/README.md +60 -0
- package/src/cover/block.json +11 -0
- package/src/cover/edit/block-controls.js +21 -11
- package/src/cover/edit/embed-video-url-input.js +5 -4
- package/src/cover/edit/index.js +9 -11
- package/src/cover/embed-video-utils.js +38 -13
- package/src/details/transforms.js +2 -7
- package/src/embed/embed-placeholder.js +0 -1
- package/src/file/edit.js +8 -8
- package/src/file/transforms.js +28 -60
- package/src/gallery/README.md +1 -1
- package/src/gallery/block.json +4 -2
- package/src/gallery/edit.js +3 -3
- package/src/gallery/gap-styles.js +79 -20
- package/src/gallery/index.php +103 -43
- package/src/group/transforms.js +2 -5
- package/src/icon/components/custom-inserter/icon-grid.js +40 -11
- package/src/icon/components/custom-inserter/index.js +98 -25
- package/src/icon/edit.js +11 -17
- package/src/icon/editor.scss +33 -8
- package/src/image/README.md +1 -1
- package/src/image/block.json +1 -1
- package/src/image/edit.js +0 -52
- package/src/image/editor.scss +2 -0
- package/src/image/image.js +19 -24
- package/src/image/transforms.js +128 -0
- package/src/index.js +19 -7
- package/src/latest-posts/edit.js +5 -8
- package/src/latest-posts/index.php +46 -16
- package/src/list-item/edit.js +1 -1
- package/src/list-item/hooks/use-enter.js +15 -22
- package/src/list-item/hooks/use-space.js +4 -6
- package/src/media-text/editor.scss +1 -0
- package/src/more/editor.scss +1 -1
- package/src/navigation/editor.scss +1 -2
- package/src/navigation-link/editor.scss +1 -1
- package/src/navigation-link/index.php +6 -3
- package/src/navigation-submenu/index.php +6 -3
- package/src/nextpage/editor.scss +1 -1
- package/src/paragraph/README.md +1 -0
- package/src/paragraph/block.json +1 -0
- package/src/paragraph/use-enter.js +4 -11
- package/src/playlist/README.md +17 -18
- package/src/playlist/block.json +29 -10
- package/src/playlist/edit.js +247 -15
- package/src/playlist/editor.scss +6 -0
- package/src/playlist/index.js +1 -1
- package/src/playlist/index.php +58 -14
- package/src/playlist/style.scss +51 -1
- package/src/playlist/test/edit.js +13 -2
- package/src/playlist/utils.js +25 -7
- package/src/playlist/view.js +97 -16
- package/src/playlist-track/README.md +3 -3
- package/src/playlist-track/block.json +4 -2
- package/src/playlist-track/edit.js +94 -70
- package/src/playlist-track/index.php +20 -6
- package/src/playlist-track/style.scss +10 -0
- package/src/playlist-track/test/edit.js +169 -0
- package/src/post-content/README.md +1 -0
- package/src/post-content/block.json +1 -0
- package/src/post-template/README.md +1 -0
- package/src/post-template/block.json +2 -1
- package/src/post-template/edit.js +9 -0
- package/src/pullquote/README.md +1 -0
- package/src/pullquote/block.json +3 -1
- package/src/query/README.md +2 -1
- package/src/query/block.json +3 -2
- package/src/query/edit/inspector-controls/index.js +43 -3
- package/src/query/edit/inspector-controls/offset-controls.js +0 -1
- package/src/query/edit/inspector-controls/pages-control.js +0 -1
- package/src/query/edit/query-content.js +19 -3
- package/src/query/index.js +1 -0
- package/src/quote/README.md +1 -0
- package/src/quote/block.json +3 -1
- package/src/quote/transforms.js +2 -4
- package/src/rss/edit.js +0 -1
- package/src/rss/index.php +1 -1
- package/src/tab-list/README.md +4 -5
- package/src/tab-list/block.json +2 -2
- package/src/tab-list/edit.js +90 -28
- package/src/tab-list/index.php +9 -4
- package/src/tab-panel/README.md +4 -6
- package/src/tab-panel/block.json +1 -6
- package/src/tab-panel/edit.js +19 -24
- package/src/tab-panels/README.md +5 -3
- package/src/tab-panels/block.json +0 -1
- package/src/tabs/README.md +18 -9
- package/src/tabs/block.json +0 -5
- package/src/tabs/edit.js +7 -64
- package/src/tabs/use-tab-list-items-sync.js +24 -4
- package/src/template-part/index.php +1 -16
- package/src/term-name/README.md +1 -1
- package/src/term-name/block.json +1 -3
- package/src/term-name/deprecated.js +74 -0
- package/src/term-name/edit.js +2 -18
- package/src/term-name/index.js +2 -0
- package/src/utils/media-control.scss +1 -5
- package/src/utils/test/waveform-player.js +297 -34
- package/src/utils/test/waveform-utils.js +410 -5
- package/src/utils/waveform-player.js +189 -59
- package/src/utils/waveform-utils.js +443 -40
- package/src/video/edit.js +0 -8
- package/src/video/editor.scss +1 -1
- package/build/image/animated-gif-convert-control.cjs +0 -105
- package/build/image/animated-gif-convert-control.cjs.map +0 -7
- package/build/utils/gif-conversion-attributes.cjs +0 -40
- package/build/utils/gif-conversion-attributes.cjs.map +0 -7
- package/build/video/gif-restore-control.cjs +0 -73
- package/build/video/gif-restore-control.cjs.map +0 -7
- package/build-module/image/animated-gif-convert-control.mjs +0 -87
- package/build-module/image/animated-gif-convert-control.mjs.map +0 -7
- package/build-module/utils/gif-conversion-attributes.mjs +0 -15
- package/build-module/utils/gif-conversion-attributes.mjs.map +0 -7
- package/build-module/video/gif-restore-control.mjs +0 -55
- package/build-module/video/gif-restore-control.mjs.map +0 -7
- package/src/image/animated-gif-convert-control.js +0 -135
- package/src/image/test/animated-gif-convert-control.js +0 -276
- package/src/utils/gif-conversion-attributes.js +0 -30
- package/src/utils/test/gif-conversion-attributes.js +0 -60
- package/src/video/gif-restore-control.js +0 -92
package/src/gallery/index.php
CHANGED
|
@@ -52,6 +52,41 @@ function block_core_gallery_render_context( $context, $parsed_block ) {
|
|
|
52
52
|
|
|
53
53
|
add_filter( 'render_block_context', 'block_core_gallery_render_context', 10, 2 );
|
|
54
54
|
|
|
55
|
+
/**
|
|
56
|
+
* Returns the column gap value used for Gallery image width calculations.
|
|
57
|
+
*
|
|
58
|
+
* @since 7.1.0
|
|
59
|
+
*
|
|
60
|
+
* @param string|array|null $gap Gallery block gap value.
|
|
61
|
+
* @param string $fallback_gap Fallback gap value.
|
|
62
|
+
* @return string Gallery column gap value.
|
|
63
|
+
*/
|
|
64
|
+
function block_core_gallery_get_column_gap_value( $gap, $fallback_gap ) {
|
|
65
|
+
if ( is_array( $gap ) ) {
|
|
66
|
+
$gap = $gap['left'] ?? $fallback_gap;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Make sure $gap is a string to avoid PHP 8.1 deprecation error in preg_match() when the value is null.
|
|
70
|
+
$gap = is_string( $gap ) ? $gap : '';
|
|
71
|
+
|
|
72
|
+
// Skip if gap value contains unsupported characters.
|
|
73
|
+
// Regex for CSS value borrowed from `safecss_filter_attr`, and used here
|
|
74
|
+
// because we only want to match against the value, not the CSS attribute.
|
|
75
|
+
$gap = $gap && preg_match( '%[\\\(&=}]|/\*%', $gap ) ? null : $gap;
|
|
76
|
+
|
|
77
|
+
// Get spacing CSS variable from preset value if provided.
|
|
78
|
+
if ( is_string( $gap ) && str_contains( $gap, 'var:preset|spacing|' ) ) {
|
|
79
|
+
$index_to_splice = strrpos( $gap, '|' ) + 1;
|
|
80
|
+
$slug = _wp_to_kebab_case( substr( $gap, $index_to_splice ) );
|
|
81
|
+
$gap = "var(--wp--preset--spacing--$slug)";
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
$gap_column = ( null !== $gap && '' !== $gap ) ? $gap : $fallback_gap;
|
|
85
|
+
|
|
86
|
+
// The unstable gallery gap calculation requires a real value (such as `0px`) and not `0`.
|
|
87
|
+
return '0' === $gap_column ? '0px' : $gap_column;
|
|
88
|
+
}
|
|
89
|
+
|
|
55
90
|
/**
|
|
56
91
|
* Resolves a Gallery block's `dynamicContent` to an ordered list of image
|
|
57
92
|
* attachment IDs.
|
|
@@ -272,6 +307,8 @@ function block_core_gallery_render_dynamic_image( $attachment_id, $attributes, $
|
|
|
272
307
|
* @return string The content of the block being rendered.
|
|
273
308
|
*/
|
|
274
309
|
function block_core_gallery_render( $attributes, $content, $block ) {
|
|
310
|
+
static $global_styles = null;
|
|
311
|
+
|
|
275
312
|
// In dynamic mode the gallery's images are resolved at render time instead of
|
|
276
313
|
// being authored as inner blocks, so `save.js` persists at most the
|
|
277
314
|
// gallery-level caption — a bare `<figcaption>`, or nothing when there is no
|
|
@@ -345,36 +382,15 @@ function block_core_gallery_render( $attributes, $content, $block ) {
|
|
|
345
382
|
// the current gap setting in order to maintain the number of flex columns
|
|
346
383
|
// so a css var is added to allow this.
|
|
347
384
|
|
|
348
|
-
$
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
// Get spacing CSS variable from preset value if provided.
|
|
359
|
-
if ( is_string( $value ) && str_contains( $value, 'var:preset|spacing|' ) ) {
|
|
360
|
-
$index_to_splice = strrpos( $value, '|' ) + 1;
|
|
361
|
-
$slug = _wp_to_kebab_case( substr( $value, $index_to_splice ) );
|
|
362
|
-
$value = "var(--wp--preset--spacing--$slug)";
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
$gap[ $key ] = $value;
|
|
366
|
-
}
|
|
367
|
-
} else {
|
|
368
|
-
// Make sure $gap is a string to avoid PHP 8.1 deprecation error in preg_match() when the value is null.
|
|
369
|
-
$gap = is_string( $gap ) ? $gap : '';
|
|
370
|
-
$gap = $gap && preg_match( '%[\\\(&=}]|/\*%', $gap ) ? null : $gap;
|
|
371
|
-
|
|
372
|
-
// Get spacing CSS variable from preset value if provided.
|
|
373
|
-
if ( is_string( $gap ) && str_contains( $gap, 'var:preset|spacing|' ) ) {
|
|
374
|
-
$index_to_splice = strrpos( $gap, '|' ) + 1;
|
|
375
|
-
$slug = _wp_to_kebab_case( substr( $gap, $index_to_splice ) );
|
|
376
|
-
$gap = "var(--wp--preset--spacing--$slug)";
|
|
377
|
-
}
|
|
385
|
+
$style_attr = is_array( $attributes['style'] ?? null )
|
|
386
|
+
? $attributes['style']
|
|
387
|
+
: array();
|
|
388
|
+
if (
|
|
389
|
+
defined( 'IS_GUTENBERG_PLUGIN' ) &&
|
|
390
|
+
IS_GUTENBERG_PLUGIN &&
|
|
391
|
+
function_exists( 'gutenberg_resolve_style_state_aliases' )
|
|
392
|
+
) {
|
|
393
|
+
$style_attr = gutenberg_resolve_style_state_aliases( $style_attr, 'core/gallery' );
|
|
378
394
|
}
|
|
379
395
|
|
|
380
396
|
$unique_gallery_classname = wp_unique_id( 'wp-block-gallery-' );
|
|
@@ -385,31 +401,75 @@ function block_core_gallery_render( $attributes, $content, $block ) {
|
|
|
385
401
|
// --gallery-block--gutter-size is deprecated. --wp--style--gallery-gap-default should be used by themes that want to set a default
|
|
386
402
|
// gap on the gallery.
|
|
387
403
|
$fallback_gap = 'var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )';
|
|
388
|
-
$gap_value = $gap ? $gap : $fallback_gap;
|
|
389
|
-
$gap_column = $gap_value;
|
|
390
404
|
|
|
391
|
-
if (
|
|
392
|
-
$
|
|
393
|
-
$gap_column = $gap_value['left'] ?? $fallback_gap;
|
|
394
|
-
$gap_value = $gap_row === $gap_column ? $gap_row : $gap_row . ' ' . $gap_column;
|
|
405
|
+
if ( null === $global_styles ) {
|
|
406
|
+
$global_styles = function_exists( 'wp_get_global_styles' ) ? wp_get_global_styles() : array();
|
|
395
407
|
}
|
|
396
408
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
409
|
+
$global_gallery_styles = $global_styles['blocks']['core/gallery'] ?? array();
|
|
410
|
+
$global_gallery_gap = $global_gallery_styles['spacing']['blockGap'] ?? $fallback_gap;
|
|
411
|
+
$has_block_gap = is_array( $style_attr['spacing'] ?? null ) && array_key_exists( 'blockGap', $style_attr['spacing'] );
|
|
412
|
+
// Prefer the block's own gap value, then Gallery global styles. Missing
|
|
413
|
+
// values fall back to the Gallery blockGap default.
|
|
414
|
+
$block_gap = $has_block_gap
|
|
415
|
+
? $style_attr['spacing']['blockGap']
|
|
416
|
+
: $global_gallery_gap;
|
|
417
|
+
$gap_column = block_core_gallery_get_column_gap_value( $block_gap, $fallback_gap );
|
|
418
|
+
|
|
419
|
+
// Set the CSS variable to the column value for Gallery's flex width calculations.
|
|
403
420
|
$gallery_styles = array(
|
|
404
421
|
array(
|
|
405
422
|
'selector' => ".wp-block-gallery.{$unique_gallery_classname}",
|
|
406
423
|
'declarations' => array(
|
|
407
424
|
'--wp--style--unstable-gallery-gap' => $gap_column,
|
|
408
|
-
'gap' => $gap_value,
|
|
409
425
|
),
|
|
410
426
|
),
|
|
411
427
|
);
|
|
412
428
|
|
|
429
|
+
$global_settings = wp_get_global_settings();
|
|
430
|
+
$viewport_settings = $global_settings['viewport'] ?? null;
|
|
431
|
+
$responsive_media_queries = array();
|
|
432
|
+
foreach ( array( 'WP_Theme_JSON_Gutenberg', 'WP_Theme_JSON' ) as $theme_json_class_name ) {
|
|
433
|
+
if ( method_exists( $theme_json_class_name, 'get_viewport_media_queries' ) ) {
|
|
434
|
+
$responsive_media_queries = $theme_json_class_name::get_viewport_media_queries( $viewport_settings );
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
foreach ( $responsive_media_queries as $breakpoint => $media_query ) {
|
|
440
|
+
$viewport_style = $style_attr[ $breakpoint ] ?? null;
|
|
441
|
+
$has_viewport_block_gap = is_array( $viewport_style ) &&
|
|
442
|
+
is_array( $viewport_style['spacing'] ?? null ) &&
|
|
443
|
+
array_key_exists( 'blockGap', $viewport_style['spacing'] );
|
|
444
|
+
$has_global_viewport_block_gap = is_array( $global_gallery_styles[ $breakpoint ]['spacing'] ?? null ) &&
|
|
445
|
+
array_key_exists( 'blockGap', $global_gallery_styles[ $breakpoint ]['spacing'] );
|
|
446
|
+
|
|
447
|
+
// Viewport-specific block values win. Gallery global viewport values
|
|
448
|
+
// only apply when the block has no base gap, so they do not override an instance value.
|
|
449
|
+
if ( $has_viewport_block_gap ) {
|
|
450
|
+
$viewport_gap = $viewport_style['spacing']['blockGap'];
|
|
451
|
+
} elseif ( ! $has_block_gap && $has_global_viewport_block_gap ) {
|
|
452
|
+
$viewport_gap = $global_gallery_styles[ $breakpoint ]['spacing']['blockGap'];
|
|
453
|
+
} else {
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
if ( null === $viewport_gap ) {
|
|
458
|
+
continue;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
$gallery_styles[] = array(
|
|
462
|
+
'selector' => ".wp-block-gallery.{$unique_gallery_classname}",
|
|
463
|
+
'declarations' => array(
|
|
464
|
+
'--wp--style--unstable-gallery-gap' => block_core_gallery_get_column_gap_value(
|
|
465
|
+
$viewport_gap,
|
|
466
|
+
$fallback_gap
|
|
467
|
+
),
|
|
468
|
+
),
|
|
469
|
+
'rules_group' => $media_query,
|
|
470
|
+
);
|
|
471
|
+
}
|
|
472
|
+
|
|
413
473
|
wp_style_engine_get_stylesheet_from_css_rules(
|
|
414
474
|
$gallery_styles,
|
|
415
475
|
array( 'context' => 'block-supports' )
|
package/src/group/transforms.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WordPress dependencies
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
createBlock,
|
|
6
|
-
__experimentalCloneSanitizedBlock,
|
|
7
|
-
} from '@wordpress/blocks';
|
|
4
|
+
import { createBlock, cloneSanitizedBlock } from '@wordpress/blocks';
|
|
8
5
|
|
|
9
6
|
const transforms = {
|
|
10
7
|
from: [
|
|
@@ -33,7 +30,7 @@ const transforms = {
|
|
|
33
30
|
// are removed both from their original location and within the
|
|
34
31
|
// new group block.
|
|
35
32
|
const groupInnerBlocks = blocks.map( ( block ) =>
|
|
36
|
-
|
|
33
|
+
cloneSanitizedBlock( block )
|
|
37
34
|
);
|
|
38
35
|
|
|
39
36
|
return createBlock(
|
|
@@ -3,13 +3,44 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { __ } from '@wordpress/i18n';
|
|
5
5
|
import { Button } from '@wordpress/components';
|
|
6
|
+
import { useAsyncList } from '@wordpress/compose';
|
|
7
|
+
import { useRef, useLayoutEffect } from '@wordpress/element';
|
|
8
|
+
import { getScrollContainer } from '@wordpress/dom';
|
|
6
9
|
|
|
7
10
|
/**
|
|
8
11
|
* Internal dependencies
|
|
9
12
|
*/
|
|
10
13
|
import HtmlRenderer from '../../../utils/html-renderer';
|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
const BATCH_SIZE = 20;
|
|
16
|
+
|
|
17
|
+
export default function IconGrid( { icons, onChange, value } ) {
|
|
18
|
+
const shownIcons = useAsyncList( icons, {
|
|
19
|
+
step: BATCH_SIZE,
|
|
20
|
+
} );
|
|
21
|
+
|
|
22
|
+
// Scroll the selected icon into view, but wait until enough icons render
|
|
23
|
+
// below it so it can be centered rather than stuck at the bottom. Skip it
|
|
24
|
+
// if the user has already scrolled the list.
|
|
25
|
+
const selectedIconRef = useRef();
|
|
26
|
+
const selectedIndex =
|
|
27
|
+
icons?.findIndex( ( icon ) => icon.name === value ) ?? -1;
|
|
28
|
+
const isReadyToScroll =
|
|
29
|
+
selectedIndex >= 0 &&
|
|
30
|
+
( shownIcons.length >= selectedIndex + BATCH_SIZE ||
|
|
31
|
+
shownIcons.length === icons.length );
|
|
32
|
+
|
|
33
|
+
useLayoutEffect( () => {
|
|
34
|
+
const node = selectedIconRef.current;
|
|
35
|
+
if ( ! isReadyToScroll || ! node ) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if ( getScrollContainer( node )?.scrollTop ) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
node.scrollIntoView( { block: 'center' } );
|
|
42
|
+
}, [ isReadyToScroll ] );
|
|
43
|
+
|
|
13
44
|
return (
|
|
14
45
|
<div className="wp-block-icon__inserter-grid">
|
|
15
46
|
{ ! icons?.length ? (
|
|
@@ -21,26 +52,24 @@ export default function IconGrid( { icons, onChange, attributes } ) {
|
|
|
21
52
|
className="wp-block-icon__inserter-grid-icons-list"
|
|
22
53
|
aria-label={ __( 'Icon library' ) }
|
|
23
54
|
>
|
|
24
|
-
{
|
|
55
|
+
{ shownIcons.map( ( icon ) => {
|
|
25
56
|
return (
|
|
26
57
|
<Button
|
|
27
58
|
key={ icon.name }
|
|
59
|
+
ref={
|
|
60
|
+
icon.name === value
|
|
61
|
+
? selectedIconRef
|
|
62
|
+
: undefined
|
|
63
|
+
}
|
|
28
64
|
className="wp-block-icon__inserter-grid-icons-list-item"
|
|
29
65
|
onClick={ () => onChange( icon.name ) }
|
|
30
66
|
variant={
|
|
31
|
-
icon.name ===
|
|
32
|
-
? 'primary'
|
|
33
|
-
: undefined
|
|
67
|
+
icon.name === value ? 'primary' : undefined
|
|
34
68
|
}
|
|
35
69
|
__next40pxDefaultSize
|
|
36
70
|
>
|
|
37
71
|
<span className="wp-block-icon__inserter-grid-icons-list-item-icon">
|
|
38
|
-
<HtmlRenderer
|
|
39
|
-
html={ icon.content }
|
|
40
|
-
wrapperProps={ {
|
|
41
|
-
style: { width: '24px' },
|
|
42
|
-
} }
|
|
43
|
-
/>
|
|
72
|
+
<HtmlRenderer html={ icon.content } />
|
|
44
73
|
</span>
|
|
45
74
|
<span className="wp-block-icon__inserter-grid-icons-list-item-title">
|
|
46
75
|
{ icon.label }
|
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
* WordPress dependencies
|
|
3
3
|
*/
|
|
4
4
|
import { __ } from '@wordpress/i18n';
|
|
5
|
-
import { Modal, SearchControl } from '@wordpress/components';
|
|
6
|
-
import {
|
|
5
|
+
import { Modal, SearchControl, Spinner } from '@wordpress/components';
|
|
6
|
+
import { Stack, Tabs } from '@wordpress/ui';
|
|
7
|
+
import { useState, useMemo } from '@wordpress/element';
|
|
7
8
|
import { useDebounce } from '@wordpress/compose';
|
|
9
|
+
import { useSelect } from '@wordpress/data';
|
|
10
|
+
import { store as coreDataStore } from '@wordpress/core-data';
|
|
8
11
|
|
|
9
12
|
/**
|
|
10
13
|
* Internal dependencies
|
|
@@ -12,27 +15,56 @@ import { useDebounce } from '@wordpress/compose';
|
|
|
12
15
|
import IconGrid from './icon-grid';
|
|
13
16
|
import { normalizeSearchInput } from '../../../utils/search-patterns';
|
|
14
17
|
|
|
15
|
-
export default function CustomInserterModal( {
|
|
16
|
-
icons = [],
|
|
17
|
-
setInserterOpen,
|
|
18
|
-
attributes,
|
|
19
|
-
setAttributes,
|
|
20
|
-
} ) {
|
|
18
|
+
export default function CustomInserterModal( { onClose, value, onChange } ) {
|
|
21
19
|
const [ searchInput, setSearchInput ] = useState( '' );
|
|
20
|
+
const [ currentCollection, setCurrentCollection ] = useState( null );
|
|
22
21
|
|
|
23
22
|
const debouncedSetSearchInput = useDebounce( setSearchInput, 300 );
|
|
24
23
|
|
|
25
|
-
const
|
|
26
|
-
(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
const collections = useSelect(
|
|
25
|
+
( select ) =>
|
|
26
|
+
select( coreDataStore ).getEntityRecords(
|
|
27
|
+
'root',
|
|
28
|
+
'iconCollection'
|
|
29
|
+
),
|
|
30
|
+
[]
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
// Default to the collection the selected icon belongs to, otherwise the
|
|
34
|
+
// first collection.
|
|
35
|
+
const selectedCollection = value?.split( '/' )[ 0 ];
|
|
36
|
+
const collectionSlug =
|
|
37
|
+
currentCollection ??
|
|
38
|
+
( collections?.some( ( { slug } ) => slug === selectedCollection )
|
|
39
|
+
? selectedCollection
|
|
40
|
+
: collections?.[ 0 ]?.slug ) ??
|
|
41
|
+
null;
|
|
42
|
+
|
|
43
|
+
const { icons, hasResolvedIcons } = useSelect(
|
|
44
|
+
( select ) => {
|
|
45
|
+
if ( collectionSlug === null ) {
|
|
46
|
+
return { icons: null, hasResolvedIcons: false };
|
|
47
|
+
}
|
|
48
|
+
const query =
|
|
49
|
+
collectionSlug === '' ? {} : { collection: collectionSlug };
|
|
50
|
+
const { getEntityRecords, hasFinishedResolution } =
|
|
51
|
+
select( coreDataStore );
|
|
52
|
+
return {
|
|
53
|
+
icons: getEntityRecords( 'root', 'icon', query ),
|
|
54
|
+
hasResolvedIcons: hasFinishedResolution( 'getEntityRecords', [
|
|
55
|
+
'root',
|
|
56
|
+
'icon',
|
|
57
|
+
query,
|
|
58
|
+
] ),
|
|
59
|
+
};
|
|
31
60
|
},
|
|
32
|
-
[
|
|
61
|
+
[ collectionSlug ]
|
|
33
62
|
);
|
|
34
63
|
|
|
35
64
|
const filteredIcons = useMemo( () => {
|
|
65
|
+
if ( ! icons ) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
36
68
|
if ( searchInput ) {
|
|
37
69
|
const input = normalizeSearchInput( searchInput );
|
|
38
70
|
return icons.filter( ( icon ) => {
|
|
@@ -52,22 +84,63 @@ export default function CustomInserterModal( {
|
|
|
52
84
|
<Modal
|
|
53
85
|
className="wp-block-icon__inserter-modal"
|
|
54
86
|
title={ __( 'Icon library' ) }
|
|
55
|
-
onRequestClose={
|
|
87
|
+
onRequestClose={ onClose }
|
|
56
88
|
isFullScreen
|
|
57
89
|
>
|
|
58
|
-
<
|
|
59
|
-
|
|
90
|
+
<Tabs.Root
|
|
91
|
+
className="wp-block-icon__inserter"
|
|
92
|
+
orientation="vertical"
|
|
93
|
+
value={ collectionSlug }
|
|
94
|
+
onValueChange={ setCurrentCollection }
|
|
95
|
+
>
|
|
96
|
+
<Stack
|
|
97
|
+
direction="column"
|
|
98
|
+
gap="lg"
|
|
99
|
+
className="wp-block-icon__inserter-sidebar"
|
|
100
|
+
>
|
|
60
101
|
<SearchControl
|
|
61
102
|
value={ searchInput }
|
|
62
103
|
onChange={ debouncedSetSearchInput }
|
|
63
104
|
/>
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
105
|
+
<Tabs.List>
|
|
106
|
+
<Tabs.Tab value="">{ __( 'All' ) }</Tabs.Tab>
|
|
107
|
+
{ collections?.map( ( collection ) => (
|
|
108
|
+
<Tabs.Tab
|
|
109
|
+
key={ collection.slug }
|
|
110
|
+
value={ collection.slug }
|
|
111
|
+
>
|
|
112
|
+
{ collection.label }
|
|
113
|
+
</Tabs.Tab>
|
|
114
|
+
) ) }
|
|
115
|
+
</Tabs.List>
|
|
116
|
+
</Stack>
|
|
117
|
+
{ [ { slug: '' }, ...( collections ?? [] ) ].map(
|
|
118
|
+
( collection ) => (
|
|
119
|
+
<Tabs.Panel
|
|
120
|
+
tabIndex={ -1 }
|
|
121
|
+
key={ collection.slug }
|
|
122
|
+
value={ collection.slug }
|
|
123
|
+
className="wp-block-icon__inserter-panel"
|
|
124
|
+
>
|
|
125
|
+
{ ! hasResolvedIcons ? (
|
|
126
|
+
<div
|
|
127
|
+
className="wp-block-icon__inserter-loading"
|
|
128
|
+
role="status"
|
|
129
|
+
aria-label={ __( 'Loading…' ) }
|
|
130
|
+
>
|
|
131
|
+
<Spinner />
|
|
132
|
+
</div>
|
|
133
|
+
) : (
|
|
134
|
+
<IconGrid
|
|
135
|
+
icons={ filteredIcons }
|
|
136
|
+
onChange={ onChange }
|
|
137
|
+
value={ value }
|
|
138
|
+
/>
|
|
139
|
+
) }
|
|
140
|
+
</Tabs.Panel>
|
|
141
|
+
)
|
|
142
|
+
) }
|
|
143
|
+
</Tabs.Root>
|
|
71
144
|
</Modal>
|
|
72
145
|
);
|
|
73
146
|
}
|
package/src/icon/edit.js
CHANGED
|
@@ -74,20 +74,12 @@ export function Edit( { attributes, setAttributes } ) {
|
|
|
74
74
|
const borderProps = useBorderProps( attributes );
|
|
75
75
|
const dimensionsProps = useDimensionsProps( attributes );
|
|
76
76
|
|
|
77
|
-
const
|
|
77
|
+
const selectedIcon = useSelect(
|
|
78
78
|
( select ) => {
|
|
79
|
-
const { getEntityRecord
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
selectedIcon: icon
|
|
83
|
-
? getEntityRecord( 'root', 'icon', icon )
|
|
84
|
-
: null,
|
|
85
|
-
allIcons: isInserterOpen
|
|
86
|
-
? getEntityRecords( 'root', 'icon' )
|
|
87
|
-
: undefined,
|
|
88
|
-
};
|
|
79
|
+
const { getEntityRecord } = select( coreDataStore );
|
|
80
|
+
return icon ? getEntityRecord( 'root', 'icon', icon ) : null;
|
|
89
81
|
},
|
|
90
|
-
[
|
|
82
|
+
[ icon ]
|
|
91
83
|
);
|
|
92
84
|
|
|
93
85
|
const iconToDisplay = selectedIcon?.content || '';
|
|
@@ -218,7 +210,7 @@ export function Edit( { attributes, setAttributes } ) {
|
|
|
218
210
|
{ blockControls }
|
|
219
211
|
{ inspectorControls }
|
|
220
212
|
<div { ...useBlockProps() }>
|
|
221
|
-
{
|
|
213
|
+
{ iconToDisplay ? (
|
|
222
214
|
<HtmlRenderer
|
|
223
215
|
html={ iconToDisplay }
|
|
224
216
|
wrapperProps={ {
|
|
@@ -258,10 +250,12 @@ export function Edit( { attributes, setAttributes } ) {
|
|
|
258
250
|
</div>
|
|
259
251
|
{ isInserterOpen && (
|
|
260
252
|
<CustomInserterModal
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
253
|
+
onClose={ () => setInserterOpen( false ) }
|
|
254
|
+
value={ attributes.icon }
|
|
255
|
+
onChange={ ( name ) => {
|
|
256
|
+
setAttributes( { icon: name } );
|
|
257
|
+
setInserterOpen( false );
|
|
258
|
+
} }
|
|
265
259
|
/>
|
|
266
260
|
) }
|
|
267
261
|
</>
|
package/src/icon/editor.scss
CHANGED
|
@@ -1,22 +1,38 @@
|
|
|
1
1
|
@use "@wordpress/base-styles/variables" as *;
|
|
2
2
|
@use "@wordpress/base-styles/colors" as *;
|
|
3
|
+
@use "@wordpress/base-styles/mixins" as *;
|
|
3
4
|
|
|
4
5
|
.wp-block[data-align="center"] > .wp-block-icon {
|
|
5
6
|
display: flex;
|
|
6
7
|
justify-content: center;
|
|
7
8
|
}
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
.wp-block-icon__inserter-sidebar {
|
|
11
|
+
padding-bottom: $grid-unit-30;
|
|
12
|
+
|
|
13
|
+
@include break-medium() {
|
|
14
|
+
overflow-x: visible;
|
|
15
|
+
overflow-y: auto;
|
|
16
|
+
position: absolute;
|
|
17
|
+
top: $header-height + $grid-unit-10;
|
|
18
|
+
left: 0;
|
|
19
|
+
bottom: 0;
|
|
20
|
+
width: $sidebar-width;
|
|
21
|
+
padding-top: $grid-unit-30;
|
|
22
|
+
padding-inline: $grid-unit-30;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.wp-block-icon__inserter-panel {
|
|
27
|
+
@include break-medium() {
|
|
28
|
+
margin-inline-start: $sidebar-width;
|
|
29
|
+
}
|
|
13
30
|
}
|
|
14
31
|
|
|
15
|
-
.wp-block-icon__inserter-
|
|
16
|
-
align-items: center;
|
|
32
|
+
.wp-block-icon__inserter-loading {
|
|
17
33
|
display: flex;
|
|
18
|
-
justify-content:
|
|
19
|
-
|
|
34
|
+
justify-content: center;
|
|
35
|
+
padding: $grid-unit-30;
|
|
20
36
|
}
|
|
21
37
|
|
|
22
38
|
.wp-block-icon__inserter-grid-icons-list {
|
|
@@ -37,6 +53,14 @@
|
|
|
37
53
|
|
|
38
54
|
.wp-block-icon__inserter-grid-icons-list-item-icon {
|
|
39
55
|
padding: $grid-unit-15;
|
|
56
|
+
|
|
57
|
+
// Fit any icon within 24x24. The viewBox preserves the aspect ratio, so
|
|
58
|
+
// non-square icons are scaled and centered without distortion.
|
|
59
|
+
svg {
|
|
60
|
+
display: block;
|
|
61
|
+
width: $icon-size;
|
|
62
|
+
height: $icon-size;
|
|
63
|
+
}
|
|
40
64
|
}
|
|
41
65
|
|
|
42
66
|
.wp-block-icon__inserter-grid-icons-list-item-title {
|
|
@@ -45,6 +69,7 @@
|
|
|
45
69
|
overflow: hidden;
|
|
46
70
|
text-overflow: ellipsis;
|
|
47
71
|
white-space: nowrap;
|
|
72
|
+
width: 100%;
|
|
48
73
|
}
|
|
49
74
|
|
|
50
75
|
.wp-block-icon__toolbar-content {
|
package/src/image/README.md
CHANGED
|
@@ -79,7 +79,7 @@ _Defined via the [`styles`](https://developer.wordpress.org/block-editor/referen
|
|
|
79
79
|
|
|
80
80
|
_Defined via the [`selectors`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-selectors/) property in block.json._
|
|
81
81
|
|
|
82
|
-
- **dimensions**: `.wp-block-image img`
|
|
82
|
+
- **dimensions**: `.wp-block-image img, .wp-block-image .components-placeholder`
|
|
83
83
|
- **border**: `.wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder`
|
|
84
84
|
- **shadow**: `.wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder`
|
|
85
85
|
- **filter**:
|
package/src/image/block.json
CHANGED
|
@@ -141,7 +141,7 @@
|
|
|
141
141
|
}
|
|
142
142
|
},
|
|
143
143
|
"selectors": {
|
|
144
|
-
"dimensions": ".wp-block-image img",
|
|
144
|
+
"dimensions": ".wp-block-image img, .wp-block-image .components-placeholder",
|
|
145
145
|
"border": ".wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder",
|
|
146
146
|
"shadow": ".wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder",
|
|
147
147
|
"filter": {
|
package/src/image/edit.js
CHANGED
|
@@ -31,7 +31,6 @@ import { store as uploadStore } from '@wordpress/upload-media';
|
|
|
31
31
|
* Internal dependencies
|
|
32
32
|
*/
|
|
33
33
|
import { useUploadMediaFromBlobURL } from '../utils/hooks';
|
|
34
|
-
import { getCarriedGifConversionAttributes } from '../utils/gif-conversion-attributes';
|
|
35
34
|
import Image from './image';
|
|
36
35
|
import { isValidFileType } from './utils';
|
|
37
36
|
import { useMaxWidthObserver } from './use-max-width-observer';
|
|
@@ -238,57 +237,6 @@ export function ImageEdit( {
|
|
|
238
237
|
return;
|
|
239
238
|
}
|
|
240
239
|
|
|
241
|
-
// Switch to a converted GIF video block when the selected media is
|
|
242
|
-
// an animated GIF whose sideloaded video companion is available.
|
|
243
|
-
// Triggering off the upload's onChange (rather than watching the
|
|
244
|
-
// attachment record) means already-saved image blocks are left
|
|
245
|
-
// alone on page load - the explicit "Display as video" toolbar
|
|
246
|
-
// button is the path for converting those. `animated_video` is
|
|
247
|
-
// only ever set on GIF image attachments, so its presence is a
|
|
248
|
-
// sufficient signal that this swap applies.
|
|
249
|
-
//
|
|
250
|
-
// A gallery only accepts `core/image` children, so the swap is
|
|
251
|
-
// skipped there; the converted video is still sideloaded and
|
|
252
|
-
// stored for use elsewhere.
|
|
253
|
-
const rootClientId = getBlockRootClientId( clientId );
|
|
254
|
-
const isInGallery =
|
|
255
|
-
!! rootClientId && getBlockName( rootClientId ) === 'core/gallery';
|
|
256
|
-
if (
|
|
257
|
-
! isInGallery &&
|
|
258
|
-
media.media_details?.animated_video &&
|
|
259
|
-
media.url
|
|
260
|
-
) {
|
|
261
|
-
const dir = media.url.slice( 0, media.url.lastIndexOf( '/' ) + 1 );
|
|
262
|
-
const poster = media.media_details.animated_video_poster;
|
|
263
|
-
__unstableMarkNextChangeAsNotPersistent();
|
|
264
|
-
replaceBlock(
|
|
265
|
-
clientId,
|
|
266
|
-
createBlock( 'core/video', {
|
|
267
|
-
...getCarriedGifConversionAttributes( attributes ),
|
|
268
|
-
id: media.id,
|
|
269
|
-
src: dir + media.media_details.animated_video,
|
|
270
|
-
poster: poster ? dir + poster : undefined,
|
|
271
|
-
caption: media.caption?.raw ?? media.caption,
|
|
272
|
-
controls: false,
|
|
273
|
-
loop: true,
|
|
274
|
-
autoplay: true,
|
|
275
|
-
muted: true,
|
|
276
|
-
playsInline: true,
|
|
277
|
-
/*
|
|
278
|
-
* Carry the GIF's intrinsic dimensions so the <video> keeps
|
|
279
|
-
* its aspect ratio from the first paint. Without them the
|
|
280
|
-
* element collapses to the browser-default size and then
|
|
281
|
-
* jumps once the poster/metadata load, which shows up as a
|
|
282
|
-
* brief duplicated image during the swap.
|
|
283
|
-
*/
|
|
284
|
-
width: media.media_details.width,
|
|
285
|
-
height: media.media_details.height,
|
|
286
|
-
} )
|
|
287
|
-
);
|
|
288
|
-
setTemporaryURL();
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
240
|
const { imageDefaultSize } = getSettings();
|
|
293
241
|
|
|
294
242
|
// Try to use the previous selected image size if its available
|
package/src/image/editor.scss
CHANGED
|
@@ -129,6 +129,7 @@ figure.wp-block-image:not(.wp-block) {
|
|
|
129
129
|
width: 100%;
|
|
130
130
|
overflow: hidden;
|
|
131
131
|
|
|
132
|
+
// stylelint-disable selector-class-pattern -- react-easy-crop library class names.
|
|
132
133
|
.reactEasyCrop_Container {
|
|
133
134
|
// The linked Image block has `pointer-events: none` applied. Override it
|
|
134
135
|
// here to enable the crop action.
|
|
@@ -143,6 +144,7 @@ figure.wp-block-image:not(.wp-block) {
|
|
|
143
144
|
border-radius: 0; // Prevent's theme.json radius bleeding into cropper.
|
|
144
145
|
}
|
|
145
146
|
}
|
|
147
|
+
// stylelint-enable selector-class-pattern
|
|
146
148
|
}
|
|
147
149
|
|
|
148
150
|
.wp-block-image__crop-icon {
|