PluginProbe
Gutenberg / 9.7.2
Gutenberg v9.7.2
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 12.6.0 7.4.0 All 402 releases
gutenberg / lib / global-styles.php

global-styles.php in Gutenberg 9.7.2, at lib/global-styles.php

274 lines 9.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Bootstraps Global Styles.
4 *
5 * @package gutenberg
6 */
7
8 /**
9 * Whether the current theme has a theme.json file.
10 *
11 * @return boolean
12 */
13 function gutenberg_experimental_global_styles_has_theme_json_support() {
14 return is_readable( locate_template( 'experimental-theme.json' ) );
15 }
16
17 /**
18 * Returns the theme presets registered via add_theme_support, if any.
19 *
20 * @param array $settings Existing editor settings.
21 *
22 * @return array Config that adheres to the theme.json schema.
23 */
24 function gutenberg_experimental_global_styles_get_theme_support_settings( $settings ) {
25 $theme_settings = array();
26 $theme_settings['global'] = array();
27 $theme_settings['global']['settings'] = array();
28
29 // Deprecated theme supports.
30 if ( isset( $settings['disableCustomColors'] ) ) {
31 if ( ! isset( $theme_settings['global']['settings']['color'] ) ) {
32 $theme_settings['global']['settings']['color'] = array();
33 }
34 $theme_settings['global']['settings']['color']['custom'] = ! $settings['disableCustomColors'];
35 }
36
37 if ( isset( $settings['disableCustomGradients'] ) ) {
38 if ( ! isset( $theme_settings['global']['settings']['color'] ) ) {
39 $theme_settings['global']['settings']['color'] = array();
40 }
41 $theme_settings['global']['settings']['color']['customGradient'] = ! $settings['disableCustomGradients'];
42 }
43
44 if ( isset( $settings['disableCustomFontSizes'] ) ) {
45 if ( ! isset( $theme_settings['global']['settings']['typography'] ) ) {
46 $theme_settings['global']['settings']['typography'] = array();
47 }
48 $theme_settings['global']['settings']['typography']['customFontSize'] = ! $settings['disableCustomFontSizes'];
49 }
50
51 if ( isset( $settings['enableCustomLineHeight'] ) ) {
52 if ( ! isset( $theme_settings['global']['settings']['typography'] ) ) {
53 $theme_settings['global']['settings']['typography'] = array();
54 }
55 $theme_settings['global']['settings']['typography']['customLineHeight'] = $settings['enableCustomLineHeight'];
56 }
57
58 if ( isset( $settings['enableCustomUnits'] ) ) {
59 if ( ! isset( $theme_settings['global']['settings']['spacing'] ) ) {
60 $theme_settings['global']['settings']['spacing'] = array();
61 }
62 $theme_settings['global']['settings']['spacing']['units'] = ( true === $settings['enableCustomUnits'] ) ?
63 array( 'px', 'em', 'rem', 'vh', 'vw' ) :
64 $settings['enableCustomUnits'];
65 }
66
67 if ( isset( $settings['colors'] ) ) {
68 if ( ! isset( $theme_settings['global']['settings']['color'] ) ) {
69 $theme_settings['global']['settings']['color'] = array();
70 }
71 $theme_settings['global']['settings']['color']['palette'] = $settings['colors'];
72 }
73
74 if ( isset( $settings['gradients'] ) ) {
75 if ( ! isset( $theme_settings['global']['settings']['color'] ) ) {
76 $theme_settings['global']['settings']['color'] = array();
77 }
78 $theme_settings['global']['settings']['color']['gradients'] = $settings['gradients'];
79 }
80
81 if ( isset( $settings['fontSizes'] ) ) {
82 $font_sizes = $settings['fontSizes'];
83 // Back-compatibility for presets without units.
84 foreach ( $font_sizes as &$font_size ) {
85 if ( is_numeric( $font_size['size'] ) ) {
86 $font_size['size'] = $font_size['size'] . 'px';
87 }
88 }
89 if ( ! isset( $theme_settings['global']['settings']['typography'] ) ) {
90 $theme_settings['global']['settings']['typography'] = array();
91 }
92 $theme_settings['global']['settings']['typography']['fontSizes'] = $font_sizes;
93 }
94
95 // Things that didn't land in core yet, so didn't have a setting assigned.
96 if ( current( (array) get_theme_support( 'custom-spacing' ) ) ) {
97 if ( ! isset( $theme_settings['global']['settings']['spacing'] ) ) {
98 $theme_settings['global']['settings']['spacing'] = array();
99 }
100 $theme_settings['global']['settings']['spacing']['customPadding'] = true;
101 }
102
103 if ( current( (array) get_theme_support( 'experimental-link-color' ) ) ) {
104 if ( ! isset( $theme_settings['global']['settings']['color'] ) ) {
105 $theme_settings['global']['settings']['color'] = array();
106 }
107 $theme_settings['global']['settings']['color']['link'] = true;
108 }
109
110 return $theme_settings;
111 }
112
113 /**
114 * Takes a tree adhering to the theme.json schema and generates
115 * the corresponding stylesheet.
116 *
117 * @param WP_Theme_JSON $tree Input tree.
118 * @param string $type Type of stylesheet we want accepts 'all', 'block_styles', and 'css_variables'.
119 *
120 * @return string Stylesheet.
121 */
122 function gutenberg_experimental_global_styles_get_stylesheet( $tree, $type = 'all' ) {
123 // Check if we can use cached.
124 $can_use_cached = (
125 ( 'all' === $type ) &&
126 ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) &&
127 ( ! defined( 'SCRIPT_DEBUG' ) || ! SCRIPT_DEBUG ) &&
128 ( ! defined( 'REST_REQUEST' ) || ! REST_REQUEST ) &&
129 ! is_admin()
130 );
131
132 if ( $can_use_cached ) {
133 // Check if we have the styles already cached.
134 $cached = get_transient( 'global_styles' );
135 if ( $cached ) {
136 return $cached;
137 }
138 }
139
140 $stylesheet = $tree->get_stylesheet( $type );
141
142 if ( ( 'all' === $type || 'block_styles' === $type ) && gutenberg_experimental_global_styles_has_theme_json_support() ) {
143 // To support all themes, we added in the block-library stylesheet
144 // a style rule such as .has-link-color a { color: var(--wp--style--color--link, #00e); }
145 // so that existing link colors themes used didn't break.
146 // We add this here to make it work for themes that opt-in to theme.json
147 // In the future, we may do this differently.
148 $stylesheet .= 'a{color:var(--wp--style--color--link, #00e);}';
149 }
150
151 if ( $can_use_cached ) {
152 // Cache for a minute.
153 // This cache doesn't need to be any longer, we only want to avoid spikes on high-traffic sites.
154 set_transient( 'global_styles', $stylesheet, MINUTE_IN_SECONDS );
155 }
156
157 return $stylesheet;
158 }
159
160 /**
161 * Fetches the preferences for each origin (core, theme, user)
162 * and enqueues the resulting stylesheet.
163 */
164 function gutenberg_experimental_global_styles_enqueue_assets() {
165 if ( ! gutenberg_experimental_global_styles_has_theme_json_support() ) {
166 return;
167 }
168
169 $settings = gutenberg_get_common_block_editor_settings();
170 $theme_support_data = gutenberg_experimental_global_styles_get_theme_support_settings( $settings );
171
172 $resolver = new WP_Theme_JSON_Resolver();
173 $all = $resolver->get_origin( $theme_support_data );
174
175 $stylesheet = gutenberg_experimental_global_styles_get_stylesheet( $all );
176 if ( empty( $stylesheet ) ) {
177 return;
178 }
179
180 wp_register_style( 'global-styles', false, array(), true, true );
181 wp_add_inline_style( 'global-styles', $stylesheet );
182 wp_enqueue_style( 'global-styles' );
183 }
184
185 /**
186 * Adds the necessary data for the Global Styles client UI to the block settings.
187 *
188 * @param array $settings Existing block editor settings.
189 * @return array New block editor settings
190 */
191 function gutenberg_experimental_global_styles_settings( $settings ) {
192 $theme_support_data = gutenberg_experimental_global_styles_get_theme_support_settings( $settings );
193 unset( $settings['colors'] );
194 unset( $settings['disableCustomColors'] );
195 unset( $settings['disableCustomFontSizes'] );
196 unset( $settings['disableCustomGradients'] );
197 unset( $settings['enableCustomLineHeight'] );
198 unset( $settings['enableCustomUnits'] );
199 unset( $settings['fontSizes'] );
200 unset( $settings['gradients'] );
201
202 $resolver = new WP_Theme_JSON_Resolver();
203 $origin = 'theme';
204 if (
205 gutenberg_experimental_global_styles_has_theme_json_support() &&
206 gutenberg_is_fse_theme()
207 ) {
208 // Only lookup for the user data if we need it.
209 $origin = 'user';
210 }
211 $tree = $resolver->get_origin( $theme_support_data, $origin );
212
213 // STEP 1: ADD FEATURES
214 //
215 // These need to be always added to the editor settings,
216 // even for themes that don't support theme.json.
217 // An example of this is that the presets are configured
218 // from the theme support data.
219 $settings['__experimentalFeatures'] = $tree->get_settings();
220
221 // STEP 2 - IF EDIT-SITE, ADD DATA REQUIRED FOR GLOBAL STYLES SIDEBAR
222 //
223 // In the site editor, the user can change styles, so the client
224 // needs the ability to create them. Hence, we pass it some data
225 // for this: base styles (core+theme) and the ID of the user CPT.
226 $screen = get_current_screen();
227 if (
228 ! empty( $screen ) &&
229 function_exists( 'gutenberg_is_edit_site_page' ) &&
230 gutenberg_is_edit_site_page( $screen->id ) &&
231 gutenberg_experimental_global_styles_has_theme_json_support() &&
232 gutenberg_is_fse_theme()
233 ) {
234 $user_cpt_id = WP_Theme_JSON_Resolver::get_user_custom_post_type_id();
235 $base_styles = $resolver->get_origin( $theme_support_data, 'theme' )->get_raw_data();
236
237 $settings['__experimentalGlobalStylesUserEntityId'] = $user_cpt_id;
238 $settings['__experimentalGlobalStylesBaseStyles'] = $base_styles;
239 } elseif ( gutenberg_experimental_global_styles_has_theme_json_support() ) {
240 // STEP 3 - ADD STYLES IF THEME HAS SUPPORT
241 //
242 // If we are in a block editor context, but not in edit-site,
243 // we add the styles via the settings, so the editor knows that
244 // some of these should be added the wrapper class,
245 // as if they were added via add_editor_styles.
246 $settings['styles'][] = array(
247 'css' => gutenberg_experimental_global_styles_get_stylesheet( $tree, 'css_variables' ),
248 '__experimentalNoWrapper' => true,
249 );
250 $settings['styles'][] = array(
251 'css' => gutenberg_experimental_global_styles_get_stylesheet( $tree, 'block_styles' ),
252 );
253 }
254
255 return $settings;
256 }
257
258 /**
259 * Register CPT to store/access user data.
260 *
261 * @return array|undefined
262 */
263 function gutenberg_experimental_global_styles_register_user_cpt() {
264 if ( ! gutenberg_experimental_global_styles_has_theme_json_support() ) {
265 return;
266 }
267
268 WP_Theme_JSON_Resolver::register_user_custom_post_type();
269 }
270
271 add_action( 'init', 'gutenberg_experimental_global_styles_register_user_cpt' );
272 add_filter( 'block_editor_settings', 'gutenberg_experimental_global_styles_settings', PHP_INT_MAX );
273 add_action( 'wp_enqueue_scripts', 'gutenberg_experimental_global_styles_enqueue_assets' );
274