1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-06-28 15:27:43 +00:00

Update dark theme. Add Bot badge. Add support for badge visibility checks. Enable username color fixes by default and require slightly brighter names in dark mode. Change image tooltips to not use HTML. Add option for global Twitch emoticons in My Emoticons menu.

This commit is contained in:
SirStendec 2015-02-26 00:42:11 -05:00
parent 2fa93b0a8e
commit dc2189d5f0
11 changed files with 462 additions and 127 deletions

199
dark.css
View file

@ -54,10 +54,14 @@ border-color: rgba(255, 255, 255, 0.35) transparent transparent!important;;
} }
/* hovering buttons */ /* hovering buttons */
.ffz-dark .button:hover{ .ffz-dark .button:not(.primary):not(.ffz-donate):hover{
color:rgb(222,222,222)!important; color:rgb(222,222,222)!important;
} }
.ffz-dark .moderation-card .button:not(.glyph-only):hover {
color: #fff !important;
}
/* stats */ /* stats */
.ffz-dark #channel .player-column .stats-and-actions .channel-stats .stat svg:not(.svg-glyph_live) path{ .ffz-dark #channel .player-column .stats-and-actions .channel-stats .stat svg:not(.svg-glyph_live) path{
fill:rgba(255,255,255,0.35)!important; fill:rgba(255,255,255,0.35)!important;
@ -100,23 +104,65 @@ border-color: rgba(255, 255, 255, 0.35) transparent transparent!important;;
color:rgb(255,255,255)!important; color:rgb(255,255,255)!important;
} }
/* Right Column */
.ffz-dark #right_col {
background-color: rgb(25,25,31);
color: #fff;
}
/* Popups */
.ffz-dark .card,
.ffz-dark #flyout .content,
.ffz-dark .dropmenu,
.ffz-dark form.js-new_panel_form,
.ffz-dark .js-new_panel_btn,
.ffz-dark .manager .videos-grid .video .meta,
.ffz-dark .ember-chat .chat-room-list {
background-color: rgb(16,16,16);
color: rgb(195,195,195); /*#acacbf;*/
border-color: #32323e;
}
.ffz-dark #flyout .point::before {
border-right-color: rgb(16,16,16); /*rgb(25,25,31);*/
}
.ffz-dark #flyout .point::after {
border-right-color: #32323e;
}
.ffz-dark .change-banner .banner-preview,
.ffz-dark form.js-new_panel_form input,
.ffz-dark form.js-new_panel_form textarea,
.ffz-dark .card input,
.ffz-dark .card textarea,
.ffz-dark .dropmenu input,
.ffz-dark input.text,
.ffz-dark input.string,
.ffz-dark textarea,
.ffz-dark .directory_header #custom_filter input {
background-color: rgba(255,255,255,0.05);
border-color: rgba(255,255,255,0.1);
color: #fff;
}
/* Other stuff */ /* Other stuff */
.ffz-dark .panel-formatting .panel { .ffz-dark .panel-formatting .panel {
color: #8c8c9c; color: #8c8c9c;
} }
.ffz-dark a { .ffz-dark .manager .videos-grid .video:hover .meta .actions li a,
.ffz-dark .ember-chat .chat-room-list .room:not(:hover) p.room-title,
.ffz-dark .dropmenu_action:not(:hover) span,
.ffz-dark a:not(.switch):not(.follow) {
color: #a68ed2; color: #a68ed2;
} }
.ffz-dark #flyout a,
.ffz-dark .dropmenu a,
.ffz-dark .ember-chat-container a,
.ffz-dark .chat-container a {
color: #6441a5;
}
.ffz-dark .panel-formatting .panel h3 { .ffz-dark .panel-formatting .panel h3 {
color: inherit; color: inherit;
} }
@ -150,8 +196,77 @@ border-color: rgba(255, 255, 255, 0.35) transparent transparent!important;;
color: #fff; color: #fff;
} }
.ffz-dark .ember-chat .moderation-card img.channel_logo {
border-color: rgb(16,16,16);
}
/* Video Manager */
.ffz-dark .manager .videos-grid .video .meta .actions {
border-top-color: rgba(255,255,255,0.25);
}
.ffz-dark #highlighter .highlight-content .form-container li label {
color: #fff;
}
/* Subscriptions Page */
.ffz-dark .tickets .ticket .benefits {
background-color: rgb(16,16,16);
color: rgb(195,195,195); /*#acacbf;*/
border-color: #32323e;
}
/* Directory Pages */
.ffz-dark .following-col .col-header .search-contain .search .search-button svg path {
fill: rgba(255,255,255,0.25);
}
.ffz-dark .following-col .col-header .search-contain .search .search-button:hover svg path {
fill: rgba(255,255,255,0.5);
}
.ffz-dark .following-col .col-header,
.ffz-dark .following-col .header {
border-color: #32323e;
}
.ffz-dark .following-col .following-list .load-more span,
.ffz-dark .viewall a {
background-color: rgb(25,25,31);
}
.ffz-dark .following-col .following-list .load-more:hover span {
color: #fff;
}
.ffz-dark .following-col .following-list .load-more:hover span,
.ffz-dark .viewall a:hover {
background-color: rgb(35,35,41);
}
.ffz-dark .viewall a .text span:first-child {
color: #a68ed2;
}
/* Profile page fixes */ /* Profile page fixes */
.ffz-dark .streams .stream .content .thumb .boxart,
.ffz-dark .videos .video .content .thumb .boxart {
border-color: rgb(16,16,16);
}
.ffz-dark .ember-chat .moderation-card img.channel_logo,
.ffz-dark .channel-link .profile-photo {
background-color: rgb(16,16,16);
}
.ffz-dark .items-grid .meta .title,
.ffz-dark .items-grid .meta p a { .ffz-dark .items-grid .meta p a {
color: #9c9c9c; color: #9c9c9c;
} }
@ -160,10 +275,74 @@ border-color: rgba(255, 255, 255, 0.35) transparent transparent!important;;
color: #6c6c6c; color: #6c6c6c;
} }
.ffz-dark ul.tabs li>a:hover, .ffz-dark .directory_header .nav li>a:hover, .ffz-dark ul.tabs_fake li>a:hover, .ffz-dark ul.tabs li>a.active, .ffz-dark .directory_header .nav li>a.active, .ffz-dark ul.tabs_fake li>a.active { .ffz-dark ul.tabs li > a,
.ffz-dark .directory_header .nav li > a,
.ffz-dark ul.tabs_fake li > a {
color: #a68ed2;
}
.ffz-dark ul.tabs:before,
.ffz-dark .direcotry_header .nav:before,
.ffz-dark ul.tabs_fake:before {
border-color: #32323e;
}
.ffz-dark ul.tabs li.selected a,
.ffz-dark .directory_header .nav li.selected a,
.ffz-dark ul.tabs_fake li.selected a,
.ffz-dark ul.tabs li>a:hover,
.ffz-dark .directory_header .nav li>a:hover,
.ffz-dark ul.tabs_fake li>a:hover,
.ffz-dark ul.tabs li>a.active,
.ffz-dark .directory_header .nav li>a.active,
.ffz-dark ul.tabs_fake li>a.active {
color: #aaa; color: #aaa;
border-color: #ccc !important; border-color: #ccc !important;
} }
/* Hide the chat Dark Mode control */ /* Hide the chat Dark Mode control */
.ffz-dark .toggle-darkmode { display: none; } .ffz-dark .toggle-darkmode { display: none; }
/* Chat Text Contrast */
.ffz-dark .ember-chat-container.dark .chat-line,
.ffz-dark .chat-container.dark .chat-line {
color: #acacbf;
}
.ffz-dark .ember-chat .chat-settings .chat-colors .chat-colors-swatch:hover,
.ffz-dark .ember-chat .chat-settings .chat-colors .chat-colors-switch.selected {
border-color: #777;
box-shadow: inset 0 0 0 1px #32323e;
}
/* FrankerFaceZ Menu */
.ffz-dark .chat-menu.ffz-ui-popup .ffz-ui-menu-page .chat-menu-content .heading,
.ffz-dark .chat-menu.ffz-ui-popup .ffz-ui-menu-page .emoticon-grid .heading,
.ffz-dark .ffz-ui-popup ul.menu,
.ffz-dark .ffz-ui-popup ul.menu a {
border-color: #32323e;
}
.ffz-dark .ffz-ui-popup ul.menu {
background-color: rgb(33,33,33);
}
.ffz-dark .ffz-ui-popup ul.menu li.active {
background-color: rgb(16,16,16);
}
.ffz-dark .ffz-ui-popup ul.menu li.active a {
border-top-color: rgb(16,16,16);
}
/* New User Prompt */
.ffz-dark #new-user-prompt {
background-color: rgb(25,25,31);
color: #acacbf;
}
.ffz-dark #new-user-prompt .message .title {
color: #fff;
}

175
script.js
View file

@ -4,6 +4,20 @@ var FFZ = window.FrankerFaceZ,
utils = require('./utils'); utils = require('./utils');
// --------------------
// Settings
// --------------------
FFZ.settings_info.bot_badges = {
type: "boolean",
value: true,
category: "Chat",
name: "Bot Badges",
help: "Give special badges to known bots."
};
// -------------------- // --------------------
// Initialization // Initialization
// -------------------- // --------------------
@ -39,7 +53,8 @@ FFZ.prototype.bttv_badges = function(data) {
var user_id = data.sender, var user_id = data.sender,
user = this.users[user_id], user = this.users[user_id],
badges_out = [], badges_out = [],
insert_at = -1; insert_at = -1,
alpha = BetterTTV.settings.get('alphaTags');
if ( ! user || ! user.badges ) if ( ! user || ! user.badges )
return; return;
@ -53,7 +68,6 @@ FFZ.prototype.bttv_badges = function(data) {
} }
} }
for (var slot in user.badges) { for (var slot in user.badges) {
if ( ! user.badges.hasOwnProperty(slot) ) if ( ! user.badges.hasOwnProperty(slot) )
continue; continue;
@ -61,8 +75,16 @@ FFZ.prototype.bttv_badges = function(data) {
var badge = user.badges[slot], var badge = user.badges[slot],
full_badge = this.badges[badge.id] || {}, full_badge = this.badges[badge.id] || {},
desc = badge.title || full_badge.title, desc = badge.title || full_badge.title,
style = "", style = "";
alpha = BetterTTV.settings.get('alphaTags');
if ( full_badge.visible !== undefined ) {
var visible = full_badge.visible;
if ( typeof visible == "function" )
visible = visible.bind(this)(null, user_id);
if ( ! visible )
continue;
}
if ( badge.image ) if ( badge.image )
style += 'background-image: url(\\"' + badge.image + '\\"); '; style += 'background-image: url(\\"' + badge.image + '\\"); ';
@ -117,12 +139,21 @@ FFZ.prototype.render_badge = function(view) {
if ( full_badge.visible !== undefined ) { if ( full_badge.visible !== undefined ) {
var visible = full_badge.visible; var visible = full_badge.visible;
if ( typeof visible == "function" ) if ( typeof visible == "function" )
try { visible = visible.bind(this)(room_id, user); } catch(err) { } visible = visible.bind(this)(room_id, user);
if ( ! visible ) if ( ! visible )
continue; continue;
} }
if ( full_badge.replaces ) {
var el = badges[0].querySelector('.badge.' + full_badge.replaces);
if ( el ) {
el.style.backgroundImage = 'url("' + (badge.image || full_badge.image) + '")';
el.title += ", " + (badge.title || full_badge.title);
return;
}
}
var el = document.createElement('div'); var el = document.createElement('div');
el.className = 'badge float-left tooltip ffz-badge-' + badge.id; el.className = 'badge float-left tooltip ffz-badge-' + badge.id;
el.setAttribute('title', badge.title || full_badge.title); el.setAttribute('title', badge.title || full_badge.title);
@ -155,24 +186,33 @@ FFZ.prototype.render_badge = function(view) {
// Legacy Support // Legacy Support
// -------------------- // --------------------
FFZ.known_bots = ["quoteconut", "quoconut", "zenwan", "nightbot", "moobot", "xanbot"]; FFZ.bttv_known_bots = ["nightbot","moobot","sourbot","xanbot","manabot","mtgbot","ackbot","baconrobot","tardisbot","deejbot","valuebot","stahpbot"];
FFZ.known_bots = ["quoteconut", "quoconut", "zenwan", "triiharder", "wobblerbot", "theroflbotr", "acebot"];
FFZ.prototype._legacy_add_donors = function(tries) { FFZ.prototype._legacy_add_donors = function(tries) {
this.badges[1] = {id: 1, title: "FFZ Donor", color: "#755000", image: "//cdn.frankerfacez.com/channel/global/donoricon.png"}; this.badges[1] = {id: 1, title: "FFZ Donor", color: "#755000", image: "//cdn.frankerfacez.com/channel/global/donoricon.png"};
utils.update_css(this._badge_style, 1, badge_css(this.badges[1])); utils.update_css(this._badge_style, 1, badge_css(this.badges[1]));
// Developer Badges // Developer Badge
this.badges[0] = {id: 0, title: "FFZ Developer", color: "#FAAF19", image: "//cdn.frankerfacez.com/channel/global/devicon.png"}; this.badges[0] = {id: 0, title: "FFZ Developer", color: "#FAAF19", image: "//cdn.frankerfacez.com/channel/global/devicon.png"};
utils.update_css(this._badge_style, 0, badge_css(this.badges[0])); utils.update_css(this._badge_style, 0, badge_css(this.badges[0]));
this.users.sirstendec = {badges: {0: {id:0}}};
// Bot Badges // Bot Badge
/*this.badges[2] = {id: 2, title: "Bot", color: "#595959", image: "//cdn.frankerfacez.com/channel/global/boticon.png", this.badges[2] = {id: 2, title: "Bot", color: "#595959", image: "//cdn.frankerfacez.com/channel/global/boticon.png",
visible: function(r,user) { return !(this.has_bttv && FFZ.bttv_known_bots[user]); }}; replaces: 'moderator',
visible: function(r,user) { return this.settings.bot_badges && !(this.has_bttv && FFZ.bttv_known_bots.indexOf(user)!==-1); }};
utils.update_css(this._badge_style, 2, badge_css(this.badges[2])); utils.update_css(this._badge_style, 2, badge_css(this.badges[2]));
for(var i=0;i<FFZ.bttv_known_bots.length;i++)
this.users[FFZ.bttv_known_bots[i]] = {badges: {0: {id:2}}};
for(var i=0;i<FFZ.known_bots.length;i++) for(var i=0;i<FFZ.known_bots.length;i++)
this.users[FFZ.known_bots[i]] = {badges: {1: {id:2}}};*/ this.users[FFZ.known_bots[i]] = {badges: {0: {id:2}}};
// Special Badges
this.users.sirstendec = {badges: {1: {id:0}}};
this.users.zenwan = {badges: {0: {id:2, image: "//cdn.frankerfacez.com/channel/global/momiglee_badge.png", title: "WAN"}}};
jQuery.ajax(constants.SERVER + "script/donors.txt", {cache: false, context: this}) jQuery.ajax(constants.SERVER + "script/donors.txt", {cache: false, context: this})
@ -202,7 +242,7 @@ FFZ.prototype._legacy_parse_donors = function(data) {
if ( badges[0] ) if ( badges[0] )
continue; continue;
badges[0] = {id:1}; badges[1] = {id:1};
count += 1; count += 1;
} }
} }
@ -442,8 +482,7 @@ var FFZ = window.FrankerFaceZ,
data_to_tooltip = function(data) { data_to_tooltip = function(data) {
var output = "<tr><td>Emoticon</td><td>" + data.code + "</td></tr>", var set = data.set,
set = data.set,
set_type = data.set_type; set_type = data.set_type;
if ( set_type === undefined ) if ( set_type === undefined )
@ -457,12 +496,7 @@ var FFZ = window.FrankerFaceZ,
set_type = null; set_type = null;
} }
if ( ! set_type ) return "Emoticon: " + data.code + "\n" + (set_type ? set_type + ": " : "") + set;
output += '<tr><td class="center" colspan="2">' + set + '</td></tr>';
else
output += "<tr><td>" + set_type + "</td><td>" + set + "</td></tr>";
return '<table class="emote-data">' + output + '</table>';
}, },
build_tooltip = function(id) { build_tooltip = function(id) {
@ -578,7 +612,7 @@ FFZ.settings_info.keywords = {
FFZ.settings_info.fix_color = { FFZ.settings_info.fix_color = {
type: "boolean", type: "boolean",
value: false, value: true,
category: "Chat", category: "Chat",
visible: function() { return ! this.has_bttv }, visible: function() { return ! this.has_bttv },
@ -647,6 +681,7 @@ FFZ.prototype.setup_line = function() {
var tokens = this._super(); var tokens = this._super();
try { try {
var start = performance.now();
tokens = f._remove_banned(tokens); tokens = f._remove_banned(tokens);
tokens = f._emoticonize(this, tokens); tokens = f._emoticonize(this, tokens);
var user = f.get_user(); var user = f.get_user();
@ -654,6 +689,10 @@ FFZ.prototype.setup_line = function() {
if ( ! user || this.get("model.from") != user.login ) if ( ! user || this.get("model.from") != user.login )
tokens = f._mentionize(this, tokens); tokens = f._mentionize(this, tokens);
var end = performance.now();
if ( end - start > 5 )
f.log("Tokenizing Message Took Too Long - " + (end-start) + "ms - " + JSON.stringify(tokens));
} catch(err) { } catch(err) {
try { try {
f.error("LineController tokenizedMessage: " + err); f.error("LineController tokenizedMessage: " + err);
@ -673,6 +712,8 @@ FFZ.prototype.setup_line = function() {
didInsertElement: function() { didInsertElement: function() {
this._super(); this._super();
try { try {
var start = performance.now();
var el = this.get('element'), var el = this.get('element'),
controller = this.get('context'), controller = this.get('context'),
user = controller.get('model.from'), user = controller.get('model.from'),
@ -715,7 +756,7 @@ FFZ.prototype.setup_line = function() {
if ( mentioned ) { if ( mentioned ) {
el.classList.add("ffz-mentioned"); el.classList.add("ffz-mentioned");
if ( ! document.hasFocus() && ! this.get('context.model.ffz_notified') && f.settings.highlight_notifications ) { if ( f.settings.highlight_notifications && !document.hasFocus() && !this.get('context.model.ffz_notified') ) {
var cap_room = FFZ.get_capitalization(room), var cap_room = FFZ.get_capitalization(room),
cap_user = FFZ.get_capitalization(user), cap_user = FFZ.get_capitalization(user),
room_name = cap_room, room_name = cap_room,
@ -783,7 +824,7 @@ FFZ.prototype.setup_line = function() {
// Enhanced Emotes // Enhanced Emotes
var images = el.querySelectorAll('img'); var images = el.querySelectorAll('img.emoticon');
for(var i=0; i < images.length; i++) { for(var i=0; i < images.length; i++) {
var img = images[i], var img = images[i],
name = img.alt, name = img.alt,
@ -806,8 +847,6 @@ FFZ.prototype.setup_line = function() {
f.ws_send("twitch_emote", id, load_emote_data.bind(f, id, img.alt)); f.ws_send("twitch_emote", id, load_emote_data.bind(f, id, img.alt));
} }
jQuery(img).tipsy({html:true});
} else if ( img.getAttribute('data-ffz-emote') ) { } else if ( img.getAttribute('data-ffz-emote') ) {
var data = JSON.parse(decodeURIComponent(img.getAttribute('data-ffz-emote'))), var data = JSON.parse(decodeURIComponent(img.getAttribute('data-ffz-emote'))),
id = data && data[0] || null, id = data && data[0] || null,
@ -835,13 +874,15 @@ FFZ.prototype.setup_line = function() {
set: set_name, set: set_name,
set_type: set_type set_type: set_type
}); });
}
jQuery(img).tipsy({html:true});
} else
jQuery(img).tipsy();
} }
jQuery(images).tipsy();
var duration = performance.now() - start;
if ( duration > 5 )
f.log("Line Took Too Long - " + duration + "ms - " + el.innerHTML);
} catch(err) { } catch(err) {
try { try {
@ -887,7 +928,7 @@ FFZ.prototype._handle_color = function(color) {
// Color Too Bright. We need a lum of 0.3 or less. // Color Too Bright. We need a lum of 0.3 or less.
matched = true; matched = true;
var s = 255, var s = 127,
nc = rgb; nc = rgb;
while(s--) { while(s--) {
nc = utils.darken(nc); nc = utils.darken(nc);
@ -899,15 +940,15 @@ FFZ.prototype._handle_color = function(color) {
} else } else
output += '.ffz-chat-colors .ember-chat-container:not(.dark) .chat-line ' + rule + ', .ffz-chat-colors .chat-container:not(.dark) .chat-line ' + rule + ' { color: ' + color + ' !important; }\n'; output += '.ffz-chat-colors .ember-chat-container:not(.dark) .chat-line ' + rule + ', .ffz-chat-colors .chat-container:not(.dark) .chat-line ' + rule + ' { color: ' + color + ' !important; }\n';
if ( lum < 0.1 ) { if ( lum < 0.15 ) {
// Color Too Dark. We need a lum of 0.1 or more. // Color Too Dark. We need a lum of 0.1 or more.
matched = true; matched = true;
var s = 255, var s = 127,
nc = rgb; nc = rgb;
while(s--) { while(s--) {
nc = utils.brighten(nc); nc = utils.brighten(nc);
if ( utils.get_luminance(nc) >= 0.1 ) if ( utils.get_luminance(nc) >= 0.15 )
break; break;
} }
@ -962,8 +1003,11 @@ FFZ.get_capitalization = function(name, callback) {
FFZ.prototype.capitalize = function(view, user) { FFZ.prototype.capitalize = function(view, user) {
var name = FFZ.get_capitalization(user, this.capitalize.bind(this, view)); var name = FFZ.get_capitalization(user, this.capitalize.bind(this, view));
if ( name && view ) if ( !name || !view )
view.$('.from').text(name); return;
var from = view.$('.from');
from && from.text(name);
} }
@ -1396,7 +1440,7 @@ var FFZ = window.FrankerFaceZ,
if ( ! room.moderator_badge ) if ( ! room.moderator_badge )
return ""; return "";
return '.chat-line[data-room="' + room.id + '"] .badges .moderator { background-image:url("' + room.moderator_badge + '") !important; }'; return '.chat-line[data-room="' + room.id + '"] .badges .moderator { background-image:url("' + room.moderator_badge + '"); }';
} }
@ -2052,8 +2096,6 @@ var FFZ = window.FrankerFaceZ,
SENDER_REGEX = /(\sdata-sender="[^"]*"(?=>))/; SENDER_REGEX = /(\sdata-sender="[^"]*"(?=>))/;
FFZ.bttv_known_bots = ["nightbot","moobot","sourbot","xanbot","manabot","mtgbot","ackbot","baconrobot","tardisbot","deejbot","valuebot","stahpbot"];
// -------------------- // --------------------
// Initialization // Initialization
// -------------------- // --------------------
@ -2291,7 +2333,7 @@ FFZ.get = function() { return FFZ.instance; }
// Version // Version
var VER = FFZ.version_info = { var VER = FFZ.version_info = {
major: 3, minor: 2, revision: 1, major: 3, minor: 2, revision: 2,
toString: function() { toString: function() {
return [VER.major, VER.minor, VER.revision].join(".") + (VER.extra || ""); return [VER.major, VER.minor, VER.revision].join(".") + (VER.extra || "");
} }
@ -3051,7 +3093,10 @@ FFZ.prototype.ws_create = function() {
} else { } else {
var success = cmd === 'True', var success = cmd === 'True',
callback = f._ws_callbacks[request]; callback = f._ws_callbacks[request];
if ( ! success || ! callback )
f.log("Socket Reply to " + request + " - " + (success ? "SUCCESS" : "FAIL"), data); f.log("Socket Reply to " + request + " - " + (success ? "SUCCESS" : "FAIL"), data);
if ( callback ) { if ( callback ) {
delete f._ws_callbacks[request]; delete f._ws_callbacks[request];
callback(success, data); callback(success, data);
@ -3623,6 +3668,22 @@ var FFZ = window.FrankerFaceZ,
TWITCH_BASE = "http://static-cdn.jtvnw.net/emoticons/v1/", TWITCH_BASE = "http://static-cdn.jtvnw.net/emoticons/v1/",
BANNED_SETS = {"00000turbo":true}, BANNED_SETS = {"00000turbo":true},
KNOWN_CODES = {
"B-?\\)": "B-)",
"\\:-?[z|Z|\\|]": ":-Z",
"\\:-?\\)": ":-)",
"\\:-?\\(": ":-(",
"\\:-?(p|P)": ":-P",
"\\;-?(p|P)": ";-P",
"\\&lt\\;3": "<3",
"\\:-?(?:\\/|\\\\)(?!\\/)": ":-/",
"\\;-?\\)": ";-)",
"R-?\\)": "R-)",
"[o|O](_|\\.)[o|O]": "O.o",
"\\:-?D": ":-D",
"\\:-?(o|O)": ":-O",
"\\&gt\\;\\(": ">(",
},
get_emotes = function(ffz) { get_emotes = function(ffz) {
var Chat = App.__container__.lookup('controller:chat'), var Chat = App.__container__.lookup('controller:chat'),
@ -3637,6 +3698,9 @@ var FFZ = window.FrankerFaceZ,
// Remove the 'default' set. // Remove the 'default' set.
set_ids = set_ids.split(",").removeObject("0") set_ids = set_ids.split(",").removeObject("0")
if ( ffz.settings.global_emotes_in_menu )
set_ids.push("0");
return [set_ids, user_sets]; return [set_ids, user_sets];
}; };
@ -3645,6 +3709,15 @@ var FFZ = window.FrankerFaceZ,
// Initialization // Initialization
// ------------------- // -------------------
FFZ.settings_info.global_emotes_in_menu = {
type: "boolean",
value: false,
name: "Display Global Emotes in My Emotes",
help: "Display the global Twitch emotes in the My Emoticons menu."
};
FFZ.prototype.setup_my_emotes = function() { FFZ.prototype.setup_my_emotes = function() {
this._twitch_emote_sets = {}; this._twitch_emote_sets = {};
this._twitch_set_to_channel = {}; this._twitch_set_to_channel = {};
@ -3654,6 +3727,8 @@ FFZ.prototype.setup_my_emotes = function() {
this._twitch_set_to_channel = JSON.parse(localStorage.ffzTwitchSets); this._twitch_set_to_channel = JSON.parse(localStorage.ffzTwitchSets);
} catch(err) { } } catch(err) { }
} }
this._twitch_set_to_channel[0] = "twitch_global";
} }
@ -3715,6 +3790,13 @@ FFZ.menu_pages.my_emotes = {
if ( !name || BANNED_SETS[name] ) if ( !name || BANNED_SETS[name] )
return; return;
if ( name == "twitch_global" ) {
FFZ.capitalization["global emoticons"] = ["Global Emoticons", Date.now()];
set.channel = "Global Emoticons";
set.badge = "//cdn.frankerfacez.com/channel/global/twitch_logo.png";
return;
}
if ( name == "turbo" ) { if ( name == "turbo" ) {
set.channel = "Twitch Turbo"; set.channel = "Twitch Turbo";
set.badge = "//cdn.frankerfacez.com/script/turbo_badge.png"; set.badge = "//cdn.frankerfacez.com/script/turbo_badge.png";
@ -3839,10 +3921,10 @@ FFZ.menu_pages.my_emotes = {
var an = a[1].toLowerCase(), var an = a[1].toLowerCase(),
bn = b[1].toLowerCase(); bn = b[1].toLowerCase();
if ( an === "twitch turbo" ) if ( an === "twitch turbo" || an === "global emoticons" )
an = "zzz" + an; an = "zzz" + an;
if ( bn === "twitch turbo" ) if ( bn === "twitch turbo" || bn === "global emoticons" )
bn = "zzz" + bn; bn = "zzz" + bn;
if ( an < bn ) return -1; if ( an < bn ) return -1;
@ -3864,7 +3946,8 @@ FFZ.menu_pages.my_emotes = {
menu.appendChild(heading); menu.appendChild(heading);
for(var x=0; x < set.emotes.length; x++) { for(var x=0; x < set.emotes.length; x++) {
var emote = set.emotes[x]; var emote = set.emotes[x],
code = KNOWN_CODES[emote.code] || emote.code;
var s = document.createElement('span'); var s = document.createElement('span');
s.className = 'emoticon tooltip'; s.className = 'emoticon tooltip';
@ -3876,8 +3959,8 @@ FFZ.menu_pages.my_emotes = {
s.style.backgroundImage = '-ms-' + img_set; s.style.backgroundImage = '-ms-' + img_set;
s.style.backgroundImage = img_set; s.style.backgroundImage = img_set;
s.title = emote.code; s.title = code;
s.addEventListener('click', f._add_emote.bind(f, view, emote.code)); s.addEventListener('click', f._add_emote.bind(f, view, code));
menu.appendChild(s); menu.appendChild(s);
} }

6
script.min.js vendored

File diff suppressed because one or more lines are too long

View file

@ -3,6 +3,20 @@ var FFZ = window.FrankerFaceZ,
utils = require('./utils'); utils = require('./utils');
// --------------------
// Settings
// --------------------
FFZ.settings_info.bot_badges = {
type: "boolean",
value: true,
category: "Chat",
name: "Bot Badges",
help: "Give special badges to known bots."
};
// -------------------- // --------------------
// Initialization // Initialization
// -------------------- // --------------------
@ -38,7 +52,8 @@ FFZ.prototype.bttv_badges = function(data) {
var user_id = data.sender, var user_id = data.sender,
user = this.users[user_id], user = this.users[user_id],
badges_out = [], badges_out = [],
insert_at = -1; insert_at = -1,
alpha = BetterTTV.settings.get('alphaTags');
if ( ! user || ! user.badges ) if ( ! user || ! user.badges )
return; return;
@ -52,7 +67,6 @@ FFZ.prototype.bttv_badges = function(data) {
} }
} }
for (var slot in user.badges) { for (var slot in user.badges) {
if ( ! user.badges.hasOwnProperty(slot) ) if ( ! user.badges.hasOwnProperty(slot) )
continue; continue;
@ -60,8 +74,16 @@ FFZ.prototype.bttv_badges = function(data) {
var badge = user.badges[slot], var badge = user.badges[slot],
full_badge = this.badges[badge.id] || {}, full_badge = this.badges[badge.id] || {},
desc = badge.title || full_badge.title, desc = badge.title || full_badge.title,
style = "", style = "";
alpha = BetterTTV.settings.get('alphaTags');
if ( full_badge.visible !== undefined ) {
var visible = full_badge.visible;
if ( typeof visible == "function" )
visible = visible.bind(this)(null, user_id);
if ( ! visible )
continue;
}
if ( badge.image ) if ( badge.image )
style += 'background-image: url(\\"' + badge.image + '\\"); '; style += 'background-image: url(\\"' + badge.image + '\\"); ';
@ -116,12 +138,21 @@ FFZ.prototype.render_badge = function(view) {
if ( full_badge.visible !== undefined ) { if ( full_badge.visible !== undefined ) {
var visible = full_badge.visible; var visible = full_badge.visible;
if ( typeof visible == "function" ) if ( typeof visible == "function" )
try { visible = visible.bind(this)(room_id, user); } catch(err) { } visible = visible.bind(this)(room_id, user);
if ( ! visible ) if ( ! visible )
continue; continue;
} }
if ( full_badge.replaces ) {
var el = badges[0].querySelector('.badge.' + full_badge.replaces);
if ( el ) {
el.style.backgroundImage = 'url("' + (badge.image || full_badge.image) + '")';
el.title += ", " + (badge.title || full_badge.title);
return;
}
}
var el = document.createElement('div'); var el = document.createElement('div');
el.className = 'badge float-left tooltip ffz-badge-' + badge.id; el.className = 'badge float-left tooltip ffz-badge-' + badge.id;
el.setAttribute('title', badge.title || full_badge.title); el.setAttribute('title', badge.title || full_badge.title);
@ -154,24 +185,33 @@ FFZ.prototype.render_badge = function(view) {
// Legacy Support // Legacy Support
// -------------------- // --------------------
FFZ.known_bots = ["quoteconut", "quoconut", "zenwan", "nightbot", "moobot", "xanbot"]; FFZ.bttv_known_bots = ["nightbot","moobot","sourbot","xanbot","manabot","mtgbot","ackbot","baconrobot","tardisbot","deejbot","valuebot","stahpbot"];
FFZ.known_bots = ["quoteconut", "quoconut", "zenwan", "triiharder", "wobblerbot", "theroflbotr", "acebot"];
FFZ.prototype._legacy_add_donors = function(tries) { FFZ.prototype._legacy_add_donors = function(tries) {
this.badges[1] = {id: 1, title: "FFZ Donor", color: "#755000", image: "//cdn.frankerfacez.com/channel/global/donoricon.png"}; this.badges[1] = {id: 1, title: "FFZ Donor", color: "#755000", image: "//cdn.frankerfacez.com/channel/global/donoricon.png"};
utils.update_css(this._badge_style, 1, badge_css(this.badges[1])); utils.update_css(this._badge_style, 1, badge_css(this.badges[1]));
// Developer Badges // Developer Badge
this.badges[0] = {id: 0, title: "FFZ Developer", color: "#FAAF19", image: "//cdn.frankerfacez.com/channel/global/devicon.png"}; this.badges[0] = {id: 0, title: "FFZ Developer", color: "#FAAF19", image: "//cdn.frankerfacez.com/channel/global/devicon.png"};
utils.update_css(this._badge_style, 0, badge_css(this.badges[0])); utils.update_css(this._badge_style, 0, badge_css(this.badges[0]));
this.users.sirstendec = {badges: {0: {id:0}}};
// Bot Badges // Bot Badge
/*this.badges[2] = {id: 2, title: "Bot", color: "#595959", image: "//cdn.frankerfacez.com/channel/global/boticon.png", this.badges[2] = {id: 2, title: "Bot", color: "#595959", image: "//cdn.frankerfacez.com/channel/global/boticon.png",
visible: function(r,user) { return !(this.has_bttv && FFZ.bttv_known_bots[user]); }}; replaces: 'moderator',
visible: function(r,user) { return this.settings.bot_badges && !(this.has_bttv && FFZ.bttv_known_bots.indexOf(user)!==-1); }};
utils.update_css(this._badge_style, 2, badge_css(this.badges[2])); utils.update_css(this._badge_style, 2, badge_css(this.badges[2]));
for(var i=0;i<FFZ.bttv_known_bots.length;i++)
this.users[FFZ.bttv_known_bots[i]] = {badges: {0: {id:2}}};
for(var i=0;i<FFZ.known_bots.length;i++) for(var i=0;i<FFZ.known_bots.length;i++)
this.users[FFZ.known_bots[i]] = {badges: {1: {id:2}}};*/ this.users[FFZ.known_bots[i]] = {badges: {0: {id:2}}};
// Special Badges
this.users.sirstendec = {badges: {1: {id:0}}};
this.users.zenwan = {badges: {0: {id:2, image: "//cdn.frankerfacez.com/channel/global/momiglee_badge.png", title: "WAN"}}};
jQuery.ajax(constants.SERVER + "script/donors.txt", {cache: false, context: this}) jQuery.ajax(constants.SERVER + "script/donors.txt", {cache: false, context: this})
@ -201,7 +241,7 @@ FFZ.prototype._legacy_parse_donors = function(data) {
if ( badges[0] ) if ( badges[0] )
continue; continue;
badges[0] = {id:1}; badges[1] = {id:1};
count += 1; count += 1;
} }
} }

View file

@ -25,8 +25,7 @@ var FFZ = window.FrankerFaceZ,
data_to_tooltip = function(data) { data_to_tooltip = function(data) {
var output = "<tr><td>Emoticon</td><td>" + data.code + "</td></tr>", var set = data.set,
set = data.set,
set_type = data.set_type; set_type = data.set_type;
if ( set_type === undefined ) if ( set_type === undefined )
@ -40,12 +39,7 @@ var FFZ = window.FrankerFaceZ,
set_type = null; set_type = null;
} }
if ( ! set_type ) return "Emoticon: " + data.code + "\n" + (set_type ? set_type + ": " : "") + set;
output += '<tr><td class="center" colspan="2">' + set + '</td></tr>';
else
output += "<tr><td>" + set_type + "</td><td>" + set + "</td></tr>";
return '<table class="emote-data">' + output + '</table>';
}, },
build_tooltip = function(id) { build_tooltip = function(id) {
@ -161,7 +155,7 @@ FFZ.settings_info.keywords = {
FFZ.settings_info.fix_color = { FFZ.settings_info.fix_color = {
type: "boolean", type: "boolean",
value: false, value: true,
category: "Chat", category: "Chat",
visible: function() { return ! this.has_bttv }, visible: function() { return ! this.has_bttv },
@ -230,6 +224,7 @@ FFZ.prototype.setup_line = function() {
var tokens = this._super(); var tokens = this._super();
try { try {
var start = performance.now();
tokens = f._remove_banned(tokens); tokens = f._remove_banned(tokens);
tokens = f._emoticonize(this, tokens); tokens = f._emoticonize(this, tokens);
var user = f.get_user(); var user = f.get_user();
@ -237,6 +232,10 @@ FFZ.prototype.setup_line = function() {
if ( ! user || this.get("model.from") != user.login ) if ( ! user || this.get("model.from") != user.login )
tokens = f._mentionize(this, tokens); tokens = f._mentionize(this, tokens);
var end = performance.now();
if ( end - start > 5 )
f.log("Tokenizing Message Took Too Long - " + (end-start) + "ms - " + JSON.stringify(tokens));
} catch(err) { } catch(err) {
try { try {
f.error("LineController tokenizedMessage: " + err); f.error("LineController tokenizedMessage: " + err);
@ -256,6 +255,8 @@ FFZ.prototype.setup_line = function() {
didInsertElement: function() { didInsertElement: function() {
this._super(); this._super();
try { try {
var start = performance.now();
var el = this.get('element'), var el = this.get('element'),
controller = this.get('context'), controller = this.get('context'),
user = controller.get('model.from'), user = controller.get('model.from'),
@ -298,7 +299,7 @@ FFZ.prototype.setup_line = function() {
if ( mentioned ) { if ( mentioned ) {
el.classList.add("ffz-mentioned"); el.classList.add("ffz-mentioned");
if ( ! document.hasFocus() && ! this.get('context.model.ffz_notified') && f.settings.highlight_notifications ) { if ( f.settings.highlight_notifications && !document.hasFocus() && !this.get('context.model.ffz_notified') ) {
var cap_room = FFZ.get_capitalization(room), var cap_room = FFZ.get_capitalization(room),
cap_user = FFZ.get_capitalization(user), cap_user = FFZ.get_capitalization(user),
room_name = cap_room, room_name = cap_room,
@ -366,7 +367,7 @@ FFZ.prototype.setup_line = function() {
// Enhanced Emotes // Enhanced Emotes
var images = el.querySelectorAll('img'); var images = el.querySelectorAll('img.emoticon');
for(var i=0; i < images.length; i++) { for(var i=0; i < images.length; i++) {
var img = images[i], var img = images[i],
name = img.alt, name = img.alt,
@ -389,8 +390,6 @@ FFZ.prototype.setup_line = function() {
f.ws_send("twitch_emote", id, load_emote_data.bind(f, id, img.alt)); f.ws_send("twitch_emote", id, load_emote_data.bind(f, id, img.alt));
} }
jQuery(img).tipsy({html:true});
} else if ( img.getAttribute('data-ffz-emote') ) { } else if ( img.getAttribute('data-ffz-emote') ) {
var data = JSON.parse(decodeURIComponent(img.getAttribute('data-ffz-emote'))), var data = JSON.parse(decodeURIComponent(img.getAttribute('data-ffz-emote'))),
id = data && data[0] || null, id = data && data[0] || null,
@ -418,13 +417,15 @@ FFZ.prototype.setup_line = function() {
set: set_name, set: set_name,
set_type: set_type set_type: set_type
}); });
}
jQuery(img).tipsy({html:true});
} else
jQuery(img).tipsy();
} }
jQuery(images).tipsy();
var duration = performance.now() - start;
if ( duration > 5 )
f.log("Line Took Too Long - " + duration + "ms - " + el.innerHTML);
} catch(err) { } catch(err) {
try { try {
@ -470,7 +471,7 @@ FFZ.prototype._handle_color = function(color) {
// Color Too Bright. We need a lum of 0.3 or less. // Color Too Bright. We need a lum of 0.3 or less.
matched = true; matched = true;
var s = 255, var s = 127,
nc = rgb; nc = rgb;
while(s--) { while(s--) {
nc = utils.darken(nc); nc = utils.darken(nc);
@ -482,15 +483,15 @@ FFZ.prototype._handle_color = function(color) {
} else } else
output += '.ffz-chat-colors .ember-chat-container:not(.dark) .chat-line ' + rule + ', .ffz-chat-colors .chat-container:not(.dark) .chat-line ' + rule + ' { color: ' + color + ' !important; }\n'; output += '.ffz-chat-colors .ember-chat-container:not(.dark) .chat-line ' + rule + ', .ffz-chat-colors .chat-container:not(.dark) .chat-line ' + rule + ' { color: ' + color + ' !important; }\n';
if ( lum < 0.1 ) { if ( lum < 0.15 ) {
// Color Too Dark. We need a lum of 0.1 or more. // Color Too Dark. We need a lum of 0.1 or more.
matched = true; matched = true;
var s = 255, var s = 127,
nc = rgb; nc = rgb;
while(s--) { while(s--) {
nc = utils.brighten(nc); nc = utils.brighten(nc);
if ( utils.get_luminance(nc) >= 0.1 ) if ( utils.get_luminance(nc) >= 0.15 )
break; break;
} }
@ -545,8 +546,11 @@ FFZ.get_capitalization = function(name, callback) {
FFZ.prototype.capitalize = function(view, user) { FFZ.prototype.capitalize = function(view, user) {
var name = FFZ.get_capitalization(user, this.capitalize.bind(this, view)); var name = FFZ.get_capitalization(user, this.capitalize.bind(this, view));
if ( name && view ) if ( !name || !view )
view.$('.from').text(name); return;
var from = view.$('.from');
from && from.text(name);
} }

View file

@ -10,7 +10,7 @@ var FFZ = window.FrankerFaceZ,
if ( ! room.moderator_badge ) if ( ! room.moderator_badge )
return ""; return "";
return '.chat-line[data-room="' + room.id + '"] .badges .moderator { background-image:url("' + room.moderator_badge + '") !important; }'; return '.chat-line[data-room="' + room.id + '"] .badges .moderator { background-image:url("' + room.moderator_badge + '"); }';
} }

View file

@ -2,8 +2,6 @@ var FFZ = window.FrankerFaceZ,
SENDER_REGEX = /(\sdata-sender="[^"]*"(?=>))/; SENDER_REGEX = /(\sdata-sender="[^"]*"(?=>))/;
FFZ.bttv_known_bots = ["nightbot","moobot","sourbot","xanbot","manabot","mtgbot","ackbot","baconrobot","tardisbot","deejbot","valuebot","stahpbot"];
// -------------------- // --------------------
// Initialization // Initialization
// -------------------- // --------------------

View file

@ -22,7 +22,7 @@ FFZ.get = function() { return FFZ.instance; }
// Version // Version
var VER = FFZ.version_info = { var VER = FFZ.version_info = {
major: 3, minor: 2, revision: 1, major: 3, minor: 2, revision: 2,
toString: function() { toString: function() {
return [VER.major, VER.minor, VER.revision].join(".") + (VER.extra || ""); return [VER.major, VER.minor, VER.revision].join(".") + (VER.extra || "");
} }

View file

@ -99,7 +99,10 @@ FFZ.prototype.ws_create = function() {
} else { } else {
var success = cmd === 'True', var success = cmd === 'True',
callback = f._ws_callbacks[request]; callback = f._ws_callbacks[request];
if ( ! success || ! callback )
f.log("Socket Reply to " + request + " - " + (success ? "SUCCESS" : "FAIL"), data); f.log("Socket Reply to " + request + " - " + (success ? "SUCCESS" : "FAIL"), data);
if ( callback ) { if ( callback ) {
delete f._ws_callbacks[request]; delete f._ws_callbacks[request];
callback(success, data); callback(success, data);

View file

@ -4,6 +4,22 @@ var FFZ = window.FrankerFaceZ,
TWITCH_BASE = "http://static-cdn.jtvnw.net/emoticons/v1/", TWITCH_BASE = "http://static-cdn.jtvnw.net/emoticons/v1/",
BANNED_SETS = {"00000turbo":true}, BANNED_SETS = {"00000turbo":true},
KNOWN_CODES = {
"B-?\\)": "B-)",
"\\:-?[z|Z|\\|]": ":-Z",
"\\:-?\\)": ":-)",
"\\:-?\\(": ":-(",
"\\:-?(p|P)": ":-P",
"\\;-?(p|P)": ";-P",
"\\&lt\\;3": "<3",
"\\:-?(?:\\/|\\\\)(?!\\/)": ":-/",
"\\;-?\\)": ";-)",
"R-?\\)": "R-)",
"[o|O](_|\\.)[o|O]": "O.o",
"\\:-?D": ":-D",
"\\:-?(o|O)": ":-O",
"\\&gt\\;\\(": ">(",
},
get_emotes = function(ffz) { get_emotes = function(ffz) {
var Chat = App.__container__.lookup('controller:chat'), var Chat = App.__container__.lookup('controller:chat'),
@ -18,6 +34,9 @@ var FFZ = window.FrankerFaceZ,
// Remove the 'default' set. // Remove the 'default' set.
set_ids = set_ids.split(",").removeObject("0") set_ids = set_ids.split(",").removeObject("0")
if ( ffz.settings.global_emotes_in_menu )
set_ids.push("0");
return [set_ids, user_sets]; return [set_ids, user_sets];
}; };
@ -26,6 +45,15 @@ var FFZ = window.FrankerFaceZ,
// Initialization // Initialization
// ------------------- // -------------------
FFZ.settings_info.global_emotes_in_menu = {
type: "boolean",
value: false,
name: "Display Global Emotes in My Emotes",
help: "Display the global Twitch emotes in the My Emoticons menu."
};
FFZ.prototype.setup_my_emotes = function() { FFZ.prototype.setup_my_emotes = function() {
this._twitch_emote_sets = {}; this._twitch_emote_sets = {};
this._twitch_set_to_channel = {}; this._twitch_set_to_channel = {};
@ -35,6 +63,8 @@ FFZ.prototype.setup_my_emotes = function() {
this._twitch_set_to_channel = JSON.parse(localStorage.ffzTwitchSets); this._twitch_set_to_channel = JSON.parse(localStorage.ffzTwitchSets);
} catch(err) { } } catch(err) { }
} }
this._twitch_set_to_channel[0] = "twitch_global";
} }
@ -96,6 +126,13 @@ FFZ.menu_pages.my_emotes = {
if ( !name || BANNED_SETS[name] ) if ( !name || BANNED_SETS[name] )
return; return;
if ( name == "twitch_global" ) {
FFZ.capitalization["global emoticons"] = ["Global Emoticons", Date.now()];
set.channel = "Global Emoticons";
set.badge = "//cdn.frankerfacez.com/channel/global/twitch_logo.png";
return;
}
if ( name == "turbo" ) { if ( name == "turbo" ) {
set.channel = "Twitch Turbo"; set.channel = "Twitch Turbo";
set.badge = "//cdn.frankerfacez.com/script/turbo_badge.png"; set.badge = "//cdn.frankerfacez.com/script/turbo_badge.png";
@ -220,10 +257,10 @@ FFZ.menu_pages.my_emotes = {
var an = a[1].toLowerCase(), var an = a[1].toLowerCase(),
bn = b[1].toLowerCase(); bn = b[1].toLowerCase();
if ( an === "twitch turbo" ) if ( an === "twitch turbo" || an === "global emoticons" )
an = "zzz" + an; an = "zzz" + an;
if ( bn === "twitch turbo" ) if ( bn === "twitch turbo" || bn === "global emoticons" )
bn = "zzz" + bn; bn = "zzz" + bn;
if ( an < bn ) return -1; if ( an < bn ) return -1;
@ -245,7 +282,8 @@ FFZ.menu_pages.my_emotes = {
menu.appendChild(heading); menu.appendChild(heading);
for(var x=0; x < set.emotes.length; x++) { for(var x=0; x < set.emotes.length; x++) {
var emote = set.emotes[x]; var emote = set.emotes[x],
code = KNOWN_CODES[emote.code] || emote.code;
var s = document.createElement('span'); var s = document.createElement('span');
s.className = 'emoticon tooltip'; s.className = 'emoticon tooltip';
@ -257,8 +295,8 @@ FFZ.menu_pages.my_emotes = {
s.style.backgroundImage = '-ms-' + img_set; s.style.backgroundImage = '-ms-' + img_set;
s.style.backgroundImage = img_set; s.style.backgroundImage = img_set;
s.title = emote.code; s.title = code;
s.addEventListener('click', f._add_emote.bind(f, view, emote.code)); s.addEventListener('click', f._add_emote.bind(f, view, code));
menu.appendChild(s); menu.appendChild(s);
} }

View file

@ -433,7 +433,9 @@
.ffz-ui-popup.dark .ffz-ui-menu-page a { color: #fff; } .ffz-ui-popup.dark .ffz-ui-menu-page a { color: #fff; }
.ffz-dark .ffz-ui-popup ul.menu svg path,
.ffz-ui-popup.dark ul.menu svg path { fill: #d3d3d3; } .ffz-ui-popup.dark ul.menu svg path { fill: #d3d3d3; }
.ffz-ui-popup ul.menu svg path { fill: #333; } .ffz-ui-popup ul.menu svg path { fill: #333; }
@ -588,22 +590,10 @@
/* Emoticon Tooltips */ /* Emoticon Tooltips */
.tipsy table.emote-data td { padding: 0 2px; } .tipsy .tipsy-inner {
white-space: pre-wrap;
.tipsy table.emote-data td:first-of-type {
text-align: right;
font-weight: bold;
padding-left: 0;
} }
.tipsy table.emote-data td:last-of-type {
text-align: left;
padding-right: 0;
white-space: nowrap;
}
.tipsy table.emote-data td.center { text-align: center; }
/* Menu Page Loader */ /* Menu Page Loader */
.ffz-ui-menu-page:empty { .ffz-ui-menu-page:empty {