Changeset 58466
- Timestamp:
- 06/24/2024 08:49:52 AM (4 months ago)
- Location:
- trunk
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/block-supports/block-style-variations.php
r58429 r58466 214 214 215 215 /** 216 * Collects block style variation data for merging with theme.json data.217 *218 * @since 6.6.0219 * @access private220 *221 * @param array $variations Shared block style variations.222 *223 * @return array Block variations data to be merged under `styles.blocks`.224 */225 function wp_resolve_block_style_variations( $variations ) {226 $variations_data = array();227 228 if ( empty( $variations ) ) {229 return $variations_data;230 }231 232 $have_named_variations = ! wp_is_numeric_array( $variations );233 234 foreach ( $variations as $key => $variation ) {235 $supported_blocks = $variation['blockTypes'] ?? array();236 237 /*238 * Standalone theme.json partial files for block style variations239 * will have their styles under a top-level property by the same name.240 * Variations defined within an existing theme.json or theme style241 * variation will themselves already be the required styles data.242 */243 $variation_data = $variation['styles'] ?? $variation;244 245 if ( empty( $variation_data ) ) {246 continue;247 }248 249 /*250 * Block style variations read in via standalone theme.json partials251 * need to have their name set to the kebab case version of their title.252 */253 $variation_name = $have_named_variations ? $key : ( $variation['slug'] ?? _wp_to_kebab_case( $variation['title'] ) );254 255 foreach ( $supported_blocks as $block_type ) {256 // Add block style variation data under current block type.257 $path = array( $block_type, 'variations', $variation_name );258 _wp_array_set( $variations_data, $path, $variation_data );259 }260 }261 262 return $variations_data;263 }264 265 /**266 * Merges variations data with existing theme.json data ensuring that the267 * current theme.json data values take precedence.268 *269 * @since 6.6.0270 * @access private271 *272 * @param array $variations_data Block style variations data keyed by block type.273 * @param WP_Theme_JSON_Data $theme_json Current theme.json data.274 * @param string $origin Origin for the theme.json data.275 *276 * @return WP_Theme_JSON The merged theme.json data.277 */278 function wp_merge_block_style_variations_data( $variations_data, $theme_json, $origin = 'theme' ) {279 if ( empty( $variations_data ) ) {280 return $theme_json;281 }282 283 $variations_theme_json_data = array(284 'version' => WP_Theme_JSON::LATEST_SCHEMA,285 'styles' => array( 'blocks' => $variations_data ),286 );287 288 $variations_theme_json = new WP_Theme_JSON_Data( $variations_theme_json_data, $origin );289 290 /*291 * Merge the current theme.json data over shared variation data so that292 * any explicit per block variation values take precedence.293 */294 return $variations_theme_json->update_with( $theme_json->get_data() );295 }296 297 /**298 * Merges any shared block style variation definitions from a theme style299 * variation into their appropriate block type within theme json styles. Any300 * custom user selections already made will take precedence over the shared301 * style variation value.302 *303 * @since 6.6.0304 * @access private305 *306 * @param WP_Theme_JSON_Data $theme_json Current theme.json data.307 *308 * @return WP_Theme_JSON_Data309 */310 function wp_resolve_block_style_variations_from_theme_style_variation( $theme_json ) {311 $theme_json_data = $theme_json->get_data();312 $shared_variations = $theme_json_data['styles']['blocks']['variations'] ?? array();313 $variations_data = wp_resolve_block_style_variations( $shared_variations );314 315 return wp_merge_block_style_variations_data( $variations_data, $theme_json, 'user' );316 }317 318 /**319 * Merges block style variation data sourced from standalone partial320 * theme.json files.321 *322 * @since 6.6.0323 * @access private324 *325 * @param WP_Theme_JSON_Data $theme_json Current theme.json data.326 *327 * @return WP_Theme_JSON_Data328 */329 function wp_resolve_block_style_variations_from_theme_json_partials( $theme_json ) {330 $block_style_variations = WP_Theme_JSON_Resolver::get_style_variations( 'block' );331 $variations_data = wp_resolve_block_style_variations( $block_style_variations );332 333 return wp_merge_block_style_variations_data( $variations_data, $theme_json );334 }335 336 /**337 * Merges shared block style variations registered within the338 * `styles.blocks.variations` property of the primary theme.json file.339 *340 * @since 6.6.0341 * @access private342 *343 * @param WP_Theme_JSON_Data $theme_json Current theme.json data.344 *345 * @return WP_Theme_JSON_Data346 */347 function wp_resolve_block_style_variations_from_primary_theme_json( $theme_json ) {348 $theme_json_data = $theme_json->get_data();349 $block_style_variations = $theme_json_data['styles']['blocks']['variations'] ?? array();350 $variations_data = wp_resolve_block_style_variations( $block_style_variations );351 352 return wp_merge_block_style_variations_data( $variations_data, $theme_json );353 }354 355 /**356 * Merges block style variations registered via the block styles registry with a357 * style object, under their appropriate block types within theme.json styles.358 * Any variation values defined within the theme.json specific to a block type359 * will take precedence over these shared definitions.360 *361 * @since 6.6.0362 * @access private363 *364 * @param WP_Theme_JSON_Data $theme_json Current theme.json data.365 *366 * @return WP_Theme_JSON_Data367 */368 function wp_resolve_block_style_variations_from_styles_registry( $theme_json ) {369 $registry = WP_Block_Styles_Registry::get_instance();370 $styles = $registry->get_all_registered();371 $variations_data = array();372 373 foreach ( $styles as $block_type => $variations ) {374 foreach ( $variations as $variation_name => $variation ) {375 if ( ! empty( $variation['style_data'] ) ) {376 $path = array( $block_type, 'variations', $variation_name );377 _wp_array_set( $variations_data, $path, $variation['style_data'] );378 }379 }380 }381 382 return wp_merge_block_style_variations_data( $variations_data, $theme_json );383 }384 385 /**386 216 * Enqueues styles for block style variations. 387 217 * … … 400 230 add_action( 'wp_enqueue_scripts', 'wp_enqueue_block_style_variation_styles', 1 ); 401 231 402 // Resolve block style variations from all their potential sources. The order here is deliberate. 403 add_filter( 'wp_theme_json_data_theme', 'wp_resolve_block_style_variations_from_primary_theme_json', 10, 1 ); 404 add_filter( 'wp_theme_json_data_theme', 'wp_resolve_block_style_variations_from_theme_json_partials', 10, 1 ); 405 add_filter( 'wp_theme_json_data_theme', 'wp_resolve_block_style_variations_from_styles_registry', 10, 1 ); 406 407 add_filter( 'wp_theme_json_data_user', 'wp_resolve_block_style_variations_from_theme_style_variation', 10, 1 ); 408 409 /** 410 * Registers any block style variations contained within the provided 411 * theme.json data. 232 /** 233 * Registers block style variations read in from theme.json partials. 412 234 * 413 235 * @since 6.6.0 … … 416 238 * @param array $variations Shared block style variations. 417 239 */ 418 function wp_register_block_style_variations_from_theme_json_ data( $variations ) {240 function wp_register_block_style_variations_from_theme_json_partials( $variations ) { 419 241 if ( empty( $variations ) ) { 420 return $variations; 421 } 422 423 $registry = WP_Block_Styles_Registry::get_instance(); 424 $have_named_variations = ! wp_is_numeric_array( $variations ); 425 426 foreach ( $variations as $key => $variation ) { 427 $supported_blocks = $variation['blockTypes'] ?? array(); 428 429 /* 430 * Standalone theme.json partial files for block style variations 431 * will have their styles under a top-level property by the same name. 432 * Variations defined within an existing theme.json or theme style 433 * variation will themselves already be the required styles data. 434 */ 435 $variation_data = $variation['styles'] ?? $variation; 436 437 if ( empty( $variation_data ) ) { 242 return; 243 } 244 245 $registry = WP_Block_Styles_Registry::get_instance(); 246 247 foreach ( $variations as $variation ) { 248 if ( empty( $variation['blockTypes'] ) || empty( $variation['styles'] ) ) { 438 249 continue; 439 250 } 440 251 441 /* 442 * Block style variations read in via standalone theme.json partials 443 * need to have their name set to the kebab case version of their title. 444 */ 445 $variation_name = $have_named_variations ? $key : ( $variation['slug'] ?? _wp_to_kebab_case( $variation['title'] ) ); 252 $variation_name = $variation['slug'] ?? _wp_to_kebab_case( $variation['title'] ); 446 253 $variation_label = $variation['title'] ?? $variation_name; 447 254 448 foreach ( $ supported_blocksas $block_type ) {255 foreach ( $variation['blockTypes'] as $block_type ) { 449 256 $registered_styles = $registry->get_registered_styles_for_block( $block_type ); 450 257 -
trunk/src/wp-includes/class-wp-theme-json-resolver.php
r58443 r58466 232 232 * @since 6.0.0 Added an `$options` parameter to allow the theme data to be returned without theme supports. 233 233 * @since 6.6.0 Add support for 'default-font-sizes' and 'default-spacing-sizes' theme supports. 234 * Register the block style variations coming from the partials and the theme.json.234 * Added registration and merging of block style variations from partial theme.json files and the block styles registry. 235 235 * 236 236 * @param array $deprecated Deprecated. Not used. … … 259 259 } 260 260 261 // Register variations defined by the theme. 262 $variations = $theme_json_data['styles']['blocks']['variations'] ?? array(); 263 wp_register_block_style_variations_from_theme_json_data( $variations ); 264 265 // Register variations defined by theme partials (theme.json files in the styles directory). 261 /* 262 * Register variations defined by theme partials (theme.json files in the styles directory). 263 * This is required so the variations pass sanitization of theme.json data. 264 */ 266 265 $variations = static::get_style_variations( 'block' ); 267 wp_register_block_style_variations_from_theme_json_data( $variations ); 266 wp_register_block_style_variations_from_theme_json_partials( $variations ); 267 268 /* 269 * Source variations from the block registry and block style variation files. Then, merge them into the existing theme.json data. 270 * 271 * In case the same style properties are defined in several sources, this is how we should resolve the values, 272 * from higher to lower priority: 273 * 274 * - styles.blocks.blockType.variations from theme.json 275 * - styles.variations from theme.json 276 * - variations from block style variation files 277 * - variations from block styles registry 278 * 279 * See test_add_registered_block_styles_to_theme_data and test_unwraps_block_style_variations. 280 * 281 */ 282 $theme_json_data = static::inject_variations_from_block_style_variation_files( $theme_json_data, $variations ); 283 $theme_json_data = static::inject_variations_from_block_styles_registry( $theme_json_data ); 268 284 269 285 /** … … 580 596 $config = $decoded_data; 581 597 } 582 583 // Register variations defined by the user.584 $variations = $config['styles']['blocks']['variations'] ?? array();585 wp_register_block_style_variations_from_theme_json_data( $variations );586 598 } 587 599 … … 886 898 * @since 6.6.0 887 899 * 888 * @param WP_Theme_JSON 900 * @param WP_Theme_JSON $theme_json A theme json instance. 889 901 * @return WP_Theme_JSON Theme merged with resolved paths, if any found. 890 902 */ … … 908 920 return $theme_json; 909 921 } 922 923 /** 924 * Adds variations sourced from block style variations files to the supplied theme.json data. 925 * 926 * @since 6.6.0 927 * 928 * @param array $data Array following the theme.json specification. 929 * @param array $variations Shared block style variations. 930 * @return array Theme json data including shared block style variation definitions. 931 */ 932 private static function inject_variations_from_block_style_variation_files( $data, $variations ) { 933 if ( empty( $variations ) ) { 934 return $data; 935 } 936 937 foreach ( $variations as $variation ) { 938 if ( empty( $variation['styles'] ) || empty( $variation['blockTypes'] ) ) { 939 continue; 940 } 941 942 $variation_name = $variation['slug'] ?? _wp_to_kebab_case( $variation['title'] ); 943 944 foreach ( $variation['blockTypes'] as $block_type ) { 945 // First, override partial styles with any top-level styles. 946 $top_level_data = $data['styles']['variations'][ $variation_name ] ?? array(); 947 if ( ! empty( $top_level_data ) ) { 948 $variation['styles'] = array_replace_recursive( $variation['styles'], $top_level_data ); 949 } 950 951 // Then, override styles so far with any block-level styles. 952 $block_level_data = $data['styles']['blocks'][ $block_type ]['variations'][ $variation_name ] ?? array(); 953 if ( ! empty( $block_level_data ) ) { 954 $variation['styles'] = array_replace_recursive( $variation['styles'], $block_level_data ); 955 } 956 957 $path = array( 'styles', 'blocks', $block_type, 'variations', $variation_name ); 958 _wp_array_set( $data, $path, $variation['styles'] ); 959 } 960 } 961 962 return $data; 963 } 964 965 /** 966 * Adds variations sourced from the block styles registry to the supplied theme.json data. 967 * 968 * @since 6.6.0 969 * 970 * @param array $data Array following the theme.json specification. 971 * @return array Theme json data including shared block style variation definitions. 972 */ 973 private static function inject_variations_from_block_styles_registry( $data ) { 974 $registry = WP_Block_Styles_Registry::get_instance(); 975 $styles = $registry->get_all_registered(); 976 977 foreach ( $styles as $block_type => $variations ) { 978 foreach ( $variations as $variation_name => $variation ) { 979 if ( empty( $variation['style_data'] ) ) { 980 continue; 981 } 982 983 // First, override registry styles with any top-level styles. 984 $top_level_data = $data['styles']['variations'][ $variation_name ] ?? array(); 985 if ( ! empty( $top_level_data ) ) { 986 $variation['style_data'] = array_replace_recursive( $variation['style_data'], $top_level_data ); 987 } 988 989 // Then, override styles so far with any block-level styles. 990 $block_level_data = $data['styles']['blocks'][ $block_type ]['variations'][ $variation_name ] ?? array(); 991 if ( ! empty( $block_level_data ) ) { 992 $variation['style_data'] = array_replace_recursive( $variation['style_data'], $block_level_data ); 993 } 994 995 $path = array( 'styles', 'blocks', $block_type, 'variations', $variation_name ); 996 _wp_array_set( $data, $path, $variation['style_data'] ); 997 } 998 } 999 1000 return $data; 1001 } 910 1002 } -
trunk/src/wp-includes/class-wp-theme-json.php
r58444 r58466 744 744 * 745 745 * @since 5.8.0 746 * @since 6.6.0 Key spacingScale by origin, and Pre-generate the 747 * spacingSizes from spacingScale.746 * @since 6.6.0 Key spacingScale by origin, and Pre-generate the spacingSizes from spacingScale. 747 * Added unwrapping of shared block style variations into block type variations if registered. 748 748 * 749 749 * @param array $theme_json A structure that follows the theme.json schema. … … 760 760 $valid_element_names = array_keys( static::ELEMENTS ); 761 761 $valid_variations = static::get_valid_block_style_variations(); 762 $this->theme_json = static::unwrap_shared_block_style_variations( $this->theme_json, $valid_variations ); 762 763 $this->theme_json = static::sanitize( $this->theme_json, $valid_block_names, $valid_element_names, $valid_variations ); 763 764 $this->theme_json = static::maybe_opt_in_into_settings( $this->theme_json ); … … 801 802 _wp_array_set( $this->theme_json, $sizes_path, $merged_spacing_sizes ); 802 803 } 804 } 805 806 /** 807 * Unwraps shared block style variations. 808 * 809 * It takes the shared variations (styles.variations.variationName) and 810 * applies them to all the blocks that have the given variation registered 811 * (styles.blocks.blockType.variations.variationName). 812 * 813 * For example, given the `core/paragraph` and `core/group` blocks have 814 * registered the `section-a` style variation, and given the following input: 815 * 816 * { 817 * "styles": { 818 * "variations": { 819 * "section-a": { "color": { "background": "backgroundColor" } } 820 * } 821 * } 822 * } 823 * 824 * It returns the following output: 825 * 826 * { 827 * "styles": { 828 * "blocks": { 829 * "core/paragraph": { 830 * "variations": { 831 * "section-a": { "color": { "background": "backgroundColor" } } 832 * }, 833 * }, 834 * "core/group": { 835 * "variations": { 836 * "section-a": { "color": { "background": "backgroundColor" } } 837 * } 838 * } 839 * } 840 * } 841 * } 842 * 843 * @since 6.6.0 844 * 845 * @param array $theme_json A structure that follows the theme.json schema. 846 * @param array $valid_variations Valid block style variations. 847 * @return array Theme json data with shared variation definitions unwrapped under appropriate block types. 848 */ 849 private static function unwrap_shared_block_style_variations( $theme_json, $valid_variations ) { 850 if ( empty( $theme_json['styles']['variations'] ) || empty( $valid_variations ) ) { 851 return $theme_json; 852 } 853 854 $new_theme_json = $theme_json; 855 $variations = $new_theme_json['styles']['variations']; 856 857 foreach ( $valid_variations as $block_type => $registered_variations ) { 858 foreach ( $registered_variations as $variation_name ) { 859 $block_level_data = $new_theme_json['styles']['blocks'][ $block_type ]['variations'][ $variation_name ] ?? array(); 860 $top_level_data = $variations[ $variation_name ] ?? array(); 861 $merged_data = array_replace_recursive( $top_level_data, $block_level_data ); 862 if ( ! empty( $merged_data ) ) { 863 _wp_array_set( $new_theme_json, array( 'styles', 'blocks', $block_type, 'variations', $variation_name ), $merged_data ); 864 } 865 } 866 } 867 868 unset( $new_theme_json['styles']['variations'] ); 869 870 return $new_theme_json; 803 871 } 804 872 … … 967 1035 $schema['settings']['blocks'] = $schema_settings_blocks; 968 1036 $schema['settings']['typography']['fontFamilies'] = static::schema_in_root_and_per_origin( static::FONT_FAMILY_SCHEMA ); 969 970 /*971 * Shared block style variations can be registered from the theme.json data so we can't972 * validate them against pre-registered block style variations.973 */974 $schema['styles']['blocks']['variations'] = null;975 1037 976 1038 // Remove anything that's not present in the schema. -
trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php
r58429 r58466 266 266 } 267 267 268 // Register theme-defined variations. 269 WP_Theme_JSON_Resolver::get_theme_data(); 270 271 // Register user-defined variations. 272 if ( ! empty( $config['styles']['blocks']['variations'] ) ) { 273 wp_register_block_style_variations_from_theme_json_data( $config['styles']['blocks']['variations'] ); 274 } 268 // Register theme-defined variations e.g. from block style variation partials under `/styles`. 269 $variations = WP_Theme_JSON_Resolver::get_style_variations( 'block' ); 270 wp_register_block_style_variations_from_theme_json_partials( $variations ); 275 271 276 272 if ( isset( $request['settings'] ) ) { … … 636 632 637 633 $response = array(); 634 635 // Register theme-defined variations e.g. from block style variation partials under `/styles`. 636 $partials = WP_Theme_JSON_Resolver::get_style_variations( 'block' ); 637 wp_register_block_style_variations_from_theme_json_partials( $partials ); 638 638 639 $variations = WP_Theme_JSON_Resolver::get_style_variations(); 639 640 640 foreach ( $variations as $variation ) { 641 641 $variation_theme_json = new WP_Theme_JSON( $variation ); -
trunk/src/wp-includes/theme-i18n.json
r58412 r58466 81 81 } 82 82 }, 83 "styles": {84 "blocks": {85 "variations": {86 "*": {87 "title": "Style variation name"88 }89 }90 }91 },92 83 "customTemplates": [ 93 84 { -
trunk/tests/phpunit/data/themedir1/block-theme-child-with-block-style-variations/theme.json
r58264 r58466 1 1 { 2 2 "$schema": "https://schemas.wp.org/trunk/theme.json", 3 "version": 3 3 "version": 3, 4 "styles": { 5 "variations": { 6 "outline": { 7 "color": { 8 "background": "green", 9 "text": "white" 10 } 11 }, 12 "block-style-variation-a": { 13 "color": { 14 "background": "darkseagreen" 15 }, 16 "typography": { 17 "fontSize": "2em", 18 "lineHeight": "1.4em" 19 } 20 } 21 }, 22 "blocks": { 23 "core/button": { 24 "variations": { 25 "outline": { 26 "color": { 27 "background": "red" 28 } 29 } 30 } 31 }, 32 "core/media-text": { 33 "variations": { 34 "block-style-variation-a": { 35 "color": { 36 "background": "blue" 37 }, 38 "typography": { 39 "fontSize": "1.5em" 40 } 41 } 42 } 43 }, 44 "core/heading": { 45 "variations": { 46 "block-style-variation-b": { 47 "typography": { 48 "fontSize": "3em" 49 } 50 } 51 } 52 } 53 } 54 } 4 55 } -
trunk/tests/phpunit/tests/block-supports/block-style-variations.php
r58429 r58466 63 63 * @ticket 61312 64 64 * @ticket 61440 65 * @ticket 61451 65 66 */ 66 67 public function test_add_registered_block_styles_to_theme_data() { 67 68 switch_theme( 'block-theme' ); 68 69 // Register theme-defined variations.70 WP_Theme_JSON_Resolver::get_theme_data();71 // Register user-defined variations.72 WP_Theme_JSON_Resolver::get_user_data();73 69 74 70 $variation_styles_data = array( … … 126 122 $expected = array( 127 123 'variations' => array( 128 // @ticket 61440129 'WithSlug' => array(130 'color' => array(131 'background' => 'aliceblue',132 'text' => 'midnightblue',133 ),134 ),135 'my-variation' => $variation_styles_data,136 124 137 125 /* … … 152 140 ), 153 141 ), 142 143 /* 144 * Manually registered variations. 145 * @ticket 61440 146 */ 147 'WithSlug' => array( 148 'color' => array( 149 'background' => 'aliceblue', 150 'text' => 'midnightblue', 151 ), 152 ), 153 'my-variation' => $variation_styles_data, 154 154 ), 155 155 ); … … 158 158 unregister_block_style( 'core/group', 'WithSlug' ); 159 159 160 $this->assertSameSetsWithIndex( $expected, $group_styles );160 $this->assertSameSetsWithIndex( $expected, $group_styles, 'Variation data does not match' ); 161 161 } 162 162 } -
trunk/tests/phpunit/tests/rest-api/rest-global-styles-controller.php
r58394 r58466 610 610 * @covers WP_REST_Global_Styles_Controller_Gutenberg::update_item 611 611 * @ticket 61312 612 * @ticket 61451 612 613 */ 613 614 public function test_update_item_with_custom_block_style_variations() { … … 616 617 grant_super_admin( self::$admin_id ); 617 618 } 619 620 /* 621 * For variations to be resolved they have to have been registered 622 * via either a theme.json partial or through the WP_Block_Styles_Registry. 623 */ 624 register_block_style( 625 'core/group', 626 array( 627 'name' => 'fromThemeStyleVariation', 628 'label' => 'From Theme Style Variation', 629 ) 630 ); 618 631 619 632 $group_variations = array( … … 630 643 array( 631 644 'styles' => array( 632 'blocks' => array( 633 'variations' => array( 634 'fromThemeStyleVariation' => array( 635 'blockTypes' => array( 'core/group', 'core/columns' ), 636 'color' => array( 637 'background' => '#000000', 638 'text' => '#ffffff', 639 ), 645 'variations' => array( 646 'fromThemeStyleVariation' => array( 647 'blockTypes' => array( 'core/group', 'core/columns' ), 648 'color' => array( 649 'background' => '#000000', 650 'text' => '#ffffff', 640 651 ), 641 652 ), 653 ), 654 'blocks' => array( 642 655 'core/group' => array( 643 656 'variations' => $group_variations, -
trunk/tests/phpunit/tests/theme/wpThemeJson.php
r58444 r58466 3932 3932 3933 3933 /** 3934 * @ticket 61451 3935 */ 3936 public function test_unwraps_block_style_variations() { 3937 register_block_style( 3938 array( 'core/paragraph', 'core/group' ), 3939 array( 3940 'name' => 'myVariation', 3941 'label' => 'My variation', 3942 ) 3943 ); 3944 3945 $input = new WP_Theme_JSON( 3946 array( 3947 'version' => WP_Theme_JSON::LATEST_SCHEMA, 3948 'styles' => array( 3949 'variations' => array( 3950 'myVariation' => array( 3951 'color' => array( 3952 'background' => 'topLevel', 3953 'gradient' => 'topLevel', 3954 ), 3955 'typography' => array( 3956 'fontFamily' => 'topLevel', 3957 ), 3958 ), 3959 ), 3960 'blocks' => array( 3961 'core/paragraph' => array( 3962 'variations' => array( 3963 'myVariation' => array( 3964 'color' => array( 3965 'background' => 'blockLevel', 3966 'text' => 'blockLevel', 3967 ), 3968 'outline' => array( 3969 'offset' => 'blockLevel', 3970 ), 3971 ), 3972 ), 3973 ), 3974 ), 3975 ), 3976 ) 3977 ); 3978 3979 $expected = array( 3980 'version' => WP_Theme_JSON::LATEST_SCHEMA, 3981 'styles' => array( 3982 'blocks' => array( 3983 'core/paragraph' => array( 3984 'variations' => array( 3985 'myVariation' => array( 3986 'color' => array( 3987 'background' => 'blockLevel', 3988 'gradient' => 'topLevel', 3989 'text' => 'blockLevel', 3990 ), 3991 'typography' => array( 3992 'fontFamily' => 'topLevel', 3993 ), 3994 'outline' => array( 3995 'offset' => 'blockLevel', 3996 ), 3997 ), 3998 ), 3999 ), 4000 'core/group' => array( 4001 'variations' => array( 4002 'myVariation' => array( 4003 'color' => array( 4004 'background' => 'topLevel', 4005 'gradient' => 'topLevel', 4006 ), 4007 'typography' => array( 4008 'fontFamily' => 'topLevel', 4009 ), 4010 ), 4011 ), 4012 ), 4013 ), 4014 ), 4015 ); 4016 $this->assertSameSetsWithIndex( $expected, $input->get_raw_data(), 'Unwrapped block style variations do not match' ); 4017 } 4018 4019 /** 3934 4020 * @ticket 57583 3935 4021 * -
trunk/tests/phpunit/tests/theme/wpThemeJsonResolver.php
r58413 r58466 1322 1322 $this->assertSame( $expected_data, $actual ); 1323 1323 } 1324 1325 /** 1326 * Tests that block style variations data gets merged in the following 1327 * priority order, from highest priority to lowest. 1328 * 1329 * - `styles.blocks.blockType.variations` from theme.json 1330 * - `styles.variations` from theme.json 1331 * - variations from block style variation files under `/styles` 1332 * - variations from `WP_Block_Styles_Registry` 1333 * 1334 * @ticket 61451 1335 */ 1336 public function test_block_style_variation_merge_order() { 1337 switch_theme( 'block-theme-child-with-block-style-variations' ); 1338 1339 /* 1340 * Register style for a block that isn't included in the block style variation's partial 1341 * theme.json's blockTypes. The name must match though so we can ensure the partial's 1342 * styles do not get applied to this block. 1343 */ 1344 register_block_style( 1345 'core/heading', 1346 array( 1347 'name' => 'block-style-variation-b', 1348 'label' => 'Heading only variation', 1349 ) 1350 ); 1351 1352 // Register variation for a block that will be partially overridden at all levels. 1353 register_block_style( 1354 'core/media-text', 1355 array( 1356 'name' => 'block-style-variation-a', 1357 'label' => 'Block Style Variation A', 1358 'style_data' => array( 1359 'color' => array( 1360 'background' => 'pink', 1361 'gradient' => 'var(--custom)', 1362 ), 1363 ), 1364 ) 1365 ); 1366 1367 $data = WP_Theme_JSON_Resolver::get_theme_data()->get_raw_data(); 1368 $block_styles = $data['styles']['blocks'] ?? array(); 1369 $actual = array_intersect_key( 1370 $block_styles, 1371 array_flip( array( 'core/button', 'core/media-text', 'core/heading' ) ) 1372 ); 1373 $expected = array( 1374 'core/button' => array( 1375 'variations' => array( 1376 'outline' => array( 1377 'color' => array( 1378 'background' => 'red', 1379 'text' => 'white', 1380 ), 1381 ), 1382 ), 1383 ), 1384 'core/media-text' => array( 1385 'variations' => array( 1386 'block-style-variation-a' => array( 1387 'color' => array( 1388 'background' => 'blue', 1389 'gradient' => 'var(--custom)', 1390 'text' => 'aliceblue', 1391 ), 1392 'typography' => array( 1393 'fontSize' => '1.5em', 1394 'lineHeight' => '1.4em', 1395 ), 1396 ), 1397 ), 1398 ), 1399 'core/heading' => array( 1400 'variations' => array( 1401 'block-style-variation-b' => array( 1402 'typography' => array( 1403 'fontSize' => '3em', 1404 ), 1405 ), 1406 ), 1407 ), 1408 ); 1409 1410 unregister_block_style( 'core/heading', 'block-style-variation-b' ); 1411 unregister_block_style( 'core/media-text', 'block-style-variation-a' ); 1412 1413 $this->assertSameSetsWithIndex( $expected, $actual, 'Merged variation styles do not match.' ); 1414 } 1324 1415 }
Note: See TracChangeset
for help on using the changeset viewer.