Skip to content

Commit

Permalink
Block Style Variations: Fix complex variation selectors when using se…
Browse files Browse the repository at this point in the history
…lectors API (#67061)

Co-authored-by: aaronrobertshaw <[email protected]>
Co-authored-by: ramonjd <[email protected]>
Co-authored-by: yogeshbhutkar <[email protected]>
Co-authored-by: Anuj-Rathore24 <[email protected]>
Co-authored-by: shimotmk <[email protected]>
  • Loading branch information
6 people authored Nov 20, 2024
1 parent 0db7ff6 commit 7d8dee1
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 2 deletions.
3 changes: 3 additions & 0 deletions backport-changelog/6.8/7825.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
https://github.com/WordPress/wordpress-develop/pull/7825

* https://github.com/WordPress/gutenberg/pull/67061
10 changes: 8 additions & 2 deletions lib/class-wp-theme-json-gutenberg.php
Original file line number Diff line number Diff line change
Expand Up @@ -2874,8 +2874,14 @@ public function get_styles_for_block( $block_metadata ) {

// Combine selectors with style variation's selector and add to overall style variation declarations.
foreach ( $variation_declarations as $current_selector => $new_declarations ) {
// If current selector includes block classname, remove it but leave the whitespace in.
$shortened_selector = str_replace( $block_metadata['selector'] . ' ', ' ', $current_selector );
/*
* Clean up any whitespace between comma separated selectors.
* This prevents these spaces breaking compound selectors such as:
* - `.wp-block-list:not(.wp-block-list .wp-block-list)`
* - `.wp-block-image img, .wp-block-image.my-class img`
*/
$clean_current_selector = preg_replace( '/,\s+/', ',', $current_selector );
$shortened_selector = str_replace( $block_metadata['selector'], '', $clean_current_selector );

// Prepend the variation selector to the current selector.
$split_selectors = explode( ',', $shortened_selector );
Expand Down
68 changes: 68 additions & 0 deletions phpunit/class-wp-theme-json-test.php
Original file line number Diff line number Diff line change
Expand Up @@ -4308,6 +4308,74 @@ public function data_get_styles_for_block_with_style_variations() {
);
}

public function test_get_styles_for_block_with_style_variations_and_custom_selectors() {
register_block_type(
'test/milk',
array(
'api_version' => 3,
'selectors' => array(
'root' => '.milk',
'color' => '.wp-block-test-milk .liquid, .wp-block-test-milk:not(.spoiled), .wp-block-test-milk.in-bottle',
),
)
);

register_block_style(
'test/milk',
array(
'name' => 'chocolate',
'label' => 'Chocolate',
)
);

$theme_json = new WP_Theme_JSON_Gutenberg(
array(
'version' => WP_Theme_JSON_Gutenberg::LATEST_SCHEMA,
'styles' => array(
'blocks' => array(
'test/milk' => array(
'color' => array(
'background' => 'white',
),
'variations' => array(
'chocolate' => array(
'color' => array(
'background' => '#35281E',
),
),
),
),
),
),
)
);

$metadata = array(
'name' => 'test/milk',
'path' => array( 'styles', 'blocks', 'test/milk' ),
'selector' => '.wp-block-test-milk',
'selectors' => array(
'color' => '.wp-block-test-milk .liquid, .wp-block-test-milk:not(.spoiled), .wp-block-test-milk.in-bottle',
),
'variations' => array(
'chocolate' => array(
'path' => array( 'styles', 'blocks', 'test/milk', 'variations', 'chocolate' ),
'selector' => '.is-style-chocolate.wp-block-test-milk',
),
),
);

$actual_styles = $theme_json->get_styles_for_block( $metadata );
$default_styles = ':root :where(.wp-block-test-milk .liquid, .wp-block-test-milk:not(.spoiled), .wp-block-test-milk.in-bottle){background-color: white;}';
$variation_styles = ':root :where(.is-style-chocolate.wp-block-test-milk .liquid,.is-style-chocolate.wp-block-test-milk:not(.spoiled),.is-style-chocolate.wp-block-test-milk.in-bottle){background-color: #35281E;}';
$expected = $default_styles . $variation_styles;

unregister_block_style( 'test/milk', 'chocolate' );
unregister_block_type( 'test/milk' );

$this->assertSame( $expected, $actual_styles );
}

public function test_block_style_variations() {
wp_set_current_user( static::$administrator_id );

Expand Down

0 comments on commit 7d8dee1

Please sign in to comment.