PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.9
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.9
1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 0.8.8 0.8.7 0.8.6 All 33 releases
desktop-mode / includes / widgets / heartbeat.php

heartbeat.php in OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin 1.1.9, at includes/widgets/heartbeat.php

137 lines 5.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * OpenStation — Heartbeat widget (built-in, lazy-loaded).
4 *
5 * Dogfoods the public `openstation_register_widget()` API for a
6 * built-in widget: the metadata + script handle live here, the
7 * JS + CSS ship as their own Vite bundle
8 * (`assets/js/widget-heartbeat[.min].js` and matching `.css`).
9 * The shell's widgets `server-sync` only loads them when the user
10 * adds the widget or the picker is opened — main bundle keeps
11 * none of the heart's code.
12 *
13 * @package OpenStation
14 */
15
16 defined( 'ABSPATH' ) || exit;
17
18 /**
19 * Register the JS bundle as a script handle so it can be loaded
20 * lazily via `wp_register_script()` / its URL. The CSS file
21 * emitted by Vite alongside the JS is registered as its own
22 * style handle and eagerly enqueued by
23 * openstation_enqueue_heartbeat_widget_styles() below — the
24 * widget server-sync only injects the JS, so the stylesheet must
25 * ship ahead of time for the chrome to paint with the JS.
26 */
27 function openstation_register_heartbeat_widget_assets() {
28 $suffix = openstation_asset_suffix();
29 $version = defined( 'OPENSTATION_VERSION' ) ? OPENSTATION_VERSION : '0';
30
31 $js_path = OPENSTATION_DIR . 'assets/js/widget-heartbeat' . $suffix . '.js';
32 $css_path = OPENSTATION_DIR . 'assets/js/widget-heartbeat' . $suffix . '.css';
33
34 wp_register_style(
35 'os-heartbeat-widget',
36 OPENSTATION_URL . 'assets/js/widget-heartbeat' . $suffix . '.css',
37 array(),
38 file_exists( $css_path ) ? (string) filemtime( $css_path ) : $version
39 );
40 wp_register_script(
41 'os-heartbeat-widget',
42 OPENSTATION_URL . 'assets/js/widget-heartbeat' . $suffix . '.js',
43 array( 'wp-hooks' ),
44 file_exists( $js_path ) ? (string) filemtime( $js_path ) : $version,
45 true
46 );
47 }
48 add_action( 'init', 'openstation_register_heartbeat_widget_assets', 5 );
49
50 /**
51 * Register the widget itself. Sizing constraints + chrome metadata
52 * (label / description / icon) live here so the framework knows
53 * the widget exists at picker-render time, before the JS bundle
54 * is even fetched.
55 */
56 function openstation_register_heartbeat_widget() {
57 if ( ! function_exists( 'openstation_register_widget' ) ) {
58 return;
59 }
60 openstation_register_widget(
61 'desktop-mode/heartbeat',
62 array(
63 'label' => __( 'Heartbeat', 'desktop-mode' ),
64 'description' => __(
65 'A gently beating heart that pulses with the WordPress Heartbeat. The bar fills as the next tick approaches.',
66 'desktop-mode'
67 ),
68 'icon' => 'dashicons-heart',
69 'script' => 'os-heartbeat-widget',
70 'movable' => true,
71 'resizable' => false,
72 'min_width' => 310,
73 'max_width' => 310,
74 'min_height' => 230,
75 'max_height' => 230,
76 'default_width' => 310,
77 'default_height' => 230,
78 )
79 );
80 }
81 add_action( 'init', 'openstation_register_heartbeat_widget', 6 );
82
83 /**
84 * Eagerly enqueue the widget's CSS handle when the current
85 * request runs in OpenStation and is not a chromeless iframe
86 * load. The JS bundle stays lazy and loads via the widget
87 * server-sync the first time the picker opens or the widget
88 * mounts.
89 *
90 * Why eager (on shell pages): the shell injects a `<script>` for
91 * the widget at runtime, but there is no matching auto-load for
92 * the stylesheet. A pure-JS CSS injection creates a flash of
93 * unstyled content while the link's stylesheet is still in
94 * flight — long enough for the widget frame's children to render
95 * past the card boundary before the stylesheet's flex layout
96 * kicks in. 1.9 KB ungzipped is small enough to live in the
97 * shell's always-loaded set without measurable cost; the
98 * heavier JS (9 KB + PIXI) stays lazy.
99 *
100 * Why NOT eager in chromeless iframes: they never mount widgets
101 * themselves — sending the stylesheet there is dead weight. Note
102 * that classic-override pages (`?desktop_mode_classic=1`) are
103 * not excluded: they skip the shell but still receive the
104 * (1.9 KB) stylesheet. The
105 * `openstation_heartbeat_widget_eager_css` filter lets a
106 * site owner opt out entirely without forking the plugin.
107 */
108 function openstation_enqueue_heartbeat_widget_styles() {
109 if ( function_exists( 'openstation_is_enabled' ) && ! openstation_is_enabled() ) {
110 return;
111 }
112 // Chromeless requests render content inside an iframe owned
113 // by a shell elsewhere — they never mount widgets themselves.
114 if (
115 function_exists( 'openstation_is_chromeless_request' )
116 && openstation_is_chromeless_request()
117 ) {
118 return;
119 }
120 /**
121 * Whether to enqueue the heartbeat widget's stylesheet on
122 * this request. Defaults to `true` for shell requests in
123 * OpenStation. Sites that never plan to ship the heartbeat
124 * widget can return `false` and save the ~0.66 KB gzipped
125 * stylesheet roundtrip.
126 *
127 * @param bool $eager Default `true` once the chromeless +
128 * openstation gates above have passed.
129 */
130 $eager = (bool) apply_filters( 'openstation_heartbeat_widget_eager_css', true );
131 if ( ! $eager ) {
132 return;
133 }
134 wp_enqueue_style( 'os-heartbeat-widget' );
135 }
136 add_action( 'admin_enqueue_scripts', 'openstation_enqueue_heartbeat_widget_styles', 20 );
137