PluginProbe
Elementor Website Builder – more than just a page builder / 3.4.2
Elementor Website Builder – more than just a page builder v3.4.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 | includes/base/element-base.php +24 -779 4.2.23.4.2 View file →
@@ -1,9 +1,7 @@
1 1 <?php
2 2 namespace Elementor;
3 3
4 -use Elementor\Core\Breakpoints\Manager as Breakpoints_Manager;
5 -
6 4 if ( ! defined( 'ABSPATH' ) ) {
7 5 exit; // Exit if accessed directly.
8 6 }
9 7
@@ -119,12 +117,8 @@
119 117 public function get_script_depends() {
120 118 return $this->depended_scripts;
121 119 }
122 120
123 - public function get_global_scripts() {
124 - return [ 'elementor-frontend' ];
125 - }
126 -
127 121 /**
128 122 * Enqueue scripts.
129 123 *
130 124 * Registers all the scripts defined as element dependencies and enqueues
@@ -134,9 +128,12 @@
134 128 * @access public
135 129 */
136 130 final public function enqueue_scripts() {
137 131 $deprecated_scripts = [
138 - // Insert here when you have a deprecated script.
132 + 'jquery-slick' => [
133 + 'version' => '2.7.0',
134 + 'replacement' => 'Swiper',
135 + ],
139 136 ];
140 137
141 138 foreach ( $this->get_script_depends() as $script ) {
142 139 if ( isset( $deprecated_scripts[ $script ] ) ) {
@@ -144,16 +141,10 @@
144 141 }
145 142
146 143 wp_enqueue_script( $script );
147 144 }
148 -
149 - foreach ( $this->get_global_scripts() as $script ) {
150 - wp_enqueue_script( $script );
151 - }
152 145 }
153 146
154 - public function register_frontend_handlers() {}
155 -
156 147 /**
157 148 * Get style dependencies.
158 149 *
159 150 * Retrieve the list of style dependencies the element requires.
@@ -295,22 +286,8 @@
295 286 return true;
296 287 }
297 288
298 289 /**
299 - * Whether the element returns dynamic content.
300 - *
301 - * Set to determine whether to cache the element output or not.
302 - *
303 - * @since 3.22.0
304 - * @access protected
305 - *
306 - * @return bool Whether to cache the element output.
307 - */
308 - protected function is_dynamic_content(): bool {
309 - return true;
310 - }
311 -
312 - /**
313 290 * Get child elements.
314 291 *
315 292 * Retrieve all the child elements of this element.
316 293 *
@@ -326,28 +303,8 @@
326 303
327 304 return $this->children;
328 305 }
329 306
330 - public function render_markdown(): string {
331 - $children = $this->get_children();
332 -
333 - if ( empty( $children ) ) {
334 - return '';
335 - }
336 -
337 - $parts = [];
338 -
339 - foreach ( $children as $child ) {
340 - $md = $child->render_markdown();
341 -
342 - if ( ! empty( trim( $md ) ) ) {
343 - $parts[] = $md;
344 - }
345 - }
346 -
347 - return implode( "\n\n", $parts );
348 - }
349 -
350 307 /**
351 308 * Get default arguments.
352 309 *
353 310 * Retrieve the element default arguments. Used to return all the default
@@ -364,23 +321,8 @@
364 321 return self::get_items( $this->default_args, $item );
365 322 }
366 323
367 324 /**
368 - * Get panel presets.
369 - *
370 - * Used for displaying the widget in the panel multiple times, but with different defaults values,
371 - * icon, title etc.
372 - *
373 - * @since 3.16.0
374 - * @access public
375 - *
376 - * @return array
377 - */
378 - public function get_panel_presets() {
379 - return [];
380 - }
381 -
382 - /**
383 325 * Add new child element.
384 326 *
385 327 * Register new child element to allow hierarchy.
386 328 *
@@ -426,14 +368,15 @@
426 368 * @since 2.8.0
427 369 * @access public
428 370 *
429 371 * @param array|string $element The HTML element.
430 - * @param array $url_control Array of link settings.
431 - * @param bool $overwrite Optional. Whether to overwrite existing
432 - * attribute. Default is false, not to overwrite.
372 + * @param array $url_control Array of link settings.
373 + * @param bool $overwrite Optional. Whether to overwrite existing
374 + * attribute. Default is false, not to overwrite.
433 375 *
434 376 * @return Element_Base Current instance of the element.
435 377 */
378 +
436 379 public function add_link_attributes( $element, array $url_control, $overwrite = false ) {
437 380 $attributes = [];
438 381
439 382 if ( ! empty( $url_control['url'] ) ) {
@@ -450,27 +393,19 @@
450 393 $attributes['rel'] = 'nofollow';
451 394 }
452 395
453 396 if ( ! empty( $url_control['custom_attributes'] ) ) {
454 - // Custom URL attributes should come as a string of comma-delimited key|value pairs.
397 + // Custom URL attributes should come as a string of comma-delimited key|value pairs
455 398 $attributes = array_merge( $attributes, Utils::parse_custom_attributes( $url_control['custom_attributes'] ) );
456 399 }
457 400
458 401 if ( $attributes ) {
459 - $this->add_render_attribute( $element, $attributes, null, $overwrite );
402 + $this->add_render_attribute( $element, $attributes, $overwrite );
460 403 }
461 404
462 405 return $this;
463 406 }
464 407
465 - public function reset_descendant_render_state(): void {
466 - $this->reset_render_state();
467 -
468 - foreach ( $this->get_children() as $child ) {
469 - $child->reset_descendant_render_state();
470 - }
471 - }
472 -
473 408 /**
474 409 * Print element.
475 410 *
476 411 * Used to generate the element final HTML on the frontend and the editor.
@@ -480,15 +415,8 @@
480 415 */
481 416 public function print_element() {
482 417 $element_type = $this->get_type();
483 418
484 - if ( $this->should_render_shortcode() ) {
485 - $unique_id = apply_filters( 'elementor/element_cache/unique_id', '' );
486 -
487 - echo '[elementor-element k="' . esc_attr( $unique_id ) . '" data="' . esc_attr( base64_encode( wp_json_encode( $this->get_raw_data() ) ) ) . '"]';
488 - return;
489 - }
490 -
491 419 /**
492 420 * Before frontend element render.
493 421 *
494 422 * Fires before Elementor element is rendered in the frontend.
@@ -551,10 +479,8 @@
551 479 // PHPCS - The content has already been escaped by the `render` method.
552 480 echo $content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
553 481 $this->after_render();
554 482
555 - // TODO: Remove this in the future
556 - // Since version 3.24.0 page scripts/styles are handled by `page_assets`.
557 483 $this->enqueue_scripts();
558 484 $this->enqueue_styles();
559 485 }
560 486
@@ -582,54 +508,8 @@
582 508 */
583 509 do_action( 'elementor/frontend/after_render', $this );
584 510 }
585 511
586 - protected function should_render_shortcode() {
587 - $should_render_shortcode = apply_filters( 'elementor/element/should_render_shortcode', false );
588 -
589 - if ( ! $should_render_shortcode ) {
590 - return false;
591 - }
592 -
593 - $raw_data = $this->get_raw_data();
594 -
595 - if ( ! empty( $raw_data['settings']['_element_cache'] ) ) {
596 - return 'yes' === $raw_data['settings']['_element_cache'];
597 - }
598 -
599 - if ( $this->is_dynamic_content() ) {
600 - return true;
601 - }
602 -
603 - $is_dynamic_content = apply_filters( 'elementor/element/is_dynamic_content', false, $raw_data, $this );
604 -
605 - $has_dynamic_tag = $this->has_element_dynamic_tag( $raw_data['settings'] );
606 -
607 - if ( $is_dynamic_content || $has_dynamic_tag ) {
608 - return true;
609 - }
610 -
611 - return false;
612 - }
613 -
614 - private function has_element_dynamic_tag( $element_settings ): bool {
615 - if ( is_array( $element_settings ) ) {
616 - if ( ! empty( $element_settings['__dynamic__'] ) ) {
617 - return true;
618 - }
619 -
620 - foreach ( $element_settings as $value ) {
621 - $has_dynamic = $this->has_element_dynamic_tag( $value );
622 -
623 - if ( $has_dynamic ) {
624 - return true;
625 - }
626 - }
627 - }
628 -
629 - return false;
630 - }
631 -
632 512 /**
633 513 * Get the element raw data.
634 514 *
635 515 * Retrieve the raw element data, including the id, type, settings, child
@@ -656,9 +536,9 @@
656 536 foreach ( $this->get_children() as $child ) {
657 537 $elements[] = $child->get_raw_data( $with_html_content );
658 538 }
659 539
660 - $raw_data = [
540 + return [
661 541 'id' => $this->get_id(),
662 542 'elType' => $data['elType'],
663 543 'settings' => $data['settings'],
664 544 'elements' => $elements,
@@ -663,36 +543,10 @@
663 543 'settings' => $data['settings'],
664 544 'elements' => $elements,
665 545 'isInner' => $data['isInner'],
666 546 ];
667 -
668 - if ( ! empty( $data['isLocked'] ) ) {
669 - $raw_data['isLocked'] = $data['isLocked'];
670 - }
671 -
672 - return $raw_data;
673 547 }
674 548
675 - public function get_data_for_save() {
676 - $data = $this->get_raw_data();
677 -
678 - $elements = [];
679 -
680 - foreach ( $this->get_children() as $child ) {
681 - $elements[] = $child->get_data_for_save();
682 - }
683 -
684 - if ( ! empty( $elements ) ) {
685 - $data['elements'] = $elements;
686 - }
687 -
688 - if ( ! empty( $data['settings'] ) ) {
689 - $data['settings'] = $this->on_save( $data['settings'] );
690 - }
691 -
692 - return $data;
693 - }
694 -
695 549 /**
696 550 * Get unique selector.
697 551 *
698 552 * Retrieve the unique selector of the element. Used to set a unique HTML
@@ -722,47 +576,8 @@
722 576 return $this->is_type_instance;
723 577 }
724 578
725 579 /**
726 - * On import update dynamic content (e.g. post and term IDs).
727 - *
728 - * @since 3.8.0
729 - *
730 - * @param array $config The config of the passed element.
731 - * @param array $data The data that requires updating/replacement when imported.
732 - * @param array|null $controls The available controls.
733 - *
734 - * @return array Element data.
735 - */
736 - public static function on_import_update_dynamic_content( array $config, array $data, $controls = null ): array {
737 - $tags_manager = Plugin::$instance->dynamic_tags;
738 -
739 - if ( empty( $config['settings'][ $tags_manager::DYNAMIC_SETTING_KEY ] ) ) {
740 - return $config;
741 - }
742 -
743 - foreach ( $config['settings'][ $tags_manager::DYNAMIC_SETTING_KEY ] as $dynamic_name => $dynamic_value ) {
744 - $tag_config = $tags_manager->tag_text_to_tag_data( $dynamic_value );
745 - $tag_instance = $tags_manager->create_tag( $tag_config['id'], $tag_config['name'], $tag_config['settings'] );
746 -
747 - if ( is_null( $tag_instance ) ) {
748 - continue;
749 - }
750 -
751 - if ( $tag_instance->has_own_method( 'on_import_replace_dynamic_content' ) ) {
752 - // TODO: Remove this check in the future.
753 - $tag_config = $tag_instance->on_import_replace_dynamic_content( $tag_config, $data['post_ids'] );
754 - } else {
755 - $tag_config = $tag_instance->on_import_update_dynamic_content( $tag_config, $data, $tag_instance->get_controls() );
756 - }
757 -
758 - $config['settings'][ $tags_manager::DYNAMIC_SETTING_KEY ][ $dynamic_name ] = $tags_manager->tag_data_to_tag_text( $tag_config['id'], $tag_config['name'], $tag_config['settings'] );
759 - }
760 -
761 - return $config;
762 - }
763 -
764 - /**
765 580 * Add render attributes.
766 581 *
767 582 * Used to add attributes to the current element wrapper HTML tag.
768 583 *
@@ -767,12 +582,12 @@
767 582 * Used to add attributes to the current element wrapper HTML tag.
768 583 *
769 584 * @since 1.3.0
770 585 * @access protected
771 - * @deprecated 3.1.0 Use `add_render_attribute()` method instead.
586 + * @deprecated 3.1.0
772 587 */
773 588 protected function _add_render_attributes() {
774 - Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '3.1.0', 'add_render_attributes()' );
589 + Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '3.1.0', __CLASS__ . '::add_render_attributes()' );
775 590
776 591 return $this->add_render_attributes();
777 592 }
778 593
@@ -797,9 +612,8 @@
797 612 'elementor-element-' . $id,
798 613 ],
799 614 'data-id' => $id,
800 615 'data-element_type' => $this->get_type(),
801 - 'data-e-type' => $this->get_type(),
802 616 ] );
803 617
804 618 $class_settings = [];
805 619
@@ -804,15 +618,9 @@
804 618 $class_settings = [];
805 619
806 620 foreach ( $settings as $setting_key => $setting ) {
807 621 if ( isset( $controls[ $setting_key ]['prefix_class'] ) ) {
808 - if ( isset( $controls[ $setting_key ]['classes_dictionary'][ $setting ] ) ) {
809 - $value = $controls[ $setting_key ]['classes_dictionary'][ $setting ];
810 - } else {
811 - $value = $setting;
812 - }
813 -
814 - $class_settings[ $setting_key ] = $value;
622 + $class_settings[ $setting_key ] = $setting;
815 623 }
816 624 }
817 625
818 626 foreach ( $class_settings as $setting_key => $setting ) {
@@ -824,15 +632,15 @@
824 632 }
825 633
826 634 $_animation = ! empty( $settings['_animation'] );
827 635 $animation = ! empty( $settings['animation'] );
828 - $has_animation = ( $_animation && 'none' !== $settings['_animation'] ) || ( $animation && 'none' !== $settings['animation'] );
636 + $has_animation = $_animation && 'none' !== $settings['_animation'] || $animation && 'none' !== $settings['animation'];
829 637
830 638 if ( $has_animation ) {
831 639 $is_static_render_mode = Plugin::$instance->frontend->is_static_render_mode();
832 640
833 641 if ( ! $is_static_render_mode ) {
834 - // Hide the element until the animation begins.
642 + // Hide the element until the animation begins
835 643 $this->add_render_attribute( '_wrapper', 'class', 'elementor-invisible' );
836 644 }
837 645 }
838 646
@@ -856,552 +664,8 @@
856 664 do_action( 'elementor/element/after_add_attributes', $this );
857 665 }
858 666
859 667 /**
860 - * Register the Transform controls in the advanced tab of the element.
861 - *
862 - * Previously registered under the Widget_Common class, but registered a more fundamental level now to enable access from other widgets.
863 - *
864 - * @param string $element_selector
865 - * @param string $transform_selector_class
866 - * @return void
867 - * @since 3.9.0
868 - * @access protected
869 - */
870 - protected function register_transform_section( $element_selector = '', $transform_selector_class = ' > .elementor-widget-container' ) {
871 - $default_unit_values_deg = [];
872 - $default_unit_values_ms = [];
873 -
874 - // Set the default unit sizes for all active breakpoints.
875 - foreach ( Breakpoints_Manager::get_default_config() as $breakpoint_name => $breakpoint_config ) {
876 - $default_unit_values_deg[ $breakpoint_name ] = [
877 - 'default' => [
878 - 'unit' => 'deg',
879 - ],
880 - ];
881 -
882 - $default_unit_values_ms[ $breakpoint_name ] = [
883 - 'default' => [
884 - 'unit' => 'ms',
885 - ],
886 - ];
887 - }
888 -
889 - $this->start_controls_section(
890 - '_section_transform',
891 - [
892 - 'label' => esc_html__( 'Transform', 'elementor' ),
893 - 'tab' => Controls_Manager::TAB_ADVANCED,
894 - ]
895 - );
896 -
897 - $this->start_controls_tabs( '_tabs_positioning' );
898 -
899 - $transform_prefix_class = 'e-';
900 - $transform_return_value = 'transform';
901 - $transform_css_modifier = '';
902 -
903 - if ( 'con' === $element_selector ) {
904 - $transform_selector_class = '.e-' . $element_selector;
905 - $transform_css_modifier = $element_selector . '-';
906 - }
907 -
908 - foreach ( [ '', '_hover' ] as $tab ) {
909 - $state = '_hover' === $tab ? ':hover' : '';
910 -
911 - $this->start_controls_tab(
912 - "_tab_positioning{$tab}",
913 - [
914 - 'label' => '' === $tab ? esc_html__( 'Normal', 'elementor' ) : esc_html__( 'Hover', 'elementor' ),
915 - ]
916 - );
917 -
918 - $this->add_control(
919 - "_transform_rotate_popover{$tab}",
920 - [
921 - 'label' => esc_html__( 'Rotate', 'elementor' ),
922 - 'type' => Controls_Manager::POPOVER_TOGGLE,
923 - 'prefix_class' => $transform_prefix_class,
924 - 'return_value' => $transform_return_value,
925 - ]
926 - );
927 -
928 - $this->start_popover();
929 -
930 - $this->add_responsive_control(
931 - "_transform_rotateZ_effect{$tab}",
932 - [
933 - 'label' => esc_html__( 'Rotate', 'elementor' ) . ' (deg)',
934 - 'type' => Controls_Manager::SLIDER,
935 - 'device_args' => $default_unit_values_deg,
936 - 'range' => [
937 - 'px' => [
938 - 'min' => -360,
939 - 'max' => 360,
940 - ],
941 - ],
942 - 'selectors' => [
943 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-rotateZ: {{SIZE}}deg',
944 - ],
945 - 'condition' => [
946 - "_transform_rotate_popover{$tab}!" => '',
947 - ],
948 - 'frontend_available' => true,
949 - ]
950 - );
951 -
952 - $this->add_control(
953 - "_transform_rotate_3d{$tab}",
954 - [
955 - 'label' => esc_html__( '3D Rotate', 'elementor' ),
956 - 'type' => Controls_Manager::SWITCHER,
957 - 'label_on' => esc_html__( 'On', 'elementor' ),
958 - 'label_off' => esc_html__( 'Off', 'elementor' ),
959 - 'selectors' => [
960 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-rotateX: 1{{UNIT}}; --e-' . $transform_css_modifier . 'transform-perspective: 20px;',
961 - ],
962 - 'condition' => [
963 - "_transform_rotate_popover{$tab}!" => '',
964 - ],
965 - 'frontend_available' => true,
966 - ]
967 - );
968 -
969 - $this->add_responsive_control(
970 - "_transform_rotateX_effect{$tab}",
971 - [
972 - 'label' => esc_html__( 'Rotate X', 'elementor' ) . ' (deg)',
973 - 'type' => Controls_Manager::SLIDER,
974 - 'device_args' => $default_unit_values_deg,
975 - 'range' => [
976 - 'px' => [
977 - 'min' => -360,
978 - 'max' => 360,
979 - ],
980 - ],
981 - 'condition' => [
982 - "_transform_rotate_3d{$tab}!" => '',
983 - "_transform_rotate_popover{$tab}!" => '',
984 - ],
985 - 'selectors' => [
986 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-rotateX: {{SIZE}}deg;',
987 - ],
988 - 'frontend_available' => true,
989 - ]
990 - );
991 -
992 - $this->add_responsive_control(
993 - "_transform_rotateY_effect{$tab}",
994 - [
995 - 'label' => esc_html__( 'Rotate Y', 'elementor' ) . ' (deg)',
996 - 'type' => Controls_Manager::SLIDER,
997 - 'device_args' => $default_unit_values_deg,
998 - 'range' => [
999 - 'px' => [
1000 - 'min' => -360,
1001 - 'max' => 360,
1002 - ],
1003 - ],
1004 - 'condition' => [
1005 - "_transform_rotate_3d{$tab}!" => '',
1006 - "_transform_rotate_popover{$tab}!" => '',
1007 - ],
1008 - 'selectors' => [
1009 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-rotateY: {{SIZE}}deg;',
1010 - ],
1011 - 'frontend_available' => true,
1012 - ]
1013 - );
1014 -
1015 - $this->add_responsive_control(
1016 - "_transform_perspective_effect{$tab}",
1017 - [
1018 - 'label' => esc_html__( 'Perspective', 'elementor' ) . ' (px)',
1019 - 'type' => Controls_Manager::SLIDER,
1020 - 'range' => [
1021 - 'px' => [
1022 - 'max' => 1000,
1023 - ],
1024 - ],
1025 - 'condition' => [
1026 - "_transform_rotate_popover{$tab}!" => '',
1027 - "_transform_rotate_3d{$tab}!" => '',
1028 - ],
1029 - 'selectors' => [
1030 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-perspective: {{SIZE}}px',
1031 - ],
1032 - 'frontend_available' => true,
1033 - ]
1034 - );
1035 -
1036 - $this->end_popover();
1037 -
1038 - $this->add_control(
1039 - "_transform_translate_popover{$tab}",
1040 - [
1041 - 'label' => esc_html__( 'Offset', 'elementor' ),
1042 - 'type' => Controls_Manager::POPOVER_TOGGLE,
1043 - 'prefix_class' => $transform_prefix_class,
1044 - 'return_value' => $transform_return_value,
1045 - ]
1046 - );
1047 -
1048 - $this->start_popover();
1049 -
1050 - $this->add_responsive_control(
1051 - "_transform_translateX_effect{$tab}",
1052 - [
1053 - 'label' => esc_html__( 'Offset X', 'elementor' ),
1054 - 'type' => Controls_Manager::SLIDER,
1055 - 'size_units' => [ 'px', '%', 'em', 'rem', 'vw', 'custom' ],
1056 - 'range' => [
1057 - '%' => [
1058 - 'min' => -100,
1059 - 'max' => 100,
1060 - ],
1061 - 'px' => [
1062 - 'min' => -1000,
1063 - 'max' => 1000,
1064 - ],
1065 - ],
1066 - 'condition' => [
1067 - "_transform_translate_popover{$tab}!" => '',
1068 - ],
1069 - 'selectors' => [
1070 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-translateX: {{SIZE}}{{UNIT}};',
1071 - ],
1072 - 'frontend_available' => true,
1073 - ]
1074 - );
1075 -
1076 - $this->add_responsive_control(
1077 - "_transform_translateY_effect{$tab}",
1078 - [
1079 - 'label' => esc_html__( 'Offset Y', 'elementor' ),
1080 - 'type' => Controls_Manager::SLIDER,
1081 - 'size_units' => [ 'px', '%', 'em', 'rem', 'vh', 'custom' ],
1082 - 'range' => [
1083 - '%' => [
1084 - 'min' => -100,
1085 - 'max' => 100,
1086 - ],
1087 - 'px' => [
1088 - 'min' => -1000,
1089 - 'max' => 1000,
1090 - ],
1091 - ],
1092 - 'condition' => [
1093 - "_transform_translate_popover{$tab}!" => '',
1094 - ],
1095 - 'selectors' => [
1096 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-translateY: {{SIZE}}{{UNIT}};',
1097 - ],
1098 - 'frontend_available' => true,
1099 - ]
1100 - );
1101 -
1102 - $this->end_popover();
1103 -
1104 - $this->add_control(
1105 - "_transform_scale_popover{$tab}",
1106 - [
1107 - 'label' => esc_html__( 'Scale', 'elementor' ),
1108 - 'type' => Controls_Manager::POPOVER_TOGGLE,
1109 - 'prefix_class' => $transform_prefix_class,
1110 - 'return_value' => $transform_return_value,
1111 - ]
1112 - );
1113 -
1114 - $this->start_popover();
1115 -
1116 - $this->add_control(
1117 - "_transform_keep_proportions{$tab}",
1118 - [
1119 - 'label' => esc_html__( 'Keep Proportions', 'elementor' ),
1120 - 'type' => Controls_Manager::SWITCHER,
1121 - 'label_on' => esc_html__( 'On', 'elementor' ),
1122 - 'label_off' => esc_html__( 'Off', 'elementor' ),
1123 - 'default' => 'yes',
1124 - ]
1125 - );
1126 -
1127 - $this->add_responsive_control(
1128 - "_transform_scale_effect{$tab}",
1129 - [
1130 - 'label' => esc_html__( 'Scale', 'elementor' ),
1131 - 'type' => Controls_Manager::SLIDER,
1132 - 'range' => [
1133 - 'px' => [
1134 - 'max' => 2,
1135 - 'step' => 0.1,
1136 - ],
1137 - ],
1138 - 'condition' => [
1139 - "_transform_scale_popover{$tab}!" => '',
1140 - "_transform_keep_proportions{$tab}!" => '',
1141 - ],
1142 - 'selectors' => [
1143 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-scale: {{SIZE}};',
1144 - ],
1145 - 'frontend_available' => true,
1146 - ]
1147 - );
1148 -
1149 - $this->add_responsive_control(
1150 - "_transform_scaleX_effect{$tab}",
1151 - [
1152 - 'label' => esc_html__( 'Scale X', 'elementor' ),
1153 - 'type' => Controls_Manager::SLIDER,
1154 - 'range' => [
1155 - 'px' => [
1156 - 'max' => 2,
1157 - 'step' => 0.1,
1158 - ],
1159 - ],
1160 - 'condition' => [
1161 - "_transform_scale_popover{$tab}!" => '',
1162 - "_transform_keep_proportions{$tab}" => '',
1163 - ],
1164 - 'selectors' => [
1165 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-scaleX: {{SIZE}};',
1166 - ],
1167 - 'frontend_available' => true,
1168 - ]
1169 - );
1170 -
1171 - $this->add_responsive_control(
1172 - "_transform_scaleY_effect{$tab}",
1173 - [
1174 - 'label' => esc_html__( 'Scale Y', 'elementor' ),
1175 - 'type' => Controls_Manager::SLIDER,
1176 - 'range' => [
1177 - 'px' => [
1178 - 'max' => 2,
1179 - 'step' => 0.1,
1180 - ],
1181 - ],
1182 - 'condition' => [
1183 - "_transform_scale_popover{$tab}!" => '',
1184 - "_transform_keep_proportions{$tab}" => '',
1185 - ],
1186 - 'selectors' => [
1187 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-scaleY: {{SIZE}};',
1188 - ],
1189 - 'frontend_available' => true,
1190 - ]
1191 - );
1192 -
1193 - $this->end_popover();
1194 -
1195 - $this->add_control(
1196 - "_transform_skew_popover{$tab}",
1197 - [
1198 - 'label' => esc_html__( 'Skew', 'elementor' ),
1199 - 'type' => Controls_Manager::POPOVER_TOGGLE,
1200 - 'prefix_class' => $transform_prefix_class,
1201 - 'return_value' => $transform_return_value,
1202 - ]
1203 - );
1204 -
1205 - $this->start_popover();
1206 -
1207 - $this->add_responsive_control(
1208 - "_transform_skewX_effect{$tab}",
1209 - [
1210 - 'label' => esc_html__( 'Skew X', 'elementor' ) . ' (deg)',
1211 - 'type' => Controls_Manager::SLIDER,
1212 - 'device_args' => $default_unit_values_deg,
1213 - 'range' => [
1214 - 'px' => [
1215 - 'min' => -360,
1216 - 'max' => 360,
1217 - ],
1218 - ],
1219 - 'condition' => [
1220 - "_transform_skew_popover{$tab}!" => '',
1221 - ],
1222 - 'selectors' => [
1223 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-skewX: {{SIZE}}deg;',
1224 - ],
1225 - 'frontend_available' => true,
1226 - ]
1227 - );
1228 -
1229 - $this->add_responsive_control(
1230 - "_transform_skewY_effect{$tab}",
1231 - [
1232 - 'label' => esc_html__( 'Skew Y', 'elementor' ) . ' (deg)',
1233 - 'type' => Controls_Manager::SLIDER,
1234 - 'device_args' => $default_unit_values_deg,
1235 - 'range' => [
1236 - 'px' => [
1237 - 'min' => -360,
1238 - 'max' => 360,
1239 - ],
1240 - ],
1241 - 'condition' => [
1242 - "_transform_skew_popover{$tab}!" => '',
1243 - ],
1244 - 'selectors' => [
1245 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-skewY: {{SIZE}}deg;',
1246 - ],
1247 - 'frontend_available' => true,
1248 - ]
1249 - );
1250 -
1251 - $this->end_popover();
1252 -
1253 - $this->add_control(
1254 - "_transform_flipX_effect{$tab}",
1255 - [
1256 - 'label' => esc_html__( 'Flip Horizontal', 'elementor' ),
1257 - 'type' => Controls_Manager::CHOOSE,
1258 - 'options' => [
1259 - 'transform' => [
1260 - 'title' => esc_html__( 'Flip Horizontal', 'elementor' ),
1261 - 'icon' => 'eicon-flip eicon-tilted',
1262 - ],
1263 - ],
1264 - 'prefix_class' => $transform_prefix_class,
1265 - 'selectors' => [
1266 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-flipX: -1',
1267 - ],
1268 - 'frontend_available' => true,
1269 - ]
1270 - );
1271 -
1272 - $this->add_control(
1273 - "_transform_flipY_effect{$tab}",
1274 - [
1275 - 'label' => esc_html__( 'Flip Vertical', 'elementor' ),
1276 - 'type' => Controls_Manager::CHOOSE,
1277 - 'options' => [
1278 - 'transform' => [
1279 - 'title' => esc_html__( 'Flip Vertical', 'elementor' ),
1280 - 'icon' => 'eicon-flip',
1281 - ],
1282 - ],
1283 - 'prefix_class' => $transform_prefix_class,
1284 - 'selectors' => [
1285 - "{{WRAPPER}}{$transform_selector_class}{$state}" => '--e-' . $transform_css_modifier . 'transform-flipY: -1',
1286 - ],
1287 - 'frontend_available' => true,
1288 - ]
1289 - );
1290 -
1291 - if ( '_hover' === $tab ) {
1292 - $this->add_control(
1293 - '_transform_transition_hover',
1294 - [
1295 - 'label' => esc_html__( 'Transition Duration', 'elementor' ) . ' (ms)',
1296 - 'type' => Controls_Manager::SLIDER,
1297 - 'device_args' => $default_unit_values_ms,
1298 - 'range' => [
1299 - 'px' => [
1300 - 'min' => 0,
1301 - 'max' => 10000,
1302 - 'step' => 100,
1303 - ],
1304 - ],
1305 - 'selectors' => [
1306 - '{{WRAPPER}}' => '--e-' . $transform_css_modifier . 'transform-transition-duration: {{SIZE}}ms',
1307 - ],
1308 - ]
1309 - );
1310 - }
1311 -
1312 - ${"transform_origin_conditions{$tab}"} = [
1313 - [
1314 - 'name' => "_transform_scale_popover{$tab}",
1315 - 'operator' => '!=',
1316 - 'value' => '',
1317 - ],
1318 - [
1319 - 'name' => "_transform_rotate_popover{$tab}",
1320 - 'operator' => '!=',
1321 - 'value' => '',
1322 - ],
1323 - [
1324 - 'name' => "_transform_flipX_effect{$tab}",
1325 - 'operator' => '!=',
1326 - 'value' => '',
1327 - ],
1328 - [
1329 - 'name' => "_transform_flipY_effect{$tab}",
1330 - 'operator' => '!=',
1331 - 'value' => '',
1332 - ],
1333 - ];
1334 -
1335 - $this->end_controls_tab();
1336 - }
1337 -
1338 - $this->end_controls_tabs();
1339 -
1340 - $transform_origin_conditions = [
1341 - 'relation' => 'or',
1342 - 'terms' => array_merge( $transform_origin_conditions, $transform_origin_conditions_hover ),
1343 - ];
1344 -
1345 - // Will override motion effect transform-origin.
1346 - $this->add_responsive_control(
1347 - 'motion_fx_transform_x_anchor_point',
1348 - [
1349 - 'label' => esc_html__( 'X Anchor Point', 'elementor' ),
1350 - 'type' => Controls_Manager::CHOOSE,
1351 - 'options' => [
1352 - 'left' => [
1353 - 'title' => esc_html__( 'Left', 'elementor' ),
1354 - 'icon' => 'eicon-h-align-left',
1355 - ],
1356 - 'center' => [
1357 - 'title' => esc_html__( 'Center', 'elementor' ),
1358 - 'icon' => 'eicon-h-align-center',
1359 - ],
1360 - 'right' => [
1361 - 'title' => esc_html__( 'Right', 'elementor' ),
1362 - 'icon' => 'eicon-h-align-right',
1363 - ],
1364 - ],
1365 - 'conditions' => $transform_origin_conditions,
1366 - 'separator' => 'before',
1367 - 'selectors' => [
1368 - '{{WRAPPER}}' => '--e-' . $transform_css_modifier . 'transform-origin-x: {{VALUE}}',
1369 - ],
1370 - ]
1371 - );
1372 -
1373 - // Will override motion effect transform-origin.
1374 - $this->add_responsive_control(
1375 - 'motion_fx_transform_y_anchor_point',
1376 - [
1377 - 'label' => esc_html__( 'Y Anchor Point', 'elementor' ),
1378 - 'type' => Controls_Manager::CHOOSE,
1379 - 'options' => [
1380 - 'top' => [
1381 - 'title' => esc_html__( 'Top', 'elementor' ),
1382 - 'icon' => 'eicon-v-align-top',
1383 - ],
1384 - 'center' => [
1385 - 'title' => esc_html__( 'Center', 'elementor' ),
1386 - 'icon' => 'eicon-v-align-middle',
1387 - ],
1388 - 'bottom' => [
1389 - 'title' => esc_html__( 'Bottom', 'elementor' ),
1390 - 'icon' => 'eicon-v-align-bottom',
1391 - ],
1392 - ],
1393 - 'conditions' => $transform_origin_conditions,
1394 - 'selectors' => [
1395 - '{{WRAPPER}}' => '--e-' . $transform_css_modifier . 'transform-origin-y: {{VALUE}}',
1396 - ],
1397 - ]
1398 - );
1399 -
1400 - $this->end_controls_section();
1401 - }
1402 -
1403 - /**
1404 668 * Add Hidden Device Controls
1405 669 *
1406 670 * Adds controls for hiding elements within certain devices' viewport widths. Adds a control for each active device.
1407 671 *
@@ -1413,23 +677,20 @@
1413 677 $active_devices = Plugin::$instance->breakpoints->get_active_devices_list( [ 'reverse' => true ] );
1414 678 $active_breakpoints = Plugin::$instance->breakpoints->get_active_breakpoints();
1415 679
1416 680 foreach ( $active_devices as $breakpoint_key ) {
1417 - $label = 'desktop' === $breakpoint_key ? esc_html__( 'Desktop', 'elementor' ) : $active_breakpoints[ $breakpoint_key ]->get_label();
681 + $label = 'desktop' === $breakpoint_key ? __( 'Desktop', 'elementor' ) : $active_breakpoints[ $breakpoint_key ]->get_label();
1418 682
1419 683 $this->add_control(
1420 684 'hide_' . $breakpoint_key,
1421 685 [
1422 - 'label' => sprintf(
1423 - /* translators: %s: Device name. */
1424 - esc_html__( 'Hide On %s', 'elementor' ),
1425 - $label
1426 - ),
686 + /* translators: %s: Device Name. */
687 + 'label' => sprintf( __( 'Hide On %s', 'elementor' ), $label ),
1427 688 'type' => Controls_Manager::SWITCHER,
1428 689 'default' => '',
1429 690 'prefix_class' => 'elementor-',
1430 - 'label_on' => esc_html__( 'Hide', 'elementor' ),
1431 - 'label_off' => esc_html__( 'Show', 'elementor' ),
691 + 'label_on' => 'Hide',
692 + 'label_off' => 'Show',
1432 693 'return_value' => 'hidden-' . $breakpoint_key,
1433 694 ]
1434 695 );
1435 696 }
@@ -1462,12 +723,11 @@
1462 723 * Output the element final HTML on the frontend.
1463 724 *
1464 725 * @since 1.0.0
1465 726 * @access protected
1466 - * @deprecated 3.1.0 Use `print_content()` method instead.
1467 727 */
1468 728 protected function _print_content() {
1469 - Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '3.1.0', 'print_content()' );
729 + Plugin::$instance->modules_manager->get_modules( 'dev-tools' )->deprecation->deprecated_function( __METHOD__, '3.1.0', __CLASS__ . '::print_content()' );
1470 730
1471 731 $this->print_content();
1472 732 }
1473 733
@@ -1520,19 +780,8 @@
1520 780 return $config;
1521 781 }
1522 782
1523 783 /**
1524 - * A Base method for sanitizing the settings before save.
1525 - * This method is meant to be overridden by the element.
1526 - *
1527 - * @param array $settings
1528 - * @return array
1529 - */
1530 - protected function on_save( array $settings ) {
1531 - return $settings;
1532 - }
1533 -
1534 - /**
1535 784 * Get child type.
1536 785 *
1537 786 * Retrieve the element child type based on element data.
1538 787 *
@@ -1545,9 +794,9 @@
1545 794 */
1546 795 private function get_child_type( $element_data ) {
1547 796 $child_type = $this->_get_default_child_type( $element_data );
1548 797
1549 - // If it's not a valid widget ( like a deactivated plugin ).
798 + // If it's not a valid widget ( like a deactivated plugin )
1550 799 if ( ! $child_type ) {
1551 800 return false;
1552 801 }
1553 802
@@ -1592,12 +841,8 @@
1592 841 $this->add_child( $child_data );
1593 842 }
1594 843 }
1595 844
1596 - public function has_widget_inner_wrapper(): bool {
1597 - return true;
1598 - }
1599 -
1600 845 /**
1601 846 * Element base constructor.
1602 847 *
1603 848 * Initializing the element base class using `$data` and `$args`.
@@ -1610,9 +855,9 @@
1610 855 *
1611 856 * @param array $data Optional. Element data. Default is an empty array.
1612 857 * @param array|null $args Optional. Element default arguments. Default is null.
1613 858 **/
1614 - public function __construct( array $data = [], ?array $args = null ) {
859 + public function __construct( array $data = [], array $args = null ) {
1615 860 if ( $data ) {
1616 861 $this->is_type_instance = false;
1617 862 } elseif ( $args ) {
1618 863 $this->default_args = $args;