icon.php (11669B)
1 <?php 2 namespace Elementor; 3 4 if ( ! defined( 'ABSPATH' ) ) { 5 exit; // Exit if accessed directly. 6 } 7 8 use Elementor\Core\Kits\Documents\Tabs\Global_Colors; 9 10 /** 11 * Elementor icon widget. 12 * 13 * Elementor widget that displays an icon from over 600+ icons. 14 * 15 * @since 1.0.0 16 */ 17 class Widget_Icon extends Widget_Base { 18 19 /** 20 * Get widget name. 21 * 22 * Retrieve icon widget name. 23 * 24 * @since 1.0.0 25 * @access public 26 * 27 * @return string Widget name. 28 */ 29 public function get_name() { 30 return 'icon'; 31 } 32 33 /** 34 * Get widget title. 35 * 36 * Retrieve icon widget title. 37 * 38 * @since 1.0.0 39 * @access public 40 * 41 * @return string Widget title. 42 */ 43 public function get_title() { 44 return esc_html__( 'Icon', 'elementor' ); 45 } 46 47 /** 48 * Get widget icon. 49 * 50 * Retrieve icon widget icon. 51 * 52 * @since 1.0.0 53 * @access public 54 * 55 * @return string Widget icon. 56 */ 57 public function get_icon() { 58 return 'eicon-favorite'; 59 } 60 61 /** 62 * Get widget categories. 63 * 64 * Retrieve the list of categories the icon widget belongs to. 65 * 66 * Used to determine where to display the widget in the editor. 67 * 68 * @since 2.0.0 69 * @access public 70 * 71 * @return array Widget categories. 72 */ 73 public function get_categories() { 74 return [ 'basic' ]; 75 } 76 77 /** 78 * Get widget keywords. 79 * 80 * Retrieve the list of keywords the widget belongs to. 81 * 82 * @since 2.1.0 83 * @access public 84 * 85 * @return array Widget keywords. 86 */ 87 public function get_keywords() { 88 return [ 'icon' ]; 89 } 90 91 /** 92 * Register icon widget controls. 93 * 94 * Adds different input fields to allow the user to change and customize the widget settings. 95 * 96 * @since 3.1.0 97 * @access protected 98 */ 99 protected function register_controls() { 100 $this->start_controls_section( 101 'section_icon', 102 [ 103 'label' => esc_html__( 'Icon', 'elementor' ), 104 ] 105 ); 106 107 $this->add_control( 108 'selected_icon', 109 [ 110 'label' => esc_html__( 'Icon', 'elementor' ), 111 'type' => Controls_Manager::ICONS, 112 'fa4compatibility' => 'icon', 113 'default' => [ 114 'value' => 'fas fa-star', 115 'library' => 'fa-solid', 116 ], 117 ] 118 ); 119 120 $this->add_control( 121 'view', 122 [ 123 'label' => esc_html__( 'View', 'elementor' ), 124 'type' => Controls_Manager::SELECT, 125 'options' => [ 126 'default' => esc_html__( 'Default', 'elementor' ), 127 'stacked' => esc_html__( 'Stacked', 'elementor' ), 128 'framed' => esc_html__( 'Framed', 'elementor' ), 129 ], 130 'default' => 'default', 131 'prefix_class' => 'elementor-view-', 132 ] 133 ); 134 135 $this->add_control( 136 'shape', 137 [ 138 'label' => esc_html__( 'Shape', 'elementor' ), 139 'type' => Controls_Manager::SELECT, 140 'options' => [ 141 'circle' => esc_html__( 'Circle', 'elementor' ), 142 'square' => esc_html__( 'Square', 'elementor' ), 143 ], 144 'default' => 'circle', 145 'condition' => [ 146 'view!' => 'default', 147 ], 148 'prefix_class' => 'elementor-shape-', 149 ] 150 ); 151 152 $this->add_control( 153 'link', 154 [ 155 'label' => esc_html__( 'Link', 'elementor' ), 156 'type' => Controls_Manager::URL, 157 'dynamic' => [ 158 'active' => true, 159 ], 160 'placeholder' => esc_html__( 'https://your-link.com', 'elementor' ), 161 ] 162 ); 163 164 $this->add_responsive_control( 165 'align', 166 [ 167 'label' => esc_html__( 'Alignment', 'elementor' ), 168 'type' => Controls_Manager::CHOOSE, 169 'options' => [ 170 'left' => [ 171 'title' => esc_html__( 'Left', 'elementor' ), 172 'icon' => 'eicon-text-align-left', 173 ], 174 'center' => [ 175 'title' => esc_html__( 'Center', 'elementor' ), 176 'icon' => 'eicon-text-align-center', 177 ], 178 'right' => [ 179 'title' => esc_html__( 'Right', 'elementor' ), 180 'icon' => 'eicon-text-align-right', 181 ], 182 ], 183 'default' => 'center', 184 'selectors' => [ 185 '{{WRAPPER}} .elementor-icon-wrapper' => 'text-align: {{VALUE}};', 186 ], 187 ] 188 ); 189 190 $this->end_controls_section(); 191 192 $this->start_controls_section( 193 'section_style_icon', 194 [ 195 'label' => esc_html__( 'Icon', 'elementor' ), 196 'tab' => Controls_Manager::TAB_STYLE, 197 ] 198 ); 199 200 $this->start_controls_tabs( 'icon_colors' ); 201 202 $this->start_controls_tab( 203 'icon_colors_normal', 204 [ 205 'label' => esc_html__( 'Normal', 'elementor' ), 206 ] 207 ); 208 209 $this->add_control( 210 'primary_color', 211 [ 212 'label' => esc_html__( 'Primary Color', 'elementor' ), 213 'type' => Controls_Manager::COLOR, 214 'default' => '', 215 'selectors' => [ 216 '{{WRAPPER}}.elementor-view-stacked .elementor-icon' => 'background-color: {{VALUE}};', 217 '{{WRAPPER}}.elementor-view-framed .elementor-icon, {{WRAPPER}}.elementor-view-default .elementor-icon' => 'color: {{VALUE}}; border-color: {{VALUE}};', 218 '{{WRAPPER}}.elementor-view-framed .elementor-icon, {{WRAPPER}}.elementor-view-default .elementor-icon svg' => 'fill: {{VALUE}};', 219 ], 220 'global' => [ 221 'default' => Global_Colors::COLOR_PRIMARY, 222 ], 223 ] 224 ); 225 226 $this->add_control( 227 'secondary_color', 228 [ 229 'label' => esc_html__( 'Secondary Color', 'elementor' ), 230 'type' => Controls_Manager::COLOR, 231 'default' => '', 232 'condition' => [ 233 'view!' => 'default', 234 ], 235 'selectors' => [ 236 '{{WRAPPER}}.elementor-view-framed .elementor-icon' => 'background-color: {{VALUE}};', 237 '{{WRAPPER}}.elementor-view-stacked .elementor-icon' => 'color: {{VALUE}};', 238 '{{WRAPPER}}.elementor-view-stacked .elementor-icon svg' => 'fill: {{VALUE}};', 239 ], 240 ] 241 ); 242 243 $this->end_controls_tab(); 244 245 $this->start_controls_tab( 246 'icon_colors_hover', 247 [ 248 'label' => esc_html__( 'Hover', 'elementor' ), 249 ] 250 ); 251 252 $this->add_control( 253 'hover_primary_color', 254 [ 255 'label' => esc_html__( 'Primary Color', 'elementor' ), 256 'type' => Controls_Manager::COLOR, 257 'default' => '', 258 'selectors' => [ 259 '{{WRAPPER}}.elementor-view-stacked .elementor-icon:hover' => 'background-color: {{VALUE}};', 260 '{{WRAPPER}}.elementor-view-framed .elementor-icon:hover, {{WRAPPER}}.elementor-view-default .elementor-icon:hover' => 'color: {{VALUE}}; border-color: {{VALUE}};', 261 '{{WRAPPER}}.elementor-view-framed .elementor-icon:hover, {{WRAPPER}}.elementor-view-default .elementor-icon:hover svg' => 'fill: {{VALUE}};', 262 ], 263 ] 264 ); 265 266 $this->add_control( 267 'hover_secondary_color', 268 [ 269 'label' => esc_html__( 'Secondary Color', 'elementor' ), 270 'type' => Controls_Manager::COLOR, 271 'default' => '', 272 'condition' => [ 273 'view!' => 'default', 274 ], 275 'selectors' => [ 276 '{{WRAPPER}}.elementor-view-framed .elementor-icon:hover' => 'background-color: {{VALUE}};', 277 '{{WRAPPER}}.elementor-view-stacked .elementor-icon:hover' => 'color: {{VALUE}};', 278 '{{WRAPPER}}.elementor-view-stacked .elementor-icon:hover svg' => 'fill: {{VALUE}};', 279 ], 280 ] 281 ); 282 283 $this->add_control( 284 'hover_animation', 285 [ 286 'label' => esc_html__( 'Hover Animation', 'elementor' ), 287 'type' => Controls_Manager::HOVER_ANIMATION, 288 ] 289 ); 290 291 $this->end_controls_tab(); 292 293 $this->end_controls_tabs(); 294 295 $this->add_responsive_control( 296 'size', 297 [ 298 'label' => esc_html__( 'Size', 'elementor' ), 299 'type' => Controls_Manager::SLIDER, 300 'range' => [ 301 'px' => [ 302 'min' => 6, 303 'max' => 300, 304 ], 305 ], 306 'selectors' => [ 307 '{{WRAPPER}} .elementor-icon' => 'font-size: {{SIZE}}{{UNIT}};', 308 ], 309 'separator' => 'before', 310 ] 311 ); 312 313 $this->add_control( 314 'icon_padding', 315 [ 316 'label' => esc_html__( 'Padding', 'elementor' ), 317 'type' => Controls_Manager::SLIDER, 318 'selectors' => [ 319 '{{WRAPPER}} .elementor-icon' => 'padding: {{SIZE}}{{UNIT}};', 320 ], 321 'range' => [ 322 'em' => [ 323 'min' => 0, 324 'max' => 5, 325 ], 326 ], 327 'condition' => [ 328 'view!' => 'default', 329 ], 330 ] 331 ); 332 333 $this->add_responsive_control( 334 'rotate', 335 [ 336 'label' => esc_html__( 'Rotate', 'elementor' ), 337 'type' => Controls_Manager::SLIDER, 338 'size_units' => [ 'deg' ], 339 'default' => [ 340 'size' => 0, 341 'unit' => 'deg', 342 ], 343 'tablet_default' => [ 344 'unit' => 'deg', 345 ], 346 'mobile_default' => [ 347 'unit' => 'deg', 348 ], 349 'selectors' => [ 350 '{{WRAPPER}} .elementor-icon i, {{WRAPPER}} .elementor-icon svg' => 'transform: rotate({{SIZE}}{{UNIT}});', 351 ], 352 ] 353 ); 354 355 $this->add_control( 356 'border_width', 357 [ 358 'label' => esc_html__( 'Border Width', 'elementor' ), 359 'type' => Controls_Manager::DIMENSIONS, 360 'selectors' => [ 361 '{{WRAPPER}} .elementor-icon' => 'border-width: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', 362 ], 363 'condition' => [ 364 'view' => 'framed', 365 ], 366 ] 367 ); 368 369 $this->add_control( 370 'border_radius', 371 [ 372 'label' => esc_html__( 'Border Radius', 'elementor' ), 373 'type' => Controls_Manager::DIMENSIONS, 374 'size_units' => [ 'px', '%' ], 375 'selectors' => [ 376 '{{WRAPPER}} .elementor-icon' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};', 377 ], 378 'condition' => [ 379 'view!' => 'default', 380 ], 381 ] 382 ); 383 384 $this->end_controls_section(); 385 } 386 387 /** 388 * Render icon widget output on the frontend. 389 * 390 * Written in PHP and used to generate the final HTML. 391 * 392 * @since 1.0.0 393 * @access protected 394 */ 395 protected function render() { 396 $settings = $this->get_settings_for_display(); 397 398 $this->add_render_attribute( 'wrapper', 'class', 'elementor-icon-wrapper' ); 399 400 $this->add_render_attribute( 'icon-wrapper', 'class', 'elementor-icon' ); 401 402 if ( ! empty( $settings['hover_animation'] ) ) { 403 $this->add_render_attribute( 'icon-wrapper', 'class', 'elementor-animation-' . $settings['hover_animation'] ); 404 } 405 406 $icon_tag = 'div'; 407 408 if ( ! empty( $settings['link']['url'] ) ) { 409 $this->add_link_attributes( 'icon-wrapper', $settings['link'] ); 410 411 $icon_tag = 'a'; 412 } 413 414 if ( empty( $settings['icon'] ) && ! Icons_Manager::is_migration_allowed() ) { 415 // add old default 416 $settings['icon'] = 'fa fa-star'; 417 } 418 419 if ( ! empty( $settings['icon'] ) ) { 420 $this->add_render_attribute( 'icon', 'class', $settings['icon'] ); 421 $this->add_render_attribute( 'icon', 'aria-hidden', 'true' ); 422 } 423 424 $migrated = isset( $settings['__fa4_migrated']['selected_icon'] ); 425 $is_new = empty( $settings['icon'] ) && Icons_Manager::is_migration_allowed(); 426 427 ?> 428 <div <?php $this->print_render_attribute_string( 'wrapper' ); ?>> 429 <<?php Utils::print_unescaped_internal_string( $icon_tag . ' ' . $this->get_render_attribute_string( 'icon-wrapper' ) ); ?>> 430 <?php if ( $is_new || $migrated ) : 431 Icons_Manager::render_icon( $settings['selected_icon'], [ 'aria-hidden' => 'true' ] ); 432 else : ?> 433 <i <?php $this->print_render_attribute_string( 'icon' ); ?>></i> 434 <?php endif; ?> 435 </<?php Utils::print_unescaped_internal_string( $icon_tag ); ?>> 436 </div> 437 <?php 438 } 439 440 /** 441 * Render icon widget output in the editor. 442 * 443 * Written as a Backbone JavaScript template and used to generate the live preview. 444 * 445 * @since 2.9.0 446 * @access protected 447 */ 448 protected function content_template() { 449 ?> 450 <# var link = settings.link.url ? 'href="' + settings.link.url + '"' : '', 451 iconHTML = elementor.helpers.renderIcon( view, settings.selected_icon, { 'aria-hidden': true }, 'i' , 'object' ), 452 migrated = elementor.helpers.isIconMigrated( settings, 'selected_icon' ), 453 iconTag = link ? 'a' : 'div'; 454 #> 455 <div class="elementor-icon-wrapper"> 456 <{{{ iconTag }}} class="elementor-icon elementor-animation-{{ settings.hover_animation }}" {{{ link }}}> 457 <# if ( iconHTML && iconHTML.rendered && ( ! settings.icon || migrated ) ) { #> 458 {{{ iconHTML.value }}} 459 <# } else { #> 460 <i class="{{ settings.icon }}" aria-hidden="true"></i> 461 <# } #> 462 </{{{ iconTag }}}> 463 </div> 464 <?php 465 } 466 }