PluginProbe
Elementor Website Builder – more than just a page builder / 3.0.2
Elementor Website Builder – more than just a page builder v3.0.2
4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 4.0.7 All 451 releases
← All changes | core/files/css/base.php +37 -164 4.2.0-dev23.0.2 View file →
@@ -4,15 +4,15 @@
4 4 use Elementor\Base_Data_Control;
5 5 use Elementor\Control_Repeater;
6 6 use Elementor\Controls_Manager;
7 7 use Elementor\Controls_Stack;
8 -use Elementor\Core\Breakpoints\Manager as Breakpoints_Manager;
9 8 use Elementor\Core\Files\Base as Base_File;
10 9 use Elementor\Core\DynamicTags\Manager;
11 10 use Elementor\Core\DynamicTags\Tag;
12 -use Elementor\Core\Frontend\Performance;
13 11 use Elementor\Core\Kits\Documents\Tabs\Global_Typography;
12 +use Elementor\Element_Base;
14 13 use Elementor\Plugin;
14 +use Elementor\Core\Responsive\Responsive;
15 15 use Elementor\Stylesheet;
16 16 use Elementor\Icons_Manager;
17 17
18 18 if ( ! defined( 'ABSPATH' ) ) {
@@ -64,10 +64,8 @@
64 64 private $icons_fonts = [];
65 65
66 66 private $dynamic_elements_ids = [];
67 67
68 - private $preserved_dynamic_style_values = [];
69 -
70 68 /**
71 69 * Stylesheet object.
72 70 *
73 71 * Holds the CSS file stylesheet instance.
@@ -104,8 +102,22 @@
104 102 return false;
105 103 }
106 104
107 105 /**
106 + * CSS file constructor.
107 + *
108 + * Initializing Elementor CSS file.
109 + *
110 + * @since 1.2.0
111 + * @access public
112 + */
113 + public function __construct( $file_name ) {
114 + parent::__construct( $file_name );
115 +
116 + $this->init_stylesheet();
117 + }
118 +
119 + /**
108 120 * Use external file.
109 121 *
110 122 * Whether to use external CSS file of not. When there are new schemes or settings
111 123 * updates.
@@ -173,25 +185,12 @@
173 185 */
174 186 public function delete() {
175 187 if ( $this->use_external_file() ) {
176 188 parent::delete();
177 - } else {
178 - $this->delete_meta();
179 189 }
180 190 }
181 191
182 192 /**
183 - * Get Responsive Control Duplication Mode
184 - *
185 - * @since 3.4.0
186 - *
187 - * @return string
188 - */
189 - protected function get_responsive_control_duplication_mode() {
190 - return 'on';
191 - }
192 -
193 - /**
194 193 * Enqueue CSS.
195 194 *
196 195 * Either enqueue the CSS file in Elementor or add inline style.
197 196 *
@@ -214,17 +213,8 @@
214 213 if ( self::CSS_STATUS_EMPTY === $meta['status'] ) {
215 214 return;
216 215 }
217 216
218 - /**
219 - * Enqueue CSS file.
220 - *
221 - * Fires before enqueuing a CSS file.
222 - *
223 - * @param Base $this The current CSS file.
224 - */
225 - do_action( 'elementor/css-file/before_enqueue', $this );
226 -
227 217 // First time after clear cache and etc.
228 218 if ( '' === $meta['status'] || $this->is_update_required() ) {
229 219 $this->update();
230 220
@@ -234,14 +224,14 @@
234 224 if ( self::CSS_STATUS_INLINE === $meta['status'] ) {
235 225 $dep = $this->get_inline_dependency();
236 226 // If the dependency has already been printed ( like a template in footer )
237 227 if ( wp_styles()->query( $dep, 'done' ) ) {
238 - printf( '<style id="%1$s">%2$s</style>', $this->get_file_handle_id(), $meta['css'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
228 + printf( '<style id="%1$s">%2$s</style>', $this->get_file_handle_id(), $meta['css'] ); // XSS ok.
239 229 } else {
240 230 wp_add_inline_style( $dep, $meta['css'] );
241 231 }
242 232 } elseif ( self::CSS_STATUS_FILE === $meta['status'] ) { // Re-check if it's not empty after CSS update.
243 - wp_enqueue_style( $this->get_file_handle_id(), $this->get_url(), $this->get_enqueue_dependencies(), null );
233 + wp_enqueue_style( $this->get_file_handle_id(), $this->get_url(), $this->get_enqueue_dependencies(), null ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion
244 234 }
245 235
246 236 // Handle fonts.
247 237 if ( ! empty( $meta['fonts'] ) ) {
@@ -273,17 +263,8 @@
273 263 *
274 264 * @param Base $this The current CSS file.
275 265 */
276 266 do_action( "elementor/css-file/{$name}/enqueue", $this );
277 -
278 - /**
279 - * Enqueue CSS file.
280 - *
281 - * Fires after enqueuing a CSS file.
282 - *
283 - * @param Base $this The current CSS file.
284 - */
285 - do_action( 'elementor/css-file/after_enqueue', $this );
286 267 }
287 268
288 269 /**
289 270 * Print CSS.
@@ -294,9 +275,9 @@
294 275 * @since 1.9.4
295 276 * @access public
296 277 */
297 278 public function print_css() {
298 - echo '<style>' . $this->get_content() . '</style>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
279 + echo '<style>' . $this->get_content() . '</style>'; // XSS ok.
299 280 Plugin::$instance->frontend->print_fonts_links();
300 281 }
301 282
302 283 /**
@@ -345,12 +326,8 @@
345 326 return;
346 327 }
347 328 }
348 329
349 - $stylesheet = $this->get_stylesheet();
350 -
351 - $control = apply_filters( 'elementor/files/css/selectors', $control, $value ?? [], $this );
352 -
353 330 foreach ( $control['selectors'] as $selector => $css_property ) {
354 331 $output_css_property = '';
355 332
356 333 if ( $global_key ) {
@@ -360,19 +337,13 @@
360 337 $output_css_property = preg_replace( '/(:)[^;]+(;?)/', '$1' . $selector_global_value . '$2', $css_property );
361 338 }
362 339 } else {
363 340 try {
364 - if ( $this->unit_has_custom_selector( $control, $value ) ) {
365 - $css_property = $control['unit_selectors_dictionary'][ $value['unit'] ];
366 - }
367 -
368 341 $output_css_property = preg_replace_callback( '/{{(?:([^.}]+)\.)?([^}| ]*)(?: *\|\| *(?:([^.}]+)\.)?([^}| ]*) *)*}}/', function( $matches ) use ( $control, $value_callback, $controls_stack, $value, $css_property ) {
369 342 $external_control_missing = $matches[1] && ! isset( $controls_stack[ $matches[1] ] );
370 343
371 344 $parsed_value = '';
372 345
373 - $value = apply_filters( 'elementor/files/css/property', $value, $css_property, $matches, $control );
374 -
375 346 if ( ! $external_control_missing ) {
376 347 $parsed_value = $this->parse_property_placeholder( $control, $value, $controls_stack, $value_callback, $matches[2], $matches[1] );
377 348 }
378 349
@@ -401,12 +372,8 @@
401 372 throw new \Exception();
402 373 }
403 374 }
404 375
405 - if ( '__EMPTY__' === $parsed_value ) {
406 - $parsed_value = '';
407 - }
408 -
409 376 return $parsed_value;
410 377 }, $css_property );
411 378 } catch ( \Exception $e ) {
412 379 return;
@@ -430,9 +397,9 @@
430 397
431 398 $pure_device_rules = $pure_device_rules[1];
432 399
433 400 foreach ( $pure_device_rules as $device_rule ) {
434 - if ( Breakpoints_Manager::BREAKPOINT_KEY_DESKTOP === $device_rule ) {
401 + if ( Element_Base::RESPONSIVE_DESKTOP === $device_rule ) {
435 402 continue;
436 403 }
437 404
438 405 $device = preg_replace( '/\+$/', '', $device_rule );
@@ -447,21 +414,17 @@
447 414
448 415 if ( ! $query && ! empty( $control['responsive'] ) ) {
449 416 $query = array_intersect_key( $control['responsive'], array_flip( [ 'min', 'max' ] ) );
450 417
451 - if ( ! empty( $query['max'] ) && Breakpoints_Manager::BREAKPOINT_KEY_DESKTOP === $query['max'] ) {
418 + if ( ! empty( $query['max'] ) && Element_Base::RESPONSIVE_DESKTOP === $query['max'] ) {
452 419 unset( $query['max'] );
453 420 }
454 421 }
455 422
456 - $stylesheet->add_rules( $parsed_selector, $output_css_property, $query );
423 + $this->stylesheet_obj->add_rules( $parsed_selector, $output_css_property, $query );
457 424 }
458 425 }
459 426
460 - protected function unit_has_custom_selector( $control, $value ) {
461 - return isset( $control['unit_selectors_dictionary'] ) && isset( $control['unit_selectors_dictionary'][ $value['unit'] ] );
462 - }
463 -
464 427 /**
465 428 * @param array $control
466 429 * @param mixed $value
467 430 * @param array $controls_stack
@@ -472,27 +435,15 @@
472 435 * @return string
473 436 */
474 437 public function parse_property_placeholder( array $control, $value, array $controls_stack, $value_callback, $placeholder, $parser_control_name = null ) {
475 438 if ( $parser_control_name ) {
476 - // If both the processed control and the control name found in the placeholder are responsive
477 - if ( ! empty( $control['responsive'] ) && ! empty( $controls_stack[ $parser_control_name ]['responsive'] ) ) {
478 - $device_suffix = Controls_Manager::get_responsive_control_device_suffix( $control );
439 + $control = $controls_stack[ $parser_control_name ];
479 440
480 - $control = $controls_stack[ $parser_control_name . $device_suffix ] ?? $controls_stack[ $parser_control_name ];
481 - } else {
482 - $control = $controls_stack[ $parser_control_name ];
483 - }
484 -
485 441 $value = call_user_func( $value_callback, $control );
486 442 }
487 443
488 - // If the control value is empty, check for global default. `0` (integer, string) are falsy but are valid values.
489 - if ( empty( $value ) && '0' !== $value && 0 !== $value ) {
490 - $value = $this->get_control_global_default_value( $control );
491 - }
492 -
493 444 if ( Controls_Manager::FONT === $control['type'] ) {
494 - $this->add_font( $value );
445 + $this->fonts[] = $value;
495 446 }
496 447
497 448 /** @var Base_Data_Control $control_obj */
498 449 $control_obj = Plugin::$instance->controls_manager->get_control( $control['type'] );
@@ -524,12 +475,8 @@
524 475 *
525 476 * @return Stylesheet The stylesheet object.
526 477 */
527 478 public function get_stylesheet() {
528 - if ( ! $this->stylesheet_obj ) {
529 - $this->init_stylesheet();
530 - }
531 -
532 479 return $this->stylesheet_obj;
533 480 }
534 481
535 482 /**
@@ -548,9 +495,9 @@
548 495 * @param array $placeholders Placeholders.
549 496 * @param array $replacements Replacements.
550 497 * @param array $all_controls All controls.
551 498 */
552 - public function add_controls_stack_style_rules( Controls_Stack $controls_stack, array $controls, array $values, array $placeholders, array $replacements, ?array $all_controls = null ) {
499 + public function add_controls_stack_style_rules( Controls_Stack $controls_stack, array $controls, array $values, array $placeholders, array $replacements, array $all_controls = null ) {
553 500 if ( ! $all_controls ) {
554 501 $all_controls = $controls_stack->get_controls();
555 502 }
556 503
@@ -572,13 +519,8 @@
572 519 if ( ! empty( $parsed_dynamic_settings[ Manager::DYNAMIC_SETTING_KEY ][ $control['name'] ] ) ) {
573 520 // Dynamic CSS should not be added to the CSS files.
574 521 // Instead it's handled by \Elementor\Core\DynamicTags\Dynamic_CSS
575 522 // and printed in a style tag.
576 - $should_preserve_value = isset( $control['control_type'] ) && 'content' === $control['control_type'];
577 - if ( $should_preserve_value ) {
578 - $this->preserved_dynamic_style_values[ $control['name'] ] = $parsed_dynamic_settings[ $control['name'] ];
579 - }
580 -
581 523 unset( $parsed_dynamic_settings[ $control['name'] ] );
582 524
583 525 $this->dynamic_elements_ids[] = $controls_stack->get_id();
584 526
@@ -677,14 +619,8 @@
677 619 * @since 1.2.0
678 620 * @access protected
679 621 */
680 622 protected function parse_content() {
681 - Performance::set_use_style_controls( true );
682 -
683 - $initial_responsive_controls_duplication_mode = Plugin::$instance->breakpoints->get_responsive_control_duplication_mode();
684 -
685 - Plugin::$instance->breakpoints->set_responsive_control_duplication_mode( $this->get_responsive_control_duplication_mode() );
686 -
687 623 $this->render_css();
688 624
689 625 $name = $this->get_name();
690 626
@@ -700,13 +636,9 @@
700 636 * @param Base $this The current CSS file.
701 637 */
702 638 do_action( "elementor/css-file/{$name}/parse", $this );
703 639
704 - Plugin::$instance->breakpoints->set_responsive_control_duplication_mode( $initial_responsive_controls_duplication_mode );
705 -
706 - Performance::set_use_style_controls( false );
707 -
708 - return $this->get_stylesheet()->__toString();
640 + return $this->stylesheet_obj->__toString();
709 641 }
710 642
711 643 /**
712 644 * Add control style rules.
@@ -730,44 +662,8 @@
730 662 );
731 663 }
732 664
733 665 /**
734 - * Get Control Global Default Value
735 - *
736 - * If the control has a global default value, and the corresponding global default setting is enabled, this method
737 - * fetches and returns the global default value. Otherwise, it returns null.
738 - *
739 - * @since 3.7.0
740 - * @access private
741 - *
742 - * @param $control
743 - * @return string|null
744 - */
745 - private function get_control_global_default_value( $control ) {
746 - if ( empty( $control['global']['default'] ) ) {
747 - return null;
748 - }
749 -
750 - // If the control value is empty, and the control has a global default set, fetch the global value and use it.
751 - $global_enabled = false;
752 -
753 - if ( 'color' === $control['type'] ) {
754 - $global_enabled = Plugin::$instance->kits_manager->is_custom_colors_enabled();
755 - } elseif ( isset( $control['groupType'] ) && 'typography' === $control['groupType'] ) {
756 - $global_enabled = Plugin::$instance->kits_manager->is_custom_typography_enabled();
757 - }
758 -
759 - $value = null;
760 -
761 - // Only apply the global default if Global Colors are enabled.
762 - if ( $global_enabled ) {
763 - $value = $this->get_selector_global_value( $control, $control['global']['default'] );
764 - }
765 -
766 - return $value;
767 - }
768 -
769 - /**
770 666 * Get style control value.
771 667 *
772 668 * Retrieve the value of the style control for any give control and values.
773 669 *
@@ -786,11 +682,9 @@
786 682 // When the control itself has no global value, but it refers to another control global value
787 683 return $this->get_selector_global_value( $control, $values['__globals__'][ $control['name'] ] );
788 684 }
789 685
790 - $value = isset( $values[ $control['name'] ] )
791 - ? $values[ $control['name'] ]
792 - : $this->preserved_dynamic_style_values[ $control['name'] ] ?? null;
686 + $value = $values[ $control['name'] ];
793 687
794 688 if ( isset( $control['selectors_dictionary'][ $value ] ) ) {
795 689 $value = $control['selectors_dictionary'][ $value ];
796 690 }
@@ -813,13 +707,14 @@
813 707 */
814 708 private function init_stylesheet() {
815 709 $this->stylesheet_obj = new Stylesheet();
816 710
817 - $active_breakpoints = Plugin::$instance->breakpoints->get_active_breakpoints();
711 + $breakpoints = Responsive::get_breakpoints();
818 712
819 - foreach ( $active_breakpoints as $breakpoint_name => $breakpoint ) {
820 - $this->stylesheet_obj->add_device( $breakpoint_name, $breakpoint->get_value() );
821 - }
713 + $this->stylesheet_obj
714 + ->add_device( 'mobile', 0 )
715 + ->add_device( 'tablet', $breakpoints['md'] )
716 + ->add_device( 'desktop', $breakpoints['lg'] );
822 717 }
823 718
824 719 /**
825 720 * Add repeater control style rules.
@@ -873,9 +768,9 @@
873 768 } );
874 769 }
875 770
876 771 private function get_selector_global_value( $control, $global_key ) {
877 - $data = Plugin::$instance->data_manager_v2->run( $global_key );
772 + $data = Plugin::$instance->data_manager->run( $global_key );
878 773
879 774 if ( empty( $data['value'] ) ) {
880 775 return null;
881 776 }
@@ -884,18 +779,10 @@
884 779
885 780 $id = $global_args[1];
886 781
887 782 if ( ! empty( $control['groupType'] ) ) {
888 - $strings_to_replace = [ $control['groupPrefix'] ];
783 + $property_name = str_replace( [ $control['groupPrefix'], '_tablet', '_mobile' ], '', $control['name'] );
889 784
890 - $active_breakpoint_keys = array_keys( Plugin::$instance->breakpoints->get_active_breakpoints() );
891 -
892 - foreach ( $active_breakpoint_keys as $breakpoint ) {
893 - $strings_to_replace[] = '_' . $breakpoint;
894 - }
895 -
896 - $property_name = str_replace( $strings_to_replace, '', $control['name'] );
897 -
898 785 // TODO: This check won't retrieve the proper answer for array values (multiple controls).
899 786 if ( empty( $data['value'][ Global_Typography::TYPOGRAPHY_GROUP_PREFIX . $property_name ] ) ) {
900 787 return null;
901 788 }
@@ -902,16 +789,8 @@
902 789
903 790 $property_name = str_replace( '_', '-', $property_name );
904 791
905 792 $value = "var( --e-global-$control[groupType]-$id-$property_name )";
906 -
907 - if ( $control['groupPrefix'] . 'font_family' === $control['name'] ) {
908 - $default_generic_fonts = Plugin::$instance->kits_manager->get_current_settings( 'default_generic_fonts' );
909 -
910 - if ( $default_generic_fonts ) {
911 - $value .= ", $default_generic_fonts";
912 - }
913 - }
914 793 } else {
915 794 $value = "var( --e-global-$control[type]-$id )";
916 795 }
917 796
@@ -917,9 +796,9 @@
917 796
918 797 return $value;
919 798 }
920 799
921 - final protected function get_active_controls( Controls_Stack $controls_stack, ?array $controls = null, ?array $settings = null ) {
800 + final protected function get_active_controls( Controls_Stack $controls_stack, array $controls = null, array $settings = null ) {
922 801 if ( ! $controls ) {
923 802 $controls = $controls_stack->get_controls();
924 803 }
925 804
@@ -934,9 +813,9 @@
934 813 $active_controls = array_reduce(
935 814 array_keys( $controls ), function( $active_controls, $control_key ) use ( $controls_stack, $controls, $settings ) {
936 815 $control = $controls[ $control_key ];
937 816
938 - if ( $controls_stack->is_control_visible( $control, $settings, $controls ) ) {
817 + if ( $controls_stack->is_control_visible( $control, $settings ) ) {
939 818 $active_controls[ $control_key ] = $control;
940 819 }
941 820
942 821 return $active_controls;
@@ -945,9 +824,9 @@
945 824
946 825 return $active_controls;
947 826 }
948 827
949 - final public function get_style_controls( Controls_Stack $controls_stack, ?array $controls = null, ?array $settings = null ) {
828 + final public function get_style_controls( Controls_Stack $controls_stack, array $controls = null, array $settings = null ) {
950 829 $controls = $this->get_active_controls( $controls_stack, $controls, $settings );
951 830
952 831 $style_controls = [];
953 832
@@ -1024,12 +903,6 @@
1024 903
1025 904 $globals = $controls_stack->get_settings( '__globals__' );
1026 905
1027 906 return ! empty( $globals[ $control_global_key ] );
1028 - }
1029 -
1030 - public function add_font( $font ) {
1031 - if ( ! in_array( $font, $this->fonts, true ) ) {
1032 - $this->fonts[] = $font;
1033 - }
1034 907 }
1035 908 }