Merged in feature/81-dev-dev01 (pull request #5)
auto-patch 81-dev-dev01-2023-12-05T22_45_26 * auto-patch 81-dev-dev01-2023-12-05T22_45_26
This commit is contained in:
@@ -750,7 +750,7 @@ class PHPMailer
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const VERSION = '6.8.0';
|
||||
const VERSION = '6.8.1';
|
||||
|
||||
/**
|
||||
* Error severity: message only, continue processing.
|
||||
@@ -795,7 +795,7 @@ class PHPMailer
|
||||
* The maximum line length supported by mail().
|
||||
*
|
||||
* Background: mail() will sometimes corrupt messages
|
||||
* with headers headers longer than 65 chars, see #818.
|
||||
* with headers longer than 65 chars, see #818.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
|
||||
@@ -35,7 +35,7 @@ class SMTP
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const VERSION = '6.8.0';
|
||||
const VERSION = '6.8.1';
|
||||
|
||||
/**
|
||||
* SMTP line break constant.
|
||||
@@ -704,7 +704,7 @@ class SMTP
|
||||
* Send an SMTP DATA command.
|
||||
* Issues a data command and sends the msg_data to the server,
|
||||
* finalizing the mail transaction. $msg_data is the message
|
||||
* that is to be send with the headers. Each header needs to be
|
||||
* that is to be sent with the headers. Each header needs to be
|
||||
* on a single line followed by a <CRLF> with the message headers
|
||||
* and the message body being separated by an additional <CRLF>.
|
||||
* Implements RFC 821: DATA <CRLF>.
|
||||
@@ -732,7 +732,7 @@ class SMTP
|
||||
$lines = explode("\n", str_replace(["\r\n", "\r"], "\n", $msg_data));
|
||||
|
||||
/* To distinguish between a complete RFC822 message and a plain message body, we check if the first field
|
||||
* of the first line (':' separated) does not contain a space then it _should_ be a header and we will
|
||||
* of the first line (':' separated) does not contain a space then it _should_ be a header, and we will
|
||||
* process all lines before a blank line as headers.
|
||||
*/
|
||||
|
||||
|
||||
@@ -96,4 +96,8 @@ class Hooks implements HookManager {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function __wakeup() {
|
||||
throw new \LogicException( __CLASS__ . ' should never be unserialized' );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -717,6 +717,20 @@ class Iri {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function __wakeup() {
|
||||
$class_props = get_class_vars( __CLASS__ );
|
||||
$string_props = array( 'scheme', 'iuserinfo', 'ihost', 'port', 'ipath', 'iquery', 'ifragment' );
|
||||
$array_props = array( 'normalization' );
|
||||
foreach ( $class_props as $prop => $default_value ) {
|
||||
if ( in_array( $prop, $string_props, true ) && ! is_string( $this->$prop ) ) {
|
||||
throw new UnexpectedValueException();
|
||||
} elseif ( in_array( $prop, $array_props, true ) && ! is_array( $this->$prop ) ) {
|
||||
throw new UnexpectedValueException();
|
||||
}
|
||||
$this->$prop = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the entire IRI. Returns true on success, false on failure (if there
|
||||
* are any invalid characters).
|
||||
|
||||
@@ -148,7 +148,7 @@ class Requests {
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const VERSION = '2.0.6';
|
||||
const VERSION = '2.0.9';
|
||||
|
||||
/**
|
||||
* Selected transport name
|
||||
|
||||
@@ -265,6 +265,10 @@ class Session {
|
||||
return Requests::request_multiple($requests, $options);
|
||||
}
|
||||
|
||||
public function __wakeup() {
|
||||
throw new \LogicException( __CLASS__ . ' should never be unserialized' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge a request's data with the default data
|
||||
*
|
||||
|
||||
@@ -194,6 +194,16 @@ function wp_admin_bar_wp_menu( $wp_admin_bar ) {
|
||||
)
|
||||
);
|
||||
|
||||
// Add learn link.
|
||||
$wp_admin_bar->add_node(
|
||||
array(
|
||||
'parent' => 'wp-logo-external',
|
||||
'id' => 'learn',
|
||||
'title' => __( 'Learn WordPress' ),
|
||||
'href' => 'https://learn.wordpress.org/',
|
||||
)
|
||||
);
|
||||
|
||||
// Add forums link.
|
||||
$wp_admin_bar->add_node(
|
||||
array(
|
||||
@@ -897,7 +907,7 @@ function wp_admin_bar_edit_menu( $wp_admin_bar ) {
|
||||
)
|
||||
);
|
||||
}
|
||||
} elseif ( is_a( $current_object, 'WP_User' ) && current_user_can( 'edit_user', $current_object->ID ) ) {
|
||||
} elseif ( $current_object instanceof WP_User && current_user_can( 'edit_user', $current_object->ID ) ) {
|
||||
$edit_user_link = get_edit_user_link( $current_object->ID );
|
||||
if ( $edit_user_link ) {
|
||||
$wp_admin_bar->add_node(
|
||||
@@ -1100,7 +1110,6 @@ function wp_admin_bar_appearance_menu( $wp_admin_bar ) {
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1226,32 +1235,51 @@ function wp_admin_bar_add_secondary_groups( $wp_admin_bar ) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints style and scripts for the admin bar.
|
||||
* Enqueues inline style to hide the admin bar when printing.
|
||||
*
|
||||
* @since 3.1.0
|
||||
* @since 6.4.0
|
||||
*/
|
||||
function wp_admin_bar_header() {
|
||||
$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
|
||||
?>
|
||||
<style<?php echo $type_attr; ?> media="print">#wpadminbar { display:none; }</style>
|
||||
<?php
|
||||
function wp_enqueue_admin_bar_header_styles() {
|
||||
// Back-compat for plugins that disable functionality by unhooking this action.
|
||||
$action = is_admin() ? 'admin_head' : 'wp_head';
|
||||
if ( ! has_action( $action, 'wp_admin_bar_header' ) ) {
|
||||
return;
|
||||
}
|
||||
remove_action( $action, 'wp_admin_bar_header' );
|
||||
|
||||
wp_add_inline_style( 'admin-bar', '@media print { #wpadminbar { display:none; } }' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints default admin bar callback.
|
||||
* Enqueues inline bump styles to make room for the admin bar.
|
||||
*
|
||||
* @since 3.1.0
|
||||
* @since 6.4.0
|
||||
*/
|
||||
function _admin_bar_bump_cb() {
|
||||
$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
|
||||
?>
|
||||
<style<?php echo $type_attr; ?> media="screen">
|
||||
html { margin-top: 32px !important; }
|
||||
@media screen and ( max-width: 782px ) {
|
||||
html { margin-top: 46px !important; }
|
||||
function wp_enqueue_admin_bar_bump_styles() {
|
||||
if ( current_theme_supports( 'admin-bar' ) ) {
|
||||
$admin_bar_args = get_theme_support( 'admin-bar' );
|
||||
$header_callback = $admin_bar_args[0]['callback'];
|
||||
}
|
||||
</style>
|
||||
<?php
|
||||
|
||||
if ( empty( $header_callback ) ) {
|
||||
$header_callback = '_admin_bar_bump_cb';
|
||||
}
|
||||
|
||||
if ( '_admin_bar_bump_cb' !== $header_callback ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Back-compat for plugins that disable functionality by unhooking this action.
|
||||
if ( ! has_action( 'wp_head', $header_callback ) ) {
|
||||
return;
|
||||
}
|
||||
remove_action( 'wp_head', $header_callback );
|
||||
|
||||
$css = '
|
||||
@media screen { html { margin-top: 32px !important; } }
|
||||
@media screen and ( max-width: 782px ) { html { margin-top: 46px !important; } }
|
||||
';
|
||||
wp_add_inline_style( 'admin-bar', $css );
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
<?php return array('dependencies' => array(), 'version' => 'd4cdced5a2afff4a8cc2');
|
||||
<?php return array('dependencies' => array(), 'version' => '79d08edf9bea9ade42e6');
|
||||
|
||||
@@ -1 +1 @@
|
||||
<?php return array('dependencies' => array(), 'version' => 'd4cdced5a2afff4a8cc2');
|
||||
<?php return array('dependencies' => array(), 'version' => '79d08edf9bea9ade42e6');
|
||||
|
||||
@@ -287,7 +287,6 @@ function get_legacy_widget_block_editor_settings() {
|
||||
* @since 6.0.0
|
||||
* @access private
|
||||
*
|
||||
* @global string $pagenow The filename of the current screen.
|
||||
* @global WP_Styles $wp_styles The WP_Styles current instance.
|
||||
* @global WP_Scripts $wp_scripts The WP_Scripts current instance.
|
||||
*
|
||||
@@ -299,7 +298,7 @@ function get_legacy_widget_block_editor_settings() {
|
||||
* }
|
||||
*/
|
||||
function _wp_get_iframed_editor_assets() {
|
||||
global $wp_styles, $wp_scripts, $pagenow;
|
||||
global $wp_styles, $wp_scripts;
|
||||
|
||||
// Keep track of the styles and scripts instance to restore later.
|
||||
$current_wp_styles = $wp_styles;
|
||||
@@ -329,10 +328,6 @@ function _wp_get_iframed_editor_assets() {
|
||||
// Enqueue the `editorStyle` handles for all core block, and dependencies.
|
||||
wp_enqueue_style( 'wp-edit-blocks' );
|
||||
|
||||
if ( 'site-editor.php' === $pagenow ) {
|
||||
wp_enqueue_style( 'wp-edit-site' );
|
||||
}
|
||||
|
||||
if ( current_theme_supports( 'wp-block-styles' ) ) {
|
||||
wp_enqueue_style( 'wp-block-library-theme' );
|
||||
}
|
||||
@@ -359,10 +354,24 @@ function _wp_get_iframed_editor_assets() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the deprecated `print_emoji_styles` handler.
|
||||
* It avoids breaking style generation with a deprecation message.
|
||||
*/
|
||||
$has_emoji_styles = has_action( 'wp_print_styles', 'print_emoji_styles' );
|
||||
if ( $has_emoji_styles ) {
|
||||
remove_action( 'wp_print_styles', 'print_emoji_styles' );
|
||||
}
|
||||
|
||||
ob_start();
|
||||
wp_print_styles();
|
||||
wp_print_font_faces();
|
||||
$styles = ob_get_clean();
|
||||
|
||||
if ( $has_emoji_styles ) {
|
||||
add_action( 'wp_print_styles', 'print_emoji_styles' );
|
||||
}
|
||||
|
||||
ob_start();
|
||||
wp_print_head_scripts();
|
||||
wp_print_footer_scripts();
|
||||
@@ -408,11 +417,12 @@ function wp_get_first_block( $blocks, $block_name ) {
|
||||
* Retrieves Post Content block attributes from the current post template.
|
||||
*
|
||||
* @since 6.3.0
|
||||
* @since 6.4.0 Return null if there is no post content block.
|
||||
* @access private
|
||||
*
|
||||
* @global int $post_ID
|
||||
*
|
||||
* @return array Post Content block attributes or empty array if they don't exist.
|
||||
* @return array|null Post Content block attributes array or null if Post Content block doesn't exist.
|
||||
*/
|
||||
function wp_get_post_content_block_attributes() {
|
||||
global $post_ID;
|
||||
@@ -420,7 +430,7 @@ function wp_get_post_content_block_attributes() {
|
||||
$is_block_theme = wp_is_block_theme();
|
||||
|
||||
if ( ! $is_block_theme || ! $post_ID ) {
|
||||
return array();
|
||||
return null;
|
||||
}
|
||||
|
||||
$template_slug = get_page_template_slug( $post_ID );
|
||||
@@ -456,12 +466,12 @@ function wp_get_post_content_block_attributes() {
|
||||
$template_blocks = parse_blocks( $current_template[0]->content );
|
||||
$post_content_block = wp_get_first_block( $template_blocks, 'core/post-content' );
|
||||
|
||||
if ( ! empty( $post_content_block['attrs'] ) ) {
|
||||
if ( isset( $post_content_block['attrs'] ) ) {
|
||||
return $post_content_block['attrs'];
|
||||
}
|
||||
}
|
||||
|
||||
return array();
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -634,7 +644,7 @@ function get_block_editor_settings( array $custom_settings, $block_editor_contex
|
||||
|
||||
$post_content_block_attributes = wp_get_post_content_block_attributes();
|
||||
|
||||
if ( ! empty( $post_content_block_attributes ) ) {
|
||||
if ( isset( $post_content_block_attributes ) ) {
|
||||
$editor_settings['postContentAttributes'] = $post_content_block_attributes;
|
||||
}
|
||||
|
||||
|
||||
@@ -319,173 +319,81 @@ function _register_remote_theme_patterns() {
|
||||
|
||||
/**
|
||||
* Register any patterns that the active theme may provide under its
|
||||
* `./patterns/` directory. Each pattern is defined as a PHP file and defines
|
||||
* its metadata using plugin-style headers. The minimum required definition is:
|
||||
*
|
||||
* /**
|
||||
* * Title: My Pattern
|
||||
* * Slug: my-theme/my-pattern
|
||||
* *
|
||||
*
|
||||
* The output of the PHP source corresponds to the content of the pattern, e.g.:
|
||||
*
|
||||
* <main><p><?php echo "Hello"; ?></p></main>
|
||||
*
|
||||
* If applicable, this will collect from both parent and child theme.
|
||||
*
|
||||
* Other settable fields include:
|
||||
*
|
||||
* - Description
|
||||
* - Viewport Width
|
||||
* - Inserter (yes/no)
|
||||
* - Categories (comma-separated values)
|
||||
* - Keywords (comma-separated values)
|
||||
* - Block Types (comma-separated values)
|
||||
* - Post Types (comma-separated values)
|
||||
* - Template Types (comma-separated values)
|
||||
* `./patterns/` directory.
|
||||
*
|
||||
* @since 6.0.0
|
||||
* @since 6.1.0 The `postTypes` property was added.
|
||||
* @since 6.2.0 The `templateTypes` property was added.
|
||||
* @since 6.4.0 Uses the `_wp_get_block_patterns` function.
|
||||
* @access private
|
||||
*/
|
||||
function _register_theme_block_patterns() {
|
||||
$default_headers = array(
|
||||
'title' => 'Title',
|
||||
'slug' => 'Slug',
|
||||
'description' => 'Description',
|
||||
'viewportWidth' => 'Viewport Width',
|
||||
'inserter' => 'Inserter',
|
||||
'categories' => 'Categories',
|
||||
'keywords' => 'Keywords',
|
||||
'blockTypes' => 'Block Types',
|
||||
'postTypes' => 'Post Types',
|
||||
'templateTypes' => 'Template Types',
|
||||
);
|
||||
|
||||
/*
|
||||
* During the bootstrap process, a check for active and valid themes is run.
|
||||
* If no themes are returned, the theme's functions.php file will not be loaded,
|
||||
* which can lead to errors if patterns expect some variables or constants to
|
||||
* already be set at this point, so bail early if that is the case.
|
||||
*/
|
||||
if ( empty( wp_get_active_and_valid_themes() ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Register patterns for the active theme. If the theme is a child theme,
|
||||
* let it override any patterns from the parent theme that shares the same slug.
|
||||
*/
|
||||
$themes = array();
|
||||
$stylesheet = get_stylesheet();
|
||||
$template = get_template();
|
||||
if ( $stylesheet !== $template ) {
|
||||
$themes[] = wp_get_theme( $stylesheet );
|
||||
$themes = array();
|
||||
$theme = wp_get_theme();
|
||||
$themes[] = $theme;
|
||||
if ( $theme->parent() ) {
|
||||
$themes[] = $theme->parent();
|
||||
}
|
||||
$themes[] = wp_get_theme( $template );
|
||||
$registry = WP_Block_Patterns_Registry::get_instance();
|
||||
|
||||
foreach ( $themes as $theme ) {
|
||||
$dirpath = $theme->get_stylesheet_directory() . '/patterns/';
|
||||
if ( ! is_dir( $dirpath ) || ! is_readable( $dirpath ) ) {
|
||||
continue;
|
||||
}
|
||||
if ( file_exists( $dirpath ) ) {
|
||||
$files = glob( $dirpath . '*.php' );
|
||||
if ( $files ) {
|
||||
foreach ( $files as $file ) {
|
||||
$pattern_data = get_file_data( $file, $default_headers );
|
||||
$patterns = $theme->get_block_patterns();
|
||||
$dirpath = $theme->get_stylesheet_directory() . '/patterns/';
|
||||
$text_domain = $theme->get( 'TextDomain' );
|
||||
|
||||
if ( empty( $pattern_data['slug'] ) ) {
|
||||
_doing_it_wrong(
|
||||
'_register_theme_block_patterns',
|
||||
sprintf(
|
||||
/* translators: %s: file name. */
|
||||
__( 'Could not register file "%s" as a block pattern ("Slug" field missing)' ),
|
||||
$file
|
||||
),
|
||||
'6.0.0'
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ! preg_match( '/^[A-z0-9\/_-]+$/', $pattern_data['slug'] ) ) {
|
||||
_doing_it_wrong(
|
||||
'_register_theme_block_patterns',
|
||||
sprintf(
|
||||
/* translators: %1s: file name; %2s: slug value found. */
|
||||
__( 'Could not register file "%1$s" as a block pattern (invalid slug "%2$s")' ),
|
||||
$file,
|
||||
$pattern_data['slug']
|
||||
),
|
||||
'6.0.0'
|
||||
);
|
||||
}
|
||||
|
||||
if ( WP_Block_Patterns_Registry::get_instance()->is_registered( $pattern_data['slug'] ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Title is a required property.
|
||||
if ( ! $pattern_data['title'] ) {
|
||||
_doing_it_wrong(
|
||||
'_register_theme_block_patterns',
|
||||
sprintf(
|
||||
/* translators: %1s: file name; %2s: slug value found. */
|
||||
__( 'Could not register file "%s" as a block pattern ("Title" field missing)' ),
|
||||
$file
|
||||
),
|
||||
'6.0.0'
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
// For properties of type array, parse data as comma-separated.
|
||||
foreach ( array( 'categories', 'keywords', 'blockTypes', 'postTypes', 'templateTypes' ) as $property ) {
|
||||
if ( ! empty( $pattern_data[ $property ] ) ) {
|
||||
$pattern_data[ $property ] = array_filter(
|
||||
preg_split(
|
||||
'/[\s,]+/',
|
||||
(string) $pattern_data[ $property ]
|
||||
)
|
||||
);
|
||||
} else {
|
||||
unset( $pattern_data[ $property ] );
|
||||
}
|
||||
}
|
||||
|
||||
// Parse properties of type int.
|
||||
foreach ( array( 'viewportWidth' ) as $property ) {
|
||||
if ( ! empty( $pattern_data[ $property ] ) ) {
|
||||
$pattern_data[ $property ] = (int) $pattern_data[ $property ];
|
||||
} else {
|
||||
unset( $pattern_data[ $property ] );
|
||||
}
|
||||
}
|
||||
|
||||
// Parse properties of type bool.
|
||||
foreach ( array( 'inserter' ) as $property ) {
|
||||
if ( ! empty( $pattern_data[ $property ] ) ) {
|
||||
$pattern_data[ $property ] = in_array(
|
||||
strtolower( $pattern_data[ $property ] ),
|
||||
array( 'yes', 'true' ),
|
||||
true
|
||||
);
|
||||
} else {
|
||||
unset( $pattern_data[ $property ] );
|
||||
}
|
||||
}
|
||||
|
||||
// Translate the pattern metadata.
|
||||
$text_domain = $theme->get( 'TextDomain' );
|
||||
//phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText, WordPress.WP.I18n.NonSingularStringLiteralContext, WordPress.WP.I18n.NonSingularStringLiteralDomain, WordPress.WP.I18n.LowLevelTranslationFunction
|
||||
$pattern_data['title'] = translate_with_gettext_context( $pattern_data['title'], 'Pattern title', $text_domain );
|
||||
if ( ! empty( $pattern_data['description'] ) ) {
|
||||
//phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText, WordPress.WP.I18n.NonSingularStringLiteralContext, WordPress.WP.I18n.NonSingularStringLiteralDomain, WordPress.WP.I18n.LowLevelTranslationFunction
|
||||
$pattern_data['description'] = translate_with_gettext_context( $pattern_data['description'], 'Pattern description', $text_domain );
|
||||
}
|
||||
|
||||
// The actual pattern content is the output of the file.
|
||||
ob_start();
|
||||
include $file;
|
||||
$pattern_data['content'] = ob_get_clean();
|
||||
if ( ! $pattern_data['content'] ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
register_block_pattern( $pattern_data['slug'], $pattern_data );
|
||||
}
|
||||
foreach ( $patterns as $file => $pattern_data ) {
|
||||
if ( $registry->is_registered( $pattern_data['slug'] ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$file_path = $dirpath . $file;
|
||||
|
||||
if ( ! file_exists( $file_path ) ) {
|
||||
_doing_it_wrong(
|
||||
__FUNCTION__,
|
||||
sprintf(
|
||||
/* translators: %s: file name. */
|
||||
__( 'Could not register file "%s" as a block pattern as the file does not exist.' ),
|
||||
$file
|
||||
),
|
||||
'6.4.0'
|
||||
);
|
||||
$theme->delete_pattern_cache();
|
||||
continue;
|
||||
}
|
||||
|
||||
// The actual pattern content is the output of the file.
|
||||
ob_start();
|
||||
include $file_path;
|
||||
$pattern_data['content'] = ob_get_clean();
|
||||
if ( ! $pattern_data['content'] ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Translate the pattern metadata.
|
||||
// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain,WordPress.WP.I18n.LowLevelTranslationFunction
|
||||
$pattern_data['title'] = translate_with_gettext_context( $pattern_data['title'], 'Pattern title', $text_domain );
|
||||
if ( ! empty( $pattern_data['description'] ) ) {
|
||||
// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain,WordPress.WP.I18n.LowLevelTranslationFunction
|
||||
$pattern_data['description'] = translate_with_gettext_context( $pattern_data['description'], 'Pattern description', $text_domain );
|
||||
}
|
||||
|
||||
register_block_pattern( $pattern_data['slug'], $pattern_data );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* @param WP_Block_Type $block_type Block Type.
|
||||
*/
|
||||
function wp_register_alignment_support( $block_type ) {
|
||||
$has_align_support = block_has_support( $block_type, array( 'align' ), false );
|
||||
$has_align_support = block_has_support( $block_type, 'align', false );
|
||||
if ( $has_align_support ) {
|
||||
if ( ! $block_type->attributes ) {
|
||||
$block_type->attributes = array();
|
||||
@@ -43,7 +43,7 @@ function wp_register_alignment_support( $block_type ) {
|
||||
*/
|
||||
function wp_apply_alignment_support( $block_type, $block_attributes ) {
|
||||
$attributes = array();
|
||||
$has_align_support = block_has_support( $block_type, array( 'align' ), false );
|
||||
$has_align_support = block_has_support( $block_type, 'align', false );
|
||||
if ( $has_align_support ) {
|
||||
$has_block_alignment = array_key_exists( 'align', $block_attributes );
|
||||
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
/**
|
||||
* Background block support flag.
|
||||
*
|
||||
* @package WordPress
|
||||
* @since 6.4.0
|
||||
*/
|
||||
|
||||
/**
|
||||
* Registers the style block attribute for block types that support it.
|
||||
*
|
||||
* @since 6.4.0
|
||||
* @access private
|
||||
*
|
||||
* @param WP_Block_Type $block_type Block Type.
|
||||
*/
|
||||
function wp_register_background_support( $block_type ) {
|
||||
// Setup attributes and styles within that if needed.
|
||||
if ( ! $block_type->attributes ) {
|
||||
$block_type->attributes = array();
|
||||
}
|
||||
|
||||
// Check for existing style attribute definition e.g. from block.json.
|
||||
if ( array_key_exists( 'style', $block_type->attributes ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$has_background_support = block_has_support( $block_type, array( 'background' ), false );
|
||||
|
||||
if ( $has_background_support ) {
|
||||
$block_type->attributes['style'] = array(
|
||||
'type' => 'object',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the background styles to the block wrapper.
|
||||
* This block support uses the `render_block` hook to ensure that
|
||||
* it is also applied to non-server-rendered blocks.
|
||||
*
|
||||
* @since 6.4.0
|
||||
* @access private
|
||||
*
|
||||
* @param string $block_content Rendered block content.
|
||||
* @param array $block Block object.
|
||||
* @return string Filtered block content.
|
||||
*/
|
||||
function wp_render_background_support( $block_content, $block ) {
|
||||
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
|
||||
$block_attributes = ( isset( $block['attrs'] ) && is_array( $block['attrs'] ) ) ? $block['attrs'] : array();
|
||||
$has_background_image_support = block_has_support( $block_type, array( 'background', 'backgroundImage' ), false );
|
||||
|
||||
if (
|
||||
! $has_background_image_support ||
|
||||
wp_should_skip_block_supports_serialization( $block_type, 'background', 'backgroundImage' )
|
||||
) {
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
$background_image_source = isset( $block_attributes['style']['background']['backgroundImage']['source'] )
|
||||
? $block_attributes['style']['background']['backgroundImage']['source']
|
||||
: null;
|
||||
$background_image_url = isset( $block_attributes['style']['background']['backgroundImage']['url'] )
|
||||
? $block_attributes['style']['background']['backgroundImage']['url']
|
||||
: null;
|
||||
$background_size = isset( $block_attributes['style']['background']['backgroundSize'] )
|
||||
? $block_attributes['style']['background']['backgroundSize']
|
||||
: 'cover';
|
||||
|
||||
$background_block_styles = array();
|
||||
|
||||
if (
|
||||
'file' === $background_image_source &&
|
||||
$background_image_url
|
||||
) {
|
||||
// Set file based background URL.
|
||||
$background_block_styles['backgroundImage']['url'] = $background_image_url;
|
||||
// Only output the background size when an image url is set.
|
||||
$background_block_styles['backgroundSize'] = $background_size;
|
||||
}
|
||||
|
||||
$styles = wp_style_engine_get_styles( array( 'background' => $background_block_styles ) );
|
||||
|
||||
if ( ! empty( $styles['css'] ) ) {
|
||||
// Inject background styles to the first element, presuming it's the wrapper, if it exists.
|
||||
$tags = new WP_HTML_Tag_Processor( $block_content );
|
||||
|
||||
if ( $tags->next_tag() ) {
|
||||
$existing_style = $tags->get_attribute( 'style' );
|
||||
$updated_style = '';
|
||||
|
||||
if ( ! empty( $existing_style ) ) {
|
||||
$updated_style = $existing_style;
|
||||
if ( ! str_ends_with( $existing_style, ';' ) ) {
|
||||
$updated_style .= ';';
|
||||
}
|
||||
}
|
||||
|
||||
$updated_style .= $styles['css'];
|
||||
$tags->set_attribute( 'style', $updated_style );
|
||||
}
|
||||
|
||||
return $tags->get_updated_html();
|
||||
}
|
||||
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
// Register the block support.
|
||||
WP_Block_Supports::get_instance()->register(
|
||||
'background',
|
||||
array(
|
||||
'register_attribute' => 'wp_register_background_support',
|
||||
)
|
||||
);
|
||||
|
||||
add_filter( 'render_block', 'wp_render_background_support', 10, 2 );
|
||||
@@ -22,7 +22,7 @@ function wp_register_border_support( $block_type ) {
|
||||
$block_type->attributes = array();
|
||||
}
|
||||
|
||||
if ( block_has_support( $block_type, array( '__experimentalBorder' ) ) && ! array_key_exists( 'style', $block_type->attributes ) ) {
|
||||
if ( block_has_support( $block_type, '__experimentalBorder' ) && ! array_key_exists( 'style', $block_type->attributes ) ) {
|
||||
$block_type->attributes['style'] = array(
|
||||
'type' => 'object',
|
||||
);
|
||||
@@ -102,14 +102,14 @@ function wp_apply_border_support( $block_type, $block_attributes ) {
|
||||
! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'color' )
|
||||
) {
|
||||
$preset_border_color = array_key_exists( 'borderColor', $block_attributes ) ? "var:preset|color|{$block_attributes['borderColor']}" : null;
|
||||
$custom_border_color = _wp_array_get( $block_attributes, array( 'style', 'border', 'color' ), null );
|
||||
$custom_border_color = isset( $block_attributes['style']['border']['color'] ) ? $block_attributes['style']['border']['color'] : null;
|
||||
$border_block_styles['color'] = $preset_border_color ? $preset_border_color : $custom_border_color;
|
||||
}
|
||||
|
||||
// Generates styles for individual border sides.
|
||||
if ( $has_border_color_support || $has_border_width_support ) {
|
||||
foreach ( array( 'top', 'right', 'bottom', 'left' ) as $side ) {
|
||||
$border = _wp_array_get( $block_attributes, array( 'style', 'border', $side ), null );
|
||||
$border = isset( $block_attributes['style']['border'][ $side ] ) ? $block_attributes['style']['border'][ $side ] : null;
|
||||
$border_side_values = array(
|
||||
'width' => isset( $border['width'] ) && ! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'width' ) ? $border['width'] : null,
|
||||
'color' => isset( $border['color'] ) && ! wp_should_skip_block_supports_serialization( $block_type, '__experimentalBorder', 'color' ) ? $border['color'] : null,
|
||||
@@ -152,11 +152,13 @@ function wp_apply_border_support( $block_type, $block_attributes ) {
|
||||
*/
|
||||
function wp_has_border_feature_support( $block_type, $feature, $default_value = false ) {
|
||||
// Check if all border support features have been opted into via `"__experimentalBorder": true`.
|
||||
if (
|
||||
property_exists( $block_type, 'supports' ) &&
|
||||
( true === _wp_array_get( $block_type->supports, array( '__experimentalBorder' ), $default_value ) )
|
||||
) {
|
||||
return true;
|
||||
if ( $block_type instanceof WP_Block_Type ) {
|
||||
$block_type_supports_border = isset( $block_type->supports['__experimentalBorder'] )
|
||||
? $block_type->supports['__experimentalBorder']
|
||||
: $default_value;
|
||||
if ( true === $block_type_supports_border ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if the specific feature has been opted into individually
|
||||
|
||||
@@ -16,15 +16,26 @@
|
||||
* @param WP_Block_Type $block_type Block Type.
|
||||
*/
|
||||
function wp_register_colors_support( $block_type ) {
|
||||
$color_support = property_exists( $block_type, 'supports' ) ? _wp_array_get( $block_type->supports, array( 'color' ), false ) : false;
|
||||
$has_text_colors_support = true === $color_support || ( is_array( $color_support ) && _wp_array_get( $color_support, array( 'text' ), true ) );
|
||||
$has_background_colors_support = true === $color_support || ( is_array( $color_support ) && _wp_array_get( $color_support, array( 'background' ), true ) );
|
||||
$has_gradients_support = _wp_array_get( $color_support, array( 'gradients' ), false );
|
||||
$has_link_colors_support = _wp_array_get( $color_support, array( 'link' ), false );
|
||||
$color_support = false;
|
||||
if ( $block_type instanceof WP_Block_Type ) {
|
||||
$color_support = isset( $block_type->supports['color'] ) ? $block_type->supports['color'] : false;
|
||||
}
|
||||
$has_text_colors_support = true === $color_support ||
|
||||
( isset( $color_support['text'] ) && $color_support['text'] ) ||
|
||||
( is_array( $color_support ) && ! isset( $color_support['text'] ) );
|
||||
$has_background_colors_support = true === $color_support ||
|
||||
( isset( $color_support['background'] ) && $color_support['background'] ) ||
|
||||
( is_array( $color_support ) && ! isset( $color_support['background'] ) );
|
||||
$has_gradients_support = isset( $color_support['gradients'] ) ? $color_support['gradients'] : false;
|
||||
$has_link_colors_support = isset( $color_support['link'] ) ? $color_support['link'] : false;
|
||||
$has_button_colors_support = isset( $color_support['button'] ) ? $color_support['button'] : false;
|
||||
$has_heading_colors_support = isset( $color_support['heading'] ) ? $color_support['heading'] : false;
|
||||
$has_color_support = $has_text_colors_support ||
|
||||
$has_background_colors_support ||
|
||||
$has_gradients_support ||
|
||||
$has_link_colors_support;
|
||||
$has_link_colors_support ||
|
||||
$has_button_colors_support ||
|
||||
$has_heading_colors_support;
|
||||
|
||||
if ( ! $block_type->attributes ) {
|
||||
$block_type->attributes = array();
|
||||
@@ -70,7 +81,7 @@ function wp_register_colors_support( $block_type ) {
|
||||
* @return array Colors CSS classes and inline styles.
|
||||
*/
|
||||
function wp_apply_colors_support( $block_type, $block_attributes ) {
|
||||
$color_support = _wp_array_get( $block_type->supports, array( 'color' ), false );
|
||||
$color_support = isset( $block_type->supports['color'] ) ? $block_type->supports['color'] : false;
|
||||
|
||||
if (
|
||||
is_array( $color_support ) &&
|
||||
@@ -79,29 +90,33 @@ function wp_apply_colors_support( $block_type, $block_attributes ) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$has_text_colors_support = true === $color_support || ( is_array( $color_support ) && _wp_array_get( $color_support, array( 'text' ), true ) );
|
||||
$has_background_colors_support = true === $color_support || ( is_array( $color_support ) && _wp_array_get( $color_support, array( 'background' ), true ) );
|
||||
$has_gradients_support = _wp_array_get( $color_support, array( 'gradients' ), false );
|
||||
$has_text_colors_support = true === $color_support ||
|
||||
( isset( $color_support['text'] ) && $color_support['text'] ) ||
|
||||
( is_array( $color_support ) && ! isset( $color_support['text'] ) );
|
||||
$has_background_colors_support = true === $color_support ||
|
||||
( isset( $color_support['background'] ) && $color_support['background'] ) ||
|
||||
( is_array( $color_support ) && ! isset( $color_support['background'] ) );
|
||||
$has_gradients_support = isset( $color_support['gradients'] ) ? $color_support['gradients'] : false;
|
||||
$color_block_styles = array();
|
||||
|
||||
// Text colors.
|
||||
if ( $has_text_colors_support && ! wp_should_skip_block_supports_serialization( $block_type, 'color', 'text' ) ) {
|
||||
$preset_text_color = array_key_exists( 'textColor', $block_attributes ) ? "var:preset|color|{$block_attributes['textColor']}" : null;
|
||||
$custom_text_color = _wp_array_get( $block_attributes, array( 'style', 'color', 'text' ), null );
|
||||
$custom_text_color = isset( $block_attributes['style']['color']['text'] ) ? $block_attributes['style']['color']['text'] : null;
|
||||
$color_block_styles['text'] = $preset_text_color ? $preset_text_color : $custom_text_color;
|
||||
}
|
||||
|
||||
// Background colors.
|
||||
if ( $has_background_colors_support && ! wp_should_skip_block_supports_serialization( $block_type, 'color', 'background' ) ) {
|
||||
$preset_background_color = array_key_exists( 'backgroundColor', $block_attributes ) ? "var:preset|color|{$block_attributes['backgroundColor']}" : null;
|
||||
$custom_background_color = _wp_array_get( $block_attributes, array( 'style', 'color', 'background' ), null );
|
||||
$custom_background_color = isset( $block_attributes['style']['color']['background'] ) ? $block_attributes['style']['color']['background'] : null;
|
||||
$color_block_styles['background'] = $preset_background_color ? $preset_background_color : $custom_background_color;
|
||||
}
|
||||
|
||||
// Gradients.
|
||||
if ( $has_gradients_support && ! wp_should_skip_block_supports_serialization( $block_type, 'color', 'gradients' ) ) {
|
||||
$preset_gradient_color = array_key_exists( 'gradient', $block_attributes ) ? "var:preset|gradient|{$block_attributes['gradient']}" : null;
|
||||
$custom_gradient_color = _wp_array_get( $block_attributes, array( 'style', 'color', 'gradient' ), null );
|
||||
$custom_gradient_color = isset( $block_attributes['style']['color']['gradient'] ) ? $block_attributes['style']['color']['gradient'] : null;
|
||||
$color_block_styles['gradient'] = $preset_gradient_color ? $preset_gradient_color : $custom_gradient_color;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* @param WP_Block_Type $block_type Block Type.
|
||||
*/
|
||||
function wp_register_custom_classname_support( $block_type ) {
|
||||
$has_custom_classname_support = block_has_support( $block_type, array( 'customClassName' ), true );
|
||||
$has_custom_classname_support = block_has_support( $block_type, 'customClassName', true );
|
||||
|
||||
if ( $has_custom_classname_support ) {
|
||||
if ( ! $block_type->attributes ) {
|
||||
@@ -42,7 +42,7 @@ function wp_register_custom_classname_support( $block_type ) {
|
||||
* @return array Block CSS classes and inline styles.
|
||||
*/
|
||||
function wp_apply_custom_classname_support( $block_type, $block_attributes ) {
|
||||
$has_custom_classname_support = block_has_support( $block_type, array( 'customClassName' ), true );
|
||||
$has_custom_classname_support = block_has_support( $block_type, 'customClassName', true );
|
||||
$attributes = array();
|
||||
if ( $has_custom_classname_support ) {
|
||||
$has_custom_classnames = array_key_exists( 'className', $block_attributes );
|
||||
|
||||
@@ -29,7 +29,7 @@ function wp_register_dimensions_support( $block_type ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$has_dimensions_support = block_has_support( $block_type, array( 'dimensions' ), false );
|
||||
$has_dimensions_support = block_has_support( $block_type, 'dimensions', false );
|
||||
|
||||
if ( $has_dimensions_support ) {
|
||||
$block_type->attributes['style'] = array(
|
||||
@@ -50,7 +50,7 @@ function wp_register_dimensions_support( $block_type ) {
|
||||
* @param array $block_attributes Block attributes.
|
||||
* @return array Block dimensions CSS classes and inline styles.
|
||||
*/
|
||||
function wp_apply_dimensions_support( $block_type, $block_attributes ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
|
||||
function wp_apply_dimensions_support( $block_type, $block_attributes ) {
|
||||
if ( wp_should_skip_block_supports_serialization( $block_type, 'dimensions' ) ) {
|
||||
return array();
|
||||
}
|
||||
@@ -68,8 +68,13 @@ function wp_apply_dimensions_support( $block_type, $block_attributes ) { // phpc
|
||||
|
||||
$skip_min_height = wp_should_skip_block_supports_serialization( $block_type, 'dimensions', 'minHeight' );
|
||||
$dimensions_block_styles = array();
|
||||
$dimensions_block_styles['minHeight'] = $has_min_height_support && ! $skip_min_height ? _wp_array_get( $block_styles, array( 'dimensions', 'minHeight' ), null ) : null;
|
||||
$styles = wp_style_engine_get_styles( array( 'dimensions' => $dimensions_block_styles ) );
|
||||
$dimensions_block_styles['minHeight'] = null;
|
||||
if ( $has_min_height_support && ! $skip_min_height ) {
|
||||
$dimensions_block_styles['minHeight'] = isset( $block_styles['dimensions']['minHeight'] )
|
||||
? $block_styles['dimensions']['minHeight']
|
||||
: null;
|
||||
}
|
||||
$styles = wp_style_engine_get_styles( array( 'dimensions' => $dimensions_block_styles ) );
|
||||
|
||||
if ( ! empty( $styles['css'] ) ) {
|
||||
$attributes['style'] = $styles['css'];
|
||||
|
||||
@@ -23,6 +23,7 @@ function wp_get_elements_class_name( $block ) {
|
||||
* Updates the block content with elements class names.
|
||||
*
|
||||
* @since 5.8.0
|
||||
* @since 6.4.0 Added support for button and heading element styling.
|
||||
* @access private
|
||||
*
|
||||
* @param string $block_content Rendered block content.
|
||||
@@ -30,45 +31,97 @@ function wp_get_elements_class_name( $block ) {
|
||||
* @return string Filtered block content.
|
||||
*/
|
||||
function wp_render_elements_support( $block_content, $block ) {
|
||||
if ( ! $block_content ) {
|
||||
if ( ! $block_content || ! isset( $block['attrs']['style']['elements'] ) ) {
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
|
||||
$skip_link_color_serialization = wp_should_skip_block_supports_serialization( $block_type, 'color', 'link' );
|
||||
|
||||
if ( $skip_link_color_serialization ) {
|
||||
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
|
||||
if ( ! $block_type ) {
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
$link_color = null;
|
||||
if ( ! empty( $block['attrs'] ) ) {
|
||||
$link_color = _wp_array_get( $block['attrs'], array( 'style', 'elements', 'link', 'color', 'text' ), null );
|
||||
}
|
||||
$element_color_properties = array(
|
||||
'button' => array(
|
||||
'skip' => wp_should_skip_block_supports_serialization( $block_type, 'color', 'button' ),
|
||||
'paths' => array(
|
||||
array( 'button', 'color', 'text' ),
|
||||
array( 'button', 'color', 'background' ),
|
||||
array( 'button', 'color', 'gradient' ),
|
||||
),
|
||||
),
|
||||
'link' => array(
|
||||
'skip' => wp_should_skip_block_supports_serialization( $block_type, 'color', 'link' ),
|
||||
'paths' => array(
|
||||
array( 'link', 'color', 'text' ),
|
||||
array( 'link', ':hover', 'color', 'text' ),
|
||||
),
|
||||
),
|
||||
'heading' => array(
|
||||
'skip' => wp_should_skip_block_supports_serialization( $block_type, 'color', 'heading' ),
|
||||
'paths' => array(
|
||||
array( 'heading', 'color', 'text' ),
|
||||
array( 'heading', 'color', 'background' ),
|
||||
array( 'heading', 'color', 'gradient' ),
|
||||
array( 'h1', 'color', 'text' ),
|
||||
array( 'h1', 'color', 'background' ),
|
||||
array( 'h1', 'color', 'gradient' ),
|
||||
array( 'h2', 'color', 'text' ),
|
||||
array( 'h2', 'color', 'background' ),
|
||||
array( 'h2', 'color', 'gradient' ),
|
||||
array( 'h3', 'color', 'text' ),
|
||||
array( 'h3', 'color', 'background' ),
|
||||
array( 'h3', 'color', 'gradient' ),
|
||||
array( 'h4', 'color', 'text' ),
|
||||
array( 'h4', 'color', 'background' ),
|
||||
array( 'h4', 'color', 'gradient' ),
|
||||
array( 'h5', 'color', 'text' ),
|
||||
array( 'h5', 'color', 'background' ),
|
||||
array( 'h5', 'color', 'gradient' ),
|
||||
array( 'h6', 'color', 'text' ),
|
||||
array( 'h6', 'color', 'background' ),
|
||||
array( 'h6', 'color', 'gradient' ),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
$hover_link_color = null;
|
||||
if ( ! empty( $block['attrs'] ) ) {
|
||||
$hover_link_color = _wp_array_get( $block['attrs'], array( 'style', 'elements', 'link', ':hover', 'color', 'text' ), null );
|
||||
}
|
||||
$skip_all_element_color_serialization = $element_color_properties['button']['skip'] &&
|
||||
$element_color_properties['link']['skip'] &&
|
||||
$element_color_properties['heading']['skip'];
|
||||
|
||||
/*
|
||||
* For now we only care about link colors.
|
||||
* This code in the future when we have a public API
|
||||
* should take advantage of WP_Theme_JSON::compute_style_properties
|
||||
* and work for any element and style.
|
||||
*/
|
||||
if ( null === $link_color && null === $hover_link_color ) {
|
||||
if ( $skip_all_element_color_serialization ) {
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
// Like the layout hook this assumes the hook only applies to blocks with a single wrapper.
|
||||
// Add the class name to the first element, presuming it's the wrapper, if it exists.
|
||||
$tags = new WP_HTML_Tag_Processor( $block_content );
|
||||
if ( $tags->next_tag() ) {
|
||||
$tags->add_class( wp_get_elements_class_name( $block ) );
|
||||
$elements_style_attributes = $block['attrs']['style']['elements'];
|
||||
|
||||
foreach ( $element_color_properties as $element_config ) {
|
||||
if ( $element_config['skip'] ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ( $element_config['paths'] as $path ) {
|
||||
if ( null !== _wp_array_get( $elements_style_attributes, $path, null ) ) {
|
||||
/*
|
||||
* It only takes a single custom attribute to require that the custom
|
||||
* class name be added to the block, so once one is found there's no
|
||||
* need to continue looking for others.
|
||||
*
|
||||
* As is done with the layout hook, this code assumes that the block
|
||||
* contains a single wrapper and that it's the first element in the
|
||||
* rendered output. That first element, if it exists, gets the class.
|
||||
*/
|
||||
$tags = new WP_HTML_Tag_Processor( $block_content );
|
||||
if ( $tags->next_tag() ) {
|
||||
$tags->add_class( wp_get_elements_class_name( $block ) );
|
||||
}
|
||||
|
||||
return $tags->get_updated_html();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $tags->get_updated_html();
|
||||
// If no custom attributes were found then there's nothing to modify.
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -90,33 +143,86 @@ function wp_render_elements_support_styles( $pre_render, $block ) {
|
||||
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
|
||||
$element_block_styles = isset( $block['attrs']['style']['elements'] ) ? $block['attrs']['style']['elements'] : null;
|
||||
|
||||
/*
|
||||
* For now we only care about link color.
|
||||
*/
|
||||
$skip_link_color_serialization = wp_should_skip_block_supports_serialization( $block_type, 'color', 'link' );
|
||||
|
||||
if ( $skip_link_color_serialization ) {
|
||||
if ( ! $element_block_styles ) {
|
||||
return null;
|
||||
}
|
||||
$class_name = wp_get_elements_class_name( $block );
|
||||
$link_block_styles = isset( $element_block_styles['link'] ) ? $element_block_styles['link'] : null;
|
||||
|
||||
wp_style_engine_get_styles(
|
||||
$link_block_styles,
|
||||
array(
|
||||
'selector' => ".$class_name a",
|
||||
'context' => 'block-supports',
|
||||
)
|
||||
$skip_link_color_serialization = wp_should_skip_block_supports_serialization( $block_type, 'color', 'link' );
|
||||
$skip_heading_color_serialization = wp_should_skip_block_supports_serialization( $block_type, 'color', 'heading' );
|
||||
$skip_button_color_serialization = wp_should_skip_block_supports_serialization( $block_type, 'color', 'button' );
|
||||
$skips_all_element_color_serialization = $skip_link_color_serialization &&
|
||||
$skip_heading_color_serialization &&
|
||||
$skip_button_color_serialization;
|
||||
|
||||
if ( $skips_all_element_color_serialization ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$class_name = wp_get_elements_class_name( $block );
|
||||
|
||||
$element_types = array(
|
||||
'button' => array(
|
||||
'selector' => ".$class_name .wp-element-button, .$class_name .wp-block-button__link",
|
||||
'skip' => $skip_button_color_serialization,
|
||||
),
|
||||
'link' => array(
|
||||
'selector' => ".$class_name a",
|
||||
'hover_selector' => ".$class_name a:hover",
|
||||
'skip' => $skip_link_color_serialization,
|
||||
),
|
||||
'heading' => array(
|
||||
'selector' => ".$class_name h1, .$class_name h2, .$class_name h3, .$class_name h4, .$class_name h5, .$class_name h6",
|
||||
'skip' => $skip_heading_color_serialization,
|
||||
'elements' => array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' ),
|
||||
),
|
||||
);
|
||||
|
||||
if ( isset( $link_block_styles[':hover'] ) ) {
|
||||
wp_style_engine_get_styles(
|
||||
$link_block_styles[':hover'],
|
||||
array(
|
||||
'selector' => ".$class_name a:hover",
|
||||
'context' => 'block-supports',
|
||||
)
|
||||
);
|
||||
foreach ( $element_types as $element_type => $element_config ) {
|
||||
if ( $element_config['skip'] ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$element_style_object = isset( $element_block_styles[ $element_type ] ) ? $element_block_styles[ $element_type ] : null;
|
||||
|
||||
// Process primary element type styles.
|
||||
if ( $element_style_object ) {
|
||||
wp_style_engine_get_styles(
|
||||
$element_style_object,
|
||||
array(
|
||||
'selector' => $element_config['selector'],
|
||||
'context' => 'block-supports',
|
||||
)
|
||||
);
|
||||
|
||||
if ( isset( $element_style_object[':hover'] ) ) {
|
||||
wp_style_engine_get_styles(
|
||||
$element_style_object[':hover'],
|
||||
array(
|
||||
'selector' => $element_config['hover_selector'],
|
||||
'context' => 'block-supports',
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Process related elements e.g. h1-h6 for headings.
|
||||
if ( isset( $element_config['elements'] ) ) {
|
||||
foreach ( $element_config['elements'] as $element ) {
|
||||
$element_style_object = isset( $element_block_styles[ $element ] )
|
||||
? $element_block_styles[ $element ]
|
||||
: null;
|
||||
|
||||
if ( $element_style_object ) {
|
||||
wp_style_engine_get_styles(
|
||||
$element_style_object,
|
||||
array(
|
||||
'selector' => ".$class_name $element",
|
||||
'context' => 'block-supports',
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
@@ -50,7 +50,7 @@ function wp_get_block_default_classname( $block_name ) {
|
||||
*/
|
||||
function wp_apply_generated_classname_support( $block_type ) {
|
||||
$attributes = array();
|
||||
$has_generated_classname_support = block_has_support( $block_type, array( 'className' ), true );
|
||||
$has_generated_classname_support = block_has_support( $block_type, 'className', true );
|
||||
if ( $has_generated_classname_support ) {
|
||||
$block_classname = wp_get_block_default_classname( $block_type->name );
|
||||
|
||||
|
||||
@@ -202,7 +202,7 @@ function wp_get_layout_definitions() {
|
||||
* @param WP_Block_Type $block_type Block Type.
|
||||
*/
|
||||
function wp_register_layout_support( $block_type ) {
|
||||
$support_layout = block_has_support( $block_type, array( 'layout' ), false ) || block_has_support( $block_type, array( '__experimentalLayout' ), false );
|
||||
$support_layout = block_has_support( $block_type, 'layout', false ) || block_has_support( $block_type, '__experimentalLayout', false );
|
||||
if ( $support_layout ) {
|
||||
if ( ! $block_type->attributes ) {
|
||||
$block_type->attributes = array();
|
||||
@@ -414,7 +414,10 @@ function wp_get_layout_style( $selector, $layout, $has_block_gap_support = false
|
||||
$gap_sides = is_array( $gap_value ) ? array( 'top', 'left' ) : array( 'top' );
|
||||
|
||||
foreach ( $gap_sides as $gap_side ) {
|
||||
$process_value = is_string( $gap_value ) ? $gap_value : _wp_array_get( $gap_value, array( $gap_side ), $fallback_gap_value );
|
||||
$process_value = $gap_value;
|
||||
if ( is_array( $gap_value ) ) {
|
||||
$process_value = isset( $gap_value[ $gap_side ] ) ? $gap_value[ $gap_side ] : $fallback_gap_value;
|
||||
}
|
||||
// Get spacing CSS variable from preset value if provided.
|
||||
if ( is_string( $process_value ) && str_contains( $process_value, 'var:preset|spacing|' ) ) {
|
||||
$index_to_splice = strrpos( $process_value, '|' ) + 1;
|
||||
@@ -495,7 +498,10 @@ function wp_get_layout_style( $selector, $layout, $has_block_gap_support = false
|
||||
$gap_sides = is_array( $gap_value ) ? array( 'top', 'left' ) : array( 'top' );
|
||||
|
||||
foreach ( $gap_sides as $gap_side ) {
|
||||
$process_value = is_string( $gap_value ) ? $gap_value : _wp_array_get( $gap_value, array( $gap_side ), $fallback_gap_value );
|
||||
$process_value = $gap_value;
|
||||
if ( is_array( $gap_value ) ) {
|
||||
$process_value = isset( $gap_value[ $gap_side ] ) ? $gap_value[ $gap_side ] : $fallback_gap_value;
|
||||
}
|
||||
// Get spacing CSS variable from preset value if provided.
|
||||
if ( is_string( $process_value ) && str_contains( $process_value, 'var:preset|spacing|' ) ) {
|
||||
$index_to_splice = strrpos( $process_value, '|' ) + 1;
|
||||
@@ -547,21 +553,22 @@ function wp_get_layout_style( $selector, $layout, $has_block_gap_support = false
|
||||
* @return string Filtered block content.
|
||||
*/
|
||||
function wp_render_layout_support_flag( $block_content, $block ) {
|
||||
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
|
||||
$support_layout = block_has_support( $block_type, array( 'layout' ), false ) || block_has_support( $block_type, array( '__experimentalLayout' ), false );
|
||||
$has_child_layout = isset( $block['attrs']['style']['layout']['selfStretch'] );
|
||||
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
|
||||
$block_supports_layout = block_has_support( $block_type, 'layout', false ) || block_has_support( $block_type, '__experimentalLayout', false );
|
||||
$layout_from_parent = isset( $block['attrs']['style']['layout']['selfStretch'] ) ? $block['attrs']['style']['layout']['selfStretch'] : null;
|
||||
|
||||
if ( ! $support_layout && ! $has_child_layout ) {
|
||||
if ( ! $block_supports_layout && ! $layout_from_parent ) {
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
$outer_class_names = array();
|
||||
|
||||
if ( $has_child_layout && ( 'fixed' === $block['attrs']['style']['layout']['selfStretch'] || 'fill' === $block['attrs']['style']['layout']['selfStretch'] ) ) {
|
||||
if ( 'fixed' === $layout_from_parent || 'fill' === $layout_from_parent ) {
|
||||
$container_content_class = wp_unique_id( 'wp-container-content-' );
|
||||
|
||||
$child_layout_styles = array();
|
||||
|
||||
if ( 'fixed' === $block['attrs']['style']['layout']['selfStretch'] && isset( $block['attrs']['style']['layout']['flexSize'] ) ) {
|
||||
if ( 'fixed' === $layout_from_parent && isset( $block['attrs']['style']['layout']['flexSize'] ) ) {
|
||||
$child_layout_styles[] = array(
|
||||
'selector' => ".$container_content_class",
|
||||
'declarations' => array(
|
||||
@@ -569,7 +576,7 @@ function wp_render_layout_support_flag( $block_content, $block ) {
|
||||
'box-sizing' => 'border-box',
|
||||
),
|
||||
);
|
||||
} elseif ( 'fill' === $block['attrs']['style']['layout']['selfStretch'] ) {
|
||||
} elseif ( 'fill' === $layout_from_parent ) {
|
||||
$child_layout_styles[] = array(
|
||||
'selector' => ".$container_content_class",
|
||||
'declarations' => array(
|
||||
@@ -589,29 +596,59 @@ function wp_render_layout_support_flag( $block_content, $block ) {
|
||||
$outer_class_names[] = $container_content_class;
|
||||
}
|
||||
|
||||
// Return early if only child layout exists.
|
||||
if ( ! $support_layout && ! empty( $outer_class_names ) ) {
|
||||
$content = new WP_HTML_Tag_Processor( $block_content );
|
||||
$content->next_tag();
|
||||
$content->add_class( implode( ' ', $outer_class_names ) );
|
||||
return (string) $content;
|
||||
// Prep the processor for modifying the block output.
|
||||
$processor = new WP_HTML_Tag_Processor( $block_content );
|
||||
|
||||
// Having no tags implies there are no tags onto which to add class names.
|
||||
if ( ! $processor->next_tag() ) {
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
/*
|
||||
* A block may not support layout but still be affected by a parent block's layout.
|
||||
*
|
||||
* In these cases add the appropriate class names and then return early; there's
|
||||
* no need to investigate on this block whether additional layout constraints apply.
|
||||
*/
|
||||
if ( ! $block_supports_layout && ! empty( $outer_class_names ) ) {
|
||||
foreach ( $outer_class_names as $class_name ) {
|
||||
$processor->add_class( $class_name );
|
||||
}
|
||||
return $processor->get_updated_html();
|
||||
}
|
||||
|
||||
$global_settings = wp_get_global_settings();
|
||||
$fallback_layout = ! empty( _wp_array_get( $block_type->supports, array( 'layout', 'default' ), array() ) ) ? _wp_array_get( $block_type->supports, array( 'layout', 'default' ), array() ) : _wp_array_get( $block_type->supports, array( '__experimentalLayout', 'default' ), array() );
|
||||
$used_layout = isset( $block['attrs']['layout'] ) ? $block['attrs']['layout'] : $fallback_layout;
|
||||
$fallback_layout = isset( $block_type->supports['layout']['default'] )
|
||||
? $block_type->supports['layout']['default']
|
||||
: array();
|
||||
if ( empty( $fallback_layout ) ) {
|
||||
$fallback_layout = isset( $block_type->supports['__experimentalLayout']['default'] )
|
||||
? $block_type->supports['__experimentalLayout']['default']
|
||||
: array();
|
||||
}
|
||||
$used_layout = isset( $block['attrs']['layout'] ) ? $block['attrs']['layout'] : $fallback_layout;
|
||||
|
||||
$class_names = array();
|
||||
$layout_definitions = wp_get_layout_definitions();
|
||||
$container_class = wp_unique_id( 'wp-container-' );
|
||||
$layout_classname = '';
|
||||
|
||||
/*
|
||||
* Uses an incremental ID that is independent per prefix to make sure that
|
||||
* rendering different numbers of blocks doesn't affect the IDs of other
|
||||
* blocks. Makes the CSS class names stable across paginations
|
||||
* for features like the enhanced pagination of the Query block.
|
||||
*/
|
||||
$container_class = wp_unique_prefixed_id(
|
||||
'wp-container-' . sanitize_title( $block['blockName'] ) . '-layout-'
|
||||
);
|
||||
|
||||
// Set the correct layout type for blocks using legacy content width.
|
||||
if ( isset( $used_layout['inherit'] ) && $used_layout['inherit'] || isset( $used_layout['contentSize'] ) && $used_layout['contentSize'] ) {
|
||||
$used_layout['type'] = 'constrained';
|
||||
}
|
||||
|
||||
$root_padding_aware_alignments = _wp_array_get( $global_settings, array( 'useRootPaddingAwareAlignments' ), false );
|
||||
$root_padding_aware_alignments = isset( $global_settings['useRootPaddingAwareAlignments'] )
|
||||
? $global_settings['useRootPaddingAwareAlignments']
|
||||
: false;
|
||||
|
||||
if (
|
||||
$root_padding_aware_alignments &&
|
||||
@@ -641,9 +678,13 @@ function wp_render_layout_support_flag( $block_content, $block ) {
|
||||
|
||||
// Get classname for layout type.
|
||||
if ( isset( $used_layout['type'] ) ) {
|
||||
$layout_classname = _wp_array_get( $layout_definitions, array( $used_layout['type'], 'className' ), '' );
|
||||
$layout_classname = isset( $layout_definitions[ $used_layout['type'] ]['className'] )
|
||||
? $layout_definitions[ $used_layout['type'] ]['className']
|
||||
: '';
|
||||
} else {
|
||||
$layout_classname = _wp_array_get( $layout_definitions, array( 'default', 'className' ), '' );
|
||||
$layout_classname = isset( $layout_definitions['default']['className'] )
|
||||
? $layout_definitions['default']['className']
|
||||
: '';
|
||||
}
|
||||
|
||||
if ( $layout_classname && is_string( $layout_classname ) ) {
|
||||
@@ -656,7 +697,9 @@ function wp_render_layout_support_flag( $block_content, $block ) {
|
||||
*/
|
||||
if ( ! current_theme_supports( 'disable-layout-styles' ) ) {
|
||||
|
||||
$gap_value = _wp_array_get( $block, array( 'attrs', 'style', 'spacing', 'blockGap' ) );
|
||||
$gap_value = isset( $block['attrs']['style']['spacing']['blockGap'] )
|
||||
? $block['attrs']['style']['spacing']['blockGap']
|
||||
: null;
|
||||
/*
|
||||
* Skip if gap value contains unsupported characters.
|
||||
* Regex for CSS value borrowed from `safecss_filter_attr`, and used here
|
||||
@@ -670,8 +713,12 @@ function wp_render_layout_support_flag( $block_content, $block ) {
|
||||
$gap_value = $gap_value && preg_match( '%[\\\(&=}]|/\*%', $gap_value ) ? null : $gap_value;
|
||||
}
|
||||
|
||||
$fallback_gap_value = _wp_array_get( $block_type->supports, array( 'spacing', 'blockGap', '__experimentalDefault' ), '0.5em' );
|
||||
$block_spacing = _wp_array_get( $block, array( 'attrs', 'style', 'spacing' ), null );
|
||||
$fallback_gap_value = isset( $block_type->supports['spacing']['blockGap']['__experimentalDefault'] )
|
||||
? $block_type->supports['spacing']['blockGap']['__experimentalDefault']
|
||||
: '0.5em';
|
||||
$block_spacing = isset( $block['attrs']['style']['spacing'] )
|
||||
? $block['attrs']['style']['spacing']
|
||||
: null;
|
||||
|
||||
/*
|
||||
* If a block's block.json skips serialization for spacing or spacing.blockGap,
|
||||
@@ -679,7 +726,9 @@ function wp_render_layout_support_flag( $block_content, $block ) {
|
||||
*/
|
||||
$should_skip_gap_serialization = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'blockGap' );
|
||||
|
||||
$block_gap = _wp_array_get( $global_settings, array( 'spacing', 'blockGap' ), null );
|
||||
$block_gap = isset( $global_settings['spacing']['blockGap'] )
|
||||
? $global_settings['spacing']['blockGap']
|
||||
: null;
|
||||
$has_block_gap_support = isset( $block_gap );
|
||||
|
||||
$style = wp_get_layout_style(
|
||||
@@ -702,49 +751,100 @@ function wp_render_layout_support_flag( $block_content, $block ) {
|
||||
$block_name = explode( '/', $block['blockName'] );
|
||||
$class_names[] = 'wp-block-' . end( $block_name ) . '-' . $layout_classname;
|
||||
|
||||
$content_with_outer_classnames = '';
|
||||
|
||||
// Add classes to the outermost HTML tag if necessary.
|
||||
if ( ! empty( $outer_class_names ) ) {
|
||||
$content_with_outer_classnames = new WP_HTML_Tag_Processor( $block_content );
|
||||
$content_with_outer_classnames->next_tag();
|
||||
foreach ( $outer_class_names as $outer_class_name ) {
|
||||
$content_with_outer_classnames->add_class( $outer_class_name );
|
||||
$processor->add_class( $outer_class_name );
|
||||
}
|
||||
|
||||
$content_with_outer_classnames = (string) $content_with_outer_classnames;
|
||||
}
|
||||
|
||||
/**
|
||||
* The first chunk of innerContent contains the block markup up until the inner blocks start.
|
||||
* This targets the opening tag of the inner blocks wrapper, which is the last tag in that chunk.
|
||||
*/
|
||||
$inner_content_classnames = '';
|
||||
|
||||
if ( isset( $block['innerContent'][0] ) && 'string' === gettype( $block['innerContent'][0] ) && count( $block['innerContent'] ) > 1 ) {
|
||||
$tags = new WP_HTML_Tag_Processor( $block['innerContent'][0] );
|
||||
$last_classnames = '';
|
||||
while ( $tags->next_tag() ) {
|
||||
$last_classnames = $tags->get_attribute( 'class' );
|
||||
}
|
||||
|
||||
$inner_content_classnames = (string) $last_classnames;
|
||||
}
|
||||
|
||||
$content = $content_with_outer_classnames ? new WP_HTML_Tag_Processor( $content_with_outer_classnames ) : new WP_HTML_Tag_Processor( $block_content );
|
||||
|
||||
if ( $inner_content_classnames ) {
|
||||
$content->next_tag( array( 'class_name' => $inner_content_classnames ) );
|
||||
foreach ( $class_names as $class_name ) {
|
||||
$content->add_class( $class_name );
|
||||
}
|
||||
} else {
|
||||
$content->next_tag();
|
||||
foreach ( $class_names as $class_name ) {
|
||||
$content->add_class( $class_name );
|
||||
* Attempts to refer to the inner-block wrapping element by its class attribute.
|
||||
*
|
||||
* When examining a block's inner content, if a block has inner blocks, then
|
||||
* the first content item will likely be a text (HTML) chunk immediately
|
||||
* preceding the inner blocks. The last HTML tag in that chunk would then be
|
||||
* an opening tag for an element that wraps the inner blocks.
|
||||
*
|
||||
* There's no reliable way to associate this wrapper in $block_content because
|
||||
* it may have changed during the rendering pipeline (as inner contents is
|
||||
* provided before rendering) and through previous filters. In many cases,
|
||||
* however, the `class` attribute will be a good-enough identifier, so this
|
||||
* code finds the last tag in that chunk and stores the `class` attribute
|
||||
* so that it can be used later when working through the rendered block output
|
||||
* to identify the wrapping element and add the remaining class names to it.
|
||||
*
|
||||
* It's also possible that no inner block wrapper even exists. If that's the
|
||||
* case this code could apply the class names to an invalid element.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* $block['innerBlocks'] = array( $list_item );
|
||||
* $block['innerContent'] = array( '<ul class="list-wrapper is-unordered">', null, '</ul>' );
|
||||
*
|
||||
* // After rendering, the initial contents may have been modified by other renderers or filters.
|
||||
* $block_content = <<<HTML
|
||||
* <figure>
|
||||
* <ul class="annotated-list list-wrapper is-unordered">
|
||||
* <li>Code</li>
|
||||
* </ul><figcaption>It's a list!</figcaption>
|
||||
* </figure>
|
||||
* HTML;
|
||||
*
|
||||
* Although it is possible that the original block-wrapper classes are changed in $block_content
|
||||
* from how they appear in $block['innerContent'], it's likely that the original class attributes
|
||||
* are still present in the wrapper as they are in this example. Frequently, additional classes
|
||||
* will also be present; rarely should classes be removed.
|
||||
*
|
||||
* @TODO: Find a better way to match the first inner block. If it's possible to identify where the
|
||||
* first inner block starts, then it will be possible to find the last tag before it starts
|
||||
* and then that tag, if an opening tag, can be solidly identified as a wrapping element.
|
||||
* Can some unique value or class or ID be added to the inner blocks when they process
|
||||
* so that they can be extracted here safely without guessing? Can the block rendering function
|
||||
* return information about where the rendered inner blocks start?
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
$inner_block_wrapper_classes = null;
|
||||
$first_chunk = isset( $block['innerContent'][0] ) ? $block['innerContent'][0] : null;
|
||||
if ( is_string( $first_chunk ) && count( $block['innerContent'] ) > 1 ) {
|
||||
$first_chunk_processor = new WP_HTML_Tag_Processor( $first_chunk );
|
||||
while ( $first_chunk_processor->next_tag() ) {
|
||||
$class_attribute = $first_chunk_processor->get_attribute( 'class' );
|
||||
if ( is_string( $class_attribute ) && ! empty( $class_attribute ) ) {
|
||||
$inner_block_wrapper_classes = $class_attribute;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (string) $content;
|
||||
/*
|
||||
* If necessary, advance to what is likely to be an inner block wrapper tag.
|
||||
*
|
||||
* This advances until it finds the first tag containing the original class
|
||||
* attribute from above. If none is found it will scan to the end of the block
|
||||
* and fail to add any class names.
|
||||
*
|
||||
* If there is no block wrapper it won't advance at all, in which case the
|
||||
* class names will be added to the first and outermost tag of the block.
|
||||
* For cases where this outermost tag is the only tag surrounding inner
|
||||
* blocks then the outer wrapper and inner wrapper are the same.
|
||||
*/
|
||||
do {
|
||||
if ( ! $inner_block_wrapper_classes ) {
|
||||
break;
|
||||
}
|
||||
|
||||
if ( false !== strpos( $processor->get_attribute( 'class' ), $inner_block_wrapper_classes ) ) {
|
||||
break;
|
||||
}
|
||||
} while ( $processor->next_tag() );
|
||||
|
||||
// Add the remaining class names.
|
||||
foreach ( $class_names as $class_name ) {
|
||||
$processor->add_class( $class_name );
|
||||
}
|
||||
|
||||
return $processor->get_updated_html();
|
||||
}
|
||||
|
||||
// Register the block support.
|
||||
@@ -789,7 +889,7 @@ function wp_restore_group_inner_container( $block_content, $block ) {
|
||||
);
|
||||
$updated_content = preg_replace_callback(
|
||||
$replace_regex,
|
||||
static function( $matches ) {
|
||||
static function ( $matches ) {
|
||||
return $matches[1] . '<div class="wp-block-group__inner-container">' . $matches[2] . '</div>' . $matches[3];
|
||||
},
|
||||
$block_content
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* @param WP_Block_Type $block_type Block Type.
|
||||
*/
|
||||
function wp_register_position_support( $block_type ) {
|
||||
$has_position_support = block_has_support( $block_type, array( 'position' ), false );
|
||||
$has_position_support = block_has_support( $block_type, 'position', false );
|
||||
|
||||
// Set up attributes and styles within that if needed.
|
||||
if ( ! $block_type->attributes ) {
|
||||
@@ -41,7 +41,7 @@ function wp_register_position_support( $block_type ) {
|
||||
*/
|
||||
function wp_render_position_support( $block_content, $block ) {
|
||||
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
|
||||
$has_position_support = block_has_support( $block_type, array( 'position' ), false );
|
||||
$has_position_support = block_has_support( $block_type, 'position', false );
|
||||
|
||||
if (
|
||||
! $has_position_support ||
|
||||
@@ -51,8 +51,8 @@ function wp_render_position_support( $block_content, $block ) {
|
||||
}
|
||||
|
||||
$global_settings = wp_get_global_settings();
|
||||
$theme_has_sticky_support = _wp_array_get( $global_settings, array( 'position', 'sticky' ), false );
|
||||
$theme_has_fixed_support = _wp_array_get( $global_settings, array( 'position', 'fixed' ), false );
|
||||
$theme_has_sticky_support = isset( $global_settings['position']['sticky'] ) ? $global_settings['position']['sticky'] : false;
|
||||
$theme_has_fixed_support = isset( $global_settings['position']['fixed'] ) ? $global_settings['position']['fixed'] : false;
|
||||
|
||||
// Only allow output for position types that the theme supports.
|
||||
$allowed_position_types = array();
|
||||
@@ -63,11 +63,11 @@ function wp_render_position_support( $block_content, $block ) {
|
||||
$allowed_position_types[] = 'fixed';
|
||||
}
|
||||
|
||||
$style_attribute = _wp_array_get( $block, array( 'attrs', 'style' ), null );
|
||||
$style_attribute = isset( $block['attrs']['style'] ) ? $block['attrs']['style'] : null;
|
||||
$class_name = wp_unique_id( 'wp-container-' );
|
||||
$selector = ".$class_name";
|
||||
$position_styles = array();
|
||||
$position_type = _wp_array_get( $style_attribute, array( 'position', 'type' ), '' );
|
||||
$position_type = isset( $style_attribute['position']['type'] ) ? $style_attribute['position']['type'] : '';
|
||||
$wrapper_classes = array();
|
||||
|
||||
if (
|
||||
@@ -78,7 +78,7 @@ function wp_render_position_support( $block_content, $block ) {
|
||||
$sides = array( 'top', 'right', 'bottom', 'left' );
|
||||
|
||||
foreach ( $sides as $side ) {
|
||||
$side_value = _wp_array_get( $style_attribute, array( 'position', $side ) );
|
||||
$side_value = isset( $style_attribute['position'][ $side ] ) ? $style_attribute['position'][ $side ] : null;
|
||||
if ( null !== $side_value ) {
|
||||
/*
|
||||
* For fixed or sticky top positions,
|
||||
|
||||
@@ -40,12 +40,12 @@ function _wp_add_block_level_presets_class( $block_content, $block ) {
|
||||
|
||||
// return early if the block doesn't have support for settings.
|
||||
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
|
||||
if ( ! block_has_support( $block_type, array( '__experimentalSettings' ), false ) ) {
|
||||
if ( ! block_has_support( $block_type, '__experimentalSettings', false ) ) {
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
// return early if no settings are found on the block attributes.
|
||||
$block_settings = _wp_array_get( $block, array( 'attrs', 'settings' ), null );
|
||||
$block_settings = isset( $block['attrs']['settings'] ) ? $block['attrs']['settings'] : null;
|
||||
if ( empty( $block_settings ) ) {
|
||||
return $block_content;
|
||||
}
|
||||
@@ -77,12 +77,12 @@ function _wp_add_block_level_presets_class( $block_content, $block ) {
|
||||
function _wp_add_block_level_preset_styles( $pre_render, $block ) {
|
||||
// Return early if the block has not support for descendent block styles.
|
||||
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
|
||||
if ( ! block_has_support( $block_type, array( '__experimentalSettings' ), false ) ) {
|
||||
if ( ! block_has_support( $block_type, '__experimentalSettings', false ) ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// return early if no settings are found on the block attributes.
|
||||
$block_settings = _wp_array_get( $block, array( 'attrs', 'settings' ), null );
|
||||
$block_settings = isset( $block['attrs']['settings'] ) ? $block['attrs']['settings'] : null;
|
||||
if ( empty( $block_settings ) ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* @param WP_Block_Type $block_type Block Type.
|
||||
*/
|
||||
function wp_register_shadow_support( $block_type ) {
|
||||
$has_shadow_support = block_has_support( $block_type, array( 'shadow' ), false );
|
||||
$has_shadow_support = block_has_support( $block_type, 'shadow', false );
|
||||
|
||||
if ( ! $has_shadow_support ) {
|
||||
return;
|
||||
@@ -50,7 +50,7 @@ function wp_register_shadow_support( $block_type ) {
|
||||
* @return array Shadow CSS classes and inline styles.
|
||||
*/
|
||||
function wp_apply_shadow_support( $block_type, $block_attributes ) {
|
||||
$has_shadow_support = block_has_support( $block_type, array( 'shadow' ), false );
|
||||
$has_shadow_support = block_has_support( $block_type, 'shadow', false );
|
||||
|
||||
if ( ! $has_shadow_support ) {
|
||||
return array();
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
* @param WP_Block_Type $block_type Block Type.
|
||||
*/
|
||||
function wp_register_spacing_support( $block_type ) {
|
||||
$has_spacing_support = block_has_support( $block_type, array( 'spacing' ), false );
|
||||
$has_spacing_support = block_has_support( $block_type, 'spacing', false );
|
||||
|
||||
// Setup attributes and styles within that if needed.
|
||||
if ( ! $block_type->attributes ) {
|
||||
@@ -58,12 +58,19 @@ function wp_apply_spacing_support( $block_type, $block_attributes ) {
|
||||
return $attributes;
|
||||
}
|
||||
|
||||
$skip_padding = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'padding' );
|
||||
$skip_margin = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'margin' );
|
||||
$spacing_block_styles = array();
|
||||
$spacing_block_styles['padding'] = $has_padding_support && ! $skip_padding ? _wp_array_get( $block_styles, array( 'spacing', 'padding' ), null ) : null;
|
||||
$spacing_block_styles['margin'] = $has_margin_support && ! $skip_margin ? _wp_array_get( $block_styles, array( 'spacing', 'margin' ), null ) : null;
|
||||
$styles = wp_style_engine_get_styles( array( 'spacing' => $spacing_block_styles ) );
|
||||
$skip_padding = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'padding' );
|
||||
$skip_margin = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'margin' );
|
||||
$spacing_block_styles = array(
|
||||
'padding' => null,
|
||||
'margin' => null,
|
||||
);
|
||||
if ( $has_padding_support && ! $skip_padding ) {
|
||||
$spacing_block_styles['padding'] = isset( $block_styles['spacing']['padding'] ) ? $block_styles['spacing']['padding'] : null;
|
||||
}
|
||||
if ( $has_margin_support && ! $skip_margin ) {
|
||||
$spacing_block_styles['margin'] = isset( $block_styles['spacing']['margin'] ) ? $block_styles['spacing']['margin'] : null;
|
||||
}
|
||||
$styles = wp_style_engine_get_styles( array( 'spacing' => $spacing_block_styles ) );
|
||||
|
||||
if ( ! empty( $styles['css'] ) ) {
|
||||
$attributes['style'] = $styles['css'];
|
||||
|
||||
@@ -16,24 +16,25 @@
|
||||
* @param WP_Block_Type $block_type Block Type.
|
||||
*/
|
||||
function wp_register_typography_support( $block_type ) {
|
||||
if ( ! property_exists( $block_type, 'supports' ) ) {
|
||||
if ( ! ( $block_type instanceof WP_Block_Type ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$typography_supports = _wp_array_get( $block_type->supports, array( 'typography' ), false );
|
||||
$typography_supports = isset( $block_type->supports['typography'] ) ? $block_type->supports['typography'] : false;
|
||||
if ( ! $typography_supports ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$has_font_family_support = _wp_array_get( $typography_supports, array( '__experimentalFontFamily' ), false );
|
||||
$has_font_size_support = _wp_array_get( $typography_supports, array( 'fontSize' ), false );
|
||||
$has_font_style_support = _wp_array_get( $typography_supports, array( '__experimentalFontStyle' ), false );
|
||||
$has_font_weight_support = _wp_array_get( $typography_supports, array( '__experimentalFontWeight' ), false );
|
||||
$has_letter_spacing_support = _wp_array_get( $typography_supports, array( '__experimentalLetterSpacing' ), false );
|
||||
$has_line_height_support = _wp_array_get( $typography_supports, array( 'lineHeight' ), false );
|
||||
$has_text_columns_support = _wp_array_get( $typography_supports, array( 'textColumns' ), false );
|
||||
$has_text_decoration_support = _wp_array_get( $typography_supports, array( '__experimentalTextDecoration' ), false );
|
||||
$has_text_transform_support = _wp_array_get( $typography_supports, array( '__experimentalTextTransform' ), false );
|
||||
$has_font_family_support = isset( $typography_supports['__experimentalFontFamily'] ) ? $typography_supports['__experimentalFontFamily'] : false;
|
||||
$has_font_size_support = isset( $typography_supports['fontSize'] ) ? $typography_supports['fontSize'] : false;
|
||||
$has_font_style_support = isset( $typography_supports['__experimentalFontStyle'] ) ? $typography_supports['__experimentalFontStyle'] : false;
|
||||
$has_font_weight_support = isset( $typography_supports['__experimentalFontWeight'] ) ? $typography_supports['__experimentalFontWeight'] : false;
|
||||
$has_letter_spacing_support = isset( $typography_supports['__experimentalLetterSpacing'] ) ? $typography_supports['__experimentalLetterSpacing'] : false;
|
||||
$has_line_height_support = isset( $typography_supports['lineHeight'] ) ? $typography_supports['lineHeight'] : false;
|
||||
$has_text_columns_support = isset( $typography_supports['textColumns'] ) ? $typography_supports['textColumns'] : false;
|
||||
$has_text_decoration_support = isset( $typography_supports['__experimentalTextDecoration'] ) ? $typography_supports['__experimentalTextDecoration'] : false;
|
||||
$has_text_transform_support = isset( $typography_supports['__experimentalTextTransform'] ) ? $typography_supports['__experimentalTextTransform'] : false;
|
||||
$has_writing_mode_support = isset( $typography_supports['__experimentalWritingMode'] ) ? $typography_supports['__experimentalWritingMode'] : false;
|
||||
|
||||
$has_typography_support = $has_font_family_support
|
||||
|| $has_font_size_support
|
||||
@@ -43,7 +44,8 @@ function wp_register_typography_support( $block_type ) {
|
||||
|| $has_line_height_support
|
||||
|| $has_text_columns_support
|
||||
|| $has_text_decoration_support
|
||||
|| $has_text_transform_support;
|
||||
|| $has_text_transform_support
|
||||
|| $has_writing_mode_support;
|
||||
|
||||
if ( ! $block_type->attributes ) {
|
||||
$block_type->attributes = array();
|
||||
@@ -83,11 +85,13 @@ function wp_register_typography_support( $block_type ) {
|
||||
* @return array Typography CSS classes and inline styles.
|
||||
*/
|
||||
function wp_apply_typography_support( $block_type, $block_attributes ) {
|
||||
if ( ! property_exists( $block_type, 'supports' ) ) {
|
||||
if ( ! ( $block_type instanceof WP_Block_Type ) ) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$typography_supports = _wp_array_get( $block_type->supports, array( 'typography' ), false );
|
||||
$typography_supports = isset( $block_type->supports['typography'] )
|
||||
? $block_type->supports['typography']
|
||||
: false;
|
||||
if ( ! $typography_supports ) {
|
||||
return array();
|
||||
}
|
||||
@@ -96,15 +100,16 @@ function wp_apply_typography_support( $block_type, $block_attributes ) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$has_font_family_support = _wp_array_get( $typography_supports, array( '__experimentalFontFamily' ), false );
|
||||
$has_font_size_support = _wp_array_get( $typography_supports, array( 'fontSize' ), false );
|
||||
$has_font_style_support = _wp_array_get( $typography_supports, array( '__experimentalFontStyle' ), false );
|
||||
$has_font_weight_support = _wp_array_get( $typography_supports, array( '__experimentalFontWeight' ), false );
|
||||
$has_letter_spacing_support = _wp_array_get( $typography_supports, array( '__experimentalLetterSpacing' ), false );
|
||||
$has_line_height_support = _wp_array_get( $typography_supports, array( 'lineHeight' ), false );
|
||||
$has_text_columns_support = _wp_array_get( $typography_supports, array( 'textColumns' ), false );
|
||||
$has_text_decoration_support = _wp_array_get( $typography_supports, array( '__experimentalTextDecoration' ), false );
|
||||
$has_text_transform_support = _wp_array_get( $typography_supports, array( '__experimentalTextTransform' ), false );
|
||||
$has_font_family_support = isset( $typography_supports['__experimentalFontFamily'] ) ? $typography_supports['__experimentalFontFamily'] : false;
|
||||
$has_font_size_support = isset( $typography_supports['fontSize'] ) ? $typography_supports['fontSize'] : false;
|
||||
$has_font_style_support = isset( $typography_supports['__experimentalFontStyle'] ) ? $typography_supports['__experimentalFontStyle'] : false;
|
||||
$has_font_weight_support = isset( $typography_supports['__experimentalFontWeight'] ) ? $typography_supports['__experimentalFontWeight'] : false;
|
||||
$has_letter_spacing_support = isset( $typography_supports['__experimentalLetterSpacing'] ) ? $typography_supports['__experimentalLetterSpacing'] : false;
|
||||
$has_line_height_support = isset( $typography_supports['lineHeight'] ) ? $typography_supports['lineHeight'] : false;
|
||||
$has_text_columns_support = isset( $typography_supports['textColumns'] ) ? $typography_supports['textColumns'] : false;
|
||||
$has_text_decoration_support = isset( $typography_supports['__experimentalTextDecoration'] ) ? $typography_supports['__experimentalTextDecoration'] : false;
|
||||
$has_text_transform_support = isset( $typography_supports['__experimentalTextTransform'] ) ? $typography_supports['__experimentalTextTransform'] : false;
|
||||
$has_writing_mode_support = isset( $typography_supports['__experimentalWritingMode'] ) ? $typography_supports['__experimentalWritingMode'] : false;
|
||||
|
||||
// Whether to skip individual block support features.
|
||||
$should_skip_font_size = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'fontSize' );
|
||||
@@ -116,6 +121,7 @@ function wp_apply_typography_support( $block_type, $block_attributes ) {
|
||||
$should_skip_text_decoration = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'textDecoration' );
|
||||
$should_skip_text_transform = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'textTransform' );
|
||||
$should_skip_letter_spacing = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'letterSpacing' );
|
||||
$should_skip_writing_mode = wp_should_skip_block_supports_serialization( $block_type, 'typography', 'writingMode' );
|
||||
|
||||
$typography_block_styles = array();
|
||||
if ( $has_font_size_support && ! $should_skip_font_size ) {
|
||||
@@ -165,11 +171,15 @@ function wp_apply_typography_support( $block_type, $block_attributes ) {
|
||||
}
|
||||
|
||||
if ( $has_line_height_support && ! $should_skip_line_height ) {
|
||||
$typography_block_styles['lineHeight'] = _wp_array_get( $block_attributes, array( 'style', 'typography', 'lineHeight' ) );
|
||||
$typography_block_styles['lineHeight'] = isset( $block_attributes['style']['typography']['lineHeight'] )
|
||||
? $block_attributes['style']['typography']['lineHeight']
|
||||
: null;
|
||||
}
|
||||
|
||||
if ( $has_text_columns_support && ! $should_skip_text_columns && isset( $block_attributes['style']['typography']['textColumns'] ) ) {
|
||||
$typography_block_styles['textColumns'] = _wp_array_get( $block_attributes, array( 'style', 'typography', 'textColumns' ), null );
|
||||
$typography_block_styles['textColumns'] = isset( $block_attributes['style']['typography']['textColumns'] )
|
||||
? $block_attributes['style']['typography']['textColumns']
|
||||
: null;
|
||||
}
|
||||
|
||||
if (
|
||||
@@ -205,6 +215,15 @@ function wp_apply_typography_support( $block_type, $block_attributes ) {
|
||||
);
|
||||
}
|
||||
|
||||
if ( $has_writing_mode_support &&
|
||||
! $should_skip_writing_mode &&
|
||||
isset( $block_attributes['style']['typography']['writingMode'] )
|
||||
) {
|
||||
$typography_block_styles['writingMode'] = isset( $block_attributes['style']['typography']['writingMode'] )
|
||||
? $block_attributes['style']['typography']['writingMode']
|
||||
: null;
|
||||
}
|
||||
|
||||
$attributes = array();
|
||||
$styles = wp_style_engine_get_styles(
|
||||
array( 'typography' => $typography_block_styles ),
|
||||
@@ -471,6 +490,7 @@ function wp_get_computed_fluid_typography_value( $args = array() ) {
|
||||
* @since 6.1.1 Adjusted rules for min and max font sizes.
|
||||
* @since 6.2.0 Added 'settings.typography.fluid.minFontSize' support.
|
||||
* @since 6.3.0 Using layout.wideSize as max viewport width, and logarithmic scale factor to calculate minimum font scale.
|
||||
* @since 6.4.0 Added configurable min and max viewport width values to the typography.fluid theme.json schema.
|
||||
*
|
||||
* @param array $preset {
|
||||
* Required. fontSizes preset value as seen in theme.json.
|
||||
@@ -517,14 +537,21 @@ function wp_get_typography_font_size_value( $preset, $should_use_fluid_typograph
|
||||
: array();
|
||||
|
||||
// Defaults.
|
||||
$default_maximum_viewport_width = isset( $layout_settings['wideSize'] ) ? $layout_settings['wideSize'] : '1600px';
|
||||
$default_maximum_viewport_width = '1600px';
|
||||
$default_minimum_viewport_width = '320px';
|
||||
$default_minimum_font_size_factor_max = 0.75;
|
||||
$default_minimum_font_size_factor_min = 0.25;
|
||||
$default_scale_factor = 1;
|
||||
$has_min_font_size = isset( $fluid_settings['minFontSize'] ) &&
|
||||
! empty( wp_get_typography_value_and_unit( $fluid_settings['minFontSize'] ) );
|
||||
$default_minimum_font_size_limit = $has_min_font_size ? $fluid_settings['minFontSize'] : '14px';
|
||||
$default_minimum_font_size_limit = '14px';
|
||||
|
||||
// Defaults overrides.
|
||||
$minimum_viewport_width = isset( $fluid_settings['minViewportWidth'] ) ? $fluid_settings['minViewportWidth'] : $default_minimum_viewport_width;
|
||||
$maximum_viewport_width = isset( $layout_settings['wideSize'] ) && ! empty( wp_get_typography_value_and_unit( $layout_settings['wideSize'] ) ) ? $layout_settings['wideSize'] : $default_maximum_viewport_width;
|
||||
if ( isset( $fluid_settings['maxViewportWidth'] ) ) {
|
||||
$maximum_viewport_width = $fluid_settings['maxViewportWidth'];
|
||||
}
|
||||
$has_min_font_size = isset( $fluid_settings['minFontSize'] ) && ! empty( wp_get_typography_value_and_unit( $fluid_settings['minFontSize'] ) );
|
||||
$minimum_font_size_limit = $has_min_font_size ? $fluid_settings['minFontSize'] : $default_minimum_font_size_limit;
|
||||
|
||||
// Font sizes.
|
||||
$fluid_font_size_settings = isset( $preset['fluid'] ) ? $preset['fluid'] : null;
|
||||
@@ -551,7 +578,7 @@ function wp_get_typography_font_size_value( $preset, $should_use_fluid_typograph
|
||||
* in order to perform comparative checks.
|
||||
*/
|
||||
$minimum_font_size_limit = wp_get_typography_value_and_unit(
|
||||
$default_minimum_font_size_limit,
|
||||
$minimum_font_size_limit,
|
||||
array(
|
||||
'coerce_to' => $preferred_size['unit'],
|
||||
)
|
||||
@@ -600,8 +627,8 @@ function wp_get_typography_font_size_value( $preset, $should_use_fluid_typograph
|
||||
|
||||
$fluid_font_size_value = wp_get_computed_fluid_typography_value(
|
||||
array(
|
||||
'minimum_viewport_width' => $default_minimum_viewport_width,
|
||||
'maximum_viewport_width' => $default_maximum_viewport_width,
|
||||
'minimum_viewport_width' => $minimum_viewport_width,
|
||||
'maximum_viewport_width' => $maximum_viewport_width,
|
||||
'minimum_font_size' => $minimum_font_size_raw,
|
||||
'maximum_font_size' => $maximum_font_size_raw,
|
||||
'scale_factor' => $default_scale_factor,
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
* @param string $feature_set Name of block support feature set..
|
||||
* @param string $feature Optional name of individual feature to check.
|
||||
*
|
||||
* @return boolean Whether to serialize block support styles & classes.
|
||||
* @return bool Whether to serialize block support styles & classes.
|
||||
*/
|
||||
function wp_should_skip_block_supports_serialization( $block_type, $feature_set, $feature = null ) {
|
||||
if ( ! is_object( $block_type ) || ! $feature_set ) {
|
||||
|
||||
@@ -37,21 +37,15 @@ if ( ! defined( 'WP_TEMPLATE_PART_AREA_UNCATEGORIZED' ) ) {
|
||||
* }
|
||||
*/
|
||||
function get_block_theme_folders( $theme_stylesheet = null ) {
|
||||
$theme_name = null === $theme_stylesheet ? get_stylesheet() : $theme_stylesheet;
|
||||
$root_dir = get_theme_root( $theme_name );
|
||||
$theme_dir = "$root_dir/$theme_name";
|
||||
|
||||
if ( file_exists( $theme_dir . '/block-templates' ) || file_exists( $theme_dir . '/block-template-parts' ) ) {
|
||||
$theme = wp_get_theme( (string) $theme_stylesheet );
|
||||
if ( ! $theme->exists() ) {
|
||||
// Return the default folders if the theme doesn't exist.
|
||||
return array(
|
||||
'wp_template' => 'block-templates',
|
||||
'wp_template_part' => 'block-template-parts',
|
||||
'wp_template' => 'templates',
|
||||
'wp_template_part' => 'parts',
|
||||
);
|
||||
}
|
||||
|
||||
return array(
|
||||
'wp_template' => 'templates',
|
||||
'wp_template_part' => 'parts',
|
||||
);
|
||||
return $theme->get_block_template_folders();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -308,10 +302,10 @@ function _get_block_template_file( $template_type, $slug ) {
|
||||
* @param array $query {
|
||||
* Arguments to retrieve templates. Optional, empty by default.
|
||||
*
|
||||
* @type array $slug__in List of slugs to include.
|
||||
* @type array $slug__not_in List of slugs to skip.
|
||||
* @type string $area A 'wp_template_part_area' taxonomy value to filter by (for 'wp_template_part' template type only).
|
||||
* @type string $post_type Post type to get the templates for.
|
||||
* @type string[] $slug__in List of slugs to include.
|
||||
* @type string[] $slug__not_in List of slugs to skip.
|
||||
* @type string $area A 'wp_template_part_area' taxonomy value to filter by (for 'wp_template_part' template type only).
|
||||
* @type string $post_type Post type to get the templates for.
|
||||
* }
|
||||
*
|
||||
* @return array Template
|
||||
@@ -411,7 +405,7 @@ function _add_block_template_info( $template_item ) {
|
||||
return $template_item;
|
||||
}
|
||||
|
||||
$theme_data = WP_Theme_JSON_Resolver::get_theme_data( array(), array( 'with_supports' => false ) )->get_custom_templates();
|
||||
$theme_data = wp_get_theme_data_custom_templates();
|
||||
if ( isset( $theme_data[ $template_item['slug'] ] ) ) {
|
||||
$template_item['title'] = $theme_data[ $template_item['slug'] ]['title'];
|
||||
$template_item['postTypes'] = $theme_data[ $template_item['slug'] ]['postTypes'];
|
||||
@@ -431,7 +425,7 @@ function _add_block_template_info( $template_item ) {
|
||||
*/
|
||||
function _add_block_template_part_area_info( $template_info ) {
|
||||
if ( wp_theme_has_theme_json() ) {
|
||||
$theme_data = WP_Theme_JSON_Resolver::get_theme_data( array(), array( 'with_supports' => false ) )->get_template_parts();
|
||||
$theme_data = wp_get_theme_data_template_parts();
|
||||
}
|
||||
|
||||
if ( isset( $theme_data[ $template_info['slug'] ]['area'] ) ) {
|
||||
@@ -477,73 +471,38 @@ function _flatten_blocks( &$blocks ) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses wp_template content and injects the active theme's
|
||||
* stylesheet as a theme attribute into each wp_template_part
|
||||
* Injects the active theme's stylesheet as a `theme` attribute
|
||||
* into a given template part block.
|
||||
*
|
||||
* @since 5.9.0
|
||||
* @since 6.4.0
|
||||
* @access private
|
||||
*
|
||||
* @param string $template_content serialized wp_template content.
|
||||
* @return string Updated 'wp_template' content.
|
||||
* @param array $block a parsed block.
|
||||
*/
|
||||
function _inject_theme_attribute_in_block_template_content( $template_content ) {
|
||||
$has_updated_content = false;
|
||||
$new_content = '';
|
||||
$template_blocks = parse_blocks( $template_content );
|
||||
|
||||
$blocks = _flatten_blocks( $template_blocks );
|
||||
foreach ( $blocks as &$block ) {
|
||||
if (
|
||||
'core/template-part' === $block['blockName'] &&
|
||||
! isset( $block['attrs']['theme'] )
|
||||
) {
|
||||
$block['attrs']['theme'] = get_stylesheet();
|
||||
$has_updated_content = true;
|
||||
}
|
||||
function _inject_theme_attribute_in_template_part_block( &$block ) {
|
||||
if (
|
||||
'core/template-part' === $block['blockName'] &&
|
||||
! isset( $block['attrs']['theme'] )
|
||||
) {
|
||||
$block['attrs']['theme'] = get_stylesheet();
|
||||
}
|
||||
|
||||
if ( $has_updated_content ) {
|
||||
foreach ( $template_blocks as &$block ) {
|
||||
$new_content .= serialize_block( $block );
|
||||
}
|
||||
|
||||
return $new_content;
|
||||
}
|
||||
|
||||
return $template_content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a block template and removes the theme attribute from each template part.
|
||||
* Removes the `theme` attribute from a given template part block.
|
||||
*
|
||||
* @since 5.9.0
|
||||
* @since 6.4.0
|
||||
* @access private
|
||||
*
|
||||
* @param string $template_content Serialized block template content.
|
||||
* @return string Updated block template content.
|
||||
* @param array $block a parsed block.
|
||||
*/
|
||||
function _remove_theme_attribute_in_block_template_content( $template_content ) {
|
||||
$has_updated_content = false;
|
||||
$new_content = '';
|
||||
$template_blocks = parse_blocks( $template_content );
|
||||
|
||||
$blocks = _flatten_blocks( $template_blocks );
|
||||
foreach ( $blocks as $key => $block ) {
|
||||
if ( 'core/template-part' === $block['blockName'] && isset( $block['attrs']['theme'] ) ) {
|
||||
unset( $blocks[ $key ]['attrs']['theme'] );
|
||||
$has_updated_content = true;
|
||||
}
|
||||
function _remove_theme_attribute_from_template_part_block( &$block ) {
|
||||
if (
|
||||
'core/template-part' === $block['blockName'] &&
|
||||
isset( $block['attrs']['theme'] )
|
||||
) {
|
||||
unset( $block['attrs']['theme'] );
|
||||
}
|
||||
|
||||
if ( ! $has_updated_content ) {
|
||||
return $template_content;
|
||||
}
|
||||
|
||||
foreach ( $template_blocks as $block ) {
|
||||
$new_content .= serialize_block( $block );
|
||||
}
|
||||
|
||||
return $new_content;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -565,7 +524,6 @@ function _build_block_template_result_from_file( $template_file, $template_type
|
||||
$template = new WP_Block_Template();
|
||||
$template->id = $theme . '//' . $template_file['slug'];
|
||||
$template->theme = $theme;
|
||||
$template->content = _inject_theme_attribute_in_block_template_content( $template_content );
|
||||
$template->slug = $template_file['slug'];
|
||||
$template->source = 'theme';
|
||||
$template->type = $template_type;
|
||||
@@ -589,6 +547,16 @@ function _build_block_template_result_from_file( $template_file, $template_type
|
||||
$template->area = $template_file['area'];
|
||||
}
|
||||
|
||||
$before_block_visitor = '_inject_theme_attribute_in_template_part_block';
|
||||
$after_block_visitor = null;
|
||||
$hooked_blocks = get_hooked_blocks();
|
||||
if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) {
|
||||
$before_block_visitor = make_before_block_visitor( $hooked_blocks, $template );
|
||||
$after_block_visitor = make_after_block_visitor( $hooked_blocks, $template );
|
||||
}
|
||||
$blocks = parse_blocks( $template_content );
|
||||
$template->content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor );
|
||||
|
||||
return $template;
|
||||
}
|
||||
|
||||
@@ -754,6 +722,7 @@ function _wp_build_title_and_description_for_taxonomy_block_template( $taxonomy,
|
||||
*
|
||||
* @since 5.9.0
|
||||
* @since 6.3.0 Added `modified` property to template objects.
|
||||
* @since 6.4.0 Added support for a revision post to be passed to this function.
|
||||
* @access private
|
||||
*
|
||||
* @param WP_Post $post Template post.
|
||||
@@ -761,7 +730,14 @@ function _wp_build_title_and_description_for_taxonomy_block_template( $taxonomy,
|
||||
*/
|
||||
function _build_block_template_result_from_post( $post ) {
|
||||
$default_template_types = get_default_block_template_types();
|
||||
$terms = get_the_terms( $post, 'wp_theme' );
|
||||
|
||||
$post_id = wp_is_post_revision( $post );
|
||||
if ( ! $post_id ) {
|
||||
$post_id = $post;
|
||||
}
|
||||
$parent_post = get_post( $post_id );
|
||||
|
||||
$terms = get_the_terms( $parent_post, 'wp_theme' );
|
||||
|
||||
if ( is_wp_error( $terms ) ) {
|
||||
return $terms;
|
||||
@@ -775,12 +751,12 @@ function _build_block_template_result_from_post( $post ) {
|
||||
$template_file = _get_block_template_file( $post->post_type, $post->post_name );
|
||||
$has_theme_file = get_stylesheet() === $theme && null !== $template_file;
|
||||
|
||||
$origin = get_post_meta( $post->ID, 'origin', true );
|
||||
$is_wp_suggestion = get_post_meta( $post->ID, 'is_wp_suggestion', true );
|
||||
$origin = get_post_meta( $parent_post->ID, 'origin', true );
|
||||
$is_wp_suggestion = get_post_meta( $parent_post->ID, 'is_wp_suggestion', true );
|
||||
|
||||
$template = new WP_Block_Template();
|
||||
$template->wp_id = $post->ID;
|
||||
$template->id = $theme . '//' . $post->post_name;
|
||||
$template->id = $theme . '//' . $parent_post->post_name;
|
||||
$template->theme = $theme;
|
||||
$template->content = $post->post_content;
|
||||
$template->slug = $post->post_name;
|
||||
@@ -795,23 +771,23 @@ function _build_block_template_result_from_post( $post ) {
|
||||
$template->author = $post->post_author;
|
||||
$template->modified = $post->post_modified;
|
||||
|
||||
if ( 'wp_template' === $post->post_type && $has_theme_file && isset( $template_file['postTypes'] ) ) {
|
||||
if ( 'wp_template' === $parent_post->post_type && $has_theme_file && isset( $template_file['postTypes'] ) ) {
|
||||
$template->post_types = $template_file['postTypes'];
|
||||
}
|
||||
|
||||
if ( 'wp_template' === $post->post_type && isset( $default_template_types[ $template->slug ] ) ) {
|
||||
if ( 'wp_template' === $parent_post->post_type && isset( $default_template_types[ $template->slug ] ) ) {
|
||||
$template->is_custom = false;
|
||||
}
|
||||
|
||||
if ( 'wp_template_part' === $post->post_type ) {
|
||||
$type_terms = get_the_terms( $post, 'wp_template_part_area' );
|
||||
if ( 'wp_template_part' === $parent_post->post_type ) {
|
||||
$type_terms = get_the_terms( $parent_post, 'wp_template_part_area' );
|
||||
if ( ! is_wp_error( $type_terms ) && false !== $type_terms ) {
|
||||
$template->area = $type_terms[0]->name;
|
||||
}
|
||||
}
|
||||
|
||||
// Check for a block template without a description and title or with a title equal to the slug.
|
||||
if ( 'wp_template' === $post->post_type && empty( $template->description ) && ( empty( $template->title ) || $template->title === $template->slug ) ) {
|
||||
if ( 'wp_template' === $parent_post->post_type && empty( $template->description ) && ( empty( $template->title ) || $template->title === $template->slug ) ) {
|
||||
$matches = array();
|
||||
|
||||
// Check for a block template for a single author, page, post, tag, category, custom post type, or custom taxonomy.
|
||||
@@ -1298,7 +1274,10 @@ function wp_generate_block_templates_export_file() {
|
||||
// Load templates into the zip file.
|
||||
$templates = get_block_templates();
|
||||
foreach ( $templates as $template ) {
|
||||
$template->content = _remove_theme_attribute_in_block_template_content( $template->content );
|
||||
$template->content = traverse_and_serialize_blocks(
|
||||
parse_blocks( $template->content ),
|
||||
'_remove_theme_attribute_from_template_part_block'
|
||||
);
|
||||
|
||||
$zip->addFromString(
|
||||
'templates/' . $template->slug . '.html',
|
||||
|
||||
@@ -208,14 +208,15 @@ function _block_template_render_title_tag() {
|
||||
* @access private
|
||||
* @since 5.8.0
|
||||
*
|
||||
* @global string $_wp_current_template_id
|
||||
* @global string $_wp_current_template_content
|
||||
* @global WP_Embed $wp_embed
|
||||
* @global WP_Query $wp_query
|
||||
*
|
||||
* @return string Block template markup.
|
||||
*/
|
||||
function get_the_block_template_html() {
|
||||
global $_wp_current_template_content;
|
||||
global $wp_embed;
|
||||
global $_wp_current_template_id, $_wp_current_template_content, $wp_embed, $wp_query;
|
||||
|
||||
if ( ! $_wp_current_template_content ) {
|
||||
if ( is_user_logged_in() ) {
|
||||
@@ -228,7 +229,40 @@ function get_the_block_template_html() {
|
||||
$content = $wp_embed->autoembed( $content );
|
||||
$content = shortcode_unautop( $content );
|
||||
$content = do_shortcode( $content );
|
||||
$content = do_blocks( $content );
|
||||
|
||||
/*
|
||||
* Most block themes omit the `core/query` and `core/post-template` blocks in their singular content templates.
|
||||
* While this technically still works since singular content templates are always for only one post, it results in
|
||||
* the main query loop never being entered which causes bugs in core and the plugin ecosystem.
|
||||
*
|
||||
* The workaround below ensures that the loop is started even for those singular templates. The while loop will by
|
||||
* definition only go through a single iteration, i.e. `do_blocks()` is only called once. Additional safeguard
|
||||
* checks are included to ensure the main query loop has not been tampered with and really only encompasses a
|
||||
* single post.
|
||||
*
|
||||
* Even if the block template contained a `core/query` and `core/post-template` block referencing the main query
|
||||
* loop, it would not cause errors since it would use a cloned instance and go through the same loop of a single
|
||||
* post, within the actual main query loop.
|
||||
*
|
||||
* This special logic should be skipped if the current template does not come from the current theme, in which case
|
||||
* it has been injected by a plugin by hijacking the block template loader mechanism. In that case, entirely custom
|
||||
* logic may be applied which is unpredictable and therefore safer to omit this special handling on.
|
||||
*/
|
||||
if (
|
||||
$_wp_current_template_id &&
|
||||
str_starts_with( $_wp_current_template_id, get_stylesheet() . '//' ) &&
|
||||
is_singular() &&
|
||||
1 === $wp_query->post_count &&
|
||||
have_posts()
|
||||
) {
|
||||
while ( have_posts() ) {
|
||||
the_post();
|
||||
$content = do_blocks( $content );
|
||||
}
|
||||
} else {
|
||||
$content = do_blocks( $content );
|
||||
}
|
||||
|
||||
$content = wptexturize( $content );
|
||||
$content = convert_smilies( $content );
|
||||
$content = wp_filter_content_tags( $content, 'template' );
|
||||
|
||||
+515
-73
@@ -73,6 +73,54 @@ function generate_block_asset_handle( $block_name, $field_name, $index = 0 ) {
|
||||
return $asset_handle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the URL to a block asset.
|
||||
*
|
||||
* @since 6.4.0
|
||||
*
|
||||
* @param string $path A normalized path to a block asset.
|
||||
* @return string|false The URL to the block asset or false on failure.
|
||||
*/
|
||||
function get_block_asset_url( $path ) {
|
||||
if ( empty( $path ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Path needs to be normalized to work in Windows env.
|
||||
static $wpinc_path_norm = '';
|
||||
if ( ! $wpinc_path_norm ) {
|
||||
$wpinc_path_norm = wp_normalize_path( realpath( ABSPATH . WPINC ) );
|
||||
}
|
||||
|
||||
if ( str_starts_with( $path, $wpinc_path_norm ) ) {
|
||||
return includes_url( str_replace( $wpinc_path_norm, '', $path ) );
|
||||
}
|
||||
|
||||
static $template_paths_norm = array();
|
||||
|
||||
$template = get_template();
|
||||
if ( ! isset( $template_paths_norm[ $template ] ) ) {
|
||||
$template_paths_norm[ $template ] = wp_normalize_path( get_template_directory() );
|
||||
}
|
||||
|
||||
if ( str_starts_with( $path, trailingslashit( $template_paths_norm[ $template ] ) ) ) {
|
||||
return get_theme_file_uri( str_replace( $template_paths_norm[ $template ], '', $path ) );
|
||||
}
|
||||
|
||||
if ( is_child_theme() ) {
|
||||
$stylesheet = get_stylesheet();
|
||||
if ( ! isset( $template_paths_norm[ $stylesheet ] ) ) {
|
||||
$template_paths_norm[ $stylesheet ] = wp_normalize_path( get_stylesheet_directory() );
|
||||
}
|
||||
|
||||
if ( str_starts_with( $path, trailingslashit( $template_paths_norm[ $stylesheet ] ) ) ) {
|
||||
return get_theme_file_uri( str_replace( $template_paths_norm[ $stylesheet ], '', $path ) );
|
||||
}
|
||||
}
|
||||
|
||||
return plugins_url( basename( $path ), $path );
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds a script handle for the selected block metadata field. It detects
|
||||
* when a path to file was provided and finds a corresponding asset file
|
||||
@@ -107,7 +155,8 @@ function register_block_script_handle( $metadata, $field_name, $index = 0 ) {
|
||||
return $script_handle;
|
||||
}
|
||||
|
||||
$script_asset_raw_path = dirname( $metadata['file'] ) . '/' . substr_replace( $script_path, '.asset.php', - strlen( '.js' ) );
|
||||
$path = dirname( $metadata['file'] );
|
||||
$script_asset_raw_path = $path . '/' . substr_replace( $script_path, '.asset.php', - strlen( '.js' ) );
|
||||
$script_handle = generate_block_asset_handle( $metadata['name'], $field_name, $index );
|
||||
$script_asset_path = wp_normalize_path(
|
||||
realpath( $script_asset_raw_path )
|
||||
@@ -128,40 +177,12 @@ function register_block_script_handle( $metadata, $field_name, $index = 0 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Path needs to be normalized to work in Windows env.
|
||||
static $wpinc_path_norm = '';
|
||||
if ( ! $wpinc_path_norm ) {
|
||||
$wpinc_path_norm = wp_normalize_path( realpath( ABSPATH . WPINC ) );
|
||||
}
|
||||
$script_path_norm = wp_normalize_path( realpath( $path . '/' . $script_path ) );
|
||||
$script_uri = get_block_asset_url( $script_path_norm );
|
||||
|
||||
// Cache $template_path_norm and $stylesheet_path_norm to avoid unnecessary additional calls.
|
||||
static $template_path_norm = '';
|
||||
static $stylesheet_path_norm = '';
|
||||
if ( ! $template_path_norm || ! $stylesheet_path_norm ) {
|
||||
$template_path_norm = wp_normalize_path( get_template_directory() );
|
||||
$stylesheet_path_norm = wp_normalize_path( get_stylesheet_directory() );
|
||||
}
|
||||
|
||||
$script_path_norm = wp_normalize_path( realpath( dirname( $metadata['file'] ) . '/' . $script_path ) );
|
||||
|
||||
$is_core_block = isset( $metadata['file'] ) && str_starts_with( $metadata['file'], $wpinc_path_norm );
|
||||
|
||||
/*
|
||||
* Determine if the block script was registered in a theme, by checking if the script path starts with either
|
||||
* the parent (template) or child (stylesheet) directory path.
|
||||
*/
|
||||
$is_parent_theme_block = str_starts_with( $script_path_norm, $template_path_norm );
|
||||
$is_child_theme_block = str_starts_with( $script_path_norm, $stylesheet_path_norm );
|
||||
$is_theme_block = ( $is_parent_theme_block || $is_child_theme_block );
|
||||
|
||||
$script_uri = plugins_url( $script_path, $metadata['file'] );
|
||||
if ( $is_core_block ) {
|
||||
$script_uri = includes_url( str_replace( $wpinc_path_norm, '', $script_path_norm ) );
|
||||
} elseif ( $is_theme_block ) {
|
||||
// Get the script path deterministically based on whether or not it was registered in a parent or child theme.
|
||||
$script_uri = $is_parent_theme_block
|
||||
? get_theme_file_uri( str_replace( $template_path_norm, '', $script_path_norm ) )
|
||||
: get_theme_file_uri( str_replace( $stylesheet_path_norm, '', $script_path_norm ) );
|
||||
$script_args = array();
|
||||
if ( 'viewScript' === $field_name && $script_uri ) {
|
||||
$script_args['strategy'] = 'defer';
|
||||
}
|
||||
|
||||
$script_asset = require $script_asset_path;
|
||||
@@ -170,7 +191,8 @@ function register_block_script_handle( $metadata, $field_name, $index = 0 ) {
|
||||
$script_handle,
|
||||
$script_uri,
|
||||
$script_dependencies,
|
||||
isset( $script_asset['version'] ) ? $script_asset['version'] : false
|
||||
isset( $script_asset['version'] ) ? $script_asset['version'] : false,
|
||||
$script_args
|
||||
);
|
||||
if ( ! $result ) {
|
||||
return false;
|
||||
@@ -246,37 +268,7 @@ function register_block_style_handle( $metadata, $field_name, $index = 0 ) {
|
||||
}
|
||||
|
||||
$style_path_norm = wp_normalize_path( realpath( dirname( $metadata['file'] ) . '/' . $style_path ) );
|
||||
$has_style_file = '' !== $style_path_norm;
|
||||
|
||||
if ( $has_style_file ) {
|
||||
$style_uri = plugins_url( $style_path, $metadata['file'] );
|
||||
|
||||
// Cache $template_path_norm and $stylesheet_path_norm to avoid unnecessary additional calls.
|
||||
static $template_path_norm = '';
|
||||
static $stylesheet_path_norm = '';
|
||||
if ( ! $template_path_norm || ! $stylesheet_path_norm ) {
|
||||
$template_path_norm = wp_normalize_path( get_template_directory() );
|
||||
$stylesheet_path_norm = wp_normalize_path( get_stylesheet_directory() );
|
||||
}
|
||||
|
||||
// Determine if the block style was registered in a theme, by checking if the script path starts with either
|
||||
// the parent (template) or child (stylesheet) directory path.
|
||||
$is_parent_theme_block = str_starts_with( $style_path_norm, $template_path_norm );
|
||||
$is_child_theme_block = str_starts_with( $style_path_norm, $stylesheet_path_norm );
|
||||
$is_theme_block = ( $is_parent_theme_block || $is_child_theme_block );
|
||||
|
||||
if ( $is_core_block ) {
|
||||
// All possible $style_path variants for core blocks are hard-coded above.
|
||||
$style_uri = includes_url( 'blocks/' . str_replace( 'core/', '', $metadata['name'] ) . '/' . $style_path );
|
||||
} elseif ( $is_theme_block ) {
|
||||
// Get the script path deterministically based on whether or not it was registered in a parent or child theme.
|
||||
$style_uri = $is_parent_theme_block
|
||||
? get_theme_file_uri( str_replace( $template_path_norm, '', $style_path_norm ) )
|
||||
: get_theme_file_uri( str_replace( $stylesheet_path_norm, '', $style_path_norm ) );
|
||||
}
|
||||
} else {
|
||||
$style_uri = false;
|
||||
}
|
||||
$style_uri = get_block_asset_url( $style_path_norm );
|
||||
|
||||
$version = ! $is_core_block && isset( $metadata['version'] ) ? $metadata['version'] : false;
|
||||
$result = wp_register_style(
|
||||
@@ -289,7 +281,7 @@ function register_block_style_handle( $metadata, $field_name, $index = 0 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( $has_style_file ) {
|
||||
if ( $style_uri ) {
|
||||
wp_style_add_data( $style_handle_name, 'path', $style_path_norm );
|
||||
|
||||
if ( $is_core_block ) {
|
||||
@@ -333,6 +325,7 @@ function get_block_metadata_i18n_schema() {
|
||||
* @since 5.9.0 Added support for `variations` and `viewScript` fields.
|
||||
* @since 6.1.0 Added support for `render` field.
|
||||
* @since 6.3.0 Added `selectors` field.
|
||||
* @since 6.4.0 Added support for `blockHooks` field.
|
||||
*
|
||||
* @param string $file_or_folder Path to the JSON file with metadata definition for
|
||||
* the block or path to the folder where the `block.json` file is located.
|
||||
@@ -504,6 +497,39 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! empty( $metadata['blockHooks'] ) ) {
|
||||
/**
|
||||
* Map camelCased position string (from block.json) to snake_cased block type position.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
$position_mappings = array(
|
||||
'before' => 'before',
|
||||
'after' => 'after',
|
||||
'firstChild' => 'first_child',
|
||||
'lastChild' => 'last_child',
|
||||
);
|
||||
|
||||
$settings['block_hooks'] = array();
|
||||
foreach ( $metadata['blockHooks'] as $anchor_block_name => $position ) {
|
||||
// Avoid infinite recursion (hooking to itself).
|
||||
if ( $metadata['name'] === $anchor_block_name ) {
|
||||
_doing_it_wrong(
|
||||
__METHOD__,
|
||||
__( 'Cannot hook block to itself.' ),
|
||||
'6.4.0'
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ! isset( $position_mappings[ $position ] ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$settings['block_hooks'][ $anchor_block_name ] = $position_mappings[ $position ];
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! empty( $metadata['render'] ) ) {
|
||||
$template_path = wp_normalize_path(
|
||||
realpath(
|
||||
@@ -523,7 +549,7 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
*
|
||||
* @return string Returns the block content.
|
||||
*/
|
||||
$settings['render_callback'] = static function( $attributes, $content, $block ) use ( $template_path ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
|
||||
$settings['render_callback'] = static function ( $attributes, $content, $block ) use ( $template_path ) {
|
||||
ob_start();
|
||||
require $template_path;
|
||||
return ob_get_clean();
|
||||
@@ -627,7 +653,8 @@ function has_blocks( $post = null ) {
|
||||
*
|
||||
* This test optimizes for performance rather than strict accuracy, detecting
|
||||
* whether the block type exists but not validating its structure and not checking
|
||||
* reusable blocks. For strict accuracy, you should use the block parser on post content.
|
||||
* synced patterns (formerly called reusable blocks). For strict accuracy,
|
||||
* you should use the block parser on post content.
|
||||
*
|
||||
* @since 5.0.0
|
||||
*
|
||||
@@ -696,6 +723,173 @@ function get_dynamic_block_names() {
|
||||
return $dynamic_block_names;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves block types hooked into the given block, grouped by anchor block type and the relative position.
|
||||
*
|
||||
* @since 6.4.0
|
||||
*
|
||||
* @return array[] Array of block types grouped by anchor block type and the relative position.
|
||||
*/
|
||||
function get_hooked_blocks() {
|
||||
$block_types = WP_Block_Type_Registry::get_instance()->get_all_registered();
|
||||
$hooked_blocks = array();
|
||||
foreach ( $block_types as $block_type ) {
|
||||
if ( ! ( $block_type instanceof WP_Block_Type ) || ! is_array( $block_type->block_hooks ) ) {
|
||||
continue;
|
||||
}
|
||||
foreach ( $block_type->block_hooks as $anchor_block_type => $relative_position ) {
|
||||
if ( ! isset( $hooked_blocks[ $anchor_block_type ] ) ) {
|
||||
$hooked_blocks[ $anchor_block_type ] = array();
|
||||
}
|
||||
if ( ! isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] ) ) {
|
||||
$hooked_blocks[ $anchor_block_type ][ $relative_position ] = array();
|
||||
}
|
||||
$hooked_blocks[ $anchor_block_type ][ $relative_position ][] = $block_type->name;
|
||||
}
|
||||
}
|
||||
|
||||
return $hooked_blocks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a function that injects the theme attribute into, and hooked blocks before, a given block.
|
||||
*
|
||||
* The returned function can be used as `$pre_callback` argument to `traverse_and_serialize_block(s)`,
|
||||
* where it will inject the `theme` attribute into all Template Part blocks, and prepend the markup for
|
||||
* any blocks hooked `before` the given block and as its parent's `first_child`, respectively.
|
||||
*
|
||||
* This function is meant for internal use only.
|
||||
*
|
||||
* @since 6.4.0
|
||||
* @access private
|
||||
*
|
||||
* @param array $hooked_blocks An array of blocks hooked to another given block.
|
||||
* @param WP_Block_Template|array $context A block template, template part, or pattern that the blocks belong to.
|
||||
* @return callable A function that returns the serialized markup for the given block,
|
||||
* including the markup for any hooked blocks before it.
|
||||
*/
|
||||
function make_before_block_visitor( $hooked_blocks, $context ) {
|
||||
/**
|
||||
* Injects hooked blocks before the given block, injects the `theme` attribute into Template Part blocks, and returns the serialized markup.
|
||||
*
|
||||
* If the current block is a Template Part block, inject the `theme` attribute.
|
||||
* Furthermore, prepend the markup for any blocks hooked `before` the given block and as its parent's
|
||||
* `first_child`, respectively, to the serialized markup for the given block.
|
||||
*
|
||||
* @param array $block The block to inject the theme attribute into, and hooked blocks before. Passed by reference.
|
||||
* @param array $parent_block The parent block of the given block. Passed by reference. Default null.
|
||||
* @param array $prev The previous sibling block of the given block. Default null.
|
||||
* @return string The serialized markup for the given block, with the markup for any hooked blocks prepended to it.
|
||||
*/
|
||||
return function ( &$block, &$parent_block = null, $prev = null ) use ( $hooked_blocks, $context ) {
|
||||
_inject_theme_attribute_in_template_part_block( $block );
|
||||
|
||||
$markup = '';
|
||||
|
||||
if ( $parent_block && ! $prev ) {
|
||||
// Candidate for first-child insertion.
|
||||
$relative_position = 'first_child';
|
||||
$anchor_block_type = $parent_block['blockName'];
|
||||
$hooked_block_types = isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] )
|
||||
? $hooked_blocks[ $anchor_block_type ][ $relative_position ]
|
||||
: array();
|
||||
|
||||
/**
|
||||
* Filters the list of hooked block types for a given anchor block type and relative position.
|
||||
*
|
||||
* @since 6.4.0
|
||||
*
|
||||
* @param string[] $hooked_block_types The list of hooked block types.
|
||||
* @param string $relative_position The relative position of the hooked blocks.
|
||||
* Can be one of 'before', 'after', 'first_child', or 'last_child'.
|
||||
* @param string $anchor_block_type The anchor block type.
|
||||
* @param WP_Block_Template|array $context The block template, template part, or pattern that the anchor block belongs to.
|
||||
*/
|
||||
$hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context );
|
||||
foreach ( $hooked_block_types as $hooked_block_type ) {
|
||||
$markup .= get_comment_delimited_block_content( $hooked_block_type, array(), '' );
|
||||
}
|
||||
}
|
||||
|
||||
$relative_position = 'before';
|
||||
$anchor_block_type = $block['blockName'];
|
||||
$hooked_block_types = isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] )
|
||||
? $hooked_blocks[ $anchor_block_type ][ $relative_position ]
|
||||
: array();
|
||||
|
||||
/** This filter is documented in wp-includes/blocks.php */
|
||||
$hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context );
|
||||
foreach ( $hooked_block_types as $hooked_block_type ) {
|
||||
$markup .= get_comment_delimited_block_content( $hooked_block_type, array(), '' );
|
||||
}
|
||||
|
||||
return $markup;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a function that injects the hooked blocks after a given block.
|
||||
*
|
||||
* The returned function can be used as `$post_callback` argument to `traverse_and_serialize_block(s)`,
|
||||
* where it will append the markup for any blocks hooked `after` the given block and as its parent's
|
||||
* `last_child`, respectively.
|
||||
*
|
||||
* This function is meant for internal use only.
|
||||
*
|
||||
* @since 6.4.0
|
||||
* @access private
|
||||
*
|
||||
* @param array $hooked_blocks An array of blocks hooked to another block.
|
||||
* @param WP_Block_Template|array $context A block template, template part, or pattern that the blocks belong to.
|
||||
* @return callable A function that returns the serialized markup for the given block,
|
||||
* including the markup for any hooked blocks after it.
|
||||
*/
|
||||
function make_after_block_visitor( $hooked_blocks, $context ) {
|
||||
/**
|
||||
* Injects hooked blocks after the given block, and returns the serialized markup.
|
||||
*
|
||||
* Append the markup for any blocks hooked `after` the given block and as its parent's
|
||||
* `last_child`, respectively, to the serialized markup for the given block.
|
||||
*
|
||||
* @param array $block The block to inject the hooked blocks after. Passed by reference.
|
||||
* @param array $parent_block The parent block of the given block. Passed by reference. Default null.
|
||||
* @param array $next The next sibling block of the given block. Default null.
|
||||
* @return string The serialized markup for the given block, with the markup for any hooked blocks appended to it.
|
||||
*/
|
||||
return function ( &$block, &$parent_block = null, $next = null ) use ( $hooked_blocks, $context ) {
|
||||
$markup = '';
|
||||
|
||||
$relative_position = 'after';
|
||||
$anchor_block_type = $block['blockName'];
|
||||
$hooked_block_types = isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] )
|
||||
? $hooked_blocks[ $anchor_block_type ][ $relative_position ]
|
||||
: array();
|
||||
|
||||
/** This filter is documented in wp-includes/blocks.php */
|
||||
$hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context );
|
||||
foreach ( $hooked_block_types as $hooked_block_type ) {
|
||||
$markup .= get_comment_delimited_block_content( $hooked_block_type, array(), '' );
|
||||
}
|
||||
|
||||
if ( $parent_block && ! $next ) {
|
||||
// Candidate for last-child insertion.
|
||||
$relative_position = 'last_child';
|
||||
$anchor_block_type = $parent_block['blockName'];
|
||||
$hooked_block_types = isset( $hooked_blocks[ $anchor_block_type ][ $relative_position ] )
|
||||
? $hooked_blocks[ $anchor_block_type ][ $relative_position ]
|
||||
: array();
|
||||
|
||||
/** This filter is documented in wp-includes/blocks.php */
|
||||
$hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context );
|
||||
foreach ( $hooked_block_types as $hooked_block_type ) {
|
||||
$markup .= get_comment_delimited_block_content( $hooked_block_type, array(), '' );
|
||||
}
|
||||
}
|
||||
|
||||
return $markup;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Given an array of attributes, returns a string in the serialized attributes
|
||||
* format prepared for post content.
|
||||
@@ -821,6 +1015,159 @@ function serialize_blocks( $blocks ) {
|
||||
return implode( '', array_map( 'serialize_block', $blocks ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Traverses a parsed block tree and applies callbacks before and after serializing it.
|
||||
*
|
||||
* Recursively traverses the block and its inner blocks and applies the two callbacks provided as
|
||||
* arguments, the first one before serializing the block, and the second one after serializing it.
|
||||
* If either callback returns a string value, it will be prepended and appended to the serialized
|
||||
* block markup, respectively.
|
||||
*
|
||||
* The callbacks will receive a reference to the current block as their first argument, so that they
|
||||
* can also modify it, and the current block's parent block as second argument. Finally, the
|
||||
* `$pre_callback` receives the previous block, whereas the `$post_callback` receives
|
||||
* the next block as third argument.
|
||||
*
|
||||
* Serialized blocks are returned including comment delimiters, and with all attributes serialized.
|
||||
*
|
||||
* This function should be used when there is a need to modify the saved block, or to inject markup
|
||||
* into the return value. Prefer `serialize_block` when preparing a block to be saved to post content.
|
||||
*
|
||||
* This function is meant for internal use only.
|
||||
*
|
||||
* @since 6.4.0
|
||||
* @access private
|
||||
*
|
||||
* @see serialize_block()
|
||||
*
|
||||
* @param array $block A representative array of a single parsed block object. See WP_Block_Parser_Block.
|
||||
* @param callable $pre_callback Callback to run on each block in the tree before it is traversed and serialized.
|
||||
* It is called with the following arguments: &$block, $parent_block, $previous_block.
|
||||
* Its string return value will be prepended to the serialized block markup.
|
||||
* @param callable $post_callback Callback to run on each block in the tree after it is traversed and serialized.
|
||||
* It is called with the following arguments: &$block, $parent_block, $next_block.
|
||||
* Its string return value will be appended to the serialized block markup.
|
||||
* @return string Serialized block markup.
|
||||
*/
|
||||
function traverse_and_serialize_block( $block, $pre_callback = null, $post_callback = null ) {
|
||||
$block_content = '';
|
||||
$block_index = 0;
|
||||
|
||||
foreach ( $block['innerContent'] as $chunk ) {
|
||||
if ( is_string( $chunk ) ) {
|
||||
$block_content .= $chunk;
|
||||
} else {
|
||||
$inner_block = $block['innerBlocks'][ $block_index ];
|
||||
|
||||
if ( is_callable( $pre_callback ) ) {
|
||||
$prev = 0 === $block_index
|
||||
? null
|
||||
: $block['innerBlocks'][ $block_index - 1 ];
|
||||
|
||||
$block_content .= call_user_func_array(
|
||||
$pre_callback,
|
||||
array( &$inner_block, &$block, $prev )
|
||||
);
|
||||
}
|
||||
|
||||
if ( is_callable( $post_callback ) ) {
|
||||
$next = count( $block['innerBlocks'] ) - 1 === $block_index
|
||||
? null
|
||||
: $block['innerBlocks'][ $block_index + 1 ];
|
||||
|
||||
$post_markup = call_user_func_array(
|
||||
$post_callback,
|
||||
array( &$inner_block, &$block, $next )
|
||||
);
|
||||
}
|
||||
|
||||
$block_content .= traverse_and_serialize_block( $inner_block, $pre_callback, $post_callback );
|
||||
$block_content .= isset( $post_markup ) ? $post_markup : '';
|
||||
|
||||
++$block_index;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! is_array( $block['attrs'] ) ) {
|
||||
$block['attrs'] = array();
|
||||
}
|
||||
|
||||
return get_comment_delimited_block_content(
|
||||
$block['blockName'],
|
||||
$block['attrs'],
|
||||
$block_content
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Given an array of parsed block trees, applies callbacks before and after serializing them and
|
||||
* returns their concatenated output.
|
||||
*
|
||||
* Recursively traverses the blocks and their inner blocks and applies the two callbacks provided as
|
||||
* arguments, the first one before serializing a block, and the second one after serializing.
|
||||
* If either callback returns a string value, it will be prepended and appended to the serialized
|
||||
* block markup, respectively.
|
||||
*
|
||||
* The callbacks will receive a reference to the current block as their first argument, so that they
|
||||
* can also modify it, and the current block's parent block as second argument. Finally, the
|
||||
* `$pre_callback` receives the previous block, whereas the `$post_callback` receives
|
||||
* the next block as third argument.
|
||||
*
|
||||
* Serialized blocks are returned including comment delimiters, and with all attributes serialized.
|
||||
*
|
||||
* This function should be used when there is a need to modify the saved blocks, or to inject markup
|
||||
* into the return value. Prefer `serialize_blocks` when preparing blocks to be saved to post content.
|
||||
*
|
||||
* This function is meant for internal use only.
|
||||
*
|
||||
* @since 6.4.0
|
||||
* @access private
|
||||
*
|
||||
* @see serialize_blocks()
|
||||
*
|
||||
* @param array[] $blocks An array of parsed blocks. See WP_Block_Parser_Block.
|
||||
* @param callable $pre_callback Callback to run on each block in the tree before it is traversed and serialized.
|
||||
* It is called with the following arguments: &$block, $parent_block, $previous_block.
|
||||
* Its string return value will be prepended to the serialized block markup.
|
||||
* @param callable $post_callback Callback to run on each block in the tree after it is traversed and serialized.
|
||||
* It is called with the following arguments: &$block, $parent_block, $next_block.
|
||||
* Its string return value will be appended to the serialized block markup.
|
||||
* @return string Serialized block markup.
|
||||
*/
|
||||
function traverse_and_serialize_blocks( $blocks, $pre_callback = null, $post_callback = null ) {
|
||||
$result = '';
|
||||
$parent_block = null; // At the top level, there is no parent block to pass to the callbacks; yet the callbacks expect a reference.
|
||||
|
||||
foreach ( $blocks as $index => $block ) {
|
||||
if ( is_callable( $pre_callback ) ) {
|
||||
$prev = 0 === $index
|
||||
? null
|
||||
: $blocks[ $index - 1 ];
|
||||
|
||||
$result .= call_user_func_array(
|
||||
$pre_callback,
|
||||
array( &$block, &$parent_block, $prev )
|
||||
);
|
||||
}
|
||||
|
||||
if ( is_callable( $post_callback ) ) {
|
||||
$next = count( $blocks ) - 1 === $index
|
||||
? null
|
||||
: $blocks[ $index + 1 ];
|
||||
|
||||
$post_markup = call_user_func_array(
|
||||
$post_callback,
|
||||
array( &$block, &$parent_block, $next )
|
||||
);
|
||||
}
|
||||
|
||||
$result .= traverse_and_serialize_block( $block, $pre_callback, $post_callback );
|
||||
$result .= isset( $post_markup ) ? $post_markup : '';
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters and sanitizes block content to remove non-allowable HTML
|
||||
* from parsed block attribute values.
|
||||
@@ -935,6 +1282,10 @@ function filter_block_kses_value( $value, $allowed_html, $allowed_protocols = ar
|
||||
* @return string The parsed and filtered content.
|
||||
*/
|
||||
function excerpt_remove_blocks( $content ) {
|
||||
if ( ! has_blocks( $content ) ) {
|
||||
return $content;
|
||||
}
|
||||
|
||||
$allowed_inner_blocks = array(
|
||||
// Classic blocks have their blockName set to null.
|
||||
null,
|
||||
@@ -1248,16 +1599,25 @@ function unregister_block_style( $block_name, $block_style_name ) {
|
||||
* Checks whether the current block type supports the feature requested.
|
||||
*
|
||||
* @since 5.8.0
|
||||
* @since 6.4.0 The `$feature` parameter now supports a string.
|
||||
*
|
||||
* @param WP_Block_Type $block_type Block type to check for support.
|
||||
* @param array $feature Path to a specific feature to check support for.
|
||||
* @param string|array $feature Feature slug, or path to a specific feature to check support for.
|
||||
* @param mixed $default_value Optional. Fallback value for feature support. Default false.
|
||||
* @return bool Whether the feature is supported.
|
||||
*/
|
||||
function block_has_support( $block_type, $feature, $default_value = false ) {
|
||||
$block_support = $default_value;
|
||||
if ( $block_type && property_exists( $block_type, 'supports' ) ) {
|
||||
$block_support = _wp_array_get( $block_type->supports, $feature, $default_value );
|
||||
if ( $block_type instanceof WP_Block_Type ) {
|
||||
if ( is_array( $feature ) && count( $feature ) === 1 ) {
|
||||
$feature = $feature[0];
|
||||
}
|
||||
|
||||
if ( is_array( $feature ) ) {
|
||||
$block_support = _wp_array_get( $block_type->supports, $feature, $default_value );
|
||||
} elseif ( isset( $block_type->supports[ $feature ] ) ) {
|
||||
$block_support = $block_type->supports[ $feature ];
|
||||
}
|
||||
}
|
||||
|
||||
return true === $block_support || is_array( $block_support );
|
||||
@@ -1290,7 +1650,7 @@ function wp_migrate_old_typography_shape( $metadata ) {
|
||||
);
|
||||
|
||||
foreach ( $typography_keys as $typography_key ) {
|
||||
$support_for_key = _wp_array_get( $metadata['supports'], array( $typography_key ), null );
|
||||
$support_for_key = isset( $metadata['supports'][ $typography_key ] ) ? $metadata['supports'][ $typography_key ] : null;
|
||||
|
||||
if ( null !== $support_for_key ) {
|
||||
_doing_it_wrong(
|
||||
@@ -1602,3 +1962,85 @@ function get_comments_pagination_arrow( $block, $pagination_type = 'next' ) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Strips all HTML from the content of footnotes, and sanitizes the ID.
|
||||
* This function expects slashed data on the footnotes content.
|
||||
*
|
||||
* @access private
|
||||
* @since 6.3.2
|
||||
*
|
||||
* @param string $footnotes JSON encoded string of an array containing the content and ID of each footnote.
|
||||
* @return string Filtered content without any HTML on the footnote content and with the sanitized id.
|
||||
*/
|
||||
function _wp_filter_post_meta_footnotes( $footnotes ) {
|
||||
$footnotes_decoded = json_decode( $footnotes, true );
|
||||
if ( ! is_array( $footnotes_decoded ) ) {
|
||||
return '';
|
||||
}
|
||||
$footnotes_sanitized = array();
|
||||
foreach ( $footnotes_decoded as $footnote ) {
|
||||
if ( ! empty( $footnote['content'] ) && ! empty( $footnote['id'] ) ) {
|
||||
$footnotes_sanitized[] = array(
|
||||
'id' => sanitize_key( $footnote['id'] ),
|
||||
'content' => wp_unslash( wp_filter_post_kses( wp_slash( $footnote['content'] ) ) ),
|
||||
);
|
||||
}
|
||||
}
|
||||
return wp_json_encode( $footnotes_sanitized );
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the filters to filter footnotes meta field.
|
||||
*
|
||||
* @access private
|
||||
* @since 6.3.2
|
||||
*/
|
||||
function _wp_footnotes_kses_init_filters() {
|
||||
add_filter( 'sanitize_post_meta_footnotes', '_wp_filter_post_meta_footnotes' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the filters that filter footnotes meta field.
|
||||
*
|
||||
* @access private
|
||||
* @since 6.3.2
|
||||
*/
|
||||
function _wp_footnotes_remove_filters() {
|
||||
remove_filter( 'sanitize_post_meta_footnotes', '_wp_filter_post_meta_footnotes' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers the filter of footnotes meta field if the user does not have unfiltered_html capability.
|
||||
*
|
||||
* @access private
|
||||
* @since 6.3.2
|
||||
*/
|
||||
function _wp_footnotes_kses_init() {
|
||||
_wp_footnotes_remove_filters();
|
||||
if ( ! current_user_can( 'unfiltered_html' ) ) {
|
||||
_wp_footnotes_kses_init_filters();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes footnotes meta field filters when imported data should be filtered.
|
||||
*
|
||||
* This filter is the last being executed on force_filtered_html_on_import.
|
||||
* If the input of the filter is true it means we are in an import situation and should
|
||||
* enable kses, independently of the user capabilities.
|
||||
* So in that case we call _wp_footnotes_kses_init_filters;
|
||||
*
|
||||
* @access private
|
||||
* @since 6.3.2
|
||||
*
|
||||
* @param string $arg Input argument of the filter.
|
||||
* @return string Input argument of the filter.
|
||||
*/
|
||||
function _wp_footnotes_force_filtered_html_on_import_filter( $arg ) {
|
||||
// force_filtered_html_on_import is true we need to init the global styles kses filters.
|
||||
if ( $arg ) {
|
||||
_wp_footnotes_kses_init_filters();
|
||||
}
|
||||
return $arg;
|
||||
}
|
||||
|
||||
@@ -112,12 +112,12 @@ function get_block_core_avatar_border_attributes( $attributes ) {
|
||||
|
||||
// Border color.
|
||||
$preset_color = array_key_exists( 'borderColor', $attributes ) ? "var:preset|color|{$attributes['borderColor']}" : null;
|
||||
$custom_color = _wp_array_get( $attributes, array( 'style', 'border', 'color' ), null );
|
||||
$custom_color = $attributes['style']['border']['color'] ?? null;
|
||||
$border_styles['color'] = $preset_color ? $preset_color : $custom_color;
|
||||
|
||||
// Individual border styles e.g. top, left etc.
|
||||
foreach ( $sides as $side ) {
|
||||
$border = _wp_array_get( $attributes, array( 'style', 'border', $side ), null );
|
||||
$border = $attributes['style']['border'][ $side ] ?? null;
|
||||
$border_styles[ $side ] = array(
|
||||
'color' => isset( $border['color'] ) ? $border['color'] : null,
|
||||
'style' => isset( $border['style'] ) ? $border['style'] : null,
|
||||
|
||||
@@ -48,6 +48,9 @@
|
||||
"__experimentalDuotone": "img"
|
||||
}
|
||||
},
|
||||
"selectors": {
|
||||
"border": ".wp-block-avatar img"
|
||||
},
|
||||
"editorStyle": "wp-block-avatar-editor",
|
||||
"style": "wp-block-avatar"
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"title": "Pattern",
|
||||
"category": "reusable",
|
||||
"description": "Create and save content to reuse across your site. Update the pattern, and the changes apply everywhere it’s used.",
|
||||
"keywords": [ "reusable" ],
|
||||
"keywords": [ "reusable" ],
|
||||
"textdomain": "default",
|
||||
"attributes": {
|
||||
"ref": {
|
||||
|
||||
@@ -172,6 +172,9 @@
|
||||
'__experimentalDuotone' => 'img'
|
||||
)
|
||||
),
|
||||
'selectors' => array(
|
||||
'border' => '.wp-block-avatar img'
|
||||
),
|
||||
'editorStyle' => 'wp-block-avatar-editor',
|
||||
'style' => 'wp-block-avatar'
|
||||
),
|
||||
@@ -212,6 +215,18 @@
|
||||
),
|
||||
'textdomain' => 'default',
|
||||
'attributes' => array(
|
||||
'tagName' => array(
|
||||
'type' => 'string',
|
||||
'enum' => array(
|
||||
'a',
|
||||
'button'
|
||||
),
|
||||
'default' => 'a'
|
||||
),
|
||||
'type' => array(
|
||||
'type' => 'string',
|
||||
'default' => 'button'
|
||||
),
|
||||
'textAlign' => array(
|
||||
'type' => 'string'
|
||||
),
|
||||
@@ -225,14 +240,14 @@
|
||||
'title' => array(
|
||||
'type' => 'string',
|
||||
'source' => 'attribute',
|
||||
'selector' => 'a',
|
||||
'selector' => 'a,button',
|
||||
'attribute' => 'title',
|
||||
'__experimentalRole' => 'content'
|
||||
),
|
||||
'text' => array(
|
||||
'type' => 'string',
|
||||
'source' => 'html',
|
||||
'selector' => 'a',
|
||||
'selector' => 'a,button',
|
||||
'__experimentalRole' => 'content'
|
||||
),
|
||||
'linkTarget' => array(
|
||||
@@ -503,7 +518,8 @@
|
||||
'content' => array(
|
||||
'type' => 'string',
|
||||
'source' => 'html',
|
||||
'selector' => 'code'
|
||||
'selector' => 'code',
|
||||
'__unstablePreserveWhiteSpace' => true
|
||||
)
|
||||
),
|
||||
'supports' => array(
|
||||
@@ -592,11 +608,14 @@
|
||||
)
|
||||
),
|
||||
'supports' => array(
|
||||
'__experimentalOnEnter' => true,
|
||||
'anchor' => true,
|
||||
'reusable' => false,
|
||||
'html' => false,
|
||||
'color' => array(
|
||||
'gradients' => true,
|
||||
'heading' => true,
|
||||
'button' => true,
|
||||
'link' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'background' => true,
|
||||
@@ -676,6 +695,8 @@
|
||||
'color' => array(
|
||||
'gradients' => true,
|
||||
'link' => true,
|
||||
'heading' => true,
|
||||
'button' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'background' => true,
|
||||
'text' => true
|
||||
@@ -1066,6 +1087,7 @@
|
||||
'html' => false,
|
||||
'color' => array(
|
||||
'gradients' => true,
|
||||
'heading' => true,
|
||||
'link' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'background' => true,
|
||||
@@ -1478,11 +1500,13 @@
|
||||
),
|
||||
'color' => array(
|
||||
'__experimentalDuotone' => '> .wp-block-cover__image-background, > .wp-block-cover__video-background',
|
||||
'heading' => true,
|
||||
'text' => true,
|
||||
'background' => false,
|
||||
'__experimentalSkipSerialization' => array(
|
||||
'gradients'
|
||||
)
|
||||
),
|
||||
'enableContrastChecker' => false
|
||||
),
|
||||
'typography' => array(
|
||||
'fontSize' => true,
|
||||
@@ -1512,9 +1536,10 @@
|
||||
'category' => 'text',
|
||||
'description' => 'Hide and show additional content.',
|
||||
'keywords' => array(
|
||||
'disclosure',
|
||||
'accordion',
|
||||
'summary',
|
||||
'hide'
|
||||
'toggle',
|
||||
'disclosure'
|
||||
),
|
||||
'textdomain' => 'default',
|
||||
'attributes' => array(
|
||||
@@ -1523,7 +1548,9 @@
|
||||
'default' => false
|
||||
),
|
||||
'summary' => array(
|
||||
'type' => 'string'
|
||||
'type' => 'string',
|
||||
'source' => 'html',
|
||||
'selector' => 'summary'
|
||||
)
|
||||
),
|
||||
'supports' => array(
|
||||
@@ -1548,6 +1575,7 @@
|
||||
'spacing' => array(
|
||||
'margin' => true,
|
||||
'padding' => true,
|
||||
'blockGap' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'margin' => false,
|
||||
'padding' => false
|
||||
@@ -1565,6 +1593,9 @@
|
||||
'__experimentalDefaultControls' => array(
|
||||
'fontSize' => true
|
||||
)
|
||||
),
|
||||
'layout' => array(
|
||||
'allowEditing' => false
|
||||
)
|
||||
),
|
||||
'editorStyle' => 'wp-block-details-editor',
|
||||
@@ -1684,6 +1715,10 @@
|
||||
'supports' => array(
|
||||
'anchor' => true,
|
||||
'align' => true,
|
||||
'spacing' => array(
|
||||
'margin' => true,
|
||||
'padding' => true
|
||||
),
|
||||
'color' => array(
|
||||
'gradients' => true,
|
||||
'link' => true,
|
||||
@@ -1692,7 +1727,8 @@
|
||||
'background' => true,
|
||||
'link' => true
|
||||
)
|
||||
)
|
||||
),
|
||||
'interactivity' => true
|
||||
),
|
||||
'viewScript' => 'file:./view.min.js',
|
||||
'editorStyle' => 'wp-block-file-editor',
|
||||
@@ -1714,9 +1750,52 @@
|
||||
'postType'
|
||||
),
|
||||
'supports' => array(
|
||||
'__experimentalBorder' => array(
|
||||
'radius' => true,
|
||||
'color' => true,
|
||||
'width' => true,
|
||||
'style' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'radius' => false,
|
||||
'color' => false,
|
||||
'width' => false,
|
||||
'style' => false
|
||||
)
|
||||
),
|
||||
'color' => array(
|
||||
'background' => true,
|
||||
'link' => true,
|
||||
'text' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'link' => true,
|
||||
'text' => true
|
||||
)
|
||||
),
|
||||
'html' => false,
|
||||
'multiple' => false,
|
||||
'reusable' => false
|
||||
'reusable' => false,
|
||||
'spacing' => array(
|
||||
'margin' => true,
|
||||
'padding' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'margin' => false,
|
||||
'padding' => false
|
||||
)
|
||||
),
|
||||
'typography' => array(
|
||||
'fontSize' => true,
|
||||
'lineHeight' => true,
|
||||
'__experimentalFontFamily' => true,
|
||||
'__experimentalTextDecoration' => true,
|
||||
'__experimentalFontStyle' => true,
|
||||
'__experimentalFontWeight' => true,
|
||||
'__experimentalLetterSpacing' => true,
|
||||
'__experimentalTextTransform' => true,
|
||||
'__experimentalWritingMode' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'fontSize' => true
|
||||
)
|
||||
)
|
||||
),
|
||||
'style' => 'wp-block-footnotes'
|
||||
),
|
||||
@@ -1811,11 +1890,11 @@
|
||||
),
|
||||
'shortCodeTransforms' => array(
|
||||
'type' => 'array',
|
||||
'default' => array(
|
||||
|
||||
),
|
||||
'items' => array(
|
||||
'type' => 'object'
|
||||
),
|
||||
'default' => array(
|
||||
|
||||
)
|
||||
),
|
||||
'columns' => array(
|
||||
@@ -1937,7 +2016,9 @@
|
||||
),
|
||||
'supports' => array(
|
||||
'__experimentalOnEnter' => true,
|
||||
'__experimentalOnMerge' => true,
|
||||
'__experimentalSettings' => true,
|
||||
'__experimentalMetadata' => true,
|
||||
'align' => array(
|
||||
'wide',
|
||||
'full'
|
||||
@@ -1945,8 +2026,13 @@
|
||||
'anchor' => true,
|
||||
'ariaLabel' => true,
|
||||
'html' => false,
|
||||
'background' => array(
|
||||
'backgroundImage' => true
|
||||
),
|
||||
'color' => array(
|
||||
'gradients' => true,
|
||||
'heading' => true,
|
||||
'button' => true,
|
||||
'link' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'background' => true,
|
||||
@@ -2066,6 +2152,7 @@
|
||||
'__experimentalLetterSpacing' => true,
|
||||
'__experimentalTextTransform' => true,
|
||||
'__experimentalTextDecoration' => true,
|
||||
'__experimentalWritingMode' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'fontSize' => true,
|
||||
'fontAppearance' => true,
|
||||
@@ -2190,6 +2277,12 @@
|
||||
'selector' => 'figcaption',
|
||||
'__experimentalRole' => 'content'
|
||||
),
|
||||
'lightbox' => array(
|
||||
'type' => 'object',
|
||||
'enabled' => array(
|
||||
'type' => 'boolean'
|
||||
)
|
||||
),
|
||||
'title' => array(
|
||||
'type' => 'string',
|
||||
'source' => 'attribute',
|
||||
@@ -2221,10 +2314,10 @@
|
||||
'__experimentalRole' => 'content'
|
||||
),
|
||||
'width' => array(
|
||||
'type' => 'number'
|
||||
'type' => 'string'
|
||||
),
|
||||
'height' => array(
|
||||
'type' => 'number'
|
||||
'type' => 'string'
|
||||
),
|
||||
'aspectRatio' => array(
|
||||
'type' => 'string'
|
||||
@@ -2247,9 +2340,6 @@
|
||||
),
|
||||
'supports' => array(
|
||||
'anchor' => true,
|
||||
'behaviors' => array(
|
||||
'lightbox' => true
|
||||
),
|
||||
'color' => array(
|
||||
'text' => false,
|
||||
'background' => false
|
||||
@@ -2287,7 +2377,8 @@
|
||||
)
|
||||
),
|
||||
'editorStyle' => 'wp-block-image-editor',
|
||||
'style' => 'wp-block-image'
|
||||
'style' => 'wp-block-image',
|
||||
'viewScript' => 'file:./view.min.js'
|
||||
),
|
||||
'latest-comments' => array(
|
||||
'$schema' => 'https://schemas.wp.org/trunk/block.json',
|
||||
@@ -2573,6 +2664,7 @@
|
||||
),
|
||||
'__unstablePasteTextInline' => true,
|
||||
'__experimentalSelector' => 'ol,ul',
|
||||
'__experimentalOnMerge' => true,
|
||||
'__experimentalSlashInserter' => true
|
||||
),
|
||||
'editorStyle' => 'wp-block-list-editor',
|
||||
@@ -2767,6 +2859,7 @@
|
||||
'html' => false,
|
||||
'color' => array(
|
||||
'gradients' => true,
|
||||
'heading' => true,
|
||||
'link' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'background' => true,
|
||||
@@ -2958,6 +3051,7 @@
|
||||
'wide',
|
||||
'full'
|
||||
),
|
||||
'ariaLabel' => true,
|
||||
'html' => false,
|
||||
'inserter' => true,
|
||||
'typography' => array(
|
||||
@@ -3006,12 +3100,10 @@
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
),
|
||||
'viewScript' => array(
|
||||
'file:./view.min.js',
|
||||
'file:./view-modal.min.js'
|
||||
),
|
||||
'interactivity' => true
|
||||
),
|
||||
'viewScript' => 'file:./view.min.js',
|
||||
'editorStyle' => 'wp-block-navigation-editor',
|
||||
'style' => 'wp-block-navigation'
|
||||
),
|
||||
@@ -3310,6 +3402,9 @@
|
||||
'text'
|
||||
),
|
||||
'textdomain' => 'default',
|
||||
'usesContext' => array(
|
||||
'postId'
|
||||
),
|
||||
'attributes' => array(
|
||||
'align' => array(
|
||||
'type' => 'string'
|
||||
@@ -3347,6 +3442,7 @@
|
||||
'text' => true
|
||||
)
|
||||
),
|
||||
'__experimentalConnections' => true,
|
||||
'spacing' => array(
|
||||
'margin' => true,
|
||||
'padding' => true,
|
||||
@@ -3364,6 +3460,7 @@
|
||||
'__experimentalFontWeight' => true,
|
||||
'__experimentalLetterSpacing' => true,
|
||||
'__experimentalTextTransform' => true,
|
||||
'__experimentalWritingMode' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'fontSize' => true
|
||||
)
|
||||
@@ -3396,7 +3493,7 @@
|
||||
'$schema' => 'https://schemas.wp.org/trunk/block.json',
|
||||
'apiVersion' => 3,
|
||||
'name' => 'core/post-author',
|
||||
'title' => 'Post Author',
|
||||
'title' => 'Author',
|
||||
'category' => 'theme',
|
||||
'description' => 'Display post author details such as name, avatar, and bio.',
|
||||
'textdomain' => 'default',
|
||||
@@ -3467,7 +3564,7 @@
|
||||
'$schema' => 'https://schemas.wp.org/trunk/block.json',
|
||||
'apiVersion' => 3,
|
||||
'name' => 'core/post-author-biography',
|
||||
'title' => 'Post Author Biography',
|
||||
'title' => 'Author Biography',
|
||||
'category' => 'theme',
|
||||
'description' => 'The author biography.',
|
||||
'textdomain' => 'default',
|
||||
@@ -3512,7 +3609,7 @@
|
||||
'$schema' => 'https://schemas.wp.org/trunk/block.json',
|
||||
'apiVersion' => 3,
|
||||
'name' => 'core/post-author-name',
|
||||
'title' => 'Post Author Name',
|
||||
'title' => 'Author Name',
|
||||
'category' => 'theme',
|
||||
'description' => 'The author name.',
|
||||
'textdomain' => 'default',
|
||||
@@ -3567,7 +3664,7 @@
|
||||
'$schema' => 'https://schemas.wp.org/trunk/block.json',
|
||||
'apiVersion' => 3,
|
||||
'name' => 'core/post-comments-form',
|
||||
'title' => 'Post Comments Form',
|
||||
'title' => 'Comments Form',
|
||||
'category' => 'theme',
|
||||
'description' => 'Display a post\'s comments form.',
|
||||
'textdomain' => 'default',
|
||||
@@ -3584,6 +3681,7 @@
|
||||
'html' => false,
|
||||
'color' => array(
|
||||
'gradients' => true,
|
||||
'heading' => true,
|
||||
'link' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'background' => true,
|
||||
@@ -3617,7 +3715,7 @@
|
||||
'$schema' => 'https://schemas.wp.org/trunk/block.json',
|
||||
'apiVersion' => 3,
|
||||
'name' => 'core/post-content',
|
||||
'title' => 'Post Content',
|
||||
'title' => 'Content',
|
||||
'category' => 'theme',
|
||||
'description' => 'Displays the contents of a post or page.',
|
||||
'textdomain' => 'default',
|
||||
@@ -3636,6 +3734,17 @@
|
||||
'dimensions' => array(
|
||||
'minHeight' => true
|
||||
),
|
||||
'spacing' => array(
|
||||
'blockGap' => true
|
||||
),
|
||||
'color' => array(
|
||||
'gradients' => true,
|
||||
'link' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'background' => false,
|
||||
'text' => false
|
||||
)
|
||||
),
|
||||
'typography' => array(
|
||||
'fontSize' => true,
|
||||
'lineHeight' => true,
|
||||
@@ -3656,9 +3765,9 @@
|
||||
'$schema' => 'https://schemas.wp.org/trunk/block.json',
|
||||
'apiVersion' => 3,
|
||||
'name' => 'core/post-date',
|
||||
'title' => 'Post Date',
|
||||
'title' => 'Date',
|
||||
'category' => 'theme',
|
||||
'description' => 'Add the date of this post.',
|
||||
'description' => 'Display the publish date for an entry such as a post or page.',
|
||||
'textdomain' => 'default',
|
||||
'attributes' => array(
|
||||
'textAlign' => array(
|
||||
@@ -3776,7 +3885,7 @@
|
||||
'$schema' => 'https://schemas.wp.org/trunk/block.json',
|
||||
'apiVersion' => 3,
|
||||
'name' => 'core/post-featured-image',
|
||||
'title' => 'Post Featured Image',
|
||||
'title' => 'Featured Image',
|
||||
'category' => 'theme',
|
||||
'description' => 'Display a post\'s featured image.',
|
||||
'textdomain' => 'default',
|
||||
@@ -3913,6 +4022,7 @@
|
||||
'__experimentalTextTransform' => true,
|
||||
'__experimentalTextDecoration' => true,
|
||||
'__experimentalLetterSpacing' => true,
|
||||
'__experimentalWritingMode' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'fontSize' => true
|
||||
)
|
||||
@@ -3937,7 +4047,8 @@
|
||||
'queryContext',
|
||||
'displayLayout',
|
||||
'templateSlug',
|
||||
'previewPostType'
|
||||
'previewPostType',
|
||||
'enhancedPagination'
|
||||
),
|
||||
'supports' => array(
|
||||
'reusable' => false,
|
||||
@@ -4142,6 +4253,10 @@
|
||||
'text' => true
|
||||
)
|
||||
),
|
||||
'spacing' => array(
|
||||
'padding' => true,
|
||||
'margin' => true
|
||||
),
|
||||
'typography' => array(
|
||||
'fontSize' => true,
|
||||
'lineHeight' => true,
|
||||
@@ -4277,12 +4392,17 @@
|
||||
),
|
||||
'namespace' => array(
|
||||
'type' => 'string'
|
||||
),
|
||||
'enhancedPagination' => array(
|
||||
'type' => 'boolean',
|
||||
'default' => false
|
||||
)
|
||||
),
|
||||
'providesContext' => array(
|
||||
'queryId' => 'queryId',
|
||||
'query' => 'query',
|
||||
'displayLayout' => 'displayLayout'
|
||||
'displayLayout' => 'displayLayout',
|
||||
'enhancedPagination' => 'enhancedPagination'
|
||||
),
|
||||
'supports' => array(
|
||||
'align' => array(
|
||||
@@ -4292,7 +4412,9 @@
|
||||
'html' => false,
|
||||
'layout' => true
|
||||
),
|
||||
'editorStyle' => 'wp-block-query-editor'
|
||||
'editorStyle' => 'wp-block-query-editor',
|
||||
'style' => 'wp-block-query',
|
||||
'viewScript' => 'file:./view.min.js'
|
||||
),
|
||||
'query-no-results' => array(
|
||||
'$schema' => 'https://schemas.wp.org/trunk/block.json',
|
||||
@@ -4418,7 +4540,8 @@
|
||||
'queryId',
|
||||
'query',
|
||||
'paginationArrow',
|
||||
'showLabel'
|
||||
'showLabel',
|
||||
'enhancedPagination'
|
||||
),
|
||||
'supports' => array(
|
||||
'reusable' => false,
|
||||
@@ -4456,9 +4579,16 @@
|
||||
),
|
||||
'description' => 'Displays a list of page numbers for pagination',
|
||||
'textdomain' => 'default',
|
||||
'attributes' => array(
|
||||
'midSize' => array(
|
||||
'type' => 'number',
|
||||
'default' => 2
|
||||
)
|
||||
),
|
||||
'usesContext' => array(
|
||||
'queryId',
|
||||
'query'
|
||||
'query',
|
||||
'enhancedPagination'
|
||||
),
|
||||
'supports' => array(
|
||||
'reusable' => false,
|
||||
@@ -4506,7 +4636,8 @@
|
||||
'queryId',
|
||||
'query',
|
||||
'paginationArrow',
|
||||
'showLabel'
|
||||
'showLabel',
|
||||
'enhancedPagination'
|
||||
),
|
||||
'supports' => array(
|
||||
'reusable' => false,
|
||||
@@ -4632,6 +4763,7 @@
|
||||
'anchor' => true,
|
||||
'html' => false,
|
||||
'__experimentalOnEnter' => true,
|
||||
'__experimentalOnMerge' => true,
|
||||
'typography' => array(
|
||||
'fontSize' => true,
|
||||
'lineHeight' => true,
|
||||
@@ -4648,6 +4780,7 @@
|
||||
),
|
||||
'color' => array(
|
||||
'gradients' => true,
|
||||
'heading' => true,
|
||||
'link' => true,
|
||||
'__experimentalDefaultControls' => array(
|
||||
'background' => true,
|
||||
@@ -4855,6 +4988,7 @@
|
||||
'text' => true
|
||||
)
|
||||
),
|
||||
'interactivity' => true,
|
||||
'typography' => array(
|
||||
'__experimentalSkipSerialization' => true,
|
||||
'__experimentalSelector' => '.wp-block-search__label, .wp-block-search__input, .wp-block-search__button',
|
||||
|
||||
@@ -9,6 +9,15 @@
|
||||
"keywords": [ "link" ],
|
||||
"textdomain": "default",
|
||||
"attributes": {
|
||||
"tagName": {
|
||||
"type": "string",
|
||||
"enum": [ "a", "button" ],
|
||||
"default": "a"
|
||||
},
|
||||
"type": {
|
||||
"type": "string",
|
||||
"default": "button"
|
||||
},
|
||||
"textAlign": {
|
||||
"type": "string"
|
||||
},
|
||||
@@ -22,14 +31,14 @@
|
||||
"title": {
|
||||
"type": "string",
|
||||
"source": "attribute",
|
||||
"selector": "a",
|
||||
"selector": "a,button",
|
||||
"attribute": "title",
|
||||
"__experimentalRole": "content"
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"source": "html",
|
||||
"selector": "a",
|
||||
"selector": "a,button",
|
||||
"__experimentalRole": "content"
|
||||
},
|
||||
"linkTarget": {
|
||||
|
||||
@@ -44,12 +44,12 @@ function render_block_core_calendar( $attributes ) {
|
||||
|
||||
// Text color.
|
||||
$preset_text_color = array_key_exists( 'textColor', $attributes ) ? "var:preset|color|{$attributes['textColor']}" : null;
|
||||
$custom_text_color = _wp_array_get( $attributes, array( 'style', 'color', 'text' ), null );
|
||||
$custom_text_color = $attributes['style']['color']['text'] ?? null;
|
||||
$color_block_styles['text'] = $preset_text_color ? $preset_text_color : $custom_text_color;
|
||||
|
||||
// Background Color.
|
||||
$preset_background_color = array_key_exists( 'backgroundColor', $attributes ) ? "var:preset|color|{$attributes['backgroundColor']}" : null;
|
||||
$custom_background_color = _wp_array_get( $attributes, array( 'style', 'color', 'background' ), null );
|
||||
$custom_background_color = $attributes['style']['color']['background'] ?? null;
|
||||
$color_block_styles['background'] = $preset_background_color ? $preset_background_color : $custom_background_color;
|
||||
|
||||
// Generate color styles and classes.
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
"content": {
|
||||
"type": "string",
|
||||
"source": "html",
|
||||
"selector": "code"
|
||||
"selector": "code",
|
||||
"__unstablePreserveWhiteSpace": true
|
||||
}
|
||||
},
|
||||
"supports": {
|
||||
|
||||
@@ -23,11 +23,14 @@
|
||||
}
|
||||
},
|
||||
"supports": {
|
||||
"__experimentalOnEnter": true,
|
||||
"anchor": true,
|
||||
"reusable": false,
|
||||
"html": false,
|
||||
"color": {
|
||||
"gradients": true,
|
||||
"heading": true,
|
||||
"button": true,
|
||||
"link": true,
|
||||
"__experimentalDefaultControls": {
|
||||
"background": true,
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
"color": {
|
||||
"gradients": true,
|
||||
"link": true,
|
||||
"heading": true,
|
||||
"button": true,
|
||||
"__experimentalDefaultControls": {
|
||||
"background": true,
|
||||
"text": true
|
||||
|
||||
@@ -66,6 +66,9 @@
|
||||
.wp-block-column.is-vertically-aligned-bottom{
|
||||
align-self:flex-end;
|
||||
}
|
||||
.wp-block-column.is-vertically-aligned-stretch{
|
||||
align-self:stretch;
|
||||
}
|
||||
.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{
|
||||
width:100%;
|
||||
}
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-columns{align-items:normal!important;box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}
|
||||
.wp-block-columns{align-items:normal!important;box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-stretch{align-self:stretch}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}
|
||||
@@ -66,6 +66,9 @@
|
||||
.wp-block-column.is-vertically-aligned-bottom{
|
||||
align-self:flex-end;
|
||||
}
|
||||
.wp-block-column.is-vertically-aligned-stretch{
|
||||
align-self:stretch;
|
||||
}
|
||||
.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{
|
||||
width:100%;
|
||||
}
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-columns{align-items:normal!important;box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}
|
||||
.wp-block-columns{align-items:normal!important;box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-stretch{align-self:stretch}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}
|
||||
@@ -28,7 +28,7 @@ function block_core_comment_template_render_comments( $comments, $block ) {
|
||||
$content = '';
|
||||
foreach ( $comments as $comment ) {
|
||||
$comment_id = $comment->comment_ID;
|
||||
$filter_block_context = static function( $context ) use ( $comment_id ) {
|
||||
$filter_block_context = static function ( $context ) use ( $comment_id ) {
|
||||
$context['commentId'] = $comment_id;
|
||||
return $context;
|
||||
};
|
||||
|
||||
@@ -26,7 +26,7 @@ function render_block_core_comments_pagination_next( $attributes, $content, $blo
|
||||
$label = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? $attributes['label'] : $default_label;
|
||||
$pagination_arrow = get_comments_pagination_arrow( $block, 'next' );
|
||||
|
||||
$filter_link_attributes = static function() {
|
||||
$filter_link_attributes = static function () {
|
||||
return get_block_wrapper_attributes();
|
||||
};
|
||||
add_filter( 'next_comments_link_attributes', $filter_link_attributes );
|
||||
|
||||
@@ -22,7 +22,7 @@ function render_block_core_comments_pagination_previous( $attributes, $content,
|
||||
$label = $pagination_arrow . $label;
|
||||
}
|
||||
|
||||
$filter_link_attributes = static function() {
|
||||
$filter_link_attributes = static function () {
|
||||
return get_block_wrapper_attributes();
|
||||
};
|
||||
add_filter( 'previous_comments_link_attributes', $filter_link_attributes );
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
"html": false,
|
||||
"color": {
|
||||
"gradients": true,
|
||||
"heading": true,
|
||||
"link": true,
|
||||
"__experimentalDefaultControls": {
|
||||
"background": true,
|
||||
|
||||
@@ -108,9 +108,11 @@
|
||||
},
|
||||
"color": {
|
||||
"__experimentalDuotone": "> .wp-block-cover__image-background, > .wp-block-cover__video-background",
|
||||
"heading": true,
|
||||
"text": true,
|
||||
"background": false,
|
||||
"__experimentalSkipSerialization": [ "gradients" ]
|
||||
"__experimentalSkipSerialization": [ "gradients" ],
|
||||
"enableContrastChecker": false
|
||||
},
|
||||
"typography": {
|
||||
"fontSize": true,
|
||||
|
||||
@@ -156,6 +156,9 @@
|
||||
}
|
||||
.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{
|
||||
margin:0;
|
||||
}
|
||||
.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{
|
||||
margin:0;
|
||||
width:auto;
|
||||
}
|
||||
.wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -156,6 +156,9 @@
|
||||
}
|
||||
.wp-block-cover-image.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position .wp-block-cover__inner-container{
|
||||
margin:0;
|
||||
}
|
||||
.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover-image.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-bottom-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-center-right .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-left .wp-block-cover__inner-container,.wp-block-cover.has-custom-content-position.has-custom-content-position.is-position-top-right .wp-block-cover__inner-container{
|
||||
margin:0;
|
||||
width:auto;
|
||||
}
|
||||
.wp-block-cover .wp-block-cover__image-background,.wp-block-cover video.wp-block-cover__video-background,.wp-block-cover-image .wp-block-cover__image-background,.wp-block-cover-image video.wp-block-cover__video-background{
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -5,7 +5,7 @@
|
||||
"title": "Details",
|
||||
"category": "text",
|
||||
"description": "Hide and show additional content.",
|
||||
"keywords": [ "disclosure", "summary", "hide" ],
|
||||
"keywords": [ "accordion", "summary", "toggle", "disclosure" ],
|
||||
"textdomain": "default",
|
||||
"attributes": {
|
||||
"showContent": {
|
||||
@@ -13,7 +13,9 @@
|
||||
"default": false
|
||||
},
|
||||
"summary": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"source": "html",
|
||||
"selector": "summary"
|
||||
}
|
||||
},
|
||||
"supports": {
|
||||
@@ -35,6 +37,7 @@
|
||||
"spacing": {
|
||||
"margin": true,
|
||||
"padding": true,
|
||||
"blockGap": true,
|
||||
"__experimentalDefaultControls": {
|
||||
"margin": false,
|
||||
"padding": false
|
||||
@@ -52,6 +55,9 @@
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
},
|
||||
"layout": {
|
||||
"allowEditing": false
|
||||
}
|
||||
},
|
||||
"editorStyle": "wp-block-details-editor",
|
||||
|
||||
@@ -5,13 +5,4 @@
|
||||
|
||||
.wp-block-details summary{
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
.wp-block-details>:not(summary){
|
||||
margin-block-end:0;
|
||||
margin-block-start:var(--wp--style--block-gap);
|
||||
}
|
||||
|
||||
.wp-block-details>:last-child{
|
||||
margin-bottom:0;
|
||||
}
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-details{box-sizing:border-box;overflow:hidden}.wp-block-details summary{cursor:pointer}.wp-block-details>:not(summary){margin-block-end:0;margin-block-start:var(--wp--style--block-gap)}.wp-block-details>:last-child{margin-bottom:0}
|
||||
.wp-block-details{box-sizing:border-box;overflow:hidden}.wp-block-details summary{cursor:pointer}
|
||||
@@ -5,13 +5,4 @@
|
||||
|
||||
.wp-block-details summary{
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
.wp-block-details>:not(summary){
|
||||
margin-block-end:0;
|
||||
margin-block-start:var(--wp--style--block-gap);
|
||||
}
|
||||
|
||||
.wp-block-details>:last-child{
|
||||
margin-bottom:0;
|
||||
}
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-details{box-sizing:border-box;overflow:hidden}.wp-block-details summary{cursor:pointer}.wp-block-details>:not(summary){margin-block-end:0;margin-block-start:var(--wp--style--block-gap)}.wp-block-details>:last-child{margin-bottom:0}
|
||||
.wp-block-details{box-sizing:border-box;overflow:hidden}.wp-block-details summary{cursor:pointer}
|
||||
@@ -5,25 +5,8 @@
|
||||
* @package WordPress
|
||||
*/
|
||||
|
||||
if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
|
||||
/**
|
||||
* Replaces view script for the File block with version using Interactivity API.
|
||||
*
|
||||
* @param array $metadata Block metadata as read in via block.json.
|
||||
*
|
||||
* @return array Filtered block type metadata.
|
||||
*/
|
||||
function gutenberg_block_core_file_update_interactive_view_script( $metadata ) {
|
||||
if ( 'core/file' === $metadata['name'] ) {
|
||||
$metadata['viewScript'] = array( 'file:./interactivity.min.js' );
|
||||
}
|
||||
return $metadata;
|
||||
}
|
||||
add_filter( 'block_type_metadata', 'gutenberg_block_core_file_update_interactive_view_script', 10, 1 );
|
||||
}
|
||||
|
||||
/**
|
||||
* When the `core/file` block is rendering, check if we need to enqueue the `'wp-block-file-view` script.
|
||||
* When the `core/file` block is rendering, check if we need to enqueue the `wp-block-file-view` script.
|
||||
*
|
||||
* @param array $attributes The block attributes.
|
||||
* @param string $content The block content.
|
||||
@@ -71,7 +54,7 @@ function render_block_core_file( $attributes, $content, $block ) {
|
||||
);
|
||||
|
||||
// If it uses the Interactivity API, add the directives.
|
||||
if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN && $should_load_view_script ) {
|
||||
if ( $should_load_view_script ) {
|
||||
$processor = new WP_HTML_Tag_Processor( $content );
|
||||
$processor->next_tag();
|
||||
$processor->set_attribute( 'data-wp-interactive', '' );
|
||||
@@ -84,6 +67,25 @@ function render_block_core_file( $attributes, $content, $block ) {
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that the view script has the `wp-interactivity` dependency.
|
||||
*
|
||||
* @since 6.4.0
|
||||
*
|
||||
* @global WP_Scripts $wp_scripts
|
||||
*/
|
||||
function block_core_file_ensure_interactivity_dependency() {
|
||||
global $wp_scripts;
|
||||
if (
|
||||
isset( $wp_scripts->registered['wp-block-file-view'] ) &&
|
||||
! in_array( 'wp-interactivity', $wp_scripts->registered['wp-block-file-view']->deps, true )
|
||||
) {
|
||||
$wp_scripts->registered['wp-block-file-view']->deps[] = 'wp-interactivity';
|
||||
}
|
||||
}
|
||||
|
||||
add_action( 'wp_print_scripts', 'block_core_file_ensure_interactivity_dependency' );
|
||||
|
||||
/**
|
||||
* Registers the `core/file` block on server.
|
||||
*/
|
||||
|
||||
@@ -57,6 +57,10 @@
|
||||
"supports": {
|
||||
"anchor": true,
|
||||
"align": true,
|
||||
"spacing": {
|
||||
"margin": true,
|
||||
"padding": true
|
||||
},
|
||||
"color": {
|
||||
"gradients": true,
|
||||
"link": true,
|
||||
@@ -65,7 +69,8 @@
|
||||
"background": true,
|
||||
"link": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"interactivity": true
|
||||
},
|
||||
"viewScript": "file:./view.min.js",
|
||||
"editorStyle": "wp-block-file-editor",
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
.wp-block-file{
|
||||
box-sizing:border-box;
|
||||
}
|
||||
.wp-block-file:not(.wp-element-button){
|
||||
font-size:.8em;
|
||||
}
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-file:not(.wp-element-button){font-size:.8em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file *+.wp-block-file__button{margin-right:.75em}:where(.wp-block-file){margin-bottom:1.5em}.wp-block-file__embed{margin-bottom:1em}:where(.wp-block-file__button){border-radius:2em;display:inline-block;padding:.5em 1em}:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}
|
||||
.wp-block-file{box-sizing:border-box}.wp-block-file:not(.wp-element-button){font-size:.8em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file *+.wp-block-file__button{margin-right:.75em}:where(.wp-block-file){margin-bottom:1.5em}.wp-block-file__embed{margin-bottom:1em}:where(.wp-block-file__button){border-radius:2em;display:inline-block;padding:.5em 1em}:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}
|
||||
@@ -1,3 +1,6 @@
|
||||
.wp-block-file{
|
||||
box-sizing:border-box;
|
||||
}
|
||||
.wp-block-file:not(.wp-element-button){
|
||||
font-size:.8em;
|
||||
}
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.wp-block-file:not(.wp-element-button){font-size:.8em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file *+.wp-block-file__button{margin-left:.75em}:where(.wp-block-file){margin-bottom:1.5em}.wp-block-file__embed{margin-bottom:1em}:where(.wp-block-file__button){border-radius:2em;display:inline-block;padding:.5em 1em}:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}
|
||||
.wp-block-file{box-sizing:border-box}.wp-block-file:not(.wp-element-button){font-size:.8em}.wp-block-file.aligncenter{text-align:center}.wp-block-file.alignright{text-align:right}.wp-block-file *+.wp-block-file__button{margin-left:.75em}:where(.wp-block-file){margin-bottom:1.5em}.wp-block-file__embed{margin-bottom:1em}:where(.wp-block-file__button){border-radius:2em;display:inline-block;padding:.5em 1em}:where(.wp-block-file__button):is(a):active,:where(.wp-block-file__button):is(a):focus,:where(.wp-block-file__button):is(a):hover,:where(.wp-block-file__button):is(a):visited{box-shadow:none;color:#fff;opacity:.85;text-decoration:none}
|
||||
@@ -1 +1 @@
|
||||
<?php return array('dependencies' => array(), 'version' => '4d04e0384ecd085abe4c');
|
||||
<?php return array('dependencies' => array(), 'version' => '3fd0154de23a0ecc28af');
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
/******/ (function() { // webpackBootstrap
|
||||
/******/ "use strict";
|
||||
var __webpack_exports__ = {};
|
||||
"use strict";
|
||||
(self["__WordPressPrivateInteractivityAPI__"] = self["__WordPressPrivateInteractivityAPI__"] || []).push([[81],{
|
||||
|
||||
/***/ 149:
|
||||
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
|
||||
|
||||
|
||||
// EXTERNAL MODULE: ./node_modules/@wordpress/interactivity/src/index.js + 15 modules
|
||||
var src = __webpack_require__(754);
|
||||
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/file/utils/index.js
|
||||
/**
|
||||
* Uses a combination of user agent matching and feature detection to determine whether
|
||||
@@ -13,25 +18,25 @@ const browserSupportsPdfs = () => {
|
||||
// Most mobile devices include "Mobi" in their UA.
|
||||
if (window.navigator.userAgent.indexOf('Mobi') > -1) {
|
||||
return false;
|
||||
} // Android tablets are the noteable exception.
|
||||
|
||||
}
|
||||
|
||||
// Android tablets are the noteable exception.
|
||||
if (window.navigator.userAgent.indexOf('Android') > -1) {
|
||||
return false;
|
||||
} // iPad pretends to be a Mac.
|
||||
|
||||
|
||||
if (window.navigator.userAgent.indexOf('Macintosh') > -1 && window.navigator.maxTouchPoints && window.navigator.maxTouchPoints > 2) {
|
||||
return false;
|
||||
} // IE only supports PDFs when there's an ActiveX object available for it.
|
||||
|
||||
|
||||
if (!!(window.ActiveXObject || 'ActiveXObject' in window) && !(createActiveXObject('AcroPDF.PDF') || createActiveXObject('PDF.PdfCtrl'))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// iPad pretends to be a Mac.
|
||||
if (window.navigator.userAgent.indexOf('Macintosh') > -1 && window.navigator.maxTouchPoints && window.navigator.maxTouchPoints > 2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// IE only supports PDFs when there's an ActiveX object available for it.
|
||||
if (!!(window.ActiveXObject || 'ActiveXObject' in window) && !(createActiveXObject('AcroPDF.PDF') || createActiveXObject('PDF.PdfCtrl'))) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* Helper function for creating ActiveX objects, catching any errors that are thrown
|
||||
* when it's generated.
|
||||
@@ -39,39 +44,39 @@ const browserSupportsPdfs = () => {
|
||||
* @param {string} type The name of the ActiveX object to create.
|
||||
* @return {window.ActiveXObject|undefined} The generated ActiveXObject, or null if it failed.
|
||||
*/
|
||||
|
||||
const createActiveXObject = type => {
|
||||
let ax;
|
||||
|
||||
try {
|
||||
ax = new window.ActiveXObject(type);
|
||||
} catch (e) {
|
||||
ax = undefined;
|
||||
}
|
||||
|
||||
return ax;
|
||||
};
|
||||
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/file/view.js
|
||||
/**
|
||||
* Hides all .wp-block-file__embed elements on the document. This function is only intended
|
||||
* to be run on the front-end, it may have weird side effects running in the block editor.
|
||||
* WordPress dependencies
|
||||
*/
|
||||
|
||||
|
||||
const hidePdfEmbedsOnUnsupportedBrowsers = () => {
|
||||
if (!browserSupportsPdfs()) {
|
||||
const embeds = document.getElementsByClassName('wp-block-file__embed');
|
||||
Array.from(embeds).forEach(embed => {
|
||||
embed.style.display = 'none';
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
;// CONCATENATED MODULE: ./node_modules/@wordpress/block-library/build-module/file/view.js
|
||||
/**
|
||||
* Internal dependencies
|
||||
*/
|
||||
|
||||
document.addEventListener('DOMContentLoaded', hidePdfEmbedsOnUnsupportedBrowsers);
|
||||
(0,src/* store */.h)({
|
||||
selectors: {
|
||||
core: {
|
||||
file: {
|
||||
hasPdfPreview: browserSupportsPdfs
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/******/ })()
|
||||
;
|
||||
/***/ })
|
||||
|
||||
},
|
||||
/******/ function(__webpack_require__) { // webpackRuntimeModules
|
||||
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
|
||||
/******/ var __webpack_exports__ = (__webpack_exec__(149));
|
||||
/******/ }
|
||||
]);
|
||||
@@ -1 +1 @@
|
||||
<?php return array('dependencies' => array(), 'version' => '9d287166f699a66eff3b');
|
||||
<?php return array('dependencies' => array(), 'version' => '8a0237493a27c0d781aa');
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
!function(){"use strict";const n=n=>{let t;try{t=new window.ActiveXObject(n)}catch(n){t=void 0}return t};document.addEventListener("DOMContentLoaded",(()=>{if(window.navigator.userAgent.indexOf("Mobi")>-1||window.navigator.userAgent.indexOf("Android")>-1||window.navigator.userAgent.indexOf("Macintosh")>-1&&window.navigator.maxTouchPoints&&window.navigator.maxTouchPoints>2||(window.ActiveXObject||"ActiveXObject"in window)&&!n("AcroPDF.PDF")&&!n("PDF.PdfCtrl")){const n=document.getElementsByClassName("wp-block-file__embed");Array.from(n).forEach((n=>{n.style.display="none"}))}}))}();
|
||||
"use strict";(self.__WordPressPrivateInteractivityAPI__=self.__WordPressPrivateInteractivityAPI__||[]).push([[81],{149:function(i,t,e){var n=e(754);const o=i=>{let t;try{t=new window.ActiveXObject(i)}catch(i){t=void 0}return t};(0,n.h)({selectors:{core:{file:{hasPdfPreview:()=>!(window.navigator.userAgent.indexOf("Mobi")>-1)&&(!(window.navigator.userAgent.indexOf("Android")>-1)&&(!(window.navigator.userAgent.indexOf("Macintosh")>-1&&window.navigator.maxTouchPoints&&window.navigator.maxTouchPoints>2)&&!((window.ActiveXObject||"ActiveXObject"in window)&&!o("AcroPDF.PDF")&&!o("PDF.PdfCtrl"))))}}}})}},function(i){var t;t=149,i(i.s=t)}]);
|
||||
@@ -34,20 +34,25 @@ function render_block_core_footnotes( $attributes, $content, $block ) {
|
||||
|
||||
$footnotes = json_decode( $footnotes, true );
|
||||
|
||||
if ( count( $footnotes ) === 0 ) {
|
||||
if ( ! is_array( $footnotes ) || count( $footnotes ) === 0 ) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$wrapper_attributes = get_block_wrapper_attributes();
|
||||
$footnote_index = 1;
|
||||
|
||||
$block_content = '';
|
||||
|
||||
foreach ( $footnotes as $footnote ) {
|
||||
// Translators: %d: Integer representing the number of return links on the page.
|
||||
$aria_label = sprintf( __( 'Jump to footnote reference %1$d' ), $footnote_index );
|
||||
$block_content .= sprintf(
|
||||
'<li id="%1$s">%2$s <a href="#%1$s-link">↩︎</a></li>',
|
||||
'<li id="%1$s">%2$s <a href="#%1$s-link" aria-label="%3$s">↩︎</a></li>',
|
||||
$footnote['id'],
|
||||
$footnote['content']
|
||||
$footnote['content'],
|
||||
$aria_label
|
||||
);
|
||||
++$footnote_index;
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
@@ -68,9 +73,10 @@ function register_block_core_footnotes() {
|
||||
$post_type,
|
||||
'footnotes',
|
||||
array(
|
||||
'show_in_rest' => true,
|
||||
'single' => true,
|
||||
'type' => 'string',
|
||||
'show_in_rest' => true,
|
||||
'single' => true,
|
||||
'type' => 'string',
|
||||
'revisions_enabled' => true,
|
||||
)
|
||||
);
|
||||
}
|
||||
@@ -84,107 +90,7 @@ function register_block_core_footnotes() {
|
||||
add_action( 'init', 'register_block_core_footnotes' );
|
||||
|
||||
/**
|
||||
* Saves the footnotes meta value to the revision.
|
||||
*
|
||||
* @since 6.3.0
|
||||
*
|
||||
* @param int $revision_id The revision ID.
|
||||
*/
|
||||
function wp_save_footnotes_meta( $revision_id ) {
|
||||
$post_id = wp_is_post_revision( $revision_id );
|
||||
|
||||
if ( $post_id ) {
|
||||
$footnotes = get_post_meta( $post_id, 'footnotes', true );
|
||||
|
||||
if ( $footnotes ) {
|
||||
// Can't use update_post_meta() because it doesn't allow revisions.
|
||||
update_metadata( 'post', $revision_id, 'footnotes', $footnotes );
|
||||
}
|
||||
}
|
||||
}
|
||||
add_action( 'wp_after_insert_post', 'wp_save_footnotes_meta' );
|
||||
|
||||
/**
|
||||
* Keeps track of the revision ID for "rest_after_insert_{$post_type}".
|
||||
*
|
||||
* @since 6.3.0
|
||||
*
|
||||
* @global int $wp_temporary_footnote_revision_id The footnote revision ID.
|
||||
*
|
||||
* @param int $revision_id The revision ID.
|
||||
*/
|
||||
function wp_keep_footnotes_revision_id( $revision_id ) {
|
||||
global $wp_temporary_footnote_revision_id;
|
||||
$wp_temporary_footnote_revision_id = $revision_id;
|
||||
}
|
||||
add_action( '_wp_put_post_revision', 'wp_keep_footnotes_revision_id' );
|
||||
|
||||
/**
|
||||
* This is a specific fix for the REST API. The REST API doesn't update
|
||||
* the post and post meta in one go (through `meta_input`). While it
|
||||
* does fix the `wp_after_insert_post` hook to be called correctly after
|
||||
* updating meta, it does NOT fix hooks such as post_updated and
|
||||
* save_post, which are normally also fired after post meta is updated
|
||||
* in `wp_insert_post()`. Unfortunately, `wp_save_post_revision` is
|
||||
* added to the `post_updated` action, which means the meta is not
|
||||
* available at the time, so we have to add it afterwards through the
|
||||
* `"rest_after_insert_{$post_type}"` action.
|
||||
*
|
||||
* @since 6.3.0
|
||||
*
|
||||
* @global int $wp_temporary_footnote_revision_id The footnote revision ID.
|
||||
*
|
||||
* @param WP_Post $post The post object.
|
||||
*/
|
||||
function wp_add_footnotes_revisions_to_post_meta( $post ) {
|
||||
global $wp_temporary_footnote_revision_id;
|
||||
|
||||
if ( $wp_temporary_footnote_revision_id ) {
|
||||
$revision = get_post( $wp_temporary_footnote_revision_id );
|
||||
|
||||
if ( ! $revision ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$post_id = $revision->post_parent;
|
||||
|
||||
// Just making sure we're updating the right revision.
|
||||
if ( $post->ID === $post_id ) {
|
||||
$footnotes = get_post_meta( $post_id, 'footnotes', true );
|
||||
|
||||
if ( $footnotes ) {
|
||||
// Can't use update_post_meta() because it doesn't allow revisions.
|
||||
update_metadata( 'post', $wp_temporary_footnote_revision_id, 'footnotes', $footnotes );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ( array( 'post', 'page' ) as $post_type ) {
|
||||
add_action( "rest_after_insert_{$post_type}", 'wp_add_footnotes_revisions_to_post_meta' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Restores the footnotes meta value from the revision.
|
||||
*
|
||||
* @since 6.3.0
|
||||
*
|
||||
* @param int $post_id The post ID.
|
||||
* @param int $revision_id The revision ID.
|
||||
*/
|
||||
function wp_restore_footnotes_from_revision( $post_id, $revision_id ) {
|
||||
$footnotes = get_post_meta( $revision_id, 'footnotes', true );
|
||||
|
||||
if ( $footnotes ) {
|
||||
update_post_meta( $post_id, 'footnotes', $footnotes );
|
||||
} else {
|
||||
delete_post_meta( $post_id, 'footnotes' );
|
||||
}
|
||||
}
|
||||
add_action( 'wp_restore_post_revision', 'wp_restore_footnotes_from_revision', 10, 2 );
|
||||
|
||||
/**
|
||||
* Adds the footnotes field to the revision.
|
||||
* Adds the footnotes field to the revisions display.
|
||||
*
|
||||
* @since 6.3.0
|
||||
*
|
||||
@@ -198,7 +104,7 @@ function wp_add_footnotes_to_revision( $fields ) {
|
||||
add_filter( '_wp_post_revision_fields', 'wp_add_footnotes_to_revision' );
|
||||
|
||||
/**
|
||||
* Gets the footnotes field from the revision.
|
||||
* Gets the footnotes field from the revision for the revisions screen.
|
||||
*
|
||||
* @since 6.3.0
|
||||
*
|
||||
@@ -212,76 +118,3 @@ function wp_get_footnotes_from_revision( $revision_field, $field, $revision ) {
|
||||
return get_metadata( 'post', $revision->ID, $field, true );
|
||||
}
|
||||
add_filter( '_wp_post_revision_field_footnotes', 'wp_get_footnotes_from_revision', 10, 3 );
|
||||
|
||||
/**
|
||||
* The REST API autosave endpoint doesn't save meta, so we can use the
|
||||
* `wp_creating_autosave` when it updates an exiting autosave, and
|
||||
* `_wp_put_post_revision` when it creates a new autosave.
|
||||
*
|
||||
* @since 6.3.0
|
||||
*
|
||||
* @param int|array $autosave The autosave ID or array.
|
||||
*/
|
||||
function _wp_rest_api_autosave_meta( $autosave ) {
|
||||
// Ensure it's a REST API request.
|
||||
if ( ! defined( 'REST_REQUEST' ) || ! REST_REQUEST ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$body = rest_get_server()->get_raw_data();
|
||||
$body = json_decode( $body, true );
|
||||
|
||||
if ( ! isset( $body['meta']['footnotes'] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// `wp_creating_autosave` passes the array,
|
||||
// `_wp_put_post_revision` passes the ID.
|
||||
$id = is_int( $autosave ) ? $autosave : $autosave['ID'];
|
||||
|
||||
if ( ! $id ) {
|
||||
return;
|
||||
}
|
||||
|
||||
update_post_meta( $id, 'footnotes', $body['meta']['footnotes'] );
|
||||
}
|
||||
// See https://github.com/WordPress/wordpress-develop/blob/2103cb9966e57d452c94218bbc3171579b536a40/src/wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php#L391C1-L391C1.
|
||||
add_action( 'wp_creating_autosave', '_wp_rest_api_autosave_meta' );
|
||||
// See https://github.com/WordPress/wordpress-develop/blob/2103cb9966e57d452c94218bbc3171579b536a40/src/wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php#L398.
|
||||
// Then https://github.com/WordPress/wordpress-develop/blob/2103cb9966e57d452c94218bbc3171579b536a40/src/wp-includes/revision.php#L367.
|
||||
add_action( '_wp_put_post_revision', '_wp_rest_api_autosave_meta' );
|
||||
|
||||
/**
|
||||
* This is a workaround for the autosave endpoint returning early if the
|
||||
* revision field are equal. The problem is that "footnotes" is not real
|
||||
* revision post field, so there's nothing to compare against.
|
||||
*
|
||||
* This trick sets the "footnotes" field (value doesn't matter), which will
|
||||
* cause the autosave endpoint to always update the latest revision. That should
|
||||
* be fine, it should be ok to update the revision even if nothing changed. Of
|
||||
* course, this is temporary fix.
|
||||
*
|
||||
* @since 6.3.0
|
||||
*
|
||||
* @param WP_Post $prepared_post The prepared post object.
|
||||
* @param WP_REST_Request $request The request object.
|
||||
*
|
||||
* See https://github.com/WordPress/wordpress-develop/blob/2103cb9966e57d452c94218bbc3171579b536a40/src/wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php#L365-L384.
|
||||
* See https://github.com/WordPress/wordpress-develop/blob/2103cb9966e57d452c94218bbc3171579b536a40/src/wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php#L219.
|
||||
*/
|
||||
function _wp_rest_api_force_autosave_difference( $prepared_post, $request ) {
|
||||
// We only want to be altering POST requests.
|
||||
if ( $request->get_method() !== 'POST' ) {
|
||||
return $prepared_post;
|
||||
}
|
||||
|
||||
// Only alter requests for the '/autosaves' route.
|
||||
if ( substr( $request->get_route(), -strlen( '/autosaves' ) ) !== '/autosaves' ) {
|
||||
return $prepared_post;
|
||||
}
|
||||
|
||||
$prepared_post->footnotes = '[]';
|
||||
return $prepared_post;
|
||||
}
|
||||
|
||||
add_filter( 'rest_pre_insert_post', '_wp_rest_api_force_autosave_difference', 10, 2 );
|
||||
|
||||
@@ -9,9 +9,52 @@
|
||||
"textdomain": "default",
|
||||
"usesContext": [ "postId", "postType" ],
|
||||
"supports": {
|
||||
"__experimentalBorder": {
|
||||
"radius": true,
|
||||
"color": true,
|
||||
"width": true,
|
||||
"style": true,
|
||||
"__experimentalDefaultControls": {
|
||||
"radius": false,
|
||||
"color": false,
|
||||
"width": false,
|
||||
"style": false
|
||||
}
|
||||
},
|
||||
"color": {
|
||||
"background": true,
|
||||
"link": true,
|
||||
"text": true,
|
||||
"__experimentalDefaultControls": {
|
||||
"link": true,
|
||||
"text": true
|
||||
}
|
||||
},
|
||||
"html": false,
|
||||
"multiple": false,
|
||||
"reusable": false
|
||||
"reusable": false,
|
||||
"spacing": {
|
||||
"margin": true,
|
||||
"padding": true,
|
||||
"__experimentalDefaultControls": {
|
||||
"margin": false,
|
||||
"padding": false
|
||||
}
|
||||
},
|
||||
"typography": {
|
||||
"fontSize": true,
|
||||
"lineHeight": true,
|
||||
"__experimentalFontFamily": true,
|
||||
"__experimentalTextDecoration": true,
|
||||
"__experimentalFontStyle": true,
|
||||
"__experimentalFontWeight": true,
|
||||
"__experimentalLetterSpacing": true,
|
||||
"__experimentalTextTransform": true,
|
||||
"__experimentalWritingMode": true,
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"style": "wp-block-footnotes"
|
||||
}
|
||||
|
||||
@@ -301,27 +301,31 @@ div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{
|
||||
display:block;
|
||||
}
|
||||
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{
|
||||
height:50vh !important;
|
||||
}
|
||||
@media (min-width:960px){
|
||||
.block-editor-freeform-modal .components-modal__frame{
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){
|
||||
height:9999rem;
|
||||
}
|
||||
.block-editor-freeform-modal .components-modal__frame .components-modal__header+div{
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{
|
||||
height:100%;
|
||||
}
|
||||
.block-editor-freeform-modal .components-modal__frame .mce-tinymce{
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{
|
||||
height:calc(100% - 52px);
|
||||
}
|
||||
.block-editor-freeform-modal .components-modal__frame .mce-container-body{
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
height:100%;
|
||||
min-width:50vw;
|
||||
}
|
||||
.block-editor-freeform-modal .components-modal__frame .mce-edit-area{
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
flex-grow:1;
|
||||
}
|
||||
.block-editor-freeform-modal .components-modal__frame .mce-edit-area iframe{
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{
|
||||
flex-grow:1;
|
||||
height:10px !important;
|
||||
}
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -301,27 +301,31 @@ div[data-type="core/freeform"].is-selected .block-library-classic__toolbar{
|
||||
display:block;
|
||||
}
|
||||
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{
|
||||
height:50vh !important;
|
||||
}
|
||||
@media (min-width:960px){
|
||||
.block-editor-freeform-modal .components-modal__frame{
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content:not(.is-full-screen){
|
||||
height:9999rem;
|
||||
}
|
||||
.block-editor-freeform-modal .components-modal__frame .components-modal__header+div{
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content .components-modal__header+div{
|
||||
height:100%;
|
||||
}
|
||||
.block-editor-freeform-modal .components-modal__frame .mce-tinymce{
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-tinymce{
|
||||
height:calc(100% - 52px);
|
||||
}
|
||||
.block-editor-freeform-modal .components-modal__frame .mce-container-body{
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-container-body{
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
height:100%;
|
||||
min-width:50vw;
|
||||
}
|
||||
.block-editor-freeform-modal .components-modal__frame .mce-edit-area{
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area{
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
flex-grow:1;
|
||||
}
|
||||
.block-editor-freeform-modal .components-modal__frame .mce-edit-area iframe{
|
||||
.block-editor-freeform-modal .block-editor-freeform-modal__content .mce-edit-area iframe{
|
||||
flex-grow:1;
|
||||
height:10px !important;
|
||||
}
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -44,7 +44,7 @@ add_filter( 'render_block_data', 'block_core_gallery_data_id_backcompatibility'
|
||||
* @return string The content of the block being rendered.
|
||||
*/
|
||||
function block_core_gallery_render( $attributes, $content ) {
|
||||
$gap = _wp_array_get( $attributes, array( 'style', 'spacing', 'blockGap' ) );
|
||||
$gap = $attributes['style']['spacing']['blockGap'] ?? null;
|
||||
// Skip if gap value contains unsupported characters.
|
||||
// Regex for CSS value borrowed from `safecss_filter_attr`, and used here
|
||||
// because we only want to match against the value, not the CSS attribute.
|
||||
|
||||
@@ -61,10 +61,10 @@
|
||||
},
|
||||
"shortCodeTransforms": {
|
||||
"type": "array",
|
||||
"default": [],
|
||||
"items": {
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"default": []
|
||||
},
|
||||
"columns": {
|
||||
"type": "number",
|
||||
|
||||
@@ -22,13 +22,20 @@
|
||||
},
|
||||
"supports": {
|
||||
"__experimentalOnEnter": true,
|
||||
"__experimentalOnMerge": true,
|
||||
"__experimentalSettings": true,
|
||||
"__experimentalMetadata": true,
|
||||
"align": [ "wide", "full" ],
|
||||
"anchor": true,
|
||||
"ariaLabel": true,
|
||||
"html": false,
|
||||
"background": {
|
||||
"backgroundImage": true
|
||||
},
|
||||
"color": {
|
||||
"gradients": true,
|
||||
"heading": true,
|
||||
"button": true,
|
||||
"link": true,
|
||||
"__experimentalDefaultControls": {
|
||||
"background": true,
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
"__experimentalLetterSpacing": true,
|
||||
"__experimentalTextTransform": true,
|
||||
"__experimentalTextDecoration": true,
|
||||
"__experimentalWritingMode": true,
|
||||
"__experimentalDefaultControls": {
|
||||
"fontSize": true,
|
||||
"fontAppearance": true,
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{
|
||||
padding:1.25em 2.375em;
|
||||
}
|
||||
h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){
|
||||
rotate:180deg;
|
||||
}
|
||||
+1
-1
@@ -1 +1 @@
|
||||
h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{padding:1.25em 2.375em}
|
||||
h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}
|
||||
@@ -1,3 +1,6 @@
|
||||
h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{
|
||||
padding:1.25em 2.375em;
|
||||
}
|
||||
h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){
|
||||
rotate:180deg;
|
||||
}
|
||||
+1
-1
@@ -1 +1 @@
|
||||
h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{padding:1.25em 2.375em}
|
||||
h1.has-background,h2.has-background,h3.has-background,h4.has-background,h5.has-background,h6.has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}
|
||||
@@ -98,8 +98,15 @@ function block_core_home_link_build_li_wrapper_attributes( $context ) {
|
||||
$colors['css_classes'],
|
||||
$font_sizes['css_classes']
|
||||
);
|
||||
$classes[] = 'wp-block-navigation-item';
|
||||
$style_attribute = ( $colors['inline_styles'] . $font_sizes['inline_styles'] );
|
||||
$classes[] = 'wp-block-navigation-item';
|
||||
|
||||
if ( is_front_page() ) {
|
||||
$classes[] = 'current-menu-item';
|
||||
} elseif ( is_home() && ( (int) get_option( 'page_for_posts' ) !== get_queried_object_id() ) ) {
|
||||
// Edge case where the Reading settings has a posts page set but not a static homepage.
|
||||
$classes[] = 'current-menu-item';
|
||||
}
|
||||
|
||||
$wrapper_attributes = get_block_wrapper_attributes(
|
||||
array(
|
||||
@@ -124,8 +131,14 @@ function render_block_core_home_link( $attributes, $content, $block ) {
|
||||
if ( empty( $attributes['label'] ) ) {
|
||||
return '';
|
||||
}
|
||||
$aria_current = '';
|
||||
|
||||
$aria_current = is_home() || ( is_front_page() && 'page' === get_option( 'show_on_front' ) ) ? ' aria-current="page"' : '';
|
||||
if ( is_front_page() ) {
|
||||
$aria_current = ' aria-current="page"';
|
||||
} elseif ( is_home() && ( (int) get_option( 'page_for_posts' ) !== get_queried_object_id() ) ) {
|
||||
// Edge case where the Reading settings has a posts page set but not a static homepage.
|
||||
$aria_current = ' aria-current="page"';
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
'<li %1$s><a class="wp-block-home-link__content wp-block-navigation-item__content" href="%2$s" rel="home"%3$s>%4$s</a></li>',
|
||||
|
||||
@@ -9,16 +9,20 @@
|
||||
* Renders the `core/image` block on the server,
|
||||
* adding a data-id attribute to the element if core/gallery has added on pre-render.
|
||||
*
|
||||
* @param array $attributes The block attributes.
|
||||
* @param string $content The block content.
|
||||
* @return string Returns the block content with the data-id attribute added.
|
||||
* @param array $attributes The block attributes.
|
||||
* @param string $content The block content.
|
||||
* @param WP_Block $block The block object.
|
||||
*
|
||||
* @return string The block content with the data-id attribute added.
|
||||
*/
|
||||
function render_block_core_image( $attributes, $content ) {
|
||||
function render_block_core_image( $attributes, $content, $block ) {
|
||||
if ( false === stripos( $content, '<img' ) ) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$processor = new WP_HTML_Tag_Processor( $content );
|
||||
$processor->next_tag( 'img' );
|
||||
|
||||
if ( $processor->get_attribute( 'src' ) === null ) {
|
||||
if ( ! $processor->next_tag( 'img' ) || null === $processor->get_attribute( 'src' ) ) {
|
||||
return '';
|
||||
}
|
||||
|
||||
@@ -30,14 +34,328 @@ function render_block_core_image( $attributes, $content ) {
|
||||
$processor->set_attribute( 'data-id', $attributes['data-id'] );
|
||||
}
|
||||
|
||||
$link_destination = isset( $attributes['linkDestination'] ) ? $attributes['linkDestination'] : 'none';
|
||||
$lightbox_settings = block_core_image_get_lightbox_settings( $block->parsed_block );
|
||||
|
||||
$view_js_file_handle = 'wp-block-image-view';
|
||||
$script_handles = $block->block_type->view_script_handles;
|
||||
|
||||
/*
|
||||
* If the lightbox is enabled and the image is not linked, add the filter
|
||||
* and the JavaScript view file.
|
||||
*/
|
||||
if (
|
||||
isset( $lightbox_settings ) &&
|
||||
'none' === $link_destination &&
|
||||
isset( $lightbox_settings['enabled'] ) &&
|
||||
true === $lightbox_settings['enabled']
|
||||
) {
|
||||
$block->block_type->supports['interactivity'] = true;
|
||||
|
||||
if ( ! in_array( $view_js_file_handle, $script_handles, true ) ) {
|
||||
$block->block_type->view_script_handles = array_merge( $script_handles, array( $view_js_file_handle ) );
|
||||
}
|
||||
|
||||
/*
|
||||
* This render needs to happen in a filter with priority 15 to ensure
|
||||
* that it runs after the duotone filter and that duotone styles are
|
||||
* applied to the image in the lightbox. We also need to ensure that the
|
||||
* lightbox works with any plugins that might use filters as well. We
|
||||
* can consider removing this in the future if the way the blocks are
|
||||
* rendered changes, or if a new kind of filter is introduced.
|
||||
*/
|
||||
add_filter( 'render_block_core/image', 'block_core_image_render_lightbox', 15, 2 );
|
||||
} else {
|
||||
/*
|
||||
* Remove the filter and the JavaScript view file if previously added by
|
||||
* other Image blocks.
|
||||
*/
|
||||
remove_filter( 'render_block_core/image', 'block_core_image_render_lightbox', 15 );
|
||||
// If the script is not needed, and it is still in the `view_script_handles`, remove it.
|
||||
if ( in_array( $view_js_file_handle, $script_handles, true ) ) {
|
||||
$block->block_type->view_script_handles = array_diff( $script_handles, array( $view_js_file_handle ) );
|
||||
}
|
||||
}
|
||||
|
||||
return $processor->get_updated_html();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the lightboxEnabled flag to the block data.
|
||||
*
|
||||
* This is used to determine whether the lightbox should be rendered or not.
|
||||
*
|
||||
* @param array $block Block data.
|
||||
*
|
||||
* @return array Filtered block data.
|
||||
*/
|
||||
function block_core_image_get_lightbox_settings( $block ) {
|
||||
// Get the lightbox setting from the block attributes.
|
||||
if ( isset( $block['attrs']['lightbox'] ) ) {
|
||||
$lightbox_settings = $block['attrs']['lightbox'];
|
||||
// If the lightbox setting is not set in the block attributes,
|
||||
// check the legacy lightbox settings that are set using the
|
||||
// `gutenberg_should_render_lightbox` filter.
|
||||
// We can remove this elseif statement when the legacy lightbox settings are removed.
|
||||
} elseif ( isset( $block['legacyLightboxSettings'] ) ) {
|
||||
$lightbox_settings = $block['legacyLightboxSettings'];
|
||||
}
|
||||
|
||||
if ( ! isset( $lightbox_settings ) ) {
|
||||
$lightbox_settings = wp_get_global_settings( array( 'lightbox' ), array( 'block_name' => 'core/image' ) );
|
||||
|
||||
// If not present in global settings, check the top-level global settings.
|
||||
//
|
||||
// NOTE: If no block-level settings are found, the previous call to
|
||||
// `wp_get_global_settings` will return the whole `theme.json`
|
||||
// structure in which case we can check if the "lightbox" key is present at
|
||||
// the top-level of the global settings and use its value.
|
||||
if ( isset( $lightbox_settings['lightbox'] ) ) {
|
||||
$lightbox_settings = wp_get_global_settings( array( 'lightbox' ) );
|
||||
}
|
||||
}
|
||||
|
||||
return $lightbox_settings ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the directives and layout needed for the lightbox behavior.
|
||||
*
|
||||
* @param string $block_content Rendered block content.
|
||||
* @param array $block Block object.
|
||||
*
|
||||
* @return string Filtered block content.
|
||||
*/
|
||||
function block_core_image_render_lightbox( $block_content, $block ) {
|
||||
/*
|
||||
* If it's not possible that an IMG element exists then return the given
|
||||
* block content as-is. It may be that there's no actual image in the block
|
||||
* or it could be that another plugin already modified this HTML.
|
||||
*/
|
||||
if ( false === stripos( $block_content, '<img' ) ) {
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
$processor = new WP_HTML_Tag_Processor( $block_content );
|
||||
|
||||
$aria_label = __( 'Enlarge image' );
|
||||
|
||||
/*
|
||||
* If there's definitely no IMG element in the block then return the given
|
||||
* block content as-is. There's nothing that this code can knowingly modify
|
||||
* to add the lightbox behavior.
|
||||
*/
|
||||
if ( ! $processor->next_tag( 'img' ) ) {
|
||||
return $block_content;
|
||||
}
|
||||
|
||||
$alt_attribute = $processor->get_attribute( 'alt' );
|
||||
|
||||
// An empty alt attribute `alt=""` is valid for decorative images.
|
||||
if ( is_string( $alt_attribute ) ) {
|
||||
$alt_attribute = trim( $alt_attribute );
|
||||
}
|
||||
|
||||
// It only makes sense to append the alt text to the button aria-label when the alt text is non-empty.
|
||||
if ( $alt_attribute ) {
|
||||
/* translators: %s: Image alt text. */
|
||||
$aria_label = sprintf( __( 'Enlarge image: %s' ), $alt_attribute );
|
||||
}
|
||||
|
||||
// Currently, we are only enabling the zoom animation.
|
||||
$lightbox_animation = 'zoom';
|
||||
|
||||
// Note: We want to store the `src` in the context so we
|
||||
// can set it dynamically when the lightbox is opened.
|
||||
if ( isset( $block['attrs']['id'] ) ) {
|
||||
$img_uploaded_src = wp_get_attachment_url( $block['attrs']['id'] );
|
||||
$img_metadata = wp_get_attachment_metadata( $block['attrs']['id'] );
|
||||
$img_width = $img_metadata['width'] ?? 'none';
|
||||
$img_height = $img_metadata['height'] ?? 'none';
|
||||
} else {
|
||||
$img_uploaded_src = $processor->get_attribute( 'src' );
|
||||
$img_width = 'none';
|
||||
$img_height = 'none';
|
||||
}
|
||||
|
||||
if ( isset( $block['attrs']['scale'] ) ) {
|
||||
$scale_attr = $block['attrs']['scale'];
|
||||
} else {
|
||||
$scale_attr = false;
|
||||
}
|
||||
|
||||
$w = new WP_HTML_Tag_Processor( $block_content );
|
||||
$w->next_tag( 'figure' );
|
||||
$w->add_class( 'wp-lightbox-container' );
|
||||
$w->set_attribute( 'data-wp-interactive', true );
|
||||
|
||||
$w->set_attribute(
|
||||
'data-wp-context',
|
||||
sprintf(
|
||||
'{ "core":
|
||||
{ "image":
|
||||
{ "imageLoaded": false,
|
||||
"initialized": false,
|
||||
"lightboxEnabled": false,
|
||||
"hideAnimationEnabled": false,
|
||||
"preloadInitialized": false,
|
||||
"lightboxAnimation": "%s",
|
||||
"imageUploadedSrc": "%s",
|
||||
"imageCurrentSrc": "",
|
||||
"targetWidth": "%s",
|
||||
"targetHeight": "%s",
|
||||
"scaleAttr": "%s",
|
||||
"dialogLabel": "%s"
|
||||
}
|
||||
}
|
||||
}',
|
||||
$lightbox_animation,
|
||||
$img_uploaded_src,
|
||||
$img_width,
|
||||
$img_height,
|
||||
$scale_attr,
|
||||
__( 'Enlarged image' )
|
||||
)
|
||||
);
|
||||
$w->next_tag( 'img' );
|
||||
$w->set_attribute( 'data-wp-init', 'effects.core.image.initOriginImage' );
|
||||
$w->set_attribute( 'data-wp-on--load', 'actions.core.image.handleLoad' );
|
||||
$w->set_attribute( 'data-wp-effect', 'effects.core.image.setButtonStyles' );
|
||||
// We need to set an event callback on the `img` specifically
|
||||
// because the `figure` element can also contain a caption, and
|
||||
// we don't want to trigger the lightbox when the caption is clicked.
|
||||
$w->set_attribute( 'data-wp-on--click', 'actions.core.image.showLightbox' );
|
||||
$w->set_attribute( 'data-wp-effect--setStylesOnResize', 'effects.core.image.setStylesOnResize' );
|
||||
$body_content = $w->get_updated_html();
|
||||
|
||||
// Add a button alongside image in the body content.
|
||||
$img = null;
|
||||
preg_match( '/<img[^>]+>/', $body_content, $img );
|
||||
|
||||
$button =
|
||||
$img[0]
|
||||
. '<button
|
||||
class="lightbox-trigger"
|
||||
type="button"
|
||||
aria-haspopup="dialog"
|
||||
aria-label="' . esc_attr( $aria_label ) . '"
|
||||
data-wp-on--click="actions.core.image.showLightbox"
|
||||
data-wp-style--right="context.core.image.imageButtonRight"
|
||||
data-wp-style--top="context.core.image.imageButtonTop"
|
||||
>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
|
||||
<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
|
||||
</svg>
|
||||
</button>';
|
||||
|
||||
$body_content = preg_replace( '/<img[^>]+>/', $button, $body_content );
|
||||
|
||||
// We need both a responsive image and an enlarged image to animate
|
||||
// the zoom seamlessly on slow internet connections; the responsive
|
||||
// image is a copy of the one in the body, which animates immediately
|
||||
// as the lightbox is opened, while the enlarged one is a full-sized
|
||||
// version that will likely still be loading as the animation begins.
|
||||
$m = new WP_HTML_Tag_Processor( $block_content );
|
||||
$m->next_tag( 'figure' );
|
||||
$m->add_class( 'responsive-image' );
|
||||
$m->next_tag( 'img' );
|
||||
// We want to set the 'src' attribute to an empty string in the responsive image
|
||||
// because otherwise, as of this writing, the wp_filter_content_tags() function in
|
||||
// WordPress will automatically add a 'srcset' attribute to the image, which will at
|
||||
// times cause the incorrectly sized image to be loaded in the lightbox on Firefox.
|
||||
// Because of this, we bind the 'src' attribute explicitly the current src to reliably
|
||||
// use the exact same image as in the content when the lightbox is first opened while
|
||||
// we wait for the larger image to load.
|
||||
$m->set_attribute( 'src', '' );
|
||||
$m->set_attribute( 'data-wp-bind--src', 'context.core.image.imageCurrentSrc' );
|
||||
$m->set_attribute( 'data-wp-style--object-fit', 'selectors.core.image.lightboxObjectFit' );
|
||||
$initial_image_content = $m->get_updated_html();
|
||||
|
||||
$q = new WP_HTML_Tag_Processor( $block_content );
|
||||
$q->next_tag( 'figure' );
|
||||
$q->add_class( 'enlarged-image' );
|
||||
$q->next_tag( 'img' );
|
||||
|
||||
// We set the 'src' attribute to an empty string to prevent the browser from loading the image
|
||||
// on initial page load, then bind the attribute to a selector that returns the full-sized image src when
|
||||
// the lightbox is opened. We could use 'loading=lazy' in combination with the 'hidden' attribute to
|
||||
// accomplish the same behavior, but that approach breaks progressive loading of the image in Safari
|
||||
// and Chrome (see https://github.com/WordPress/gutenberg/pull/52765#issuecomment-1674008151). Until that
|
||||
// is resolved, manually setting the 'src' seems to be the best solution to load the large image on demand.
|
||||
$q->set_attribute( 'src', '' );
|
||||
$q->set_attribute( 'data-wp-bind--src', 'selectors.core.image.enlargedImgSrc' );
|
||||
$q->set_attribute( 'data-wp-style--object-fit', 'selectors.core.image.lightboxObjectFit' );
|
||||
$enlarged_image_content = $q->get_updated_html();
|
||||
|
||||
// If the current theme does NOT have a `theme.json`, or the colors are not defined,
|
||||
// we need to set the background color & close button color to some default values
|
||||
// because we can't get them from the Global Styles.
|
||||
$background_color = '#fff';
|
||||
$close_button_color = '#000';
|
||||
if ( wp_theme_has_theme_json() ) {
|
||||
$global_styles_color = wp_get_global_styles( array( 'color' ) );
|
||||
if ( ! empty( $global_styles_color['background'] ) ) {
|
||||
$background_color = esc_attr( $global_styles_color['background'] );
|
||||
}
|
||||
if ( ! empty( $global_styles_color['text'] ) ) {
|
||||
$close_button_color = esc_attr( $global_styles_color['text'] );
|
||||
}
|
||||
}
|
||||
|
||||
$close_button_icon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" aria-hidden="true" focusable="false"><path d="M13 11.8l6.1-6.3-1-1-6.1 6.2-6.1-6.2-1 1 6.1 6.3-6.5 6.7 1 1 6.5-6.6 6.5 6.6 1-1z"></path></svg>';
|
||||
$close_button_label = esc_attr__( 'Close' );
|
||||
|
||||
$lightbox_html = <<<HTML
|
||||
<div data-wp-body="" class="wp-lightbox-overlay $lightbox_animation"
|
||||
data-wp-bind--role="selectors.core.image.roleAttribute"
|
||||
data-wp-bind--aria-label="selectors.core.image.dialogLabel"
|
||||
data-wp-class--initialized="context.core.image.initialized"
|
||||
data-wp-class--active="context.core.image.lightboxEnabled"
|
||||
data-wp-class--hideAnimationEnabled="context.core.image.hideAnimationEnabled"
|
||||
data-wp-bind--aria-modal="selectors.core.image.ariaModal"
|
||||
data-wp-effect="effects.core.image.initLightbox"
|
||||
data-wp-on--keydown="actions.core.image.handleKeydown"
|
||||
data-wp-on--touchstart="actions.core.image.handleTouchStart"
|
||||
data-wp-on--touchmove="actions.core.image.handleTouchMove"
|
||||
data-wp-on--touchend="actions.core.image.handleTouchEnd"
|
||||
data-wp-on--click="actions.core.image.hideLightbox"
|
||||
tabindex="-1"
|
||||
>
|
||||
<button type="button" aria-label="$close_button_label" style="fill: $close_button_color" class="close-button" data-wp-on--click="actions.core.image.hideLightbox">
|
||||
$close_button_icon
|
||||
</button>
|
||||
<div class="lightbox-image-container">$initial_image_content</div>
|
||||
<div class="lightbox-image-container">$enlarged_image_content</div>
|
||||
<div class="scrim" style="background-color: $background_color" aria-hidden="true"></div>
|
||||
</div>
|
||||
HTML;
|
||||
|
||||
return str_replace( '</figure>', $lightbox_html . '</figure>', $body_content );
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures that the view script has the `wp-interactivity` dependency.
|
||||
*
|
||||
* @since 6.4.0
|
||||
*
|
||||
* @global WP_Scripts $wp_scripts
|
||||
*/
|
||||
function block_core_image_ensure_interactivity_dependency() {
|
||||
global $wp_scripts;
|
||||
if (
|
||||
isset( $wp_scripts->registered['wp-block-image-view'] ) &&
|
||||
! in_array( 'wp-interactivity', $wp_scripts->registered['wp-block-image-view']->deps, true )
|
||||
) {
|
||||
$wp_scripts->registered['wp-block-image-view']->deps[] = 'wp-interactivity';
|
||||
}
|
||||
}
|
||||
|
||||
add_action( 'wp_print_scripts', 'block_core_image_ensure_interactivity_dependency' );
|
||||
|
||||
/**
|
||||
* Registers the `core/image` block on server.
|
||||
*/
|
||||
function register_block_core_image() {
|
||||
|
||||
register_block_type_from_metadata(
|
||||
__DIR__ . '/image',
|
||||
array(
|
||||
|
||||
@@ -33,6 +33,12 @@
|
||||
"selector": "figcaption",
|
||||
"__experimentalRole": "content"
|
||||
},
|
||||
"lightbox": {
|
||||
"type": "object",
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"source": "attribute",
|
||||
@@ -64,10 +70,10 @@
|
||||
"__experimentalRole": "content"
|
||||
},
|
||||
"width": {
|
||||
"type": "number"
|
||||
"type": "string"
|
||||
},
|
||||
"height": {
|
||||
"type": "number"
|
||||
"type": "string"
|
||||
},
|
||||
"aspectRatio": {
|
||||
"type": "string"
|
||||
@@ -90,9 +96,6 @@
|
||||
},
|
||||
"supports": {
|
||||
"anchor": true,
|
||||
"behaviors": {
|
||||
"lightbox": true
|
||||
},
|
||||
"color": {
|
||||
"text": false,
|
||||
"background": false
|
||||
@@ -127,5 +130,6 @@
|
||||
{ "name": "rounded", "label": "Rounded" }
|
||||
],
|
||||
"editorStyle": "wp-block-image-editor",
|
||||
"style": "wp-block-image"
|
||||
"style": "wp-block-image",
|
||||
"viewScript": "file:./view.min.js"
|
||||
}
|
||||
|
||||
@@ -92,25 +92,58 @@
|
||||
margin:0;
|
||||
}
|
||||
|
||||
.wp-lightbox-container .img-container{
|
||||
.wp-lightbox-container{
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
position:relative;
|
||||
}
|
||||
.wp-lightbox-container button{
|
||||
background:none;
|
||||
border:none;
|
||||
.wp-lightbox-container img{
|
||||
cursor:zoom-in;
|
||||
height:100%;
|
||||
}
|
||||
.wp-lightbox-container img:hover+button{
|
||||
opacity:1;
|
||||
}
|
||||
.wp-lightbox-container button{
|
||||
align-items:center;
|
||||
-webkit-backdrop-filter:blur(16px) saturate(180%);
|
||||
backdrop-filter:blur(16px) saturate(180%);
|
||||
background-color:rgba(90,90,90,.25);
|
||||
border:none;
|
||||
border-radius:4px;
|
||||
cursor:zoom-in;
|
||||
display:flex;
|
||||
height:20px;
|
||||
justify-content:center;
|
||||
left:16px;
|
||||
opacity:0;
|
||||
padding:0;
|
||||
position:absolute;
|
||||
width:100%;
|
||||
text-align:center;
|
||||
top:16px;
|
||||
transition:opacity .2s ease;
|
||||
width:20px;
|
||||
z-index:100;
|
||||
}
|
||||
.wp-lightbox-container button:focus-visible{
|
||||
outline:5px auto #212121;
|
||||
outline:5px auto -webkit-focus-ring-color;
|
||||
outline-offset:5px;
|
||||
outline:3px auto rgba(90,90,90,.25);
|
||||
outline:3px auto -webkit-focus-ring-color;
|
||||
outline-offset:3px;
|
||||
}
|
||||
.wp-lightbox-container button:hover{
|
||||
cursor:pointer;
|
||||
opacity:1;
|
||||
}
|
||||
.wp-lightbox-container button:focus{
|
||||
opacity:1;
|
||||
}
|
||||
.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){
|
||||
background-color:rgba(90,90,90,.25);
|
||||
border:none;
|
||||
}
|
||||
|
||||
.wp-lightbox-overlay{
|
||||
box-sizing:border-box;
|
||||
cursor:zoom-out;
|
||||
height:100vh;
|
||||
overflow:hidden;
|
||||
position:fixed;
|
||||
@@ -121,32 +154,54 @@
|
||||
z-index:100000;
|
||||
}
|
||||
.wp-lightbox-overlay .close-button{
|
||||
align-items:center;
|
||||
cursor:pointer;
|
||||
left:12.5px;
|
||||
display:flex;
|
||||
justify-content:center;
|
||||
left:calc(env(safe-area-inset-left) + 16px);
|
||||
min-height:40px;
|
||||
min-width:40px;
|
||||
padding:0;
|
||||
position:absolute;
|
||||
top:12.5px;
|
||||
top:calc(env(safe-area-inset-top) + 16px);
|
||||
z-index:5000000;
|
||||
}
|
||||
.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){
|
||||
background:none;
|
||||
border:none;
|
||||
}
|
||||
.wp-lightbox-overlay .lightbox-image-container{
|
||||
height:var(--wp--lightbox-container-height);
|
||||
overflow:hidden;
|
||||
position:absolute;
|
||||
right:50%;
|
||||
top:50%;
|
||||
transform:translate(50%, -50%);
|
||||
transform-origin:top right;
|
||||
width:var(--wp--lightbox-container-width);
|
||||
z-index:9999999999;
|
||||
}
|
||||
.wp-lightbox-overlay .wp-block-image{
|
||||
align-items:center;
|
||||
box-sizing:border-box;
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
height:100%;
|
||||
justify-content:center;
|
||||
position:absolute;
|
||||
margin:0;
|
||||
position:relative;
|
||||
transform-origin:100% 0;
|
||||
width:100%;
|
||||
z-index:3000000;
|
||||
}
|
||||
.wp-lightbox-overlay .wp-block-image img{
|
||||
height:var(--wp--lightbox-image-height);
|
||||
min-height:var(--wp--lightbox-image-height);
|
||||
min-width:var(--wp--lightbox-image-width);
|
||||
width:var(--wp--lightbox-image-width);
|
||||
}
|
||||
.wp-lightbox-overlay .wp-block-image figcaption{
|
||||
display:none;
|
||||
}
|
||||
.wp-lightbox-overlay .wp-block-image img{
|
||||
max-height:100%;
|
||||
max-width:100%;
|
||||
width:auto;
|
||||
}
|
||||
.wp-lightbox-overlay button{
|
||||
background:none;
|
||||
border:none;
|
||||
@@ -159,54 +214,46 @@
|
||||
width:100%;
|
||||
z-index:2000000;
|
||||
}
|
||||
.wp-lightbox-overlay.fade.active{
|
||||
.wp-lightbox-overlay.active{
|
||||
animation:turn-on-visibility .25s both;
|
||||
visibility:visible;
|
||||
}
|
||||
.wp-lightbox-overlay.fade.active img{
|
||||
animation:turn-on-visibility .3s both;
|
||||
.wp-lightbox-overlay.active img{
|
||||
animation:turn-on-visibility .35s both;
|
||||
}
|
||||
.wp-lightbox-overlay.fade.hideanimationenabled:not(.active){
|
||||
animation:turn-off-visibility .3s both;
|
||||
.wp-lightbox-overlay.hideanimationenabled:not(.active){
|
||||
animation:turn-off-visibility .35s both;
|
||||
}
|
||||
.wp-lightbox-overlay.fade.hideanimationenabled:not(.active) img{
|
||||
.wp-lightbox-overlay.hideanimationenabled:not(.active) img{
|
||||
animation:turn-off-visibility .25s both;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom img{
|
||||
height:var(--lightbox-image-max-height);
|
||||
position:absolute;
|
||||
transform-origin:top right;
|
||||
width:var(--lightbox-image-max-width);
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.active{
|
||||
opacity:1;
|
||||
visibility:visible;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.active .wp-block-image img{
|
||||
animation:lightbox-zoom-in .4s forwards;
|
||||
}
|
||||
@media (prefers-reduced-motion){
|
||||
.wp-lightbox-overlay.zoom.active .wp-block-image img{
|
||||
animation:turn-on-visibility .4s both;
|
||||
@media (prefers-reduced-motion:no-preference){
|
||||
.wp-lightbox-overlay.zoom.active{
|
||||
animation:none;
|
||||
opacity:1;
|
||||
visibility:visible;
|
||||
}
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.active .scrim{
|
||||
animation:turn-on-visibility .4s forwards;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .wp-block-image img{
|
||||
animation:lightbox-zoom-out .4s forwards;
|
||||
}
|
||||
@media (prefers-reduced-motion){
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .wp-block-image img{
|
||||
animation:turn-off-visibility .4s both;
|
||||
.wp-lightbox-overlay.zoom.active .lightbox-image-container{
|
||||
animation:lightbox-zoom-in .4s;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.active .lightbox-image-container img{
|
||||
animation:none;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.active .scrim{
|
||||
animation:turn-on-visibility .4s forwards;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active){
|
||||
animation:none;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .lightbox-image-container{
|
||||
animation:lightbox-zoom-out .4s;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .lightbox-image-container img{
|
||||
animation:none;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .scrim{
|
||||
animation:turn-off-visibility .4s forwards;
|
||||
}
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .scrim{
|
||||
animation:turn-off-visibility .4s forwards;
|
||||
}
|
||||
|
||||
html.has-lightbox-open{
|
||||
overflow:hidden;
|
||||
}
|
||||
|
||||
@keyframes turn-on-visibility{
|
||||
@@ -233,29 +280,22 @@ html.has-lightbox-open{
|
||||
}
|
||||
@keyframes lightbox-zoom-in{
|
||||
0%{
|
||||
right:var(--lightbox-initial-left-position);
|
||||
top:var(--lightbox-initial-top-position);
|
||||
transform:scale(var(--lightbox-scale-width), var(--lightbox-scale-height));
|
||||
transform:translate(calc((-50vw + var(--wp--lightbox-initial-left-position))*-1), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));
|
||||
}
|
||||
to{
|
||||
right:var(--lightbox-target-left-position);
|
||||
top:var(--lightbox-target-top-position);
|
||||
transform:scale(1);
|
||||
transform:translate(50%, -50%) scale(1);
|
||||
}
|
||||
}
|
||||
@keyframes lightbox-zoom-out{
|
||||
0%{
|
||||
right:var(--lightbox-target-left-position);
|
||||
top:var(--lightbox-target-top-position);
|
||||
transform:scale(1);
|
||||
transform:translate(50%, -50%) scale(1);
|
||||
visibility:visible;
|
||||
}
|
||||
99%{
|
||||
visibility:visible;
|
||||
}
|
||||
to{
|
||||
right:var(--lightbox-initial-left-position);
|
||||
top:var(--lightbox-initial-top-position);
|
||||
transform:scale(var(--lightbox-scale-width), var(--lightbox-scale-height));
|
||||
transform:translate(calc((-50vw + var(--wp--lightbox-initial-left-position))*-1), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));
|
||||
visibility:hidden;
|
||||
}
|
||||
}
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -92,25 +92,58 @@
|
||||
margin:0;
|
||||
}
|
||||
|
||||
.wp-lightbox-container .img-container{
|
||||
.wp-lightbox-container{
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
position:relative;
|
||||
}
|
||||
.wp-lightbox-container button{
|
||||
background:none;
|
||||
border:none;
|
||||
.wp-lightbox-container img{
|
||||
cursor:zoom-in;
|
||||
height:100%;
|
||||
}
|
||||
.wp-lightbox-container img:hover+button{
|
||||
opacity:1;
|
||||
}
|
||||
.wp-lightbox-container button{
|
||||
align-items:center;
|
||||
-webkit-backdrop-filter:blur(16px) saturate(180%);
|
||||
backdrop-filter:blur(16px) saturate(180%);
|
||||
background-color:rgba(90,90,90,.25);
|
||||
border:none;
|
||||
border-radius:4px;
|
||||
cursor:zoom-in;
|
||||
display:flex;
|
||||
height:20px;
|
||||
justify-content:center;
|
||||
opacity:0;
|
||||
padding:0;
|
||||
position:absolute;
|
||||
width:100%;
|
||||
right:16px;
|
||||
text-align:center;
|
||||
top:16px;
|
||||
transition:opacity .2s ease;
|
||||
width:20px;
|
||||
z-index:100;
|
||||
}
|
||||
.wp-lightbox-container button:focus-visible{
|
||||
outline:5px auto #212121;
|
||||
outline:5px auto -webkit-focus-ring-color;
|
||||
outline-offset:5px;
|
||||
outline:3px auto rgba(90,90,90,.25);
|
||||
outline:3px auto -webkit-focus-ring-color;
|
||||
outline-offset:3px;
|
||||
}
|
||||
.wp-lightbox-container button:hover{
|
||||
cursor:pointer;
|
||||
opacity:1;
|
||||
}
|
||||
.wp-lightbox-container button:focus{
|
||||
opacity:1;
|
||||
}
|
||||
.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){
|
||||
background-color:rgba(90,90,90,.25);
|
||||
border:none;
|
||||
}
|
||||
|
||||
.wp-lightbox-overlay{
|
||||
box-sizing:border-box;
|
||||
cursor:zoom-out;
|
||||
height:100vh;
|
||||
left:0;
|
||||
overflow:hidden;
|
||||
@@ -121,32 +154,54 @@
|
||||
z-index:100000;
|
||||
}
|
||||
.wp-lightbox-overlay .close-button{
|
||||
align-items:center;
|
||||
cursor:pointer;
|
||||
display:flex;
|
||||
justify-content:center;
|
||||
min-height:40px;
|
||||
min-width:40px;
|
||||
padding:0;
|
||||
position:absolute;
|
||||
right:12.5px;
|
||||
top:12.5px;
|
||||
right:calc(env(safe-area-inset-right) + 16px);
|
||||
top:calc(env(safe-area-inset-top) + 16px);
|
||||
z-index:5000000;
|
||||
}
|
||||
.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){
|
||||
background:none;
|
||||
border:none;
|
||||
}
|
||||
.wp-lightbox-overlay .lightbox-image-container{
|
||||
height:var(--wp--lightbox-container-height);
|
||||
left:50%;
|
||||
overflow:hidden;
|
||||
position:absolute;
|
||||
top:50%;
|
||||
transform:translate(-50%, -50%);
|
||||
transform-origin:top left;
|
||||
width:var(--wp--lightbox-container-width);
|
||||
z-index:9999999999;
|
||||
}
|
||||
.wp-lightbox-overlay .wp-block-image{
|
||||
align-items:center;
|
||||
box-sizing:border-box;
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
height:100%;
|
||||
justify-content:center;
|
||||
position:absolute;
|
||||
margin:0;
|
||||
position:relative;
|
||||
transform-origin:0 0;
|
||||
width:100%;
|
||||
z-index:3000000;
|
||||
}
|
||||
.wp-lightbox-overlay .wp-block-image img{
|
||||
height:var(--wp--lightbox-image-height);
|
||||
min-height:var(--wp--lightbox-image-height);
|
||||
min-width:var(--wp--lightbox-image-width);
|
||||
width:var(--wp--lightbox-image-width);
|
||||
}
|
||||
.wp-lightbox-overlay .wp-block-image figcaption{
|
||||
display:none;
|
||||
}
|
||||
.wp-lightbox-overlay .wp-block-image img{
|
||||
max-height:100%;
|
||||
max-width:100%;
|
||||
width:auto;
|
||||
}
|
||||
.wp-lightbox-overlay button{
|
||||
background:none;
|
||||
border:none;
|
||||
@@ -159,54 +214,46 @@
|
||||
width:100%;
|
||||
z-index:2000000;
|
||||
}
|
||||
.wp-lightbox-overlay.fade.active{
|
||||
.wp-lightbox-overlay.active{
|
||||
animation:turn-on-visibility .25s both;
|
||||
visibility:visible;
|
||||
}
|
||||
.wp-lightbox-overlay.fade.active img{
|
||||
animation:turn-on-visibility .3s both;
|
||||
.wp-lightbox-overlay.active img{
|
||||
animation:turn-on-visibility .35s both;
|
||||
}
|
||||
.wp-lightbox-overlay.fade.hideanimationenabled:not(.active){
|
||||
animation:turn-off-visibility .3s both;
|
||||
.wp-lightbox-overlay.hideanimationenabled:not(.active){
|
||||
animation:turn-off-visibility .35s both;
|
||||
}
|
||||
.wp-lightbox-overlay.fade.hideanimationenabled:not(.active) img{
|
||||
.wp-lightbox-overlay.hideanimationenabled:not(.active) img{
|
||||
animation:turn-off-visibility .25s both;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom img{
|
||||
height:var(--lightbox-image-max-height);
|
||||
position:absolute;
|
||||
transform-origin:top left;
|
||||
width:var(--lightbox-image-max-width);
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.active{
|
||||
opacity:1;
|
||||
visibility:visible;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.active .wp-block-image img{
|
||||
animation:lightbox-zoom-in .4s forwards;
|
||||
}
|
||||
@media (prefers-reduced-motion){
|
||||
.wp-lightbox-overlay.zoom.active .wp-block-image img{
|
||||
animation:turn-on-visibility .4s both;
|
||||
@media (prefers-reduced-motion:no-preference){
|
||||
.wp-lightbox-overlay.zoom.active{
|
||||
animation:none;
|
||||
opacity:1;
|
||||
visibility:visible;
|
||||
}
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.active .scrim{
|
||||
animation:turn-on-visibility .4s forwards;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .wp-block-image img{
|
||||
animation:lightbox-zoom-out .4s forwards;
|
||||
}
|
||||
@media (prefers-reduced-motion){
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .wp-block-image img{
|
||||
animation:turn-off-visibility .4s both;
|
||||
.wp-lightbox-overlay.zoom.active .lightbox-image-container{
|
||||
animation:lightbox-zoom-in .4s;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.active .lightbox-image-container img{
|
||||
animation:none;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.active .scrim{
|
||||
animation:turn-on-visibility .4s forwards;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active){
|
||||
animation:none;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .lightbox-image-container{
|
||||
animation:lightbox-zoom-out .4s;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .lightbox-image-container img{
|
||||
animation:none;
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .scrim{
|
||||
animation:turn-off-visibility .4s forwards;
|
||||
}
|
||||
}
|
||||
.wp-lightbox-overlay.zoom.hideanimationenabled:not(.active) .scrim{
|
||||
animation:turn-off-visibility .4s forwards;
|
||||
}
|
||||
|
||||
html.has-lightbox-open{
|
||||
overflow:hidden;
|
||||
}
|
||||
|
||||
@keyframes turn-on-visibility{
|
||||
@@ -233,29 +280,22 @@ html.has-lightbox-open{
|
||||
}
|
||||
@keyframes lightbox-zoom-in{
|
||||
0%{
|
||||
left:var(--lightbox-initial-left-position);
|
||||
top:var(--lightbox-initial-top-position);
|
||||
transform:scale(var(--lightbox-scale-width), var(--lightbox-scale-height));
|
||||
transform:translate(calc(-50vw + var(--wp--lightbox-initial-left-position)), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));
|
||||
}
|
||||
to{
|
||||
left:var(--lightbox-target-left-position);
|
||||
top:var(--lightbox-target-top-position);
|
||||
transform:scale(1);
|
||||
transform:translate(-50%, -50%) scale(1);
|
||||
}
|
||||
}
|
||||
@keyframes lightbox-zoom-out{
|
||||
0%{
|
||||
left:var(--lightbox-target-left-position);
|
||||
top:var(--lightbox-target-top-position);
|
||||
transform:scale(1);
|
||||
transform:translate(-50%, -50%) scale(1);
|
||||
visibility:visible;
|
||||
}
|
||||
99%{
|
||||
visibility:visible;
|
||||
}
|
||||
to{
|
||||
left:var(--lightbox-initial-left-position);
|
||||
top:var(--lightbox-initial-top-position);
|
||||
transform:scale(var(--lightbox-scale-width), var(--lightbox-scale-height));
|
||||
transform:translate(calc(-50vw + var(--wp--lightbox-initial-left-position)), calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));
|
||||
visibility:hidden;
|
||||
}
|
||||
}
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
<?php return array('dependencies' => array(), 'version' => '749bd8d7dd37390bdeea');
|
||||
@@ -0,0 +1,533 @@
|
||||
"use strict";
|
||||
(self["__WordPressPrivateInteractivityAPI__"] = self["__WordPressPrivateInteractivityAPI__"] || []).push([[354],{
|
||||
|
||||
/***/ 699:
|
||||
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
|
||||
|
||||
/* harmony import */ var _wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(754);
|
||||
/**
|
||||
* WordPress dependencies
|
||||
*/
|
||||
|
||||
const focusableSelectors = ['a[href]', 'area[href]', 'input:not([disabled]):not([type="hidden"]):not([aria-hidden])', 'select:not([disabled]):not([aria-hidden])', 'textarea:not([disabled]):not([aria-hidden])', 'button:not([disabled]):not([aria-hidden])', 'iframe', 'object', 'embed', '[contenteditable]', '[tabindex]:not([tabindex^="-"])'];
|
||||
|
||||
/*
|
||||
* Stores a context-bound scroll handler.
|
||||
*
|
||||
* This callback could be defined inline inside of the store
|
||||
* object but it's created externally to avoid confusion about
|
||||
* how its logic is called. This logic is not referenced directly
|
||||
* by the directives in the markup because the scroll event we
|
||||
* need to listen to is triggered on the window; so by defining it
|
||||
* outside of the store, we signal that the behavior here is different.
|
||||
* If we find a compelling reason to move it to the store, feel free.
|
||||
*
|
||||
* @type {Function}
|
||||
*/
|
||||
let scrollCallback;
|
||||
|
||||
/*
|
||||
* Tracks whether user is touching screen; used to
|
||||
* differentiate behavior for touch and mouse input.
|
||||
*
|
||||
* @type {boolean}
|
||||
*/
|
||||
let isTouching = false;
|
||||
|
||||
/*
|
||||
* Tracks the last time the screen was touched; used to
|
||||
* differentiate behavior for touch and mouse input.
|
||||
*
|
||||
* @type {number}
|
||||
*/
|
||||
let lastTouchTime = 0;
|
||||
|
||||
/*
|
||||
* Lightbox page-scroll handler: prevents scrolling.
|
||||
*
|
||||
* This handler is added to prevent scrolling behaviors that
|
||||
* trigger content shift while the lightbox is open.
|
||||
*
|
||||
* It would be better to accomplish this through CSS alone, but
|
||||
* using overflow: hidden is currently the only way to do so, and
|
||||
* that causes the layout to shift and prevents the zoom animation
|
||||
* from working in some cases because we're unable to account for
|
||||
* the layout shift when doing the animation calculations. Instead,
|
||||
* here we use JavaScript to prevent and reset the scrolling
|
||||
* behavior. In the future, we may be able to use CSS or overflow: hidden
|
||||
* instead to not rely on JavaScript, but this seems to be the best approach
|
||||
* for now that provides the best visual experience.
|
||||
*
|
||||
* @param {Object} context Interactivity page context?
|
||||
*/
|
||||
function handleScroll(context) {
|
||||
// We can't override the scroll behavior on mobile devices
|
||||
// because doing so breaks the pinch to zoom functionality, and we
|
||||
// want to allow users to zoom in further on the high-res image.
|
||||
if (!isTouching && Date.now() - lastTouchTime > 450) {
|
||||
// We are unable to use event.preventDefault() to prevent scrolling
|
||||
// because the scroll event can't be canceled, so we reset the position instead.
|
||||
window.scrollTo(context.core.image.scrollLeftReset, context.core.image.scrollTopReset);
|
||||
}
|
||||
}
|
||||
(0,_wordpress_interactivity__WEBPACK_IMPORTED_MODULE_0__/* .store */ .h)({
|
||||
state: {
|
||||
core: {
|
||||
image: {
|
||||
windowWidth: window.innerWidth,
|
||||
windowHeight: window.innerHeight
|
||||
}
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
core: {
|
||||
image: {
|
||||
showLightbox: ({
|
||||
context,
|
||||
event
|
||||
}) => {
|
||||
// We can't initialize the lightbox until the reference
|
||||
// image is loaded, otherwise the UX is broken.
|
||||
if (!context.core.image.imageLoaded) {
|
||||
return;
|
||||
}
|
||||
context.core.image.initialized = true;
|
||||
context.core.image.lastFocusedElement = window.document.activeElement;
|
||||
context.core.image.scrollDelta = 0;
|
||||
context.core.image.pointerType = event.pointerType;
|
||||
context.core.image.lightboxEnabled = true;
|
||||
setStyles(context, context.core.image.imageRef);
|
||||
context.core.image.scrollTopReset = window.pageYOffset || document.documentElement.scrollTop;
|
||||
|
||||
// In most cases, this value will be 0, but this is included
|
||||
// in case a user has created a page with horizontal scrolling.
|
||||
context.core.image.scrollLeftReset = window.pageXOffset || document.documentElement.scrollLeft;
|
||||
|
||||
// We define and bind the scroll callback here so
|
||||
// that we can pass the context and as an argument.
|
||||
// We may be able to change this in the future if we
|
||||
// define the scroll callback in the store instead, but
|
||||
// this approach seems to tbe clearest for now.
|
||||
scrollCallback = handleScroll.bind(null, context);
|
||||
|
||||
// We need to add a scroll event listener to the window
|
||||
// here because we are unable to otherwise access it via
|
||||
// the Interactivity API directives. If we add a native way
|
||||
// to access the window, we can remove this.
|
||||
window.addEventListener('scroll', scrollCallback, false);
|
||||
},
|
||||
hideLightbox: async ({
|
||||
context
|
||||
}) => {
|
||||
context.core.image.hideAnimationEnabled = true;
|
||||
if (context.core.image.lightboxEnabled) {
|
||||
// We want to wait until the close animation is completed
|
||||
// before allowing a user to scroll again. The duration of this
|
||||
// animation is defined in the styles.scss and depends on if the
|
||||
// animation is 'zoom' or 'fade', but in any case we should wait
|
||||
// a few milliseconds longer than the duration, otherwise a user
|
||||
// may scroll too soon and cause the animation to look sloppy.
|
||||
setTimeout(function () {
|
||||
window.removeEventListener('scroll', scrollCallback);
|
||||
// If we don't delay before changing the focus,
|
||||
// the focus ring will appear on Firefox before
|
||||
// the image has finished animating, which looks broken.
|
||||
context.core.image.lightboxTriggerRef.focus({
|
||||
preventScroll: true
|
||||
});
|
||||
}, 450);
|
||||
context.core.image.lightboxEnabled = false;
|
||||
}
|
||||
},
|
||||
handleKeydown: ({
|
||||
context,
|
||||
actions,
|
||||
event
|
||||
}) => {
|
||||
if (context.core.image.lightboxEnabled) {
|
||||
if (event.key === 'Tab' || event.keyCode === 9) {
|
||||
// If shift + tab it change the direction
|
||||
if (event.shiftKey && window.document.activeElement === context.core.image.firstFocusableElement) {
|
||||
event.preventDefault();
|
||||
context.core.image.lastFocusableElement.focus();
|
||||
} else if (!event.shiftKey && window.document.activeElement === context.core.image.lastFocusableElement) {
|
||||
event.preventDefault();
|
||||
context.core.image.firstFocusableElement.focus();
|
||||
}
|
||||
}
|
||||
if (event.key === 'Escape' || event.keyCode === 27) {
|
||||
actions.core.image.hideLightbox({
|
||||
context,
|
||||
event
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
// This is fired just by lazily loaded
|
||||
// images on the page, not all images.
|
||||
handleLoad: ({
|
||||
context,
|
||||
effects,
|
||||
ref
|
||||
}) => {
|
||||
context.core.image.imageLoaded = true;
|
||||
context.core.image.imageCurrentSrc = ref.currentSrc;
|
||||
effects.core.image.setButtonStyles({
|
||||
context,
|
||||
ref
|
||||
});
|
||||
},
|
||||
handleTouchStart: () => {
|
||||
isTouching = true;
|
||||
},
|
||||
handleTouchMove: ({
|
||||
context,
|
||||
event
|
||||
}) => {
|
||||
// On mobile devices, we want to prevent triggering the
|
||||
// scroll event because otherwise the page jumps around as
|
||||
// we reset the scroll position. This also means that closing
|
||||
// the lightbox requires that a user perform a simple tap. This
|
||||
// may be changed in the future if we find a better alternative
|
||||
// to override or reset the scroll position during swipe actions.
|
||||
if (context.core.image.lightboxEnabled) {
|
||||
event.preventDefault();
|
||||
}
|
||||
},
|
||||
handleTouchEnd: () => {
|
||||
// We need to wait a few milliseconds before resetting
|
||||
// to ensure that pinch to zoom works consistently
|
||||
// on mobile devices when the lightbox is open.
|
||||
lastTouchTime = Date.now();
|
||||
isTouching = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
selectors: {
|
||||
core: {
|
||||
image: {
|
||||
roleAttribute: ({
|
||||
context
|
||||
}) => {
|
||||
return context.core.image.lightboxEnabled ? 'dialog' : null;
|
||||
},
|
||||
ariaModal: ({
|
||||
context
|
||||
}) => {
|
||||
return context.core.image.lightboxEnabled ? 'true' : null;
|
||||
},
|
||||
dialogLabel: ({
|
||||
context
|
||||
}) => {
|
||||
return context.core.image.lightboxEnabled ? context.core.image.dialogLabel : null;
|
||||
},
|
||||
lightboxObjectFit: ({
|
||||
context
|
||||
}) => {
|
||||
if (context.core.image.initialized) {
|
||||
return 'cover';
|
||||
}
|
||||
},
|
||||
enlargedImgSrc: ({
|
||||
context
|
||||
}) => {
|
||||
return context.core.image.initialized ? context.core.image.imageUploadedSrc : 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
effects: {
|
||||
core: {
|
||||
image: {
|
||||
initOriginImage: ({
|
||||
context,
|
||||
ref
|
||||
}) => {
|
||||
context.core.image.imageRef = ref;
|
||||
context.core.image.lightboxTriggerRef = ref.parentElement.querySelector('.lightbox-trigger');
|
||||
if (ref.complete) {
|
||||
context.core.image.imageLoaded = true;
|
||||
context.core.image.imageCurrentSrc = ref.currentSrc;
|
||||
}
|
||||
},
|
||||
initLightbox: async ({
|
||||
context,
|
||||
ref
|
||||
}) => {
|
||||
if (context.core.image.lightboxEnabled) {
|
||||
const focusableElements = ref.querySelectorAll(focusableSelectors);
|
||||
context.core.image.firstFocusableElement = focusableElements[0];
|
||||
context.core.image.lastFocusableElement = focusableElements[focusableElements.length - 1];
|
||||
|
||||
// Move focus to the dialog when opening it.
|
||||
ref.focus();
|
||||
}
|
||||
},
|
||||
setButtonStyles: ({
|
||||
context,
|
||||
ref
|
||||
}) => {
|
||||
const {
|
||||
naturalWidth,
|
||||
naturalHeight,
|
||||
offsetWidth,
|
||||
offsetHeight
|
||||
} = ref;
|
||||
|
||||
// If the image isn't loaded yet, we can't
|
||||
// calculate where the button should be.
|
||||
if (naturalWidth === 0 || naturalHeight === 0) {
|
||||
return;
|
||||
}
|
||||
const figure = ref.parentElement;
|
||||
const figureWidth = ref.parentElement.clientWidth;
|
||||
|
||||
// We need special handling for the height because
|
||||
// a caption will cause the figure to be taller than
|
||||
// the image, which means we need to account for that
|
||||
// when calculating the placement of the button in the
|
||||
// top right corner of the image.
|
||||
let figureHeight = ref.parentElement.clientHeight;
|
||||
const caption = figure.querySelector('figcaption');
|
||||
if (caption) {
|
||||
const captionComputedStyle = window.getComputedStyle(caption);
|
||||
figureHeight = figureHeight - caption.offsetHeight - parseFloat(captionComputedStyle.marginTop) - parseFloat(captionComputedStyle.marginBottom);
|
||||
}
|
||||
const buttonOffsetTop = figureHeight - offsetHeight;
|
||||
const buttonOffsetRight = figureWidth - offsetWidth;
|
||||
|
||||
// In the case of an image with object-fit: contain, the
|
||||
// size of the <img> element can be larger than the image itself,
|
||||
// so we need to calculate where to place the button.
|
||||
if (context.core.image.scaleAttr === 'contain') {
|
||||
// Natural ratio of the image.
|
||||
const naturalRatio = naturalWidth / naturalHeight;
|
||||
// Offset ratio of the image.
|
||||
const offsetRatio = offsetWidth / offsetHeight;
|
||||
if (naturalRatio >= offsetRatio) {
|
||||
// If it reaches the width first, keep
|
||||
// the width and compute the height.
|
||||
const referenceHeight = offsetWidth / naturalRatio;
|
||||
context.core.image.imageButtonTop = (offsetHeight - referenceHeight) / 2 + buttonOffsetTop + 16;
|
||||
context.core.image.imageButtonRight = buttonOffsetRight + 16;
|
||||
} else {
|
||||
// If it reaches the height first, keep
|
||||
// the height and compute the width.
|
||||
const referenceWidth = offsetHeight * naturalRatio;
|
||||
context.core.image.imageButtonTop = buttonOffsetTop + 16;
|
||||
context.core.image.imageButtonRight = (offsetWidth - referenceWidth) / 2 + buttonOffsetRight + 16;
|
||||
}
|
||||
} else {
|
||||
context.core.image.imageButtonTop = buttonOffsetTop + 16;
|
||||
context.core.image.imageButtonRight = buttonOffsetRight + 16;
|
||||
}
|
||||
},
|
||||
setStylesOnResize: ({
|
||||
state,
|
||||
context,
|
||||
ref
|
||||
}) => {
|
||||
if (context.core.image.lightboxEnabled && (state.core.image.windowWidth || state.core.image.windowHeight)) {
|
||||
setStyles(context, ref);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}, {
|
||||
afterLoad: ({
|
||||
state
|
||||
}) => {
|
||||
window.addEventListener('resize', debounce(() => {
|
||||
state.core.image.windowWidth = window.innerWidth;
|
||||
state.core.image.windowHeight = window.innerHeight;
|
||||
}));
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
* Computes styles for the lightbox and adds them to the document.
|
||||
*
|
||||
* @function
|
||||
* @param {Object} context - An Interactivity API context
|
||||
* @param {Object} event - A triggering event
|
||||
*/
|
||||
function setStyles(context, ref) {
|
||||
// The reference img element lies adjacent
|
||||
// to the event target button in the DOM.
|
||||
let {
|
||||
naturalWidth,
|
||||
naturalHeight,
|
||||
offsetWidth: originalWidth,
|
||||
offsetHeight: originalHeight
|
||||
} = ref;
|
||||
let {
|
||||
x: screenPosX,
|
||||
y: screenPosY
|
||||
} = ref.getBoundingClientRect();
|
||||
|
||||
// Natural ratio of the image clicked to open the lightbox.
|
||||
const naturalRatio = naturalWidth / naturalHeight;
|
||||
// Original ratio of the image clicked to open the lightbox.
|
||||
let originalRatio = originalWidth / originalHeight;
|
||||
|
||||
// If it has object-fit: contain, recalculate the original sizes
|
||||
// and the screen position without the blank spaces.
|
||||
if (context.core.image.scaleAttr === 'contain') {
|
||||
if (naturalRatio > originalRatio) {
|
||||
const heightWithoutSpace = originalWidth / naturalRatio;
|
||||
// Recalculate screen position without the top space.
|
||||
screenPosY += (originalHeight - heightWithoutSpace) / 2;
|
||||
originalHeight = heightWithoutSpace;
|
||||
} else {
|
||||
const widthWithoutSpace = originalHeight * naturalRatio;
|
||||
// Recalculate screen position without the left space.
|
||||
screenPosX += (originalWidth - widthWithoutSpace) / 2;
|
||||
originalWidth = widthWithoutSpace;
|
||||
}
|
||||
}
|
||||
originalRatio = originalWidth / originalHeight;
|
||||
|
||||
// Typically, we use the image's full-sized dimensions. If those
|
||||
// dimensions have not been set (i.e. an external image with only one size),
|
||||
// the image's dimensions in the lightbox are the same
|
||||
// as those of the image in the content.
|
||||
let imgMaxWidth = parseFloat(context.core.image.targetWidth !== 'none' ? context.core.image.targetWidth : naturalWidth);
|
||||
let imgMaxHeight = parseFloat(context.core.image.targetHeight !== 'none' ? context.core.image.targetHeight : naturalHeight);
|
||||
|
||||
// Ratio of the biggest image stored in the database.
|
||||
let imgRatio = imgMaxWidth / imgMaxHeight;
|
||||
let containerMaxWidth = imgMaxWidth;
|
||||
let containerMaxHeight = imgMaxHeight;
|
||||
let containerWidth = imgMaxWidth;
|
||||
let containerHeight = imgMaxHeight;
|
||||
// Check if the target image has a different ratio than the original one (thumbnail).
|
||||
// Recalculate the width and height.
|
||||
if (naturalRatio.toFixed(2) !== imgRatio.toFixed(2)) {
|
||||
if (naturalRatio > imgRatio) {
|
||||
// If the width is reached before the height, we keep the maxWidth
|
||||
// and recalculate the height.
|
||||
// Unless the difference between the maxHeight and the reducedHeight
|
||||
// is higher than the maxWidth, where we keep the reducedHeight and
|
||||
// recalculate the width.
|
||||
const reducedHeight = imgMaxWidth / naturalRatio;
|
||||
if (imgMaxHeight - reducedHeight > imgMaxWidth) {
|
||||
imgMaxHeight = reducedHeight;
|
||||
imgMaxWidth = reducedHeight * naturalRatio;
|
||||
} else {
|
||||
imgMaxHeight = imgMaxWidth / naturalRatio;
|
||||
}
|
||||
} else {
|
||||
// If the height is reached before the width, we keep the maxHeight
|
||||
// and recalculate the width.
|
||||
// Unless the difference between the maxWidth and the reducedWidth
|
||||
// is higher than the maxHeight, where we keep the reducedWidth and
|
||||
// recalculate the height.
|
||||
const reducedWidth = imgMaxHeight * naturalRatio;
|
||||
if (imgMaxWidth - reducedWidth > imgMaxHeight) {
|
||||
imgMaxWidth = reducedWidth;
|
||||
imgMaxHeight = reducedWidth / naturalRatio;
|
||||
} else {
|
||||
imgMaxWidth = imgMaxHeight * naturalRatio;
|
||||
}
|
||||
}
|
||||
containerWidth = imgMaxWidth;
|
||||
containerHeight = imgMaxHeight;
|
||||
imgRatio = imgMaxWidth / imgMaxHeight;
|
||||
|
||||
// Calculate the max size of the container.
|
||||
if (originalRatio > imgRatio) {
|
||||
containerMaxWidth = imgMaxWidth;
|
||||
containerMaxHeight = containerMaxWidth / originalRatio;
|
||||
} else {
|
||||
containerMaxHeight = imgMaxHeight;
|
||||
containerMaxWidth = containerMaxHeight * originalRatio;
|
||||
}
|
||||
}
|
||||
|
||||
// If the image has been pixelated on purpose, keep that size.
|
||||
if (originalWidth > containerWidth || originalHeight > containerHeight) {
|
||||
containerWidth = originalWidth;
|
||||
containerHeight = originalHeight;
|
||||
}
|
||||
|
||||
// Calculate the final lightbox image size and the
|
||||
// scale factor. MaxWidth is either the window container
|
||||
// (accounting for padding) or the image resolution.
|
||||
let horizontalPadding = 0;
|
||||
if (window.innerWidth > 480) {
|
||||
horizontalPadding = 80;
|
||||
} else if (window.innerWidth > 1920) {
|
||||
horizontalPadding = 160;
|
||||
}
|
||||
const verticalPadding = 80;
|
||||
const targetMaxWidth = Math.min(window.innerWidth - horizontalPadding, containerWidth);
|
||||
const targetMaxHeight = Math.min(window.innerHeight - verticalPadding, containerHeight);
|
||||
const targetContainerRatio = targetMaxWidth / targetMaxHeight;
|
||||
if (originalRatio > targetContainerRatio) {
|
||||
// If targetMaxWidth is reached before targetMaxHeight
|
||||
containerWidth = targetMaxWidth;
|
||||
containerHeight = containerWidth / originalRatio;
|
||||
} else {
|
||||
// If targetMaxHeight is reached before targetMaxWidth
|
||||
containerHeight = targetMaxHeight;
|
||||
containerWidth = containerHeight * originalRatio;
|
||||
}
|
||||
const containerScale = originalWidth / containerWidth;
|
||||
const lightboxImgWidth = imgMaxWidth * (containerWidth / containerMaxWidth);
|
||||
const lightboxImgHeight = imgMaxHeight * (containerHeight / containerMaxHeight);
|
||||
|
||||
// Add the CSS variables needed.
|
||||
let styleTag = document.getElementById('wp-lightbox-styles');
|
||||
if (!styleTag) {
|
||||
styleTag = document.createElement('style');
|
||||
styleTag.id = 'wp-lightbox-styles';
|
||||
document.head.appendChild(styleTag);
|
||||
}
|
||||
|
||||
// As of this writing, using the calculations above will render the lightbox
|
||||
// with a small, erroneous whitespace on the left side of the image in iOS Safari,
|
||||
// perhaps due to an inconsistency in how browsers handle absolute positioning and CSS
|
||||
// transformation. In any case, adding 1 pixel to the container width and height solves
|
||||
// the problem, though this can be removed if the issue is fixed in the future.
|
||||
styleTag.innerHTML = `
|
||||
:root {
|
||||
--wp--lightbox-initial-top-position: ${screenPosY}px;
|
||||
--wp--lightbox-initial-left-position: ${screenPosX}px;
|
||||
--wp--lightbox-container-width: ${containerWidth + 1}px;
|
||||
--wp--lightbox-container-height: ${containerHeight + 1}px;
|
||||
--wp--lightbox-image-width: ${lightboxImgWidth}px;
|
||||
--wp--lightbox-image-height: ${lightboxImgHeight}px;
|
||||
--wp--lightbox-scale: ${containerScale};
|
||||
}
|
||||
`;
|
||||
}
|
||||
|
||||
/*
|
||||
* Debounces a function call.
|
||||
*
|
||||
* @function
|
||||
* @param {Function} func - A function to be called
|
||||
* @param {number} wait - The time to wait before calling the function
|
||||
*/
|
||||
function debounce(func, wait = 50) {
|
||||
let timeout;
|
||||
return () => {
|
||||
const later = () => {
|
||||
timeout = null;
|
||||
func();
|
||||
};
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(later, wait);
|
||||
};
|
||||
}
|
||||
|
||||
/***/ })
|
||||
|
||||
},
|
||||
/******/ function(__webpack_require__) { // webpackRuntimeModules
|
||||
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
|
||||
/******/ var __webpack_exports__ = (__webpack_exec__(699));
|
||||
/******/ }
|
||||
]);
|
||||
@@ -0,0 +1 @@
|
||||
<?php return array('dependencies' => array(), 'version' => '32caaf5e7c6834efef4c');
|
||||
+1
File diff suppressed because one or more lines are too long
@@ -20,46 +20,82 @@ require BLOCKS_PATH . 'require-dynamic-blocks.php';
|
||||
* avoids unnecessary logic and filesystem lookups in the other function.
|
||||
*
|
||||
* @since 6.3.0
|
||||
*
|
||||
* @global string $wp_version The WordPress version string.
|
||||
*/
|
||||
function register_core_block_style_handles() {
|
||||
global $wp_version;
|
||||
|
||||
if ( ! wp_should_load_separate_core_block_assets() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
static $core_blocks_meta;
|
||||
if ( ! $core_blocks_meta ) {
|
||||
$core_blocks_meta = require ABSPATH . WPINC . '/blocks/blocks-json.php';
|
||||
}
|
||||
|
||||
$includes_url = includes_url();
|
||||
$includes_path = ABSPATH . WPINC . '/';
|
||||
$suffix = wp_scripts_get_suffix();
|
||||
$wp_styles = wp_styles();
|
||||
$style_fields = array(
|
||||
$blocks_url = includes_url( 'blocks/' );
|
||||
$suffix = wp_scripts_get_suffix();
|
||||
$wp_styles = wp_styles();
|
||||
$style_fields = array(
|
||||
'style' => 'style',
|
||||
'editorStyle' => 'editor',
|
||||
);
|
||||
|
||||
static $core_blocks_meta;
|
||||
if ( ! $core_blocks_meta ) {
|
||||
$core_blocks_meta = require BLOCKS_PATH . 'blocks-json.php';
|
||||
}
|
||||
|
||||
$files = false;
|
||||
$transient_name = 'wp_core_block_css_files';
|
||||
|
||||
/*
|
||||
* Ignore transient cache when the development mode is set to 'core'. Why? To avoid interfering with
|
||||
* the core developer's workflow.
|
||||
*/
|
||||
if ( ! wp_is_development_mode( 'core' ) ) {
|
||||
$transient_name = 'wp_core_block_css_files';
|
||||
$files = get_transient( $transient_name );
|
||||
if ( ! $files ) {
|
||||
$files = glob( wp_normalize_path( __DIR__ . '/**/**.css' ) );
|
||||
set_transient( $transient_name, $files );
|
||||
$can_use_cached = ! wp_is_development_mode( 'core' );
|
||||
|
||||
if ( $can_use_cached ) {
|
||||
$cached_files = get_transient( $transient_name );
|
||||
|
||||
// Check the validity of cached values by checking against the current WordPress version.
|
||||
if (
|
||||
is_array( $cached_files )
|
||||
&& isset( $cached_files['version'] )
|
||||
&& $cached_files['version'] === $wp_version
|
||||
&& isset( $cached_files['files'] )
|
||||
) {
|
||||
$files = $cached_files['files'];
|
||||
}
|
||||
} else {
|
||||
$files = glob( wp_normalize_path( __DIR__ . '/**/**.css' ) );
|
||||
}
|
||||
|
||||
$register_style = static function( $name, $filename, $style_handle ) use ( $includes_path, $includes_url, $suffix, $wp_styles, $files ) {
|
||||
$style_path = "blocks/{$name}/{$filename}{$suffix}.css";
|
||||
$path = wp_normalize_path( $includes_path . $style_path );
|
||||
if ( ! $files ) {
|
||||
$files = glob( wp_normalize_path( BLOCKS_PATH . '**/**.css' ) );
|
||||
|
||||
if ( ! in_array( $path, $files, true ) ) {
|
||||
// Normalize BLOCKS_PATH prior to substitution for Windows environments.
|
||||
$normalized_blocks_path = wp_normalize_path( BLOCKS_PATH );
|
||||
|
||||
$files = array_map(
|
||||
static function ( $file ) use ( $normalized_blocks_path ) {
|
||||
return str_replace( $normalized_blocks_path, '', $file );
|
||||
},
|
||||
$files
|
||||
);
|
||||
|
||||
// Save core block style paths in cache when not in development mode.
|
||||
if ( $can_use_cached ) {
|
||||
set_transient(
|
||||
$transient_name,
|
||||
array(
|
||||
'version' => $wp_version,
|
||||
'files' => $files,
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$register_style = static function ( $name, $filename, $style_handle ) use ( $blocks_url, $suffix, $wp_styles, $files ) {
|
||||
$style_path = "{$name}/{$filename}{$suffix}.css";
|
||||
$path = wp_normalize_path( BLOCKS_PATH . $style_path );
|
||||
|
||||
if ( ! in_array( $style_path, $files, true ) ) {
|
||||
$wp_styles->add(
|
||||
$style_handle,
|
||||
false
|
||||
@@ -67,14 +103,14 @@ function register_core_block_style_handles() {
|
||||
return;
|
||||
}
|
||||
|
||||
$wp_styles->add( $style_handle, $includes_url . $style_path );
|
||||
$wp_styles->add( $style_handle, $blocks_url . $style_path );
|
||||
$wp_styles->add_data( $style_handle, 'path', $path );
|
||||
|
||||
$rtl_file = str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $path );
|
||||
$rtl_file = "{$name}/{$filename}-rtl{$suffix}.css";
|
||||
if ( is_rtl() && in_array( $rtl_file, $files, true ) ) {
|
||||
$wp_styles->add_data( $style_handle, 'rtl', 'replace' );
|
||||
$wp_styles->add_data( $style_handle, 'suffix', $suffix );
|
||||
$wp_styles->add_data( $style_handle, 'path', $rtl_file );
|
||||
$wp_styles->add_data( $style_handle, 'path', str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $path ) );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -48,15 +48,7 @@ function render_block_core_latest_posts( $attributes ) {
|
||||
$block_core_latest_posts_excerpt_length = $attributes['excerptLength'];
|
||||
add_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 );
|
||||
|
||||
$filter_latest_posts_excerpt_more = static function( $more ) use ( $attributes ) {
|
||||
$use_excerpt = 'excerpt' === $attributes['displayPostContentRadio'];
|
||||
/* translators: %1$s is a URL to a post, excerpt truncation character, default … */
|
||||
return $use_excerpt ? sprintf( __( ' … <a href="%1$s" rel="noopener noreferrer">Read more</a>' ), esc_url( get_permalink() ) ) : $more;
|
||||
};
|
||||
|
||||
add_filter( 'excerpt_more', $filter_latest_posts_excerpt_more );
|
||||
|
||||
if ( isset( $attributes['categories'] ) ) {
|
||||
if ( ! empty( $attributes['categories'] ) ) {
|
||||
$args['category__in'] = array_column( $attributes['categories'], 'id' );
|
||||
}
|
||||
if ( isset( $attributes['selectedAuthor'] ) ) {
|
||||
@@ -151,6 +143,23 @@ function render_block_core_latest_posts( $attributes ) {
|
||||
|
||||
$trimmed_excerpt = get_the_excerpt( $post );
|
||||
|
||||
/*
|
||||
* Adds a "Read more" link with screen reader text.
|
||||
* […] is the default excerpt ending from wp_trim_excerpt() in Core.
|
||||
*/
|
||||
if ( str_ends_with( $trimmed_excerpt, ' […]' ) ) {
|
||||
$excerpt_length = (int) apply_filters( 'excerpt_length', $block_core_latest_posts_excerpt_length );
|
||||
if ( $excerpt_length <= $block_core_latest_posts_excerpt_length ) {
|
||||
$trimmed_excerpt = substr( $trimmed_excerpt, 0, -11 );
|
||||
$trimmed_excerpt .= sprintf(
|
||||
/* translators: 1: A URL to a post, 2: Hidden accessibility text: Post title */
|
||||
__( '… <a href="%1$s" rel="noopener noreferrer">Read more<span class="screen-reader-text">: %2$s</span></a>' ),
|
||||
esc_url( $post_link ),
|
||||
esc_html( $title )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if ( post_password_required( $post ) ) {
|
||||
$trimmed_excerpt = __( 'This content is password protected.' );
|
||||
}
|
||||
|
||||
@@ -69,6 +69,7 @@
|
||||
},
|
||||
"__unstablePasteTextInline": true,
|
||||
"__experimentalSelector": "ol,ul",
|
||||
"__experimentalOnMerge": true,
|
||||
"__experimentalSlashInserter": true
|
||||
},
|
||||
"editorStyle": "wp-block-list-editor",
|
||||
|
||||
@@ -100,6 +100,7 @@
|
||||
"html": false,
|
||||
"color": {
|
||||
"gradients": true,
|
||||
"heading": true,
|
||||
"link": true,
|
||||
"__experimentalDefaultControls": {
|
||||
"background": true,
|
||||
|
||||
@@ -31,15 +31,6 @@
|
||||
.wp-block-navigation-link__invalid-item{
|
||||
color:#000;
|
||||
}
|
||||
|
||||
.wp-block-navigation-link__missing_text-tooltip{
|
||||
height:1px;
|
||||
margin:-1px;
|
||||
overflow:hidden;
|
||||
padding:0;
|
||||
position:absolute;
|
||||
width:1px;
|
||||
}
|
||||
.wp-block-navigation-link__placeholder{
|
||||
background-image:none !important;
|
||||
box-shadow:none !important;
|
||||
|
||||
@@ -1 +1 @@
|
||||
.wp-block-navigation .block-list-appender{position:relative}.wp-block-navigation .has-child{cursor:pointer}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{z-index:29}.wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{height:auto!important;min-width:200px!important;opacity:1!important;overflow:visible!important;visibility:visible!important;width:auto!important}.wp-block-navigation-item .wp-block-navigation-item__content{cursor:text}.wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{min-width:20px}.wp-block-navigation-item .block-list-appender{margin:16px 16px 16px auto}.wp-block-navigation-link__invalid-item{color:#000}.wp-block-navigation-link__missing_text-tooltip{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.wp-block-navigation-link__placeholder{background-image:none!important;box-shadow:none!important;position:relative;text-decoration:none!important}.wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:var(--wp-admin-theme-color);background-image:linear-gradient(-45deg,transparent 20%,var(--wp-underline-color) 30%,var(--wp-underline-color) 36%,transparent 46%),linear-gradient(-135deg,transparent 54%,var(--wp-underline-color) 64%,var(--wp-underline-color) 70%,transparent 80%);background-position:100% 100%;background-repeat:repeat-x;background-size:6px 3px;padding-bottom:.1em}.is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:#fff}.wp-block-navigation-link__placeholder.wp-block-navigation-item__content{cursor:pointer}.link-control-transform{border-top:1px solid #ccc;padding:0 16px 8px}.link-control-transform__subheading{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.link-control-transform__items{display:flex;justify-content:space-between}.link-control-transform__item{flex-basis:33%;flex-direction:column;gap:8px;height:auto}
|
||||
.wp-block-navigation .block-list-appender{position:relative}.wp-block-navigation .has-child{cursor:pointer}.wp-block-navigation .has-child .wp-block-navigation__submenu-container{z-index:28}.wp-block-navigation .has-child:hover .wp-block-navigation__submenu-container{z-index:29}.wp-block-navigation .has-child.has-child-selected>.wp-block-navigation__submenu-container,.wp-block-navigation .has-child.is-selected>.wp-block-navigation__submenu-container{height:auto!important;min-width:200px!important;opacity:1!important;overflow:visible!important;visibility:visible!important;width:auto!important}.wp-block-navigation-item .wp-block-navigation-item__content{cursor:text}.wp-block-navigation-item.is-editing,.wp-block-navigation-item.is-selected{min-width:20px}.wp-block-navigation-item .block-list-appender{margin:16px 16px 16px auto}.wp-block-navigation-link__invalid-item{color:#000}.wp-block-navigation-link__placeholder{background-image:none!important;box-shadow:none!important;position:relative;text-decoration:none!important}.wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:var(--wp-admin-theme-color);background-image:linear-gradient(-45deg,transparent 20%,var(--wp-underline-color) 30%,var(--wp-underline-color) 36%,transparent 46%),linear-gradient(-135deg,transparent 54%,var(--wp-underline-color) 64%,var(--wp-underline-color) 70%,transparent 80%);background-position:100% 100%;background-repeat:repeat-x;background-size:6px 3px;padding-bottom:.1em}.is-dark-theme .wp-block-navigation-link__placeholder .wp-block-navigation-link__placeholder-text span{--wp-underline-color:#fff}.wp-block-navigation-link__placeholder.wp-block-navigation-item__content{cursor:pointer}.link-control-transform{border-top:1px solid #ccc;padding:0 16px 8px}.link-control-transform__subheading{color:#1e1e1e;font-size:11px;font-weight:500;margin-bottom:1.5em;text-transform:uppercase}.link-control-transform__items{display:flex;justify-content:space-between}.link-control-transform__item{flex-basis:33%;flex-direction:column;gap:8px;height:auto}
|
||||
@@ -31,15 +31,6 @@
|
||||
.wp-block-navigation-link__invalid-item{
|
||||
color:#000;
|
||||
}
|
||||
|
||||
.wp-block-navigation-link__missing_text-tooltip{
|
||||
height:1px;
|
||||
margin:-1px;
|
||||
overflow:hidden;
|
||||
padding:0;
|
||||
position:absolute;
|
||||
width:1px;
|
||||
}
|
||||
.wp-block-navigation-link__placeholder{
|
||||
background-image:none !important;
|
||||
box-shadow:none !important;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user