beestat.component.icon = function(icon_name, tooltip) { this.icon_name_ = icon_name; this.tooltip_ = tooltip; beestat.component.apply(this, arguments); }; beestat.extend(beestat.component.icon, beestat.component); beestat.component.icon.prototype.decorate_ = function(parent) { var self = this; // TODO This works but really icons need to be put into their own containers if I want this parent.style('display', 'inline-block'); var container = $.createElement('div') .style({ 'display': 'flex', 'align-items': 'center' }); parent.appendChild(container); var icon = $.createElement('div') .style('position', 'relative') .addClass([ 'icon', this.icon_name_ ]); if (this.tooltip_ !== undefined) { icon.setAttribute('title', this.tooltip_); } container.appendChild(icon); if (this.size_ !== undefined && this.size_ !== 24) { icon.addClass('f' + this.size_); } if (this.color_ !== undefined) { container.style('color', this.color_); } if (this.text_ !== undefined) { var text = $.createElement('span') .style({ 'margin-left': (beestat.style.size.gutter / 2) }) .innerText(this.text_); container.appendChild(text); } // Hover if (this.hover_color_ !== undefined) { container.style({ 'cursor': 'pointer', 'transition': 'color 200ms ease' }); container.addEventListener('mouseenter', function() { container.style('color', self.hover_color_); }); container.addEventListener('mouseleave', function() { container.style('color', self.color_ || ''); }); } container.addEventListener('click', function() { self.dispatchEvent('click'); }); // Bubble if (this.bubble_text_ !== undefined) { var bubble = $.createElement('div') .style({ 'background': this.bubble_color_ || beestat.style.color.blue.base, 'position': 'absolute', 'top': 0, 'right': 0, 'border-radius': '6px', 'height': '12px', 'line-height': '12px', 'min-width': '12px', 'text-align': 'center', 'color': '#fff', 'font-size': '10px' }) .innerText(this.bubble_text_); icon.appendChild(bubble); } this.parent_ = icon; }; /** * Set the color of the icon. * * @param {string} color Any supported CSS color string. * * @return {beestat.component.icon} This. */ beestat.component.icon.prototype.set_color = function(color) { this.color_ = color; return this; }; /** * Set the hover color of the icon * * @param {string} hover_color Any supported CSS color string * * @return {beestat.component.icon} This. */ beestat.component.icon.prototype.set_hover_color = function(hover_color) { this.hover_color_ = hover_color; return this; }; /** * Set the text of the icon. * * @param {string} text * * @return {beestat.component.icon} This. */ beestat.component.icon.prototype.set_text = function(text) { this.text_ = text; return this; }; /** * Set the size of the icon * * @param {number} size * * @return {beestat.component.icon} This. */ beestat.component.icon.prototype.set_size = function(size) { this.size_ = size; return this; }; /** * Set the text of the bubble. * * @param {string} bubble_text * * @return {beestat.component.icon} This. */ beestat.component.icon.prototype.set_bubble_text = function(bubble_text) { this.bubble_text_ = bubble_text; return this; }; /** * Set the color of the bubble. * * @param {string} bubble_color * * @return {beestat.component.icon} This. */ beestat.component.icon.prototype.set_bubble_color = function(bubble_color) { this.bubble_color_ = bubble_color; return this; }; /** * Do the normal event listener stuff, but also wrap the icon in an tag to * automatically take advantage of link styles. * * Note: Must call after the icon is rendered. * * @return {beestat.component.icon} This. */ beestat.component.icon.prototype.addEventListener = function() { rocket.EventTarget.prototype.addEventListener.apply(this, arguments); return this; }; /** * Get the icon element. * * @return {rocket.Elements} The icon element. */ beestat.component.icon.prototype.get_element = function() { return this.parent_; };