This commit is contained in:
2026-07-02 15:54:39 -06:00
commit 9883323161
17470 changed files with 4470592 additions and 0 deletions
@@ -0,0 +1,43 @@
<?php
/**
* Main entry point for auto-generated asset registration.
* Do not edit this file manually.
*
* @package jetpack_newsletter
*/
// Load script module registration.
$modules_file = __DIR__ . '/modules.php';
if ( file_exists( $modules_file ) ) {
require_once $modules_file;
}
// Load script registration.
$scripts_file = __DIR__ . '/scripts.php';
if ( file_exists( $scripts_file ) ) {
require_once $scripts_file;
}
// Load style registration.
$styles_file = __DIR__ . '/styles.php';
if ( file_exists( $styles_file ) ) {
require_once $styles_file;
}
// Load routes registration.
$routes_file = __DIR__ . '/routes.php';
if ( file_exists( $routes_file ) ) {
require_once $routes_file;
}
// Load widgets registration.
$widgets_file = __DIR__ . '/widgets.php';
if ( file_exists( $widgets_file ) ) {
require_once $widgets_file;
}
// Load pages registration.
$pages_file = __DIR__ . '/pages.php';
if ( file_exists( $pages_file ) ) {
require_once $pages_file;
}
@@ -0,0 +1,14 @@
<?php
/**
* Plugin constants - Auto-generated by build process.
* Do not edit this file manually.
*
* Returns an array of constants for use in other templates.
*
* @package jetpack_newsletter
*/
return array(
'version' => '0.11.1',
'build_url' => plugin_dir_url( __FILE__ ),
);
@@ -0,0 +1,17 @@
<svg width="380" height="183" viewBox="0 0 380 183" fill="none" xmlns="http://www.w3.org/2000/svg">
<g opacity="0.75" filter="url(#filter0_f_5953_11924)">
<path d="M360 -60C360 7.93102 304.931 63 237 63C169.069 63 114 7.93102 114 -60C114 -127.931 169.069 -183 237 -183C304.931 -183 360 -127.931 360 -60Z" fill="url(#paint0_linear_5953_11924)"/>
</g>
<defs>
<filter id="filter0_f_5953_11924" x="-6" y="-303" width="486" height="486" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="60" result="effect1_foregroundBlur_5953_11924"/>
</filter>
<linearGradient id="paint0_linear_5953_11924" x1="360" y1="-60" x2="114" y2="-60" gradientUnits="userSpaceOnUse">
<stop stop-color="#48FF50"/>
<stop offset="0.471846" stop-color="#108642"/>
<stop offset="1" stop-color="#2E38FA"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 990 B

@@ -0,0 +1,63 @@
<?php
/**
* Script module registration - Auto-generated by build process.
* Do not edit this file manually.
*
* @package jetpack_newsletter
*/
/**
* Register all script modules.
*/
function jetpack_newsletter_register_script_modules() {
// Ensure this only runs once. wp_default_scripts can fire multiple times,
// and each wp_deregister_script_module() call also dequeues the module.
// If a module was enqueued between calls, repeated deregister/register
// cycles would lose the enqueue state.
static $already_registered = false;
if ( $already_registered ) {
return;
}
$already_registered = true;
// Load build constants
$constants_file = __DIR__ . '/constants.php';
if ( ! file_exists( $constants_file ) ) {
return;
}
$build_constants = require $constants_file;
$modules_dir = __DIR__ . '/modules';
$modules_file = $modules_dir . '/registry.php';
if ( ! file_exists( $modules_file ) ) {
return;
}
$modules = require $modules_file;
$base_url = $build_constants['build_url'] . 'modules/';
foreach ( $modules as $module ) {
// WASM-only modules (e.g., vips worker) only have .min.js; use it even when SCRIPT_DEBUG is `true`.
$extension = '.min.js';
$asset_path = $modules_dir . '/' . $module['asset'];
$asset = file_exists( $asset_path ) ? require $asset_path : array();
// Deregister first to override any previously registered version
// (e.g., Core's default modules when running as a plugin).
wp_deregister_script_module( $module['id'] );
wp_register_script_module(
$module['id'],
$base_url . $module['path'] . $extension,
$asset['module_dependencies'] ?? array(),
$asset['version'] ?? false,
array(
'fetchpriority' => 'low',
'in_footer' => true,
)
);
}
}
add_action( 'wp_default_scripts', 'jetpack_newsletter_register_script_modules' );
@@ -0,0 +1 @@
<?php return array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-theme', 'wp-url'), 'module_dependencies' => array(array('id' => '@wordpress/a11y', 'import' => 'static'), array('id' => '@wordpress/lazy-editor', 'import' => 'dynamic'), array('id' => '@wordpress/route', 'import' => 'static')), 'version' => '188faf6c64fdd1b4');
@@ -0,0 +1,11 @@
<?php
/**
* Script module registry - Auto-generated by build process.
* Do not edit this file manually.
*
* @package jetpack_newsletter
*/
return array(
);
@@ -0,0 +1 @@
<?php return array('dependencies' => array('jetpack-connection', 'jetpack-script-data', 'react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => 'ffce2c4026fe2ea03c4f');
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,18 @@
<?php
/**
* Pages loader - Auto-generated by build process.
* Do not edit this file manually.
*
* @package jetpack_newsletter
*/
foreach ( [
__DIR__ . '/pages/jetpack-newsletter-dashboard/page.php',
__DIR__ . '/pages/jetpack-newsletter-dashboard/page-wp-admin.php',
__DIR__ . '/pages/jetpack-subscribers-announcement/page.php',
__DIR__ . '/pages/jetpack-subscribers-announcement/page-wp-admin.php',
] as $file ) {
if ( file_exists( $file ) ) {
require_once $file;
}
}
@@ -0,0 +1 @@
// Empty module loader for page dependencies
@@ -0,0 +1,317 @@
<?php
/**
* Page: jetpack-newsletter-dashboard (wp-admin integrated)
* Auto-generated by build process.
* Do not edit this file manually.
*
* This version integrates with the standard WordPress admin interface,
* keeping the wp-admin sidebar and scripts/styles intact.
*
* @package jetpack_newsletter
*/
// Global storage for jetpack-newsletter-dashboard routes and menu items
global $jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_routes, $jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_menu_items;
$jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_routes = array();
$jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_menu_items = array();
/**
* Register a route for the jetpack-newsletter-dashboard-wp-admin page.
*
* @param string $path Route path (e.g., '/types/$type/edit/$id').
* @param string|null $content_module Script module ID for content (stage/inspector).
* @param string|null $route_module Script module ID for route lifecycle hooks.
*/
function jetpack_newsletter_register_jetpack_newsletter_dashboard_wp_admin_route( $path, $content_module = null, $route_module = null ) {
global $jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_routes;
$route = array( 'path' => $path );
if ( ! empty( $content_module ) ) {
$route['content_module'] = $content_module;
}
if ( ! empty( $route_module ) ) {
$route['route_module'] = $route_module;
}
$jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_routes[] = $route;
}
/**
* Register a menu item for the jetpack-newsletter-dashboard-wp-admin page.
* Note: Menu items are registered but not displayed in single-page mode.
*
* @param string $id Menu item ID.
* @param string $label Display label.
* @param string $to Route path to navigate to.
* @param string $parent_id Optional. Parent menu item ID.
*/
function jetpack_newsletter_register_jetpack_newsletter_dashboard_wp_admin_menu_item( $id, $label, $to, $parent_id = '' ) {
global $jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_menu_items;
$menu_item = array(
'id' => $id,
'label' => $label,
'to' => $to,
);
if ( ! empty( $parent_id ) ) {
$menu_item['parent'] = $parent_id;
}
$jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_menu_items[] = $menu_item;
}
/**
* Get all registered routes for the jetpack-newsletter-dashboard-wp-admin page.
*
* @return array Array of route objects.
*/
function jetpack_newsletter_get_jetpack_newsletter_dashboard_wp_admin_routes() {
global $jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_routes;
return $jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_routes ?? array();
}
/**
* Get all registered menu items for the jetpack-newsletter-dashboard-wp-admin page.
*
* @return array Array of menu item objects.
*/
function jetpack_newsletter_get_jetpack_newsletter_dashboard_wp_admin_menu_items() {
global $jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_menu_items;
return $jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_menu_items ?? array();
}
/**
* Preload REST API data for the jetpack-newsletter-dashboard-wp-admin page.
* Automatically called during page rendering.
*/
function jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_preload_data() {
// Define paths to preload - same for all pages
// Please also change packages/core-data/src/entities.js when changing this.
$preload_paths = array(
'/?_fields=description,gmt_offset,home,image_sizes,image_size_threshold,name,site_icon,site_icon_url,site_logo,timezone_string,url,page_for_posts,page_on_front,show_on_front',
array( '/wp/v2/settings', 'OPTIONS' ),
);
// Use rest_preload_api_request to gather the preloaded data
$preload_data = array_reduce(
$preload_paths,
'rest_preload_api_request',
array()
);
// Register the preloading middleware with wp-api-fetch
wp_add_inline_script(
'wp-api-fetch',
sprintf(
'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );',
wp_json_encode( $preload_data )
),
'after'
);
}
/**
* Enqueue scripts and styles for the jetpack-newsletter-dashboard-wp-admin page.
* Hooked to admin_enqueue_scripts.
*
* @param string $hook_suffix The current admin page.
*/
function jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_enqueue_scripts( $hook_suffix ) {
// Check all possible ways this page can be accessed:
// 1. Menu page via admin.php?page=jetpack-newsletter-dashboard-wp-admin (plugin)
// 2. Direct file via jetpack-newsletter-dashboard.php (Core) - screen ID will be 'jetpack-newsletter-dashboard'
$current_screen = get_current_screen();
$is_our_page = (
( isset( $_GET['page'] ) && 'jetpack-newsletter-dashboard-wp-admin' === $_GET['page'] ) || // phpcs:ignore WordPress.Security.NonceVerification.Recommended
( $current_screen && 'jetpack-newsletter-dashboard' === $current_screen->id )
);
if ( ! $is_our_page ) {
return;
}
// Load build constants
$build_constants = require __DIR__ . '/../../constants.php';
/**
* Fires when the jetpack-newsletter-dashboard admin page is initialized so extensions can register routes and menu items.
*/
do_action( 'jetpack-newsletter-dashboard-wp-admin_init' );
// Preload REST API data
jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_preload_data();
// Get all registered routes
$routes = jetpack_newsletter_get_jetpack_newsletter_dashboard_wp_admin_routes();
// Get boot module asset file for dependencies
$asset_file = __DIR__ . '/../../modules/boot/index.min.asset.php';
if ( file_exists( $asset_file ) ) {
$asset = require $asset_file;
// This script serves two purposes:
// 1. It ensures all the globals that are made available to the modules are loaded.
// 2. It initializes the boot module as an inline script.
wp_register_script( 'jetpack-newsletter-dashboard-wp-admin-prerequisites', '', $asset['dependencies'], $asset['version'], true );
/*
* Add inline script to initialize the app using initSinglePage (no menuItems).
* The dynamic import is deferred until DOMContentLoaded so that all classic
* script dependencies of @wordpress/boot (wp-private-apis, wp-components,
* wp-theme, etc.) have finished parsing and executing before the boot module
* evaluates. Otherwise, a modulepreloaded @wordpress/boot can win the race
* against the classic-script-printing pass on fast CDN-fronted hosts in
* Chrome, evaluating before wp.theme.privateApis is defined and throwing
* "Cannot unlock an undefined object". See <https://core.trac.wordpress.org/ticket/65103>.
*/
$init_js_function = <<<'JS'
( mountId, routes ) => {
const run = async () => {
const mod = await import( "@wordpress/boot" );
mod.initSinglePage( { mountId, routes } );
};
if ( document.readyState === "loading" ) {
document.addEventListener( "DOMContentLoaded", run );
} else {
run();
}
}
JS;
wp_add_inline_script(
'jetpack-newsletter-dashboard-wp-admin-prerequisites',
sprintf(
'( %s )( %s, %s );',
$init_js_function,
wp_json_encode( 'jetpack-newsletter-dashboard-wp-admin-app', JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
wp_json_encode( $routes, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
)
);
// Register prerequisites style by filtering script dependencies to find registered styles
$style_dependencies = array_filter(
$asset['dependencies'],
function ( $handle ) {
return wp_style_is( $handle, 'registered' );
}
);
wp_register_style( 'jetpack-newsletter-dashboard-wp-admin-prerequisites', false, $style_dependencies, $asset['version'] );
// Build dependencies for jetpack-newsletter-dashboard-wp-admin module
$boot_dependencies = array(
array(
'import' => 'static',
'id' => '@wordpress/boot',
),
);
// Add all registered routes as dependencies
foreach ( $routes as $route ) {
if ( isset( $route['route_module'] ) ) {
$boot_dependencies[] = array(
'import' => 'static',
'id' => $route['route_module'],
);
}
if ( isset( $route['content_module'] ) ) {
$boot_dependencies[] = array(
'import' => 'dynamic',
'id' => $route['content_module'],
);
}
}
/**
* Filters the boot script-module dependencies for the
* jetpack-newsletter-dashboard-wp-admin page.
*
* Surfaces extending this page can append entries to the boot
* dependency list. Each entry is an array with 'import' (string
* 'static' or 'dynamic') and 'id' (script-module handle) keys.
*
* @param array $boot_dependencies Boot dependencies for the page.
*/
$boot_dependencies = apply_filters(
'jetpack-newsletter-dashboard-wp-admin_boot_dependencies',
$boot_dependencies
);
// Dummy script module to ensure dependencies are loaded
wp_register_script_module(
'jetpack-newsletter-dashboard-wp-admin',
$build_constants['build_url'] . 'pages/jetpack-newsletter-dashboard/loader.js',
$boot_dependencies
);
// Enqueue the boot scripts and styles
wp_enqueue_script( 'jetpack-newsletter-dashboard-wp-admin-prerequisites' );
wp_enqueue_script_module( 'jetpack-newsletter-dashboard-wp-admin' );
wp_enqueue_style( 'jetpack-newsletter-dashboard-wp-admin-prerequisites' );
}
}
/**
* Render the jetpack-newsletter-dashboard-wp-admin page.
* Call this function from add_menu_page or add_submenu_page.
* This renders within the normal WordPress admin interface.
*/
function jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_render_page() {
?>
<style>
/* Critical styles to prevent layout shifts - inlined for immediate application */
#wpwrap {
overflow-y: auto;
}
body {
background: #fff;
}
/* Reset wp-admin padding */
#wpcontent {
padding-inline-start: 0;
}
#wpbody-content {
padding-bottom: 0;
}
/* Hide legacy admin elements */
#wpbody-content > div:not(.boot-layout-container):not(#screen-meta) {
display: none;
}
#wpfooter {
display: none;
}
/* Accessibility regions */
.a11y-speak-region {
inset-inline-start: -1px;
top: -1px;
}
/* Admin menu indicators */
ul#adminmenu a.wp-has-current-submenu::after,
ul#adminmenu > li.current > a.current::after {
border-inline-end-color: #fff;
}
/* Media frame fix */
.media-frame select.attachment-filters:last-of-type {
width: auto;
max-width: 100%;
}
/* Responsive overflow fix for #wpwrap */
@media (min-width: 782px) {
#wpwrap {
overflow-y: initial;
}
}
</style>
<div id="jetpack-newsletter-dashboard-wp-admin-app" class="boot-layout-container"></div>
<?php
}
// Hook the enqueue function to admin_enqueue_scripts
add_action( 'admin_enqueue_scripts', 'jetpack_newsletter_jetpack_newsletter_dashboard_wp_admin_enqueue_scripts' );
@@ -0,0 +1,318 @@
<?php
/**
* Page: jetpack-newsletter-dashboard
* Auto-generated by build process.
* Do not edit this file manually.
*
* @package jetpack_newsletter
*/
// Global storage for jetpack-newsletter-dashboard routes and menu items
global $jetpack_newsletter_jetpack_newsletter_dashboard_routes, $jetpack_newsletter_jetpack_newsletter_dashboard_menu_items;
$jetpack_newsletter_jetpack_newsletter_dashboard_routes = array();
$jetpack_newsletter_jetpack_newsletter_dashboard_menu_items = array();
/**
* Register a route for the jetpack-newsletter-dashboard page.
*
* @param string $path Route path (e.g., '/types/$type/edit/$id').
* @param string|null $content_module Script module ID for content (stage/inspector).
* @param string|null $route_module Script module ID for route lifecycle hooks.
*/
function jetpack_newsletter_register_jetpack_newsletter_dashboard_route( $path, $content_module = null, $route_module = null ) {
global $jetpack_newsletter_jetpack_newsletter_dashboard_routes;
$route = array( 'path' => $path );
if ( ! empty( $content_module ) ) {
$route['content_module'] = $content_module;
}
if ( ! empty( $route_module ) ) {
$route['route_module'] = $route_module;
}
$jetpack_newsletter_jetpack_newsletter_dashboard_routes[] = $route;
}
/**
* Register a menu item for the jetpack-newsletter-dashboard page.
*
* @param string $id Menu item ID.
* @param string $label Display label.
* @param string $to Route path to navigate to.
* @param string $parent_id Optional. Parent menu item ID.
* @param string $parent_type Optional. Parent type: 'drilldown' or 'dropdown'.
*/
function jetpack_newsletter_register_jetpack_newsletter_dashboard_menu_item( $id, $label, $to, $parent_id = '', $parent_type = '' ) {
global $jetpack_newsletter_jetpack_newsletter_dashboard_menu_items;
$menu_item = array(
'id' => $id,
'label' => $label,
'to' => $to,
);
if ( ! empty( $parent_id ) ) {
$menu_item['parent'] = $parent_id;
}
if ( ! empty( $parent_type ) && in_array( $parent_type, array( 'drilldown', 'dropdown' ), true ) ) {
$menu_item['parent_type'] = $parent_type;
}
$jetpack_newsletter_jetpack_newsletter_dashboard_menu_items[] = $menu_item;
}
/**
* Get all registered routes for the jetpack-newsletter-dashboard page.
*
* @return array Array of route objects.
*/
function jetpack_newsletter_get_jetpack_newsletter_dashboard_routes() {
global $jetpack_newsletter_jetpack_newsletter_dashboard_routes;
return $jetpack_newsletter_jetpack_newsletter_dashboard_routes ?? array();
}
/**
* Get all registered menu items for the jetpack-newsletter-dashboard page.
*
* @return array Array of menu item objects.
*/
function jetpack_newsletter_get_jetpack_newsletter_dashboard_menu_items() {
global $jetpack_newsletter_jetpack_newsletter_dashboard_menu_items;
return $jetpack_newsletter_jetpack_newsletter_dashboard_menu_items ?? array();
}
/**
* Preload REST API data for the jetpack-newsletter-dashboard page.
* Automatically called during page rendering.
*/
function jetpack_newsletter_jetpack_newsletter_dashboard_preload_data() {
// Define paths to preload - same for all pages
// Please also change packages/core-data/src/entities.js when changing this.
$preload_paths = array(
'/?_fields=description,gmt_offset,home,image_sizes,image_size_threshold,name,site_icon,site_icon_url,site_logo,timezone_string,url,page_for_posts,page_on_front,show_on_front',
array( '/wp/v2/settings', 'OPTIONS' ),
);
// Use rest_preload_api_request to gather the preloaded data
$preload_data = array_reduce(
$preload_paths,
'rest_preload_api_request',
array()
);
// Register the preloading middleware with wp-api-fetch
wp_add_inline_script(
'wp-api-fetch',
sprintf(
'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );',
wp_json_encode( $preload_data )
),
'after'
);
}
/**
* Render the jetpack-newsletter-dashboard page.
* Call this function from add_menu_page or add_submenu_page.
*/
function jetpack_newsletter_jetpack_newsletter_dashboard_render_page() {
// Load build constants
$build_constants = require __DIR__ . '/../../constants.php';
// Set current screen
set_current_screen();
// Remove unwanted deprecated handler
remove_action( 'admin_head', 'wp_admin_bar_header' );
// Remove unwanted scripts and styles that were enqueued during `admin_init`
foreach ( wp_scripts()->queue as $script ) {
wp_dequeue_script( $script );
}
foreach ( wp_styles()->queue as $style ) {
wp_dequeue_style( $style );
}
/**
* Fires when the jetpack-newsletter-dashboard page is initialized so extensions can register routes and menu items.
*/
do_action( 'jetpack-newsletter-dashboard_init' );
// Enqueue command palette assets for boot-based pages
if ( function_exists( 'wp_enqueue_command_palette_assets' ) ) {
wp_enqueue_command_palette_assets();
}
// Preload REST API data
jetpack_newsletter_jetpack_newsletter_dashboard_preload_data();
// Get all registered routes and menu items
$menu_items = jetpack_newsletter_get_jetpack_newsletter_dashboard_menu_items();
$routes = jetpack_newsletter_get_jetpack_newsletter_dashboard_routes();
// Get boot module asset file for dependencies
$asset_file = __DIR__ . '/../../modules/boot/index.min.asset.php';
if ( file_exists( $asset_file ) ) {
$asset = require $asset_file;
// This script serves two purposes:
// 1. It ensures all the globals that are made available to the modules are loaded.
// 2. It initializes the boot module as an inline script.
wp_register_script( 'jetpack-newsletter-dashboard-prerequisites', '', $asset['dependencies'], $asset['version'], true );
// Add inline script to initialize the app
$init_modules = [];
wp_add_inline_script(
'jetpack-newsletter-dashboard-prerequisites',
sprintf(
'import("@wordpress/boot").then(mod => mod.init({mountId: "%s", menuItems: %s, routes: %s, initModules: %s, dashboardLink: "%s"}));',
'jetpack-newsletter-dashboard-app',
wp_json_encode( $menu_items, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
wp_json_encode( $routes, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
wp_json_encode( $init_modules, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
esc_url( admin_url( '/' ) )
)
);
// Register prerequisites style by filtering script dependencies to find registered styles
$style_dependencies = array_filter(
$asset['dependencies'],
function ( $handle ) {
return wp_style_is( $handle, 'registered' );
}
);
wp_register_style( 'jetpack-newsletter-dashboard-prerequisites', false, $style_dependencies, $asset['version'] );
// Build dependencies for jetpack-newsletter-dashboard module
$boot_dependencies = array(
array(
'import' => 'static',
'id' => '@wordpress/boot',
),
);
// Add init modules as static dependencies
// No init modules configured
// Add all registered routes as dependencies
foreach ( $routes as $route ) {
if ( isset( $route['route_module'] ) ) {
$boot_dependencies[] = array(
'import' => 'static',
'id' => $route['route_module'],
);
}
if ( isset( $route['content_module'] ) ) {
$boot_dependencies[] = array(
'import' => 'dynamic',
'id' => $route['content_module'],
);
}
}
/**
* Filters the boot script-module dependencies for the
* jetpack-newsletter-dashboard page.
*
* Surfaces extending this page can append entries to the boot
* dependency list. Each entry is an array with 'import' (string
* 'static' or 'dynamic') and 'id' (script-module handle) keys.
*
* @param array $boot_dependencies Boot dependencies for the page.
*/
$boot_dependencies = apply_filters(
'jetpack-newsletter-dashboard_boot_dependencies',
$boot_dependencies
);
// Dummy script module to ensure dependencies are loaded
wp_register_script_module(
'jetpack-newsletter-dashboard',
$build_constants['build_url'] . 'pages/jetpack-newsletter-dashboard/loader.js',
$boot_dependencies
);
// Enqueue the boot scripts and styles
wp_enqueue_script( 'jetpack-newsletter-dashboard-prerequisites' );
wp_enqueue_script_module( 'jetpack-newsletter-dashboard' );
wp_enqueue_style( 'jetpack-newsletter-dashboard-prerequisites' );
}
// Output the HTML
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?php echo esc_html( get_admin_page_title() ); ?></title>
<style>
html {
background: #f1f1f1;
color: #444;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
font-size: 13px;
line-height: 1.4em;
}
body {
margin: 0;
}
#wpadminbar { display: none; }
</style>
<?php
global $hook_suffix;
// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$hook_suffix = 'jetpack-newsletter-dashboard';
// BEGIN see wp-admin/admin-header.php
print_admin_styles();
print_head_scripts();
/** This action is documented in wp-admin/admin-header.php */
do_action( "admin_head-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
/** This action is documented in wp-admin/admin-header.php */
do_action( 'admin_head' );
// END see wp-admin/admin-header.php
?>
</head>
<body class="jetpack-newsletter-dashboard">
<div id="jetpack-newsletter-dashboard-app" style="height: 100vh; box-sizing: border-box;"></div>
<?php
// BEGIN see wp-admin/admin-footer.php
/** This action is documented in wp-admin/admin-footer.php */
do_action( 'admin_footer', '' );
// Print import map first so it's available for inline scripts
wp_script_modules()->print_import_map();
print_footer_scripts();
wp_script_modules()->print_enqueued_script_modules();
wp_script_modules()->print_script_module_preloads();
wp_script_modules()->print_script_module_data();
/** This action is documented in wp-admin/admin-footer.php */
do_action( "admin_footer-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
// END see wp-admin/admin-footer.php
?>
</body>
</html>
<?php
exit;
}
/**
* Intercept admin_init to render the page early.
* This bypasses the default WordPress admin template.
*/
function jetpack_newsletter_jetpack_newsletter_dashboard_intercept_render() {
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
if ( isset( $_GET['page'] ) && 'jetpack-newsletter-dashboard' === $_GET['page'] ) {
jetpack_newsletter_jetpack_newsletter_dashboard_render_page();
exit;
}
}
// Hook the interceptor to admin_init
add_action( 'admin_init', 'jetpack_newsletter_jetpack_newsletter_dashboard_intercept_render' );
@@ -0,0 +1 @@
// Empty module loader for page dependencies
@@ -0,0 +1,317 @@
<?php
/**
* Page: jetpack-subscribers-announcement (wp-admin integrated)
* Auto-generated by build process.
* Do not edit this file manually.
*
* This version integrates with the standard WordPress admin interface,
* keeping the wp-admin sidebar and scripts/styles intact.
*
* @package jetpack_newsletter
*/
// Global storage for jetpack-subscribers-announcement routes and menu items
global $jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_routes, $jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_menu_items;
$jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_routes = array();
$jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_menu_items = array();
/**
* Register a route for the jetpack-subscribers-announcement-wp-admin page.
*
* @param string $path Route path (e.g., '/types/$type/edit/$id').
* @param string|null $content_module Script module ID for content (stage/inspector).
* @param string|null $route_module Script module ID for route lifecycle hooks.
*/
function jetpack_newsletter_register_jetpack_subscribers_announcement_wp_admin_route( $path, $content_module = null, $route_module = null ) {
global $jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_routes;
$route = array( 'path' => $path );
if ( ! empty( $content_module ) ) {
$route['content_module'] = $content_module;
}
if ( ! empty( $route_module ) ) {
$route['route_module'] = $route_module;
}
$jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_routes[] = $route;
}
/**
* Register a menu item for the jetpack-subscribers-announcement-wp-admin page.
* Note: Menu items are registered but not displayed in single-page mode.
*
* @param string $id Menu item ID.
* @param string $label Display label.
* @param string $to Route path to navigate to.
* @param string $parent_id Optional. Parent menu item ID.
*/
function jetpack_newsletter_register_jetpack_subscribers_announcement_wp_admin_menu_item( $id, $label, $to, $parent_id = '' ) {
global $jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_menu_items;
$menu_item = array(
'id' => $id,
'label' => $label,
'to' => $to,
);
if ( ! empty( $parent_id ) ) {
$menu_item['parent'] = $parent_id;
}
$jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_menu_items[] = $menu_item;
}
/**
* Get all registered routes for the jetpack-subscribers-announcement-wp-admin page.
*
* @return array Array of route objects.
*/
function jetpack_newsletter_get_jetpack_subscribers_announcement_wp_admin_routes() {
global $jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_routes;
return $jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_routes ?? array();
}
/**
* Get all registered menu items for the jetpack-subscribers-announcement-wp-admin page.
*
* @return array Array of menu item objects.
*/
function jetpack_newsletter_get_jetpack_subscribers_announcement_wp_admin_menu_items() {
global $jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_menu_items;
return $jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_menu_items ?? array();
}
/**
* Preload REST API data for the jetpack-subscribers-announcement-wp-admin page.
* Automatically called during page rendering.
*/
function jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_preload_data() {
// Define paths to preload - same for all pages
// Please also change packages/core-data/src/entities.js when changing this.
$preload_paths = array(
'/?_fields=description,gmt_offset,home,image_sizes,image_size_threshold,name,site_icon,site_icon_url,site_logo,timezone_string,url,page_for_posts,page_on_front,show_on_front',
array( '/wp/v2/settings', 'OPTIONS' ),
);
// Use rest_preload_api_request to gather the preloaded data
$preload_data = array_reduce(
$preload_paths,
'rest_preload_api_request',
array()
);
// Register the preloading middleware with wp-api-fetch
wp_add_inline_script(
'wp-api-fetch',
sprintf(
'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );',
wp_json_encode( $preload_data )
),
'after'
);
}
/**
* Enqueue scripts and styles for the jetpack-subscribers-announcement-wp-admin page.
* Hooked to admin_enqueue_scripts.
*
* @param string $hook_suffix The current admin page.
*/
function jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_enqueue_scripts( $hook_suffix ) {
// Check all possible ways this page can be accessed:
// 1. Menu page via admin.php?page=jetpack-subscribers-announcement-wp-admin (plugin)
// 2. Direct file via jetpack-subscribers-announcement.php (Core) - screen ID will be 'jetpack-subscribers-announcement'
$current_screen = get_current_screen();
$is_our_page = (
( isset( $_GET['page'] ) && 'jetpack-subscribers-announcement-wp-admin' === $_GET['page'] ) || // phpcs:ignore WordPress.Security.NonceVerification.Recommended
( $current_screen && 'jetpack-subscribers-announcement' === $current_screen->id )
);
if ( ! $is_our_page ) {
return;
}
// Load build constants
$build_constants = require __DIR__ . '/../../constants.php';
/**
* Fires when the jetpack-subscribers-announcement admin page is initialized so extensions can register routes and menu items.
*/
do_action( 'jetpack-subscribers-announcement-wp-admin_init' );
// Preload REST API data
jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_preload_data();
// Get all registered routes
$routes = jetpack_newsletter_get_jetpack_subscribers_announcement_wp_admin_routes();
// Get boot module asset file for dependencies
$asset_file = __DIR__ . '/../../modules/boot/index.min.asset.php';
if ( file_exists( $asset_file ) ) {
$asset = require $asset_file;
// This script serves two purposes:
// 1. It ensures all the globals that are made available to the modules are loaded.
// 2. It initializes the boot module as an inline script.
wp_register_script( 'jetpack-subscribers-announcement-wp-admin-prerequisites', '', $asset['dependencies'], $asset['version'], true );
/*
* Add inline script to initialize the app using initSinglePage (no menuItems).
* The dynamic import is deferred until DOMContentLoaded so that all classic
* script dependencies of @wordpress/boot (wp-private-apis, wp-components,
* wp-theme, etc.) have finished parsing and executing before the boot module
* evaluates. Otherwise, a modulepreloaded @wordpress/boot can win the race
* against the classic-script-printing pass on fast CDN-fronted hosts in
* Chrome, evaluating before wp.theme.privateApis is defined and throwing
* "Cannot unlock an undefined object". See <https://core.trac.wordpress.org/ticket/65103>.
*/
$init_js_function = <<<'JS'
( mountId, routes ) => {
const run = async () => {
const mod = await import( "@wordpress/boot" );
mod.initSinglePage( { mountId, routes } );
};
if ( document.readyState === "loading" ) {
document.addEventListener( "DOMContentLoaded", run );
} else {
run();
}
}
JS;
wp_add_inline_script(
'jetpack-subscribers-announcement-wp-admin-prerequisites',
sprintf(
'( %s )( %s, %s );',
$init_js_function,
wp_json_encode( 'jetpack-subscribers-announcement-wp-admin-app', JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
wp_json_encode( $routes, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
)
);
// Register prerequisites style by filtering script dependencies to find registered styles
$style_dependencies = array_filter(
$asset['dependencies'],
function ( $handle ) {
return wp_style_is( $handle, 'registered' );
}
);
wp_register_style( 'jetpack-subscribers-announcement-wp-admin-prerequisites', false, $style_dependencies, $asset['version'] );
// Build dependencies for jetpack-subscribers-announcement-wp-admin module
$boot_dependencies = array(
array(
'import' => 'static',
'id' => '@wordpress/boot',
),
);
// Add all registered routes as dependencies
foreach ( $routes as $route ) {
if ( isset( $route['route_module'] ) ) {
$boot_dependencies[] = array(
'import' => 'static',
'id' => $route['route_module'],
);
}
if ( isset( $route['content_module'] ) ) {
$boot_dependencies[] = array(
'import' => 'dynamic',
'id' => $route['content_module'],
);
}
}
/**
* Filters the boot script-module dependencies for the
* jetpack-subscribers-announcement-wp-admin page.
*
* Surfaces extending this page can append entries to the boot
* dependency list. Each entry is an array with 'import' (string
* 'static' or 'dynamic') and 'id' (script-module handle) keys.
*
* @param array $boot_dependencies Boot dependencies for the page.
*/
$boot_dependencies = apply_filters(
'jetpack-subscribers-announcement-wp-admin_boot_dependencies',
$boot_dependencies
);
// Dummy script module to ensure dependencies are loaded
wp_register_script_module(
'jetpack-subscribers-announcement-wp-admin',
$build_constants['build_url'] . 'pages/jetpack-subscribers-announcement/loader.js',
$boot_dependencies
);
// Enqueue the boot scripts and styles
wp_enqueue_script( 'jetpack-subscribers-announcement-wp-admin-prerequisites' );
wp_enqueue_script_module( 'jetpack-subscribers-announcement-wp-admin' );
wp_enqueue_style( 'jetpack-subscribers-announcement-wp-admin-prerequisites' );
}
}
/**
* Render the jetpack-subscribers-announcement-wp-admin page.
* Call this function from add_menu_page or add_submenu_page.
* This renders within the normal WordPress admin interface.
*/
function jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_render_page() {
?>
<style>
/* Critical styles to prevent layout shifts - inlined for immediate application */
#wpwrap {
overflow-y: auto;
}
body {
background: #fff;
}
/* Reset wp-admin padding */
#wpcontent {
padding-inline-start: 0;
}
#wpbody-content {
padding-bottom: 0;
}
/* Hide legacy admin elements */
#wpbody-content > div:not(.boot-layout-container):not(#screen-meta) {
display: none;
}
#wpfooter {
display: none;
}
/* Accessibility regions */
.a11y-speak-region {
inset-inline-start: -1px;
top: -1px;
}
/* Admin menu indicators */
ul#adminmenu a.wp-has-current-submenu::after,
ul#adminmenu > li.current > a.current::after {
border-inline-end-color: #fff;
}
/* Media frame fix */
.media-frame select.attachment-filters:last-of-type {
width: auto;
max-width: 100%;
}
/* Responsive overflow fix for #wpwrap */
@media (min-width: 782px) {
#wpwrap {
overflow-y: initial;
}
}
</style>
<div id="jetpack-subscribers-announcement-wp-admin-app" class="boot-layout-container"></div>
<?php
}
// Hook the enqueue function to admin_enqueue_scripts
add_action( 'admin_enqueue_scripts', 'jetpack_newsletter_jetpack_subscribers_announcement_wp_admin_enqueue_scripts' );
@@ -0,0 +1,318 @@
<?php
/**
* Page: jetpack-subscribers-announcement
* Auto-generated by build process.
* Do not edit this file manually.
*
* @package jetpack_newsletter
*/
// Global storage for jetpack-subscribers-announcement routes and menu items
global $jetpack_newsletter_jetpack_subscribers_announcement_routes, $jetpack_newsletter_jetpack_subscribers_announcement_menu_items;
$jetpack_newsletter_jetpack_subscribers_announcement_routes = array();
$jetpack_newsletter_jetpack_subscribers_announcement_menu_items = array();
/**
* Register a route for the jetpack-subscribers-announcement page.
*
* @param string $path Route path (e.g., '/types/$type/edit/$id').
* @param string|null $content_module Script module ID for content (stage/inspector).
* @param string|null $route_module Script module ID for route lifecycle hooks.
*/
function jetpack_newsletter_register_jetpack_subscribers_announcement_route( $path, $content_module = null, $route_module = null ) {
global $jetpack_newsletter_jetpack_subscribers_announcement_routes;
$route = array( 'path' => $path );
if ( ! empty( $content_module ) ) {
$route['content_module'] = $content_module;
}
if ( ! empty( $route_module ) ) {
$route['route_module'] = $route_module;
}
$jetpack_newsletter_jetpack_subscribers_announcement_routes[] = $route;
}
/**
* Register a menu item for the jetpack-subscribers-announcement page.
*
* @param string $id Menu item ID.
* @param string $label Display label.
* @param string $to Route path to navigate to.
* @param string $parent_id Optional. Parent menu item ID.
* @param string $parent_type Optional. Parent type: 'drilldown' or 'dropdown'.
*/
function jetpack_newsletter_register_jetpack_subscribers_announcement_menu_item( $id, $label, $to, $parent_id = '', $parent_type = '' ) {
global $jetpack_newsletter_jetpack_subscribers_announcement_menu_items;
$menu_item = array(
'id' => $id,
'label' => $label,
'to' => $to,
);
if ( ! empty( $parent_id ) ) {
$menu_item['parent'] = $parent_id;
}
if ( ! empty( $parent_type ) && in_array( $parent_type, array( 'drilldown', 'dropdown' ), true ) ) {
$menu_item['parent_type'] = $parent_type;
}
$jetpack_newsletter_jetpack_subscribers_announcement_menu_items[] = $menu_item;
}
/**
* Get all registered routes for the jetpack-subscribers-announcement page.
*
* @return array Array of route objects.
*/
function jetpack_newsletter_get_jetpack_subscribers_announcement_routes() {
global $jetpack_newsletter_jetpack_subscribers_announcement_routes;
return $jetpack_newsletter_jetpack_subscribers_announcement_routes ?? array();
}
/**
* Get all registered menu items for the jetpack-subscribers-announcement page.
*
* @return array Array of menu item objects.
*/
function jetpack_newsletter_get_jetpack_subscribers_announcement_menu_items() {
global $jetpack_newsletter_jetpack_subscribers_announcement_menu_items;
return $jetpack_newsletter_jetpack_subscribers_announcement_menu_items ?? array();
}
/**
* Preload REST API data for the jetpack-subscribers-announcement page.
* Automatically called during page rendering.
*/
function jetpack_newsletter_jetpack_subscribers_announcement_preload_data() {
// Define paths to preload - same for all pages
// Please also change packages/core-data/src/entities.js when changing this.
$preload_paths = array(
'/?_fields=description,gmt_offset,home,image_sizes,image_size_threshold,name,site_icon,site_icon_url,site_logo,timezone_string,url,page_for_posts,page_on_front,show_on_front',
array( '/wp/v2/settings', 'OPTIONS' ),
);
// Use rest_preload_api_request to gather the preloaded data
$preload_data = array_reduce(
$preload_paths,
'rest_preload_api_request',
array()
);
// Register the preloading middleware with wp-api-fetch
wp_add_inline_script(
'wp-api-fetch',
sprintf(
'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );',
wp_json_encode( $preload_data )
),
'after'
);
}
/**
* Render the jetpack-subscribers-announcement page.
* Call this function from add_menu_page or add_submenu_page.
*/
function jetpack_newsletter_jetpack_subscribers_announcement_render_page() {
// Load build constants
$build_constants = require __DIR__ . '/../../constants.php';
// Set current screen
set_current_screen();
// Remove unwanted deprecated handler
remove_action( 'admin_head', 'wp_admin_bar_header' );
// Remove unwanted scripts and styles that were enqueued during `admin_init`
foreach ( wp_scripts()->queue as $script ) {
wp_dequeue_script( $script );
}
foreach ( wp_styles()->queue as $style ) {
wp_dequeue_style( $style );
}
/**
* Fires when the jetpack-subscribers-announcement page is initialized so extensions can register routes and menu items.
*/
do_action( 'jetpack-subscribers-announcement_init' );
// Enqueue command palette assets for boot-based pages
if ( function_exists( 'wp_enqueue_command_palette_assets' ) ) {
wp_enqueue_command_palette_assets();
}
// Preload REST API data
jetpack_newsletter_jetpack_subscribers_announcement_preload_data();
// Get all registered routes and menu items
$menu_items = jetpack_newsletter_get_jetpack_subscribers_announcement_menu_items();
$routes = jetpack_newsletter_get_jetpack_subscribers_announcement_routes();
// Get boot module asset file for dependencies
$asset_file = __DIR__ . '/../../modules/boot/index.min.asset.php';
if ( file_exists( $asset_file ) ) {
$asset = require $asset_file;
// This script serves two purposes:
// 1. It ensures all the globals that are made available to the modules are loaded.
// 2. It initializes the boot module as an inline script.
wp_register_script( 'jetpack-subscribers-announcement-prerequisites', '', $asset['dependencies'], $asset['version'], true );
// Add inline script to initialize the app
$init_modules = [];
wp_add_inline_script(
'jetpack-subscribers-announcement-prerequisites',
sprintf(
'import("@wordpress/boot").then(mod => mod.init({mountId: "%s", menuItems: %s, routes: %s, initModules: %s, dashboardLink: "%s"}));',
'jetpack-subscribers-announcement-app',
wp_json_encode( $menu_items, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
wp_json_encode( $routes, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
wp_json_encode( $init_modules, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
esc_url( admin_url( '/' ) )
)
);
// Register prerequisites style by filtering script dependencies to find registered styles
$style_dependencies = array_filter(
$asset['dependencies'],
function ( $handle ) {
return wp_style_is( $handle, 'registered' );
}
);
wp_register_style( 'jetpack-subscribers-announcement-prerequisites', false, $style_dependencies, $asset['version'] );
// Build dependencies for jetpack-subscribers-announcement module
$boot_dependencies = array(
array(
'import' => 'static',
'id' => '@wordpress/boot',
),
);
// Add init modules as static dependencies
// No init modules configured
// Add all registered routes as dependencies
foreach ( $routes as $route ) {
if ( isset( $route['route_module'] ) ) {
$boot_dependencies[] = array(
'import' => 'static',
'id' => $route['route_module'],
);
}
if ( isset( $route['content_module'] ) ) {
$boot_dependencies[] = array(
'import' => 'dynamic',
'id' => $route['content_module'],
);
}
}
/**
* Filters the boot script-module dependencies for the
* jetpack-subscribers-announcement page.
*
* Surfaces extending this page can append entries to the boot
* dependency list. Each entry is an array with 'import' (string
* 'static' or 'dynamic') and 'id' (script-module handle) keys.
*
* @param array $boot_dependencies Boot dependencies for the page.
*/
$boot_dependencies = apply_filters(
'jetpack-subscribers-announcement_boot_dependencies',
$boot_dependencies
);
// Dummy script module to ensure dependencies are loaded
wp_register_script_module(
'jetpack-subscribers-announcement',
$build_constants['build_url'] . 'pages/jetpack-subscribers-announcement/loader.js',
$boot_dependencies
);
// Enqueue the boot scripts and styles
wp_enqueue_script( 'jetpack-subscribers-announcement-prerequisites' );
wp_enqueue_script_module( 'jetpack-subscribers-announcement' );
wp_enqueue_style( 'jetpack-subscribers-announcement-prerequisites' );
}
// Output the HTML
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?php echo esc_html( get_admin_page_title() ); ?></title>
<style>
html {
background: #f1f1f1;
color: #444;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
font-size: 13px;
line-height: 1.4em;
}
body {
margin: 0;
}
#wpadminbar { display: none; }
</style>
<?php
global $hook_suffix;
// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$hook_suffix = 'jetpack-subscribers-announcement';
// BEGIN see wp-admin/admin-header.php
print_admin_styles();
print_head_scripts();
/** This action is documented in wp-admin/admin-header.php */
do_action( "admin_head-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
/** This action is documented in wp-admin/admin-header.php */
do_action( 'admin_head' );
// END see wp-admin/admin-header.php
?>
</head>
<body class="jetpack-subscribers-announcement">
<div id="jetpack-subscribers-announcement-app" style="height: 100vh; box-sizing: border-box;"></div>
<?php
// BEGIN see wp-admin/admin-footer.php
/** This action is documented in wp-admin/admin-footer.php */
do_action( 'admin_footer', '' );
// Print import map first so it's available for inline scripts
wp_script_modules()->print_import_map();
print_footer_scripts();
wp_script_modules()->print_enqueued_script_modules();
wp_script_modules()->print_script_module_preloads();
wp_script_modules()->print_script_module_data();
/** This action is documented in wp-admin/admin-footer.php */
do_action( "admin_footer-{$hook_suffix}" ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
// END see wp-admin/admin-footer.php
?>
</body>
</html>
<?php
exit;
}
/**
* Intercept admin_init to render the page early.
* This bypasses the default WordPress admin template.
*/
function jetpack_newsletter_jetpack_subscribers_announcement_intercept_render() {
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
if ( isset( $_GET['page'] ) && 'jetpack-subscribers-announcement' === $_GET['page'] ) {
jetpack_newsletter_jetpack_subscribers_announcement_render_page();
exit;
}
}
// Hook the interceptor to admin_init
add_action( 'admin_init', 'jetpack_newsletter_jetpack_subscribers_announcement_intercept_render' );
@@ -0,0 +1 @@
<?php return array('dependencies' => array(), 'version' => '6569e23e23e0349e92b7');
@@ -0,0 +1 @@
@media(max-width:360px){#wpadminbar .wp-admin-bar-reader{display:none!important}}#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-item{padding:0}@media(max-width:782px){#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-item{display:flex;justify-content:center}}#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-icon{align-items:center;display:flex;height:100%;margin:0;padding:0 6px}@media(max-width:782px){#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-icon{justify-content:center;padding:0}}@media(max-width:480px){#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-icon{max-width:40px}}#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-icon:before{background-color:currentColor;content:"";display:flex;height:20px;margin:0;mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="11" fill="none" viewBox="0 0 24 11"><path fill="%23000" d="m22.875 4.607-.055-.25C22.335 2.175 20.276.584 17.924.584c-1.271 0-2.488.447-3.412 1.264-.32.283-.568.593-.769.894a9.5 9.5 0 0 0-1.711-.18h-.027c-.586 0-1.163.085-1.73.188a4.7 4.7 0 0 0-.777-.91C8.573 1.013 7.356.575 6.085.575 3.724.584 1.665 2.174 1.18 4.358l-.055.249H0v1.4h1.125l.055.25c.458 2.183 2.517 3.773 4.895 3.773 2.764 0 5.005-2.114 5.005-4.718 0 0 .01-.585-.228-1.341a9 9 0 0 1 1.153-.095c.366 0 .75.035 1.143.086-.247.765-.229 1.35-.229 1.35 0 2.604 2.242 4.718 5.005 4.718 2.38 0 4.438-1.581 4.896-3.773l.055-.25H24v-1.4zm-16.8 4.022c-1.94 0-3.522-1.487-3.522-3.326 0-1.84 1.583-3.326 3.522-3.326 1.94 0 3.523 1.487 3.523 3.326 0 1.84-1.583 3.326-3.523 3.326m11.85 0c-1.94 0-3.523-1.487-3.523-3.326 0-1.84 1.583-3.326 3.522-3.326 1.94 0 3.523 1.487 3.523 3.326 0 1.84-1.583 3.326-3.523 3.326"/></svg>');mask-position:center;mask-repeat:no-repeat;width:24px}@media(max-width:782px){#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-icon:before{height:36px;margin:0;mask-size:contain;width:36px}}#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-label{padding-inline-end:8px}@media(max-width:782px){#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-label{display:none}#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader{display:block}}@media(max-width:480px){#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader{width:46px}}
@@ -0,0 +1 @@
@media(max-width:360px){#wpadminbar .wp-admin-bar-reader{display:none!important}}#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-item{padding:0}@media(max-width:782px){#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-item{display:flex;justify-content:center}}#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-icon{align-items:center;display:flex;height:100%;margin:0;padding:0 6px}@media(max-width:782px){#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-icon{justify-content:center;padding:0}}@media(max-width:480px){#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-icon{max-width:40px}}#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-icon:before{background-color:currentColor;content:"";display:flex;height:20px;margin:0;mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="11" fill="none" viewBox="0 0 24 11"><path fill="%23000" d="m22.875 4.607-.055-.25C22.335 2.175 20.276.584 17.924.584c-1.271 0-2.488.447-3.412 1.264-.32.283-.568.593-.769.894a9.5 9.5 0 0 0-1.711-.18h-.027c-.586 0-1.163.085-1.73.188a4.7 4.7 0 0 0-.777-.91C8.573 1.013 7.356.575 6.085.575 3.724.584 1.665 2.174 1.18 4.358l-.055.249H0v1.4h1.125l.055.25c.458 2.183 2.517 3.773 4.895 3.773 2.764 0 5.005-2.114 5.005-4.718 0 0 .01-.585-.228-1.341a9 9 0 0 1 1.153-.095c.366 0 .75.035 1.143.086-.247.765-.229 1.35-.229 1.35 0 2.604 2.242 4.718 5.005 4.718 2.38 0 4.438-1.581 4.896-3.773l.055-.25H24v-1.4zm-16.8 4.022c-1.94 0-3.522-1.487-3.522-3.326 0-1.84 1.583-3.326 3.522-3.326 1.94 0 3.523 1.487 3.523 3.326 0 1.84-1.583 3.326-3.523 3.326m11.85 0c-1.94 0-3.523-1.487-3.523-3.326 0-1.84 1.583-3.326 3.522-3.326 1.94 0 3.523 1.487 3.523 3.326 0 1.84-1.583 3.326-3.523 3.326"/></svg>');mask-position:center;mask-repeat:no-repeat;width:24px}@media(max-width:782px){#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-icon:before{height:36px;margin:0;mask-size:contain;width:36px}}#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-label{padding-inline-end:8px}@media(max-width:782px){#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader .ab-label{display:none}#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader{display:block}}@media(max-width:480px){#wpadminbar #wp-admin-bar-top-secondary #wp-admin-bar-reader{width:46px}}
@@ -0,0 +1,132 @@
<?php
/**
* Routes registration - Auto-generated by build process.
* Registers all routes on their respective page init hooks.
* Do not edit this file manually.
*
* @package jetpack_newsletter
*/
// Load routes registry
$routes_file = __DIR__ . '/routes/registry.php';
if ( ! file_exists( $routes_file ) ) {
return;
}
$routes = require $routes_file;
// Group routes by page and store in globals for page-specific functions
$routes_by_page = array();
foreach ( $routes as $route ) {
$page_slug = $route['page'];
if ( ! isset( $routes_by_page[ $page_slug ] ) ) {
$routes_by_page[ $page_slug ] = array();
}
$routes_by_page[ $page_slug ][] = $route;
}
// Store routes data in globals for each page
foreach ( $routes_by_page as $page_slug => $page_routes ) {
$page_slug_underscore = str_replace( '-', '_', $page_slug );
$global_name = 'jetpack_newsletter_' . $page_slug_underscore . '_routes_data';
$GLOBALS[ $global_name ] = $page_routes;
}
/**
* Generic helper function to register routes for a page.
*
* @param array $page_routes Array of route data for the page.
* @param string $register_function_name Name of the function to call for registering each route.
*/
function jetpack_newsletter_register_page_routes( $page_routes, $register_function_name ) {
// Load build constants
$build_constants = require __DIR__ . '/constants.php';
foreach ( $page_routes as $route ) {
$content_handle = null;
$route_handle = null;
// Register content module if exists
if ( $route['has_content'] ) {
$content_asset_path = __DIR__ . "/routes/{$route['name']}/content.min.asset.php";
if ( file_exists( $content_asset_path ) ) {
$content_asset = require $content_asset_path;
$content_handle = 'jetpack-newsletter/routes/' . $route['name'] . '/content';
$extension = '.min.js';
// Deregister first to override any previously registered version
// (e.g., Core's default modules when running as a plugin).
wp_deregister_script_module( $content_handle );
wp_register_script_module(
$content_handle,
$build_constants['build_url'] . 'routes/' . $route['name'] . '/content' . $extension,
$content_asset['module_dependencies'] ?? array(),
$content_asset['version'] ?? false
);
}
}
// Register route module if exists
if ( $route['has_route'] ) {
$route_asset_path = __DIR__ . "/routes/{$route['name']}/route.min.asset.php";
if ( file_exists( $route_asset_path ) ) {
$route_asset = require $route_asset_path;
$route_handle = 'jetpack-newsletter/routes/' . $route['name'] . '/route';
$extension = '.min.js';
// Deregister first to override any previously registered version
// (e.g., Core's default modules when running as a plugin).
wp_deregister_script_module( $route_handle );
wp_register_script_module(
$route_handle,
$build_constants['build_url'] . 'routes/' . $route['name'] . '/route' . $extension,
$route_asset['module_dependencies'] ?? array(),
$route_asset['version'] ?? false
);
}
}
// Register route with page
if ( function_exists( $register_function_name ) ) {
call_user_func( $register_function_name, $route['path'], $content_handle, $route_handle );
}
}
}
// Page-specific route registration functions
// Page-specific route registration functions for jetpack-newsletter-dashboard
/**
* Register routes for jetpack-newsletter-dashboard page (full-page mode).
*/
function jetpack_newsletter_register_jetpack_newsletter_dashboard_page_routes() {
global $jetpack_newsletter_jetpack_newsletter_dashboard_routes_data;
jetpack_newsletter_register_page_routes( $jetpack_newsletter_jetpack_newsletter_dashboard_routes_data, 'jetpack_newsletter_register_jetpack_newsletter_dashboard_route' );
}
add_action( 'jetpack-newsletter-dashboard_init', 'jetpack_newsletter_register_jetpack_newsletter_dashboard_page_routes' );
/**
* Register routes for jetpack-newsletter-dashboard page (wp-admin mode).
*/
function jetpack_newsletter_register_jetpack_newsletter_dashboard_wp_admin_page_routes() {
global $jetpack_newsletter_jetpack_newsletter_dashboard_routes_data;
jetpack_newsletter_register_page_routes( $jetpack_newsletter_jetpack_newsletter_dashboard_routes_data, 'jetpack_newsletter_register_jetpack_newsletter_dashboard_wp_admin_route' );
}
add_action( 'jetpack-newsletter-dashboard-wp-admin_init', 'jetpack_newsletter_register_jetpack_newsletter_dashboard_wp_admin_page_routes' );
// Page-specific route registration functions for jetpack-subscribers-announcement
/**
* Register routes for jetpack-subscribers-announcement page (full-page mode).
*/
function jetpack_newsletter_register_jetpack_subscribers_announcement_page_routes() {
global $jetpack_newsletter_jetpack_subscribers_announcement_routes_data;
jetpack_newsletter_register_page_routes( $jetpack_newsletter_jetpack_subscribers_announcement_routes_data, 'jetpack_newsletter_register_jetpack_subscribers_announcement_route' );
}
add_action( 'jetpack-subscribers-announcement_init', 'jetpack_newsletter_register_jetpack_subscribers_announcement_page_routes' );
/**
* Register routes for jetpack-subscribers-announcement page (wp-admin mode).
*/
function jetpack_newsletter_register_jetpack_subscribers_announcement_wp_admin_page_routes() {
global $jetpack_newsletter_jetpack_subscribers_announcement_routes_data;
jetpack_newsletter_register_page_routes( $jetpack_newsletter_jetpack_subscribers_announcement_routes_data, 'jetpack_newsletter_register_jetpack_subscribers_announcement_wp_admin_route' );
}
add_action( 'jetpack-subscribers-announcement-wp-admin_init', 'jetpack_newsletter_register_jetpack_subscribers_announcement_wp_admin_page_routes' );
@@ -0,0 +1 @@
<?php return array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keycodes', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-theme', 'wp-url', 'wp-warning'), 'module_dependencies' => array(array('id' => '@wordpress/a11y', 'import' => 'static'), array('id' => '@wordpress/route', 'import' => 'static')), 'version' => 'aaece2843ec8199bb63f');
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
<?php return array('dependencies' => array(), 'version' => '214f7487552bc80b234d');
@@ -0,0 +1 @@
var e={inspector:({search:r})=>r?.tab==="settings"?!1:!!(r?.subscriber||r?.u)};export{e as route};
@@ -0,0 +1,24 @@
<?php
/**
* Route registry - Auto-generated by build process.
* Do not edit this file manually.
*
* @package jetpack_newsletter
*/
return array(
array(
'name' => 'dashboard',
'path' => '/',
'page' => 'jetpack-newsletter-dashboard',
'has_route' => true,
'has_content' => true,
),
array(
'name' => 'subscribers-announcement',
'path' => '/',
'page' => 'jetpack-subscribers-announcement',
'has_route' => false,
'has_content' => true,
)
);
@@ -0,0 +1 @@
<?php return array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-theme', 'wp-url'), 'module_dependencies' => array(array('id' => '@wordpress/a11y', 'import' => 'static'), array('id' => '@wordpress/route', 'import' => 'static')), 'version' => 'ad0755c97021548579db');
@@ -0,0 +1,85 @@
<?php
/**
* Script registration - Auto-generated by build process.
* Do not edit this file manually.
*
* @package jetpack_newsletter
*/
/**
* Registers a script according to `wp_register_script`. Honors this request by
* reassigning internal dependency properties of any script handle already
* registered by that name. It does not deregister the original script, to
* avoid losing inline scripts which may have been attached.
*
* @param WP_Scripts $scripts WP_Scripts instance.
* @param string $handle Name of the script. Should be unique.
* @param string $src Full URL of the script, or path of the script relative to the WordPress root directory.
* @param array $deps Optional. An array of registered script handles this script depends on. Default empty array.
* @param string|bool|null $ver Optional. String specifying script version number, if it has one, which is added to the URL
* as a query string for cache busting purposes. If version is set to false, a version
* number is automatically added equal to current installed WordPress version.
* If set to null, no version is added.
* @param bool $in_footer Optional. Whether to enqueue the script before </body> instead of in the <head>.
* Default 'false'.
*/
function jetpack_newsletter_override_script( $scripts, $handle, $src, $deps = array(), $ver = false, $in_footer = false ) {
$script = $scripts->query( $handle, 'registered' );
if ( $script ) {
/*
* In many ways, this is a reimplementation of `wp_register_script` but
* bypassing consideration of whether a script by the given handle had
* already been registered.
*/
// See: `_WP_Dependency::__construct` .
$script->src = $src;
$script->deps = $deps;
$script->ver = $ver;
$script->args = $in_footer ? 1 : null;
} else {
$scripts->add( $handle, $src, $deps, $ver, ( $in_footer ? 1 : null ) );
}
if ( in_array( 'wp-i18n', $deps, true ) ) {
$scripts->set_translations( $handle );
}
}
/**
* Register all package scripts.
*/
function jetpack_newsletter_register_package_scripts( $scripts ) {
// Load build constants
$build_constants = require __DIR__ . '/constants.php';
$default_version = ! SCRIPT_DEBUG ? $build_constants['version'] : time();
$extension = '.min.js';
$scripts_dir = __DIR__ . '/scripts';
$scripts_file = $scripts_dir . '/registry.php';
if ( ! file_exists( $scripts_file ) ) {
return;
}
$scripts_data = require $scripts_file;
$plugin_dir = dirname( __FILE__ );
foreach ( $scripts_data as $script_data ) {
$asset_file = $scripts_dir . '/' . $script_data['asset'];
$asset = file_exists( $asset_file ) ? require $asset_file : array();
$dependencies = $asset['dependencies'] ?? array();
$version = $asset['version'] ?? $default_version;
jetpack_newsletter_override_script(
$scripts,
$script_data['handle'],
$build_constants['build_url'] . 'scripts/' . $script_data['path'] . $extension,
$dependencies,
$version,
true
);
}
}
add_action( 'wp_default_scripts', 'jetpack_newsletter_register_package_scripts' );
@@ -0,0 +1,11 @@
<?php
/**
* Script registry - Auto-generated by build process.
* Do not edit this file manually.
*
* @package jetpack_newsletter
*/
return array(
);
@@ -0,0 +1,73 @@
<?php
/**
* Style registration - Auto-generated by build process.
* Do not edit this file manually.
*
* Note: These styles can be overridden by calling jetpack_newsletter_override_style()
* in lib/client-assets.php for complex cases (multiple files, conditional deps, etc.)
*
* @package jetpack_newsletter
*/
/**
* Registers a style according to `wp_register_style`. Honors this request by
* deregistering any style by the same handler before registration.
*
* @param WP_Styles $styles WP_Styles instance.
* @param string $handle Name of the stylesheet. Should be unique.
* @param string $src Full URL of the stylesheet, or path of the stylesheet relative to the WordPress root directory.
* @param array $deps Optional. An array of registered stylesheet handles this stylesheet depends on. Default empty array.
* @param string|bool|null $ver Optional. String specifying stylesheet version number, if it has one, which is added to the URL
* as a query string for cache busting purposes. If version is set to false, a version
* number is automatically added equal to current installed WordPress version.
* If set to null, no version is added.
* @param string $media Optional. The media for which this stylesheet has been defined.
* Default 'all'. Accepts media types like 'all', 'print' and 'screen', or media queries like
* '(orientation: portrait)' and '(max-width: 640px)'.
*/
function jetpack_newsletter_override_style( $styles, $handle, $src, $deps = array(), $ver = false, $media = 'all' ) {
$style = $styles->query( $handle, 'registered' );
if ( $style ) {
$styles->remove( $handle );
}
$styles->add( $handle, $src, $deps, $ver, $media );
}
/**
* Register all package styles (simple cases only).
* Complex cases should be manually registered in lib/client-assets.php.
*
* @param WP_Styles $styles WP_Styles instance.
*/
function jetpack_newsletter_register_package_styles( $styles ) {
// Load build constants
$build_constants = require __DIR__ . '/constants.php';
$default_version = ! SCRIPT_DEBUG ? $build_constants['version'] : time();
$suffix = '.min';
$styles_dir = __DIR__ . '/styles';
$styles_file = $styles_dir . '/registry.php';
if ( ! file_exists( $styles_file ) ) {
return;
}
$styles_data = require $styles_file;
$plugin_dir = dirname( __FILE__ );
foreach ( $styles_data as $style_data ) {
jetpack_newsletter_override_style(
$styles,
$style_data['handle'],
$build_constants['build_url'] . 'styles/' . $style_data['path'] . $suffix . '.css',
$style_data['dependencies'],
$default_version
);
// Enable RTL support (WordPress automatically loads -rtl.css variant)
$styles->add_data( $style_data['handle'], 'rtl', 'replace' );
$styles->add_data( $style_data['handle'], 'suffix', $suffix );
}
}
add_action( 'wp_default_styles', 'jetpack_newsletter_register_package_styles' );
@@ -0,0 +1,11 @@
<?php
/**
* Style registry - Auto-generated by build process.
* Do not edit this file manually.
*
* @package jetpack_newsletter
*/
return array(
);
@@ -0,0 +1 @@
<?php return array('dependencies' => array('jetpack-script-data', 'react', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => '2225f15b2a464a861605');
@@ -0,0 +1 @@
.wpcom-daily-writing-prompt--prompt{background-color:var(--wpds-color-bg-surface-neutral-weak);border-radius:var(--wpds-border-radius-md);padding:var(--wpds-dimension-padding-md)}.wpcom-daily-writing-prompt--branding{border-block-start:var(--wpds-border-width-xs) solid var(--wpds-color-stroke-surface-neutral-weak);padding-block-start:var(--wpds-dimension-padding-md)}.wpcom-daily-writing-prompt--answered-users a{color:var(--wp-ui-button-foreground-color)}.wpcom-daily-writing-prompt--answered-users img{border:var(--wpds-border-width-sm) solid var(--wpds-color-bg-surface-neutral);border-radius:50%;margin-inline-start:calc((var(--wpds-dimension-gap-sm) + var(--wpds-border-width-sm))*-1);vertical-align:middle}.wpcom-daily-writing-prompt--answered-users img:first-child{margin-inline-start:0}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
.wpcom-daily-writing-prompt--prompt{background-color:var(--wpds-color-bg-surface-neutral-weak);border-radius:var(--wpds-border-radius-md);padding:var(--wpds-dimension-padding-md)}.wpcom-daily-writing-prompt--branding{border-block-start:var(--wpds-border-width-xs) solid var(--wpds-color-stroke-surface-neutral-weak);padding-block-start:var(--wpds-dimension-padding-md)}.wpcom-daily-writing-prompt--answered-users a{color:var(--wp-ui-button-foreground-color)}.wpcom-daily-writing-prompt--answered-users img{border:var(--wpds-border-width-sm) solid var(--wpds-color-bg-surface-neutral);border-radius:50%;margin-inline-start:calc((var(--wpds-dimension-gap-sm) + var(--wpds-border-width-sm))*-1);vertical-align:middle}.wpcom-daily-writing-prompt--answered-users img:first-child{margin-inline-start:0}