| @@ -25,11 +25,11 @@ | ||
| 25 | 25 | * Retrieves a URL to a file in the gutenberg plugin. |
| 26 | 26 | * |
| 27 | 27 | * @since 0.1.0 |
| 28 | 28 | * |
| 29 | - * @param string $path Relative path of the desired file. | |
| 29 | + * @param string $path Relative path of the desired file. | |
| 30 | 30 | * |
| 31 | - * @return string Fully qualified URL pointing to the desired file. | |
| 31 | + * @return string Fully qualified URL pointing to the desired file. | |
| 32 | 32 | */ |
| 33 | 33 | function gutenberg_url( $path ) { |
| 34 | 34 | return plugins_url( $path, __DIR__ ); |
| 35 | 35 | } |
| @@ -86,26 +86,17 @@ | ||
| 86 | 86 | } |
| 87 | 87 | add_filter( 'load_script_translation_file', 'gutenberg_override_translation_file', 10, 2 ); |
| 88 | 88 | |
| 89 | 89 | /** |
| 90 | - * Handle special case dependencies for wp-block-library that depend on runtime conditions. | |
| 90 | + * Adds the 'editor' dependency to wp-block-library, required by the Classic block. | |
| 91 | 91 | * |
| 92 | - * This adds the 'editor' dependency conditionally based on experiments and classic block requirements. | |
| 93 | - * All other script registrations are handled by the auto-generated build/scripts.php file. | |
| 94 | - * | |
| 95 | 92 | * @param WP_Scripts $scripts WP_Scripts instance. |
| 96 | 93 | */ |
| 97 | 94 | function gutenberg_register_block_library_script_special_case( $scripts ) { |
| 98 | 95 | $handle = 'wp-block-library'; |
| 99 | 96 | $script = $scripts->query( $handle, 'registered' ); |
| 100 | - if ( | |
| 101 | - ! gutenberg_is_experiment_enabled( 'gutenberg-no-tinymce' ) || | |
| 102 | - ! empty( $_GET['requiresTinymce'] ) || | |
| 103 | - gutenberg_post_being_edited_requires_classic_block() | |
| 104 | - ) { | |
| 105 | - if ( ! in_array( 'editor', $script->deps, true ) ) { | |
| 106 | - $script->deps[] = 'editor'; | |
| 107 | - } | |
| 97 | + if ( ! in_array( 'editor', $script->deps, true ) ) { | |
| 98 | + $script->deps[] = 'editor'; | |
| 108 | 99 | } |
| 109 | 100 | } |
| 110 | 101 | add_action( 'wp_default_scripts', 'gutenberg_register_block_library_script_special_case', 11 ); |
| 111 | 102 | |
| @@ -133,10 +124,12 @@ | ||
| 133 | 124 | // else (for development or test) default to use the current time. |
| 134 | 125 | $version = defined( 'GUTENBERG_VERSION' ) && ! SCRIPT_DEBUG ? GUTENBERG_VERSION : time(); |
| 135 | 126 | $suffix = SCRIPT_DEBUG ? '' : '.min'; |
| 136 | 127 | |
| 137 | - // wp-components: add dashicons (icon font dependency) | |
| 138 | - $styles->query( 'wp-components', 'registered' )->deps[] = 'dashicons'; | |
| 128 | + // wp-components: add dashicons (icon font dependency) and design tokens. | |
| 129 | + $components_style = $styles->query( 'wp-components', 'registered' ); | |
| 130 | + $components_style->deps[] = 'dashicons'; | |
| 131 | + $components_style->deps[] = 'wp-theme'; | |
| 139 | 132 | |
| 140 | 133 | // wp-edit-post: add wp-edit-blocks (custom handle not auto-inferred) |
| 141 | 134 | $styles->query( 'wp-edit-post', 'registered' )->deps[] = 'wp-edit-blocks'; |
| 142 | 135 | |
| @@ -151,8 +144,19 @@ | ||
| 151 | 144 | |
| 152 | 145 | // wp-customize-widgets: add wp-edit-blocks (custom handle not auto-inferred) |
| 153 | 146 | $styles->query( 'wp-customize-widgets', 'registered' )->deps[] = 'wp-edit-blocks'; |
| 154 | 147 | |
| 148 | + gutenberg_override_style( | |
| 149 | + $styles, | |
| 150 | + 'wp-theme', | |
| 151 | + gutenberg_url( 'build/styles/theme/design-tokens' . $suffix . '.css' ), | |
| 152 | + array(), | |
| 153 | + $version | |
| 154 | + ); | |
| 155 | + $styles->add_data( 'wp-theme', 'rtl', 'replace' ); | |
| 156 | + $styles->add_data( 'wp-theme', 'suffix', $suffix ); | |
| 157 | + $styles->add_data( 'wp-theme', 'path', gutenberg_dir_path() . 'build/styles/theme/design-tokens' . $suffix . '.css' ); | |
| 158 | + | |
| 155 | 159 | // Register wp-base-styles and add it to the already registered wp-admin stylesheet |
| 156 | 160 | gutenberg_override_style( |
| 157 | 161 | $styles, |
| 158 | 162 | 'wp-base-styles', |
| @@ -188,8 +192,12 @@ | ||
| 188 | 192 | $styles->add_data( 'wp-block-library', 'path', gutenberg_dir_path() . 'build/styles/block-library/' . $block_library_filename . $suffix . '.css' ); |
| 189 | 193 | |
| 190 | 194 | // Only add CONTENT styles here that should be enqueued in the iframe! |
| 191 | 195 | $wp_edit_blocks_dependencies = array( |
| 196 | + // Design System tokens load first so the `:root` CSS custom | |
| 197 | + // properties are defined before any consuming stylesheet reads | |
| 198 | + // them inside the editor iframe. | |
| 199 | + 'wp-theme', | |
| 192 | 200 | 'wp-components', |
| 193 | 201 | // This need to be added before the block library styles, |
| 194 | 202 | // The block library styles override the "reset" styles. |
| 195 | 203 | 'wp-reset-editor-styles', |
| @@ -369,12 +377,17 @@ | ||
| 369 | 377 | function gutenberg_register_vendor_scripts( $scripts ) { |
| 370 | 378 | $extension = SCRIPT_DEBUG ? '.js' : '.min.js'; |
| 371 | 379 | $vendors_dir = gutenberg_dir_path() . 'build/scripts/vendors/'; |
| 372 | 380 | |
| 381 | + // When the React 19 experiment is enabled, register React 19 vendor | |
| 382 | + // scripts under the `react`, `react-dom`, and `react-jsx-runtime` handles. | |
| 383 | + $use_react_19 = gutenberg_is_experiment_enabled( 'gutenberg-react-19' ); | |
| 384 | + | |
| 373 | 385 | $vendor_handles = array( 'react', 'react-dom', 'react-jsx-runtime' ); |
| 374 | 386 | |
| 375 | 387 | foreach ( $vendor_handles as $handle ) { |
| 376 | - $asset_file = $vendors_dir . $handle . '.min.asset.php'; | |
| 388 | + $source = $use_react_19 ? $handle . '-19' : $handle; | |
| 389 | + $asset_file = $vendors_dir . $source . '.min.asset.php'; | |
| 377 | 390 | $asset = file_exists( $asset_file ) ? require $asset_file : array(); |
| 378 | 391 | $dependencies = $asset['dependencies'] ?? array(); |
| 379 | 392 | $version = $asset['version'] ?? '0'; |
| 380 | 393 | |
| @@ -380,9 +393,9 @@ | ||
| 380 | 393 | |
| 381 | 394 | gutenberg_override_script( |
| 382 | 395 | $scripts, |
| 383 | 396 | $handle, |
| 384 | - gutenberg_url( 'build/scripts/vendors/' . $handle . $extension ), | |
| 397 | + gutenberg_url( 'build/scripts/vendors/' . $source . $extension ), | |
| 385 | 398 | $dependencies, |
| 386 | 399 | $version |
| 387 | 400 | ); |
| 388 | 401 | } |
| @@ -435,8 +448,11 @@ | ||
| 435 | 448 | // Enqueue stored styles. |
| 436 | 449 | add_action( 'wp_enqueue_scripts', 'gutenberg_enqueue_stored_styles' ); |
| 437 | 450 | add_action( 'wp_footer', 'gutenberg_enqueue_stored_styles', 1 ); |
| 438 | 451 | |
| 452 | +/** | |
| 453 | + * Enqueues the LaTeX to MathML loader script module in the block editor. | |
| 454 | + */ | |
| 439 | 455 | add_action( 'enqueue_block_editor_assets', 'gutenberg_enqueue_latex_to_mathml_loader' ); |
| 440 | 456 | function gutenberg_enqueue_latex_to_mathml_loader() { |
| 441 | 457 | wp_enqueue_script_module( '@wordpress/latex-to-mathml/loader' ); |
| 442 | 458 | } |
| @@ -449,15 +465,25 @@ | ||
| 449 | 465 | * when client-side media processing is triggered via @wordpress/upload-media. |
| 450 | 466 | * |
| 451 | 467 | * @see packages/vips/src/loader.ts |
| 452 | 468 | */ |
| 453 | -if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) { | |
| 454 | - add_action( 'enqueue_block_editor_assets', 'gutenberg_enqueue_vips_loader' ); | |
| 455 | -} | |
| 469 | +add_action( 'enqueue_block_editor_assets', 'gutenberg_enqueue_vips_loader' ); | |
| 456 | 470 | function gutenberg_enqueue_vips_loader() { |
| 457 | 471 | wp_enqueue_script_module( '@wordpress/vips/loader' ); |
| 458 | 472 | } |
| 459 | 473 | |
| 460 | -add_action( 'admin_enqueue_scripts', 'gutenberg_enqueue_core_abilities' ); | |
| 461 | -function gutenberg_enqueue_core_abilities() { | |
| 462 | - wp_enqueue_script_module( '@wordpress/core-abilities' ); | |
| 474 | +/** | |
| 475 | + * Enqueue the video-conversion loader script module in the block editor. | |
| 476 | + * | |
| 477 | + * This registers @wordpress/video-conversion/worker as a dynamic dependency | |
| 478 | + * in the import map, enabling on-demand loading of the WebCodecs-based | |
| 479 | + * GIF-to-video processing module when animated GIF conversion is triggered | |
| 480 | + * via @wordpress/upload-media. | |
| 481 | + * | |
| 482 | + * @see packages/video-conversion/src/loader.ts | |
| 483 | + */ | |
| 484 | +if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) { | |
| 485 | + add_action( 'enqueue_block_editor_assets', 'gutenberg_enqueue_video_conversion_loader' ); | |
| 486 | +} | |
| 487 | +function gutenberg_enqueue_video_conversion_loader() { | |
| 488 | + wp_enqueue_script_module( '@wordpress/video-conversion/loader' ); | |
| 463 | 489 | } |