PluginProbe
Gutenberg / trunk
Gutenberg vtrunk
24.1.0 24.0.0 23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 All 404 releases
gutenberg / build / pages / font-library / page-wp-admin.php

page-wp-admin.php in Gutenberg trunk, at build/pages/font-library/page-wp-admin.php

342 lines 10.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Page: font-library (wp-admin integrated)
4 * Auto-generated by build process.
5 * Do not edit this file manually.
6 *
7 * This version integrates with the standard WordPress admin interface,
8 * keeping the wp-admin sidebar and scripts/styles intact.
9 *
10 * @package gutenberg
11 */
12
13 // Global storage for font-library routes and menu items
14 global $gutenberg_font_library_wp_admin_routes, $gutenberg_font_library_wp_admin_menu_items;
15 $gutenberg_font_library_wp_admin_routes = array();
16 $gutenberg_font_library_wp_admin_menu_items = array();
17
18 /**
19 * Register a route for the font-library-wp-admin page.
20 *
21 * @param string $path Route path (e.g., '/types/$type/edit/$id').
22 * @param string|null $content_module Script module ID for content (stage/inspector).
23 * @param string|null $route_module Script module ID for route lifecycle hooks.
24 */
25 function gutenberg_register_font_library_wp_admin_route( $path, $content_module = null, $route_module = null ) {
26 global $gutenberg_font_library_wp_admin_routes;
27
28 $route = array( 'path' => $path );
29 if ( ! empty( $content_module ) ) {
30 $route['content_module'] = $content_module;
31 }
32 if ( ! empty( $route_module ) ) {
33 $route['route_module'] = $route_module;
34 }
35
36 $gutenberg_font_library_wp_admin_routes[] = $route;
37 }
38
39 /**
40 * Register a menu item for the font-library-wp-admin page.
41 * Note: Menu items are registered but not displayed in single-page mode.
42 *
43 * @param string $id Menu item ID.
44 * @param string $label Display label.
45 * @param string $to Route path to navigate to.
46 * @param string $parent_id Optional. Parent menu item ID.
47 */
48 function gutenberg_register_font_library_wp_admin_menu_item( $id, $label, $to, $parent_id = '' ) {
49 global $gutenberg_font_library_wp_admin_menu_items;
50
51 $menu_item = array(
52 'id' => $id,
53 'label' => $label,
54 'to' => $to,
55 );
56
57 if ( ! empty( $parent_id ) ) {
58 $menu_item['parent'] = $parent_id;
59 }
60
61 $gutenberg_font_library_wp_admin_menu_items[] = $menu_item;
62 }
63
64 /**
65 * Get all registered routes for the font-library-wp-admin page.
66 *
67 * @return array Array of route objects.
68 */
69 function gutenberg_get_font_library_wp_admin_routes() {
70 global $gutenberg_font_library_wp_admin_routes;
71 return $gutenberg_font_library_wp_admin_routes ?? array();
72 }
73
74 /**
75 * Get all registered menu items for the font-library-wp-admin page.
76 *
77 * @return array Array of menu item objects.
78 */
79 function gutenberg_get_font_library_wp_admin_menu_items() {
80 global $gutenberg_font_library_wp_admin_menu_items;
81 return $gutenberg_font_library_wp_admin_menu_items ?? array();
82 }
83
84 /**
85 * Preload REST API data for the font-library-wp-admin page.
86 * Automatically called during page rendering.
87 */
88 function gutenberg_font_library_wp_admin_preload_data() {
89 // Define paths to preload - same for all pages
90 // This must exactly match the _fields list in packages/core-data/src/entities.js,
91 // same fields in the same order, or the preload is never consumed.
92 $preload_paths = array(
93 '/?_fields=description,gmt_offset,home,image_max_bit_depth,image_sizes,image_size_threshold,image_strip_meta,name,site_icon,site_icon_url,site_logo,timezone_string,url,page_for_posts,page_on_front,show_on_front',
94 array( '/wp/v2/settings', 'OPTIONS' ),
95 );
96
97 // Use rest_preload_api_request to gather the preloaded data
98 $preload_data = array_reduce(
99 $preload_paths,
100 'rest_preload_api_request',
101 array()
102 );
103
104 // Register the preloading middleware with wp-api-fetch
105 wp_add_inline_script(
106 'wp-api-fetch',
107 sprintf(
108 'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );',
109 wp_json_encode( $preload_data )
110 ),
111 'after'
112 );
113 }
114
115 /**
116 * Enqueue scripts and styles for the font-library-wp-admin page.
117 * Hooked to admin_enqueue_scripts.
118 *
119 * @param string $hook_suffix The current admin page.
120 */
121 function gutenberg_font_library_wp_admin_enqueue_scripts( $hook_suffix ) {
122 // Check all possible ways this page can be accessed:
123 // 1. Menu page via admin.php?page=font-library-wp-admin (plugin)
124 // 2. Direct file via font-library.php (Core) - screen ID will be 'font-library'
125 $current_screen = get_current_screen();
126 $is_our_page = (
127 ( isset( $_GET['page'] ) && 'font-library-wp-admin' === $_GET['page'] ) || // phpcs:ignore WordPress.Security.NonceVerification.Recommended
128 ( $current_screen && 'font-library' === $current_screen->id )
129 );
130
131 if ( ! $is_our_page ) {
132 return;
133 }
134
135 // Load build constants
136 $build_constants = require __DIR__ . '/../../constants.php';
137
138 /**
139 * Fires when the font-library admin page is initialized so extensions can register routes and menu items.
140 */
141 do_action( 'font-library-wp-admin_init' );
142
143 // Preload REST API data
144 gutenberg_font_library_wp_admin_preload_data();
145
146 // Get all registered routes
147 $routes = gutenberg_get_font_library_wp_admin_routes();
148
149 // Get boot module asset file for dependencies. Plugins that build their own
150 // boot module use it; everyone else falls back to the copy bundled with Core.
151 $asset_file = __DIR__ . '/../../modules/boot/index.min.asset.php';
152 if ( ! file_exists( $asset_file ) ) {
153 $asset_file = ABSPATH . WPINC . '/js/dist/script-modules/boot/index.min.asset.php';
154 }
155 if ( file_exists( $asset_file ) ) {
156 $asset = require $asset_file;
157
158 // This script serves two purposes:
159 // 1. It ensures all the globals that are made available to the modules are loaded.
160 // 2. It initializes the boot module as an inline script.
161 wp_register_script( 'font-library-wp-admin-prerequisites', '', $asset['dependencies'], $asset['version'], true );
162
163 $init_modules = [];
164
165 /*
166 * Add inline script to initialize the app using initSinglePage (no menuItems).
167 * The dynamic import is deferred until DOMContentLoaded so that all classic
168 * script dependencies of @wordpress/boot (wp-private-apis, wp-components,
169 * wp-theme, etc.) have finished parsing and executing before the boot module
170 * evaluates. Otherwise, a modulepreloaded @wordpress/boot can win the race
171 * against the classic-script-printing pass on fast CDN-fronted hosts in
172 * Chrome, evaluating before wp.theme.privateApis is defined and throwing
173 * "Cannot unlock an undefined object". See <https://core.trac.wordpress.org/ticket/65103>.
174 */
175 $init_js_function = <<<'JS'
176 ( mountId, routes, initModules ) => {
177 const run = async () => {
178 const mod = await import( "@wordpress/boot" );
179 mod.initSinglePage( { mountId, routes, initModules } );
180 };
181 if ( document.readyState === "loading" ) {
182 document.addEventListener( "DOMContentLoaded", run );
183 } else {
184 run();
185 }
186 }
187 JS;
188 wp_add_inline_script(
189 'font-library-wp-admin-prerequisites',
190 sprintf(
191 '( %s )( %s, %s, %s );',
192 $init_js_function,
193 wp_json_encode( 'font-library-wp-admin-app', JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
194 wp_json_encode( $routes, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
195 wp_json_encode( $init_modules, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
196 )
197 );
198
199 // Register prerequisites style by filtering script dependencies to find registered styles
200 $style_dependencies = array_filter(
201 $asset['dependencies'],
202 function ( $handle ) {
203 return wp_style_is( $handle, 'registered' );
204 }
205 );
206 wp_register_style( 'font-library-wp-admin-prerequisites', false, $style_dependencies, $asset['version'] );
207
208 // Build dependencies for font-library-wp-admin module
209 $boot_dependencies = array(
210 array(
211 'import' => 'static',
212 'id' => '@wordpress/boot',
213 ),
214 );
215
216 // Add init modules as static dependencies
217 // No init modules configured
218
219 // Add all registered routes as dependencies
220 foreach ( $routes as $route ) {
221 if ( isset( $route['route_module'] ) ) {
222 $boot_dependencies[] = array(
223 'import' => 'static',
224 'id' => $route['route_module'],
225 );
226 }
227 if ( isset( $route['content_module'] ) ) {
228 $boot_dependencies[] = array(
229 'import' => 'dynamic',
230 'id' => $route['content_module'],
231 );
232 }
233 }
234
235 /**
236 * Filters the boot script-module dependencies for the
237 * font-library-wp-admin page.
238 *
239 * Surfaces extending this page can append entries to the boot
240 * dependency list. Each entry is an array with 'import' (string
241 * 'static' or 'dynamic') and 'id' (script-module handle) keys.
242 *
243 * @param array $boot_dependencies Boot dependencies for the page.
244 */
245 $boot_dependencies = apply_filters(
246 'font-library-wp-admin_boot_dependencies',
247 $boot_dependencies
248 );
249
250 // Dummy script module to ensure dependencies are loaded
251 wp_register_script_module(
252 'font-library-wp-admin',
253 $build_constants['build_url'] . 'pages/font-library/loader.js',
254 $boot_dependencies
255 );
256
257 // Enqueue the boot scripts and styles
258 wp_enqueue_script( 'font-library-wp-admin-prerequisites' );
259 wp_enqueue_script_module( 'font-library-wp-admin' );
260 wp_enqueue_style( 'font-library-wp-admin-prerequisites' );
261 }
262 }
263
264 /**
265 * Render the font-library-wp-admin page.
266 * Call this function from add_menu_page or add_submenu_page.
267 * This renders within the normal WordPress admin interface.
268 */
269 function gutenberg_font_library_wp_admin_render_page() {
270 ?>
271 <style>
272 /* Critical styles to prevent layout shifts - inlined for immediate application */
273
274 #wpwrap {
275 overflow-y: auto;
276 }
277 body.js {
278 background: #fff;
279 }
280
281 /* Reset wp-admin padding */
282 body.js #wpcontent {
283 padding-inline-start: 0;
284 }
285 body.js #wpbody-content {
286 padding-bottom: 0;
287 }
288
289 /* Hide legacy admin elements */
290 body.js #wpbody-content > div:not(#font-library-wp-admin-app):not(#screen-meta) {
291 display: none;
292 }
293 body.js #wpfooter {
294 display: none;
295 }
296
297 /* Accessibility regions */
298 .a11y-speak-region {
299 inset-inline-start: -1px;
300 top: -1px;
301 }
302
303 /* Admin menu indicators */
304 ul#adminmenu a.wp-has-current-submenu::after,
305 ul#adminmenu > li.current > a.current::after {
306 border-inline-end-color: #fff;
307 }
308
309 /* Media frame fix */
310 .media-frame select.attachment-filters:last-of-type {
311 width: auto;
312 max-width: 100%;
313 }
314
315 /* Responsive overflow fix for #wpwrap */
316 @media (min-width: 782px) {
317 #wpwrap {
318 overflow-y: initial;
319 }
320 }
321 </style>
322 <div class="wrap hide-if-js">
323 <h1 class="wp-heading-inline"><?php echo esc_html( get_admin_page_title() ); ?></h1>
324 <?php
325 wp_admin_notice(
326 __( 'This screen requires JavaScript. Enable JavaScript in your browser settings and reload the page.' ),
327 array( 'type' => 'error' )
328 );
329 ?>
330 </div>
331 <?php
332 // Core's pre-CSS Modules Boot layout uses this class for viewport sizing.
333 // Remove it when the minimum supported WordPress version includes the Boot
334 // changes from Gutenberg #81756.
335 ?>
336 <div id="font-library-wp-admin-app" class="boot-layout-container"></div>
337 <?php
338 }
339
340 // Hook the enqueue function to admin_enqueue_scripts
341 add_action( 'admin_enqueue_scripts', 'gutenberg_font_library_wp_admin_enqueue_scripts' );
342