ProShell v2.0
Dashboard
Server Info
Server: 158.106.128.192
PHP: 8.2.33
home
planet5
public_html
bansibaba.com
2026-09-16 13:10:34
Editing: button-trait.php
Cancel
Save Changes
<?php namespace Elementor\Includes\Widgets\Traits; use Elementor\Controls_Manager; use Elementor\Core\Kits\Documents\Tabs\Global_Colors; use Elementor\Core\Kits\Documents\Tabs\Global_Typography; use Elementor\Group_Control_Background; use Elementor\Group_Control_Border; use Elementor\Group_Control_Box_Shadow; use Elementor\Group_Control_Text_Shadow; use Elementor\Group_Control_Typography; use Elementor\Icons_Manager; use Elementor\Widget_Base; use Elementor\Plugin; if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } trait Button_Trait { /** * Get button sizes. * * Retrieve an array of button sizes for the button widget. * * @since 3.4.0 * @access public * @static * * @return array An array containing button sizes. */ public static function get_button_sizes() { return [ 'xs' => esc_html__( 'Extra Small', 'elementor' ), 'sm' => esc_html__( 'Small', 'elementor' ), 'md' => esc_html__( 'Medium', 'elementor' ), 'lg' => esc_html__( 'Large', 'elementor' ), 'xl' => esc_html__( 'Extra Large', 'elementor' ), ]; } /** * @since 3.4.0 * * @param array $args { * An array of values for the button adjustments. * * @type array $section_condition Set of conditions to hide the controls. * @type string $button_text Text contained in button. * @type string $text_control_label Name for the label of the text control. * @type array $icon_exclude_inline_options Set of icon types to exclude from icon controls. * } */ protected function register_button_content_controls( $args = [] ) { $default_args = [ 'section_condition' => [], 'button_default_text' => esc_html__( 'Click here', 'elementor' ), 'text_control_label' => esc_html__( 'Text', 'elementor' ), 'icon_exclude_inline_options' => [], ]; $args = wp_parse_args( $args, $default_args ); $this->add_control( 'button_type', [ 'label' => esc_html__( 'Type', 'elementor' ), 'type' => Controls_Manager::SELECT, 'default' => '', 'options' => [ '' => esc_html__( 'Default', 'elementor' ), 'info' => esc_html__( 'Info', 'elementor' ), 'success' => esc_html__( 'Success', 'elementor' ), 'warning' => esc_html__( 'Warning', 'elementor' ), 'danger' => esc_html__( 'Danger', 'elementor' ), ], 'prefix_class' => 'elementor-button-', 'condition' => $args['section_condition'], ] ); $this->add_control( 'text', [ 'label' => $args['text_control_label'], 'type' => Controls_Manager::TEXT, 'dynamic' => [ 'active' => true, ], 'default' => $args['button_default_text'], 'placeholder' => $args['button_default_text'], 'condition' => $args['section_condition'], ] ); $this->add_control( 'link', [ 'label' => esc_html__( 'Link', 'elementor' ), 'type' => Controls_Manager::URL, 'dynamic' => [ 'active' => true, ], 'default' => [ 'url' => '#', ], 'condition' => $args['section_condition'], ] ); $this->add_control( 'size', [ 'label' => esc_html__( 'Size', 'elementor' ), 'type' => Controls_Manager::SELECT, 'default' => 'sm', 'options' => self::get_button_sizes(), 'style_transfer' => true, 'condition' => array_merge( $args['section_condition'], [ 'size[value]!' => 'sm' ] ), // a workaround to hide the control, unless it's in use (not default). ] ); $this->add_control( 'selected_icon', [ 'label' => esc_html__( 'Icon', 'elementor' ), 'type' => Controls_Manager::ICONS, 'fa4compatibility' => 'icon', 'skin' => 'inline', 'label_block' => false, 'condition' => $args['section_condition'], 'icon_exclude_inline_options' => $args['icon_exclude_inline_options'], ] ); $this->add_control( 'icon_align', [ 'label' => esc_html__( 'Icon Position', 'elementor' ), 'type' => Controls_Manager::CHOOSE, 'default' => is_rtl() ? 'row-reverse' : 'row', 'options' => [ 'row' => [ 'title' => esc_html__( 'Start', 'elementor' ), 'icon' => 'eicon-h-align-left', ], 'row-reverse' => [ 'title' => esc_html__( 'End', 'elementor' ), 'icon' => 'eicon-h-align-right', ], ], 'classes' => 'elementor-control-start-end', 'selectors_dictionary' => [ 'left' => is_rtl() ? 'row-reverse' : 'row', 'right' => is_rtl() ? 'row' : 'row-reverse', ], 'selectors' => [ '{{WRAPPER}} .elementor-button-content-wrapper' => 'flex-direction: {{VALUE}};', ], 'condition' => array_merge( $args['section_condition'], [ 'text!' => '', 'selected_icon[value]!' => '', ] ), ] ); $this->add_control( 'icon_indent', [ 'label' => esc_html__( 'Icon Spacing', 'elementor' ), 'type' => Controls_Manager::SLIDER, 'size_units' => [ 'px', 'em', 'rem', 'custom' ], 'range' => [ 'px' => [ 'max' => 50, ], 'em' => [ 'max' => 5, ], 'rem' => [ 'max' => 5, ], ], 'selectors' => [ '{{WRAPPER}} .elementor-button .elementor-button-content-wrapper' => 'gap: {{SIZE}}{{UNIT}};', ], 'condition' => array_merge( $args['section_condition'], [ 'text!' => '', 'selected_icon[value]!' => '', ] ), ] ); $this->add_control( 'button_css_id', [ 'label' => esc_html__( 'Button ID', 'elementor' ), 'type' => Controls_Manager::TEXT, 'dynamic' => [ 'active' => true, ], 'ai' => [ 'active' => false, ], 'default' => '', 'title' => esc_html__( 'Add your custom id WITHOUT the Pound key. e.g: my-id', 'elementor' ), 'description' => sprintf( /* translators: 1: `<code>` opening tag, 2: `</code>` closing tag. */ esc_html__( 'Please make sure the ID is unique and not used elsewhere on the page. This field allows %1$sA-z 0-9%2$s & underscore chars without spaces.', 'elementor' ), '<code>', '</code>' ), 'separator' => 'before', 'condition' => $args['section_condition'], ] ); } /** * @since 3.4.0 * * @param array $args { * An array of values for the button adjustments. * * @type array $section_condition Set of conditions to hide the controls. * @type string $alignment_default Default position for the button. * @type string $alignment_control_prefix_class Prefix class name for the button position control. * @type string $content_alignment_default Default alignment for the button content. * } */ protected function register_button_style_controls( $args = [] ) { $default_args = [ 'section_condition' => [], 'alignment_default' => '', 'alignment_control_prefix_class' => 'elementor%s-align-', 'content_alignment_default' => '', ]; $args = wp_parse_args( $args, $default_args ); $this->add_responsive_control( 'align', [ 'label' => esc_html__( 'Position', 'elementor' ), 'type' => Controls_Manager::CHOOSE, 'options' => [ 'left' => [ 'title' => esc_html__( 'Left', 'elementor' ), 'icon' => 'eicon-h-align-left', ], 'center' => [ 'title' => esc_html__( 'Center', 'elementor' ), 'icon' => 'eicon-h-align-center', ], 'right' => [ 'title' => esc_html__( 'Right', 'elementor' ), 'icon' => 'eicon-h-align-right', ], 'justify' => [ 'title' => esc_html__( 'Stretch', 'elementor' ), 'icon' => 'eicon-h-align-stretch', ], ], 'prefix_class' => $args['alignment_control_prefix_class'], 'default' => $args['alignment_default'], 'condition' => $args['section_condition'], ] ); $this->add_responsive_control( 'content_align', [ 'label' => esc_html__( 'Alignment', 'elementor' ), 'type' => Controls_Manager::CHOOSE, 'options' => [ 'start' => [ 'title' => esc_html__( 'Start', 'elementor' ), 'icon' => 'eicon-text-align-left', ], 'center' => [ 'title' => esc_html__( 'Center', 'elementor' ), 'icon' => 'eicon-text-align-center', ], 'end' => [ 'title' => esc_html__( 'End', 'elementor' ), 'icon' => 'eicon-text-align-right', ], 'space-between' => [ 'title' => esc_html__( 'Space between', 'elementor' ), 'icon' => 'eicon-text-align-justify', ], ], 'default' => $args['content_alignment_default'], 'classes' => 'elementor-control-start-end', 'selectors' => [ '{{WRAPPER}} .elementor-button .elementor-button-content-wrapper' => 'justify-content: {{VALUE}};', ], 'condition' => array_merge( $args['section_condition'], [ 'align' => 'justify' ] ), ] ); $this->add_group_control( Group_Control_Typography::get_type(), [ 'name' => 'typography', 'global' => [ 'default' => Global_Typography::TYPOGRAPHY_ACCENT, ], 'selector' => '{{WRAPPER}} .elementor-button', 'condition' => $args['section_condition'], ] ); $this->add_group_control( Group_Control_Text_Shadow::get_type(), [ 'name' => 'text_shadow', 'selector' => '{{WRAPPER}} .elementor-button', 'condition' => $args['section_condition'], ] ); $this->start_controls_tabs( 'tabs_button_style', [ 'condition' => $args['section_condition'], ] ); $this->start_controls_tab( 'tab_button_normal', [ 'label' => esc_html__( 'Normal', 'elementor' ), 'condition' => $args['section_condition'], ] ); $this->add_control( 'button_text_color', [ 'label' => esc_html__( 'Text Color', 'elementor' ), 'type' => Controls_Manager::COLOR, 'default' => '', 'selectors' => [ '{{WRAPPER}} .elementor-button' => 'fill: {{VALUE}}; color: {{VALUE}};', ], 'condition' => $args['section_condition'], ] ); $this->add_group_control( Group_Control_Background::get_type(), [ 'name' => 'background', 'types' => [ 'classic', 'gradient' ], 'exclude' => [ 'image' ], 'selector' => '{{WRAPPER}} .elementor-button', 'fields_options' => [ 'background' => [ 'default' => 'classic', ], 'color' => [ 'global' => [ 'default' => Global_Colors::COLOR_ACCENT, ], ], ], 'condition' => $args['section_condition'], ] ); $this->add_group_control( Group_Control_Box_Shadow::get_type(), [ 'name' => 'button_box_shadow', 'selector' => '{{WRAPPER}} .elementor-button', 'condition' => $args['section_condition'], ] ); $this->end_controls_tab(); $this->start_controls_tab( 'tab_button_hover', [ 'label' => esc_html__( 'Hover', 'elementor' ), 'condition' => $args['section_condition'], ] ); $this->add_control( 'hover_color', [ 'label' => esc_html__( 'Text Color', 'elementor' ), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .elementor-button:hover, {{WRAPPER}} .elementor-button:focus' => 'color: {{VALUE}};', '{{WRAPPER}} .elementor-button:hover svg, {{WRAPPER}} .elementor-button:focus svg' => 'fill: {{VALUE}};', ], 'condition' => $args['section_condition'], ] ); $this->add_group_control( Group_Control_Background::get_type(), [ 'name' => 'button_background_hover', 'types' => [ 'classic', 'gradient' ], 'exclude' => [ 'image' ], 'selector' => '{{WRAPPER}} .elementor-button:hover, {{WRAPPER}} .elementor-button:focus', 'fields_options' => [ 'background' => [ 'default' => 'classic', ], ], 'condition' => $args['section_condition'], ] ); $this->add_control( 'button_hover_border_color', [ 'label' => esc_html__( 'Border Color', 'elementor' ), 'type' => Controls_Manager::COLOR, 'selectors' => [ '{{WRAPPER}} .elementor-button:hover, {{WRAPPER}} .elementor-button:focus' => 'border-color: {{VALUE}};', ], 'condition' => $args['section_condition'], ] ); $this->add_group_control( Group_Control_Box_Shadow::get_type(), [ 'name' => 'button_hover_box_shadow', 'selector' => '{{WRAPPER}} .elementor-button:hover, {{WRAPPER}} .elementor-button:focus', 'condition' => $args['section_condition'], ] ); $this->add_control( 'button_hover_transition_duration', [ 'label' => esc_html__( 'Transition Duration', 'elementor' ), 'type' => Controls_Manager::SLIDER, 'size_units' => [ 's', 'ms', 'custom' ], 'default' => [ 'unit' => 's', ], 'selectors' => [ '{{WRAPPER}} .elementor-button' => 'transition-duration: {{SIZE}}{{UNIT}};', ], ] ); $this->add_control( 'hover_animation', [ 'label' => esc_html__( 'Hover Animation', 'elementor' ), 'type' => Controls_Manager::HOVER_ANIMATION, 'condition' => $args['section_condition'], ] ); $this->end_controls_tab(); $this->end_controls_tabs(); $this->add_group_control( Group_Control_Border::get_type(), [ 'name' => 'border', 'selector' => '{{WRAPPER}} .elementor-button', 'separator' => 'before', 'condition' => $args['section_condition'], ] ); $this->add_responsive_control( 'border_radius', [ 'label' => esc_html__( 'Border Radius', 'elementor' ), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ], 'selectors' => [ '{{WRAPPER}} .elementor-button' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], 'condition' => $args['section_condition'], ] ); $this->add_responsive_control( 'text_padding', [ 'label' => esc_html__( 'Padding', 'elementor' ), 'type' => Controls_Manager::DIMENSIONS, 'size_units' => [ 'px', '%', 'em', 'rem', 'vw', 'custom' ], 'selectors' => [ '{{WRAPPER}} .elementor-button' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', ], 'separator' => 'before', 'condition' => $args['section_condition'], ] ); } /** * Render button widget output on the frontend. * * Written in PHP and used to generate the final HTML. * * @param \Elementor\Widget_Base|null $instance * * @since 3.4.0 * @access protected */ protected function render_button( ?Widget_Base $instance = null ) { if ( empty( $instance ) ) { $instance = $this; } $settings = $instance->get_settings_for_display(); if ( empty( $settings['text'] ) && empty( $settings['selected_icon']['value'] ) ) { return; } $optimized_markup = Plugin::$instance->experiments->is_feature_active( 'e_optimized_markup' ); $instance->add_render_attribute( 'wrapper', 'class', 'elementor-button-wrapper' ); $instance->add_render_attribute( 'button', 'class', 'elementor-button' ); if ( ! empty( $settings['link']['url'] ) ) { $instance->add_link_attributes( 'button', $settings['link'] ); $instance->add_render_attribute( 'button', 'class', 'elementor-button-link' ); } else { $instance->add_render_attribute( 'button', 'role', 'button' ); } if ( ! empty( $settings['button_css_id'] ) ) { $instance->add_render_attribute( 'button', 'id', $settings['button_css_id'] ); } if ( ! empty( $settings['size'] ) ) { $instance->add_render_attribute( 'button', 'class', 'elementor-size-' . $settings['size'] ); } else { $instance->add_render_attribute( 'button', 'class', 'elementor-size-sm' ); // BC, to make sure the class is always present } if ( ! empty( $settings['hover_animation'] ) ) { $instance->add_render_attribute( 'button', 'class', 'elementor-animation-' . $settings['hover_animation'] ); } ?> <?php if ( ! $optimized_markup ) : ?> <div <?php $instance->print_render_attribute_string( 'wrapper' ); ?>> <?php endif; ?> <a <?php $instance->print_render_attribute_string( 'button' ); ?>> <?php $this->render_text( $instance ); ?> </a> <?php if ( ! $optimized_markup ) : ?> </div> <?php endif; ?> <?php } /** * Render button widget output in the editor. * * Written as a Backbone JavaScript template and used to generate the live preview. * * @since 3.4.0 * @access protected */ protected function content_template() { ?> <# if ( '' === settings.text && '' === settings.selected_icon.value ) { return; } const optimized_markup = elementorCommon.config.experimentalFeatures.e_optimized_markup; view.addRenderAttribute( 'wrapper', 'class', 'elementor-button-wrapper' ); view.addRenderAttribute( 'button', 'class', 'elementor-button' ); if ( '' !== settings.link?.url ) { view.addRenderAttribute( 'button', 'href', elementor.helpers.sanitizeUrl( settings.link?.url ) ); view.addRenderAttribute( 'button', 'class', 'elementor-button-link' ); } else { view.addRenderAttribute( 'button', 'role', 'button' ); } if ( '' !== settings.button_css_id ) { view.addRenderAttribute( 'button', 'id', settings.button_css_id ); } if ( '' !== settings.size ) { view.addRenderAttribute( 'button', 'class', 'elementor-size-' + settings.size ); } if ( '' !== settings.hover_animation ) { view.addRenderAttribute( 'button', 'class', 'elementor-animation-' + settings.hover_animation ); } view.addRenderAttribute( 'icon', 'class', 'elementor-button-icon' ); view.addRenderAttribute( 'text', 'class', 'elementor-button-text' ); view.addInlineEditingAttributes( 'text', 'none' ); var iconHTML = elementor.helpers.renderIcon( view, settings.selected_icon, { 'aria-hidden': true }, 'i' , 'object' ), migrated = elementor.helpers.isIconMigrated( settings, 'selected_icon' ); #> <# if ( ! optimized_markup ) { #> <div {{{ view.getRenderAttributeString( 'wrapper' ) }}}> <# } #> <a {{{ view.getRenderAttributeString( 'button' ) }}}> <span class="elementor-button-content-wrapper"> <# if ( settings.icon || settings.selected_icon ) { #> <span {{{ view.getRenderAttributeString( 'icon' ) }}}> <# if ( ( migrated || ! settings.icon ) && iconHTML.rendered ) { #> {{{ iconHTML.value }}} <# } else { #> <i class="{{ settings.icon }}" aria-hidden="true"></i> <# } #> </span> <# } #> <# if ( settings.text ) { #> <span {{{ view.getRenderAttributeString( 'text' ) }}}>{{ settings.text }}</span> <# } #> </span> </a> <# if ( ! optimized_markup ) { #> </div> <# } #> <?php } /** * Render button text. * * Render button widget text. * * @param \Elementor\Widget_Base|null $instance * * @since 3.4.0 * @access protected */ protected function render_text( ?Widget_Base $instance = null ) { // The default instance should be `$this` (a Button widget), unless the Trait is being used from outside of a widget (e.g. `Skin_Base`) which should pass an `$instance`. if ( empty( $instance ) ) { $instance = $this; } $settings = $instance->get_settings_for_display(); $migrated = isset( $settings['__fa4_migrated']['selected_icon'] ); $is_new = empty( $settings['icon'] ) && Icons_Manager::is_migration_allowed(); $instance->add_render_attribute( [ 'content-wrapper' => [ 'class' => 'elementor-button-content-wrapper', ], 'icon' => [ 'class' => 'elementor-button-icon', ], 'text' => [ 'class' => 'elementor-button-text', ], ] ); // TODO: replace the protected with public // $instance->add_inline_editing_attributes( 'text', 'none' ); ?> <span <?php $instance->print_render_attribute_string( 'content-wrapper' ); ?>> <?php if ( ! empty( $settings['icon'] ) || ! empty( $settings['selected_icon']['value'] ) ) : ?> <span <?php $instance->print_render_attribute_string( 'icon' ); ?>> <?php if ( $is_new || $migrated ) : Icons_Manager::render_icon( $settings['selected_icon'], [ 'aria-hidden' => 'true' ] ); else : ?> <i class="<?php echo esc_attr( $settings['icon'] ); ?>" aria-hidden="true"></i> <?php endif; ?> </span> <?php endif; ?> <?php if ( ! empty( $settings['text'] ) ) : ?> <span <?php $instance->print_render_attribute_string( 'text' ); ?>><?php echo wp_kses_post( $settings['text'] ); ?></span> <?php endif; ?> </span> <?php } public function on_import( $element ) { return Icons_Manager::on_import_migration( $element, 'icon', 'selected_icon' ); } }
Upload Files
Cancel
Upload
Create New
Cancel
Create
Change Permissions
Cancel
Save
Change Date
Cancel
Save
Rename Item
Cancel
Save
Confirm Delete
Are you sure you want to delete the selected items?
Cancel
Delete