-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Backport: add theme json class changes to edit style variations #3941
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 7 commits
53ce333
c99dace
2c58b47
923feca
fe1353c
80ad395
1f232da
159a3e3
fc4a2a2
86ac232
994c202
0768aa8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -665,9 +665,17 @@ protected static function sanitize( $input, $valid_block_names, $valid_element_n | |
| $schema_styles_blocks = array(); | ||
| $schema_settings_blocks = array(); | ||
| foreach ( $valid_block_names as $block ) { | ||
| $schema_settings_blocks[ $block ] = static::VALID_SETTINGS; | ||
| $schema_styles_blocks[ $block ] = $styles_non_top_level; | ||
| $schema_styles_blocks[ $block ]['elements'] = $schema_styles_elements; | ||
| // Build the schema for each block style variation. | ||
| $style_variation_names = isset( $input['styles']['blocks'][ $block ]['variations'] ) ? array_keys( $input['styles']['blocks'][ $block ]['variations'] ) : array(); | ||
| $schema_styles_variations = array(); | ||
| if ( ! empty( $style_variation_names ) ) { | ||
| $schema_styles_variations = array_fill_keys( $style_variation_names, $styles_non_top_level ); | ||
| } | ||
|
|
||
| $schema_settings_blocks[ $block ] = static::VALID_SETTINGS; | ||
| $schema_styles_blocks[ $block ] = $styles_non_top_level; | ||
| $schema_styles_blocks[ $block ]['elements'] = $schema_styles_elements; | ||
| $schema_styles_blocks[ $block ]['variations'] = $schema_styles_variations; | ||
| } | ||
|
|
||
| $schema['styles'] = static::VALID_STYLES; | ||
|
|
@@ -814,6 +822,15 @@ protected static function get_blocks_metadata() { | |
| } | ||
| static::$blocks_metadata[ $block_name ]['elements'][ $el_name ] = implode( ',', $element_selector ); | ||
| } | ||
| // If the block has style variations, append their selectors to the block metadata. | ||
| if ( ! empty( $block_type->styles ) ) { | ||
| $style_selectors = array(); | ||
| foreach ( $block_type->styles as $style ) { | ||
| // The style variation classname is duplicated in the selector to ensure that it overrides core block styles. | ||
| $style_selectors[ $style['name'] ] = static::append_to_selector( '.is-style-' . $style['name'] . '.is-style-' . $style['name'], static::$blocks_metadata[ $block_name ]['selector'] ); | ||
| } | ||
| static::$blocks_metadata[ $block_name ]['styleVariations'] = $style_selectors; | ||
| } | ||
| } | ||
|
|
||
| return static::$blocks_metadata; | ||
|
|
@@ -2039,12 +2056,23 @@ private static function get_block_nodes( $theme_json ) { | |
| $feature_selectors = $selectors[ $name ]['features']; | ||
| } | ||
|
|
||
| $variation_selectors = array(); | ||
| if ( isset( $node['variations'] ) ) { | ||
| foreach ( $node['variations'] as $variation => $node ) { | ||
| $variation_selectors[] = array( | ||
| 'path' => array( 'styles', 'blocks', $name, 'variations', $variation ), | ||
| 'selector' => $selectors[ $name ]['styleVariations'][ $variation ], | ||
| ); | ||
| } | ||
| } | ||
|
|
||
| $nodes[] = array( | ||
| 'name' => $name, | ||
| 'path' => array( 'styles', 'blocks', $name ), | ||
| 'selector' => $selector, | ||
| 'duotone' => $duotone_selector, | ||
| 'features' => $feature_selectors, | ||
| 'name' => $name, | ||
| 'path' => array( 'styles', 'blocks', $name ), | ||
| 'selector' => $selector, | ||
| 'duotone' => $duotone_selector, | ||
| 'features' => $feature_selectors, | ||
| 'variations' => $variation_selectors, | ||
| ); | ||
|
|
||
| if ( isset( $theme_json['styles']['blocks'][ $name ]['elements'] ) ) { | ||
|
|
@@ -2124,6 +2152,48 @@ public function get_styles_for_block( $block_metadata ) { | |
| } | ||
| } | ||
|
|
||
| // If there are style variations, generate the declarations for them, including any feature selectors the block may have. | ||
| $style_variation_declarations = array(); | ||
| if ( ! empty( $block_metadata['variations'] ) ) { | ||
| foreach ( $block_metadata['variations'] as $style_variation ) { | ||
| $style_variation_node = _wp_array_get( $this->theme_json, $style_variation['path'], array() ); | ||
| $style_variation_selector = $style_variation['selector']; | ||
|
|
||
| // If the block has feature selectors, generate the declarations for them within the current style variation. | ||
| if ( ! empty( $block_metadata['features'] ) ) { | ||
| foreach ( $block_metadata['features'] as $feature_name => $feature_selector ) { | ||
| if ( ! empty( $style_variation_node[ $feature_name ] ) ) { | ||
|
||
| // Prepend the variation selector to the feature selector. | ||
| $split_feature_selectors = explode( ',', $feature_selector ); | ||
| $feature_selectors = array_map( | ||
| function( $split_feature_selector ) use ( $style_variation_selector ) { | ||
| return trim( $style_variation_selector ) . trim( $split_feature_selector ); | ||
|
||
| }, | ||
| $split_feature_selectors | ||
| ); | ||
| $combined_feature_selectors = implode( ',', $feature_selectors ); | ||
|
|
||
| // Compute declarations for the feature. | ||
| $new_feature_declarations = static::compute_style_properties( array( $feature_name => $style_variation_node[ $feature_name ] ), $settings, null, $this->theme_json ); | ||
|
|
||
| // Merge new declarations with any that already exist for | ||
| // the feature selector. This may occur when multiple block | ||
| // support features use the same custom selector. | ||
|
||
| if ( isset( $style_variation_declarations[ $combined_feature_selectors ] ) ) { | ||
| $style_variation_declarations[ $combined_feature_selectors ] = array_merge( $style_variation_declarations[ $combined_feature_selectors ], $new_feature_declarations ); | ||
| } else { | ||
| $style_variation_declarations[ $combined_feature_selectors ] = $new_feature_declarations; | ||
| } | ||
| // Remove the feature from the variation's node now the | ||
| // styles will be included under the feature level selector. | ||
| unset( $style_variation_node[ $feature_name ] ); | ||
| } | ||
| } | ||
| } | ||
| // Compute declarations for remaining styles not covered by feature level selectors. | ||
| $style_variation_declarations[ $style_variation_selector ] = static::compute_style_properties( $style_variation_node, $settings, null, $this->theme_json ); | ||
| } | ||
| } | ||
| /* | ||
| * Get a reference to element name from path. | ||
| * $block_metadata['path'] = array( 'styles','elements','link' ); | ||
|
|
@@ -2214,6 +2284,11 @@ function( $pseudo_selector ) use ( $selector ) { | |
| $block_rules .= static::to_ruleset( $feature_selector, $individual_feature_declarations ); | ||
| } | ||
|
|
||
| // 6. Generate and append the style variation rulesets. | ||
| foreach ( $style_variation_declarations as $style_variation_selector => $individual_style_variation_declarations ) { | ||
| $block_rules .= static::to_ruleset( $style_variation_selector, $individual_style_variation_declarations ); | ||
| } | ||
|
|
||
| return $block_rules; | ||
| } | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What if the array structure exists, but the
'variations'are not an array? What would happen?https://3v4l.org/kHpHT
To avoid these, also check if it is an array.
I'd also suggest switching to
! empty()instead ofisset(). Why? To avoid doingarray_keys()on an empty array.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Resolved here 86ac232.