text: /**
   * IconElement is often mixed into other classes to generate an icon.
   * Icons are graphics, about the size of normal text. They are used to aid the user
   * in locating a control or to convey information in a space-efficient way. See the
   * [OOUI documentation on MediaWiki] [1] for a list of icons
   * included in the library.
   *
   * [1]: https://www.mediawiki.org/wiki/OOUI/Widgets/Icons,_Indicators,_and_Labels#Icons
   *
   * @abstract
   * @class
   *
   * @constructor
   * @param {Object} [config] Configuration options
   * @cfg {jQuery} [$icon] The icon element created by the class. If this configuration is omitted,
   *  the icon element will use a generated `<span>`. To use a different HTML tag, or to specify that
   *  the icon element be set to an existing icon instead of the one generated by this class, set a
   *  value using a jQuery selection. For example:
   *
   *      // Use a <div> tag instead of a <span>
   *     $icon: $( '<div>' )
   *     // Use an existing icon element instead of the one generated by the class
   *     $icon: this.$element
   *     // Use an icon element from a child widget
   *     $icon: this.childwidget.$element
   * @cfg {Object|string} [icon=''] The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a
   *  map of symbolic names. A map is used for i18n purposes and contains a `default` icon
   *  name and additional names keyed by language code. The `default` name is used when no icon is
   *  keyed by the user's language.
   *
   *  Example of an i18n map:
   *
   *     { default: 'bold-a', en: 'bold-b', de: 'bold-f' }
   *  See the [OOUI documentation on MediaWiki] [2] for a list of icons included in the library.
   * [2]: https://www.mediawiki.org/wiki/OOUI/Widgets/Icons,_Indicators,_and_Labels#Icons
   */
  OO.ui.mixin.IconElement = function OoUiMixinIconElement( config ) {
  	// Configuration initialization
  	config = config || {};
  
  	// Properties
  	this.$icon = null;
  	this.icon = null;
  
  	// Initialization
  	this.setIcon( config.icon || this.constructor.static.icon );
  	this.setIconElement( config.$icon || $( '<span>' ) );
  };
  
  /* Setup */
  
  OO.initClass( OO.ui.mixin.IconElement );
  
  /* Static Properties */
  
  /**
   * The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names. A map
   * is used for i18n purposes and contains a `default` icon name and additional names keyed by
   * language code. The `default` name is used when no icon is keyed by the user's language.
   *
   * Example of an i18n map:
   *
   *     { default: 'bold-a', en: 'bold-b', de: 'bold-f' }
   *
   * Note: the static property will be overridden if the #icon configuration is used.
   *
   * @static
   * @inheritable
   * @property {Object|string}
   */
  OO.ui.mixin.IconElement.static.icon = null;
  
  /**
   * The icon title, displayed when users move the mouse over the icon. The value can be text, a
   * function that returns title text, or `null` for no title.
   *
   * The static property will be overridden if the #iconTitle configuration is used.
   *
   * @static
   * @inheritable
   * @property {string|Function|null}
   */
  OO.ui.mixin.IconElement.static.iconTitle = null;
  
  /* Methods */
  
  /**
   * Set the icon element. This method is used to retarget an icon mixin so that its functionality
   * applies to the specified icon element instead of the one created by the class. If an icon
   * element is already set, the mixin’s effect on that element is removed. Generated CSS classes
   * and mixin methods will no longer affect the element.
   *
   * @param {jQuery} $icon Element to use as icon
   */
  OO.ui.mixin.IconElement.prototype.setIconElement = function ( $icon ) {
  	if ( this.$icon ) {
  		this.$icon
  			.removeClass( 'oo-ui-iconElement-icon oo-ui-icon-' + this.icon )
  			.removeAttr( 'title' );
  	}
  
  	this.$icon = $icon
  		.addClass( 'oo-ui-iconElement-icon' )
  		.toggleClass( 'oo-ui-iconElement-noIcon', !this.icon )
  		.toggleClass( 'oo-ui-icon-' + this.icon, !!this.icon );
  	if ( this.iconTitle !== null ) {
  		this.$icon.attr( 'title', this.iconTitle );
  	}
  
  	this.updateThemeClasses();
  };
  
  /**
   * Set icon by symbolic name (e.g., ‘remove’ or ‘menu’). Use `null` to remove an icon.
   * The icon parameter can also be set to a map of icon names. See the #icon config setting
   * for an example.
   *
   * @param {Object|string|null} icon A symbolic icon name, a {@link #icon map of icon names} keyed
   *  by language code, or `null` to remove the icon.
   * @chainable
   * @return {OO.ui.Element} The element, for chaining
   */
  OO.ui.mixin.IconElement.prototype.setIcon = function ( icon ) {
  	icon = OO.isPlainObject( icon ) ? OO.ui.getLocalValue( icon, null, 'default' ) : icon;
  	icon = typeof icon === 'string' && icon.trim().length ? icon.trim() : null;
  
  	if ( this.icon !== icon ) {
  		if ( this.$icon ) {
  			if ( this.icon !== null ) {
  				this.$icon.removeClass( 'oo-ui-icon-' + this.icon );
  			}
  			if ( icon !== null ) {
  				this.$icon.addClass( 'oo-ui-icon-' + icon );
  			}
  		}
  		this.icon = icon;
  	}
  
  	this.$element.toggleClass( 'oo-ui-iconElement', !!this.icon );
  	if ( this.$icon ) {
  		this.$icon.toggleClass( 'oo-ui-iconElement-noIcon', !this.icon );
  	}
  	this.updateThemeClasses();
  
  	return this;
  };
  
  /**
   * Get the symbolic name of the icon.
   *
   * @return {string} Icon name
   */
  OO.ui.mixin.IconElement.prototype.getIcon = function () {
  	return this.icon;
  };
  