diff --git a/dark.css b/dark.css
index 0c24fcf9..0f33d367 100644
--- a/dark.css
+++ b/dark.css
@@ -1036,4 +1036,7 @@
.ffz-dark .conversation-window.has-focus .conversation-input-actions .button,
.ffz-dark .conversation-window.has-focus .conversation-input-actions .follow-button:not(.ember-follow) .follow {
background-color: #6441a5
-}
\ No newline at end of file
+}
+
+.ffz-dark .conversation-window .new-message-divider span { background: transparent; }
+.ffz-dark .conversation-window .new-message-divider:after { display: none; }
\ No newline at end of file
diff --git a/src/colors.js b/src/colors.js
index 604959d6..a0d09ad4 100644
--- a/src/colors.js
+++ b/src/colors.js
@@ -570,19 +570,7 @@ FFZ.prototype._update_colors = function(darkness_only) {
this._color_old_darkness = is_dark;
- var colored_bits = document.querySelectorAll('.chat-line .has-color');
- for(var i=0, l=colored_bits.length; i < l; i++) {
- var bit = colored_bits[i],
- color = bit.getAttribute('data-color'),
- colors = color && this._handle_color(color);
-
- if ( ! colors )
- continue;
-
- bit.style.color = is_dark ? colors[1] : colors[0];
- }
-
- colored_bits = document.querySelectorAll('.conversation-chat-line .has-color');
+ var colored_bits = document.querySelectorAll('.has-color');
for(var i=0, l=colored_bits.length; i < l; i++) {
var bit = colored_bits[i],
color = bit.getAttribute('data-color'),
diff --git a/src/constants.js b/src/constants.js
index 45d456c5..d8422d59 100644
--- a/src/constants.js
+++ b/src/constants.js
@@ -77,6 +77,7 @@ module.exports = {
CLOCK: '',
GEAR: '',
HEART: '',
+ UNHEART: '',
EMOTE: '',
STAR: '',
CLOSE: '',
diff --git a/src/ember/conversations.js b/src/ember/conversations.js
new file mode 100644
index 00000000..f73996b2
--- /dev/null
+++ b/src/ember/conversations.js
@@ -0,0 +1,252 @@
+var FFZ = window.FrankerFaceZ,
+ utils = require('../utils'),
+ constants = require('../constants');
+
+
+// ---------------
+// Settings
+// ---------------
+
+FFZ.settings_info.conv_title_clickable = {
+ type: "boolean",
+ value: false,
+ no_mobile: true,
+
+ category: "Conversations",
+ name: "Clickable Header Name",
+ help: "Make the conversation header a link that takes you to that person's page.",
+ on_update: function(val) {
+ document.body.classList.toggle('ffz-conv-title-clickable', val);
+ }
+ };
+
+FFZ.settings_info.conv_focus_on_click = {
+ type: "boolean",
+ value: false,
+ no_mobile: true,
+
+ category: "Conversations",
+ name: "Focus Input on Click",
+ help: "Focus on a conversation's input box when you click it."
+ };
+
+FFZ.settings_info.top_conversations = {
+ type: "boolean",
+ value: false,
+ no_mobile: true,
+
+ category: "Conversations",
+ name: "Position on Top",
+ help: "Display the new conversation-style whisper UI at the top of the window instead of the bottom.",
+ on_update: function(val) {
+ document.body.classList.toggle('ffz-top-conversations', val);
+ }
+ };
+
+FFZ.settings_info.conv_beta_enable = {
+ type: "boolean",
+ value: false,
+ no_mobile: true,
+
+ category: "Conversations",
+ name: "Enable Conversations",
+ help: "Twitch hasn't enabled them yet, but they're in the code for testing. Try them out!",
+ on_update: function(val) {
+ App.__container__.lookup('route:application').controller.set('isConversationsEnabled', val);
+ }
+ };
+
+
+// ---------------
+// Initialization
+// ---------------
+
+FFZ.prototype.setup_conversations = function() {
+ document.body.classList.toggle('ffz-top-conversations', this.settings.top_conversations);
+ document.body.classList.toggle('ffz-conv-title-clickable', this.settings.conv_title_clickable);;
+
+ if ( this.settings.conv_beta_enable )
+ App.__container__.lookup('route:application').controller.set('isConversationsEnabled', true);
+
+ this.log("Hooking the Ember Conversation Window component.");
+ var ConvWindow = App.__container__.resolve('component:conversation-window');
+ if ( ConvWindow )
+ this._modify_conversation_window(ConvWindow);
+
+
+ this.log("Hooking the Ember Conversation Line component.");
+ var ConvLine = App.__container__.resolve('component:conversation-line');
+ if ( ConvLine )
+ this._modify_conversation_line(ConvLine);
+}
+
+
+FFZ.prototype._modify_conversation_window = function(component) {
+ var f = this,
+
+ Layout = App.__container__.lookup('controller:layout'),
+ Settings = App.__container__.lookup('controller:settings');
+
+ component.reopen({
+ onConversationClick: Ember.on('click', function() {
+ this.markConversationRead();
+ if ( f.settings.conv_focus_on_click )
+ this.$(".conversation-input-bar textarea").focus();
+ }),
+
+ headerBadges: Ember.computed("conversation.participants", "currentUsername", function() {
+ var e = this.get("conversation.participants").rejectBy("username", this.get("currentUsername")).objectAt(0),
+ badges = {},
+
+ ut = e.get("userType");
+
+ if ( ut === "staff" )
+ badges[0] = {classes: 'badge staff', title: 'Staff'};
+ else if ( ut === 'admin' )
+ badges[0] = {classes: 'badge admin', title: 'Admin'};
+ else if ( ut === 'global_mod' )
+ badges[0] = {classes: 'badge global-moderator', title: 'Global Moderator'};
+
+ if ( e.get('hasTurbo') )
+ badges[15] = {classes: 'badge turbo', title: 'Turbo'}
+
+ // FFZ Badges
+ var data = f.users[e.get('username')];
+ if ( data && data.badges ) {
+ for(var slot in data.badges) {
+ if ( ! data.badges.hasOwnProperty(slot) )
+ continue;
+
+ var badge = data.badges[slot],
+ full_badge = f.badges[badge.id] || {},
+ old_badge = badges[slot];
+
+ if ( full_badge.visible !== undefined ) {
+ var visible = full_badge.visible;
+ if ( typeof visible === "function" )
+ try {
+ visible = visible.bind(f)(null, e.get('username'), null, badges);
+ } catch(err) {
+ f.error("badge " + badge.id + " visible: " + err);
+ continue;
+ }
+
+ if ( ! visible )
+ continue;
+ }
+
+ if ( old_badge ) {
+ var replaces = badge.hasOwnProperty('replaces') ? badge.replaces : full_badge.replaces;
+ if ( ! replaces )
+ continue;
+
+ old_badge.klass = 'badge ffz-badge-' + badge.id;
+ old_badge.title += ', ' + (badge.title || full_badge.title);
+ continue;
+ }
+
+ badges[slot] = {
+ classes: 'badge ffz-badge-' + badge.id,
+ title: badge.title || full_badge.title
+ }
+ }
+ }
+
+ var out = [];
+ for(var slot in badges)
+ out.push(badges[slot]);
+
+ return out;
+ }),
+
+ didInsertElement: function() {
+ var el = this.get('element'),
+ header = el && el.querySelector('.conversation-header'),
+ header_name = header && header.querySelector('.conversation-header-name'),
+
+ new_header_name = document.createElement('span'),
+
+ raw_color = this.get('otherUser.color'),
+ colors = raw_color && f._handle_color(raw_color),
+
+ is_dark = (Layout && Layout.get('isTheatreMode')) || f.settings.dark_twitch;
+
+ if ( header_name ) {
+ new_header_name.className = 'conversation-header-name';
+ new_header_name.textContent = header_name.textContent;
+ header.insertBefore(new_header_name, header_name);
+
+ if ( raw_color ) {
+ header_name.style.color = (is_dark ? colors[1] : colors[0]);
+ header_name.classList.add('has-color');
+ header_name.setAttribute('data-color', raw_color);
+
+ new_header_name.style.color = (is_dark ? colors[1] : colors[0]);
+ new_header_name.classList.add('has-color');
+ new_header_name.setAttribute('data-color', raw_color);
+ }
+ }
+ }
+ });
+}
+
+
+FFZ.prototype._modify_conversation_line = function(component) {
+ var f = this,
+
+ Layout = App.__container__.lookup('controller:layout'),
+ Settings = App.__container__.lookup('controller:settings');
+
+ component.reopen({
+ tokenizedMessage: function() {
+ try {
+ return f.tokenize_conversation_line(this.get('message'));
+ } catch(err) {
+ f.error("convo-line tokenizedMessage: " + err);
+ return this._super();
+ }
+
+ }.property("message", "currentUsername"),
+
+ click: function(e) {
+ if ( e.target && e.target.classList.contains('deleted-link') )
+ return f._deleted_link_click.bind(e.target)(e);
+
+ if ( f._click_emote(e.target, e) )
+ return;
+
+ return this._super(e);
+ },
+
+ render: function(e) {
+ var user = this.get('message.from.username'),
+ raw_color = this.get('message.from.color'),
+ colors = raw_color && f._handle_color(raw_color),
+
+ is_dark = (Layout && Layout.get('isTheatreMode')) || f.settings.dark_twitch;
+
+ e.push('
');
+
+ var alias = f.aliases[user],
+ name = this.get('message.from.displayName') || (user && user.capitalize()) || "unknown user",
+ style = colors && 'color:' + (is_dark ? colors[1] : colors[0]),
+ colored = style ? ' has-color' : '';
+
+ if ( alias )
+ e.push('' + utils.sanitize(alias) + '');
+ else
+ e.push('' + utils.sanitize(name) + '');
+
+ e.push(': ');
+
+ if ( ! this.get('isActionMessage') ) {
+ style = '';
+ colored = '';
+ }
+
+ e.push('');
+ e.push(f.render_tokens(this.get('tokenizedMessage'), true));
+ e.push('');
+ }
+ });
+}
\ No newline at end of file
diff --git a/src/ember/directory.js b/src/ember/directory.js
index 281fe89b..f3704d36 100644
--- a/src/ember/directory.js
+++ b/src/ember/directory.js
@@ -45,8 +45,12 @@ FFZ.prototype.setup_directory = function() {
// Initialize existing views.
for(var key in Ember.View.views) {
var view = Ember.View.views[key];
- if ( view instanceof ChannelView || view instanceof CreativeChannel || view instanceof CSGOChannel || view instanceof HostView )
- view.ffzInit();
+ try {
+ if ( (ChannelView && view instanceof ChannelView) || (CreativeChannel && view instanceof CreativeChannel) || (CSGOChannel && view instanceof CSGOChannel) || (HostView && view instanceof HostView) )
+ view.ffzInit();
+ } catch(err) {
+ this.error("Directory Setup: " + err);
+ }
}
}
diff --git a/src/ember/following.js b/src/ember/following.js
new file mode 100644
index 00000000..a743749e
--- /dev/null
+++ b/src/ember/following.js
@@ -0,0 +1,318 @@
+var FFZ = window.FrankerFaceZ,
+ utils = require('../utils'),
+ constants = require('../constants');
+
+
+// --------------------
+// Settings
+// --------------------
+
+FFZ.settings_info.enhance_profile_following = {
+ type: "boolean",
+ value: true,
+
+ category: "Appearance",
+ name: "Enhanced Following Control",
+ help: "Display additional controls on your own profile's Following tab to make management easier."
+}
+
+
+// --------------------
+// Initialization
+// --------------------
+
+FFZ.prototype.setup_profile_following = function() {
+ if ( ! window.App )
+ return;
+
+ var f = this;
+
+ // Build our is-following cache.
+ this._following_cache = {};
+
+ // First, we need to hook the model. This is what we'll use to grab the following notification state,
+ // rather than making potentially hundreds of API requests.
+ var Following = App.__container__.resolve('model:kraken-channel-following');
+ if ( ! Following )
+ return;
+
+ this._hook_following(Following);
+
+ // Also try hooking that other model.
+ var Notification = App.__container__.resolve('model:notification');
+ if ( Notification )
+ this._hook_following(Notification, true);
+
+
+ // Now, we need to edit the profile Following view itself.
+ var ProfileView = App.__container__.resolve('view:channel/following');
+ if ( ! ProfileView )
+ return;
+
+ ProfileView.reopen({
+ didInsertElement: function() {
+ this._super();
+ try {
+ this.ffzInit();
+ } catch(err) {
+ f.error("ProfileView ffzInit: " + err);
+ }
+ },
+
+ willClearRender: function() {
+ try {
+ this.ffzTeardown();
+ } catch(err) {
+ f.error("ProvileView ffzTeardown: " + err);
+ }
+ this._super();
+ },
+
+ ffzInit: function() {
+ // Only process our own profile following page.
+ var user = f.get_user();
+ if ( ! f.settings.enhance_profile_following || ! user || ! user.login === this.get('context.id') )
+ return;
+
+ var el = this.get('element'),
+ users = el && el.querySelectorAll('.user.item');
+
+ el.classList.add('ffz-enhanced-following');
+
+ var had_data = true;
+
+ if ( users && users.length )
+ for(var i=0; i < users.length; i++)
+ had_data = this.ffzProcessUser(users[i]) && had_data;
+ else
+ had_data = false;
+
+ if ( ! had_data ) {
+ // Force a refresh.
+ f.log("Forcing a refresh of user following data.");
+ var following = this.get('context.following'),
+ refresher = function() {
+ if ( following.get('isLoading') )
+ setTimeout(refresher, 25);
+
+ following.clear();
+ following.load();
+ }
+
+ // We use this weird function to prevent trying to load twice mucking things up.
+ setTimeout(refresher);
+ }
+
+ // Watch for new ones the bad way.
+ if ( ! this._ffz_observer ) {
+ var t = this;
+ var observer = this._ffz_observer = new MutationObserver(function(mutations) {
+ for(var i=0; i < mutations.length; i++) {
+ var mutation = mutations[i];
+ if ( mutation.type !== "childList" )
+ continue;
+
+ for(var x=0; x < mutation.addedNodes.length; x++) {
+ var added = mutation.addedNodes[x];
+ if ( added.nodeType !== added.ELEMENT_NODE || added.tagName !== "DIV" )
+ continue;
+
+ // Is it an ember-view? Check its kids.
+ if ( added.classList.contains('ember-view') ) {
+ var users = added.querySelectorAll('.user.item');
+ if ( users )
+ for(var y=0; y < users.length; y++)
+ t.ffzProcessUser(users[y]);
+
+ } else if ( added.classList.contains('user') )
+ t.ffzProcessUser(added);
+ }
+ }
+ });
+
+ observer.observe(el, {
+ childList: true,
+ subtree: true
+ });
+ }
+ },
+
+ ffzTeardown: function() {
+ if ( this._ffz_observer ) {
+ this._ffz_observer.disconnect();
+ this._ffz_observer = null;
+ }
+ },
+
+ ffzProcessUser: function(user) {
+ if ( user.classList.contains('ffz-processed') )
+ return true;
+
+ var link = user.querySelector('a'),
+ link_parts = link && link.href.split("/"),
+ user_id = link_parts && link_parts[3],
+ data = f._following_cache[user_id],
+ t_el = document.createElement('div');
+
+ user.classList.add('ffz-processed');
+ if ( ! data )
+ return false;
+
+ t_el.className = 'overlay_info length';
+ jQuery(t_el).tipsy({html: true});
+
+ var age = data[0] ? Math.floor((Date.now() - data[0].getTime()) / 1000) : 0;
+ if ( age ) {
+ t_el.innerHTML = constants.CLOCK + ' ' + utils.human_time(age, 10);
+ t_el.setAttribute('original-title', 'Following Since: ' + data[0].toLocaleString() + '');
+ } else
+ t_el.style.display = 'none';
+
+ user.appendChild(t_el);
+
+ var actions = document.createElement('div'),
+ follow = document.createElement('button'),
+ notif = document.createElement('button'),
+
+ update_follow = function() {
+ data = f._following_cache[user_id];
+ user.classList.toggle('followed', data);
+ follow.innerHTML = constants.HEART + constants.UNHEART + ' Follow';
+
+ if ( t_el ) {
+ var age = data && data[0] ? Math.floor((Date.now() - data[0].getTime()) / 1000) : undefined;
+ if ( age !== undefined ) {
+ t_el.innerHTML = constants.CLOCK + ' ' + (age < 60 ? 'now' : utils.human_time(age, 10));
+ t_el.setAttribute('original-title', 'Following Since: ' + data[0].toLocaleString() + '');
+ t_el.style.display = '';
+ } else {
+ t_el.style.display = 'none';
+ }
+ }
+ },
+
+ update_notif = function() {
+ data = f._following_cache[user_id];
+ notif.classList.toggle('notifications-on', data && data[1]);
+ notif.textContent = 'Notification ' + (data && data[1] ? 'On' : 'Off');
+ };
+
+ actions.className = 'actions';
+
+ follow.className = 'button follow';
+ notif.className = 'button notifications';
+
+ update_follow();
+ update_notif();
+
+ follow.addEventListener('click', function() {
+ var was_following = !!data;
+
+ follow.disabled = true;
+ notif.disabled = true;
+ follow.textContent = 'Updating';
+
+ (was_following ?
+ Twitch.api.del("users/:login/follows/channels/" + user_id) :
+ Twitch.api.put("users/:login/follows/channels/" + user_id, {notifications: false}))
+ .done(function() {
+ data = f._following_cache[user_id] = was_following ? null : [new Date(), false];
+ })
+ .always(function() {
+ update_follow();
+ update_notif();
+ follow.disabled = false;
+ notif.disabled = false;
+ })
+ });
+
+ notif.addEventListener('click', function() {
+ var was_following = data[1];
+
+ follow.disabled = true;
+ notif.disabled = true;
+ notif.textContent = 'Updating';
+
+ Twitch.api.put("users/:login/follows/channels/" + user_id, {notifications: !was_following})
+ .done(function() {
+ data[1] = ! was_following;
+ })
+ .always(function() {
+ update_notif();
+ follow.disabled = false;
+ notif.disabled = false;
+ });
+ });
+
+ actions.appendChild(follow);
+ actions.appendChild(notif);
+ user.appendChild(actions);
+
+ return true;
+ }
+ });
+
+ // Now, rebuild any views.
+ try {
+ ProfileView.create().destroy();
+ } catch(err) { }
+
+ for(var key in Ember.View.views) {
+ var view = Ember.View.views[key];
+ if ( ! view || !(view instanceof ProfileView) )
+ continue;
+
+ this.log("Manually updating existing Following View.", view);
+ try {
+ var following = view.get('context.following');
+ this._hook_following(following);
+ } catch(err) {
+ this.error("setup: view:channel/following: model hook: " + err);
+ }
+
+ try {
+ view.ffzInit();
+ } catch(err) {
+ this.error("setup: view:channel/following: " + err);
+ }
+ }
+}
+
+
+FFZ.prototype._hook_following = function(Following) {
+ var f = this;
+ Following.reopen({
+ apiLoad: function(e) {
+ var user = f.get_user(),
+ channel_id = this.get('id'),
+ t = this;
+
+ if ( ! user || user.login !== channel_id )
+ return this._super(e);
+
+ return new RSVP.Promise(function(success, fail) {
+ t._super(e).then(function(data) {
+ if ( data && data.follows ) {
+ var now = Date.now();
+ for(var i=0; i < data.follows.length; i++) {
+ var follow = data.follows[i];
+ if ( ! follow || ! follow.channel || ! follow.channel.name ) {
+ continue;
+ }
+
+ if ( follow.channel.display_name )
+ FFZ.capitalization[follow.channel.name] = [follow.channel.display_name, now];
+
+ f._following_cache[follow.channel.name] = [follow.created_at ? utils.parse_date(follow.created_at) : null, follow.notifications || false];
+ }
+ }
+
+ success(data);
+
+ }, function(err) {
+ fail(err);
+ })
+ });
+ }
+ });
+}
\ No newline at end of file
diff --git a/src/ember/line.js b/src/ember/line.js
index 6a08aaae..699618c9 100644
--- a/src/ember/line.js
+++ b/src/ember/line.js
@@ -549,19 +549,11 @@ FFZ.prototype.setup_line = function() {
this._modify_line(Whisper);
this.log("Hooking the Ember Message Line component.");
-
var Line = App.__container__.resolve('component:message-line');
if ( Line )
this._modify_line(Line);
- this.log("Hooking the Ember Conversation Line component.");
- var Conversation = App.__container__.resolve('component:conversation-line');
-
- if ( Conversation )
- this._modify_conversation_line(Conversation);
-
-
// Store the capitalization of our own name.
var user = this.get_user();
if ( user && user.name )
diff --git a/src/ember/room.js b/src/ember/room.js
index 9e257543..4c3c30ef 100644
--- a/src/ember/room.js
+++ b/src/ember/room.js
@@ -115,6 +115,8 @@ FFZ.prototype.setup_room = function() {
FFZ.prototype._modify_rview = function(view) {
var f = this;
view.reopen({
+ alternate: false,
+
didInsertElement: function() {
this._super();
@@ -134,6 +136,10 @@ FFZ.prototype._modify_rview = function(view) {
this._super();
},
+ ffzUpdateAlternate: function() {
+ this.get('element').classList.toggle('ffz-alternate', this.get('ffzAlternate'));
+ }.observes("ffzAlternate"),
+
ffzInit: function() {
f._roomv = this;
@@ -1182,10 +1188,10 @@ FFZ.prototype._modify_room = function(room) {
return;
var is_whisper = msg.style === 'whisper';
- if ( f.settings.group_tabs && f.settings.whisper_room ) {
- if ( ( is_whisper && ! this.ffz_whisper_room ) || ( ! is_whisper && this.ffz_whisper_room ) )
- return;
- }
+
+ // Ignore whispers if conversations are enabled.
+ if ( is_whisper && App.__container__.lookup('route:application').controller.get('isConversationsEnabled') )
+ return;
if ( ! is_whisper )
msg.room = this.get('id');
diff --git a/src/emoticons.js b/src/emoticons.js
index 45da1fe3..e7b7c9be 100644
--- a/src/emoticons.js
+++ b/src/emoticons.js
@@ -262,7 +262,7 @@ FFZ.prototype._emote_tooltip = function(emote) {
title = set && set.title || "Global",
source = set && set.source || "FFZ";
- emote._tooltip = "Emoticon: " + (emote.hidden ? "???" : emote.name) + "\n" + source + " " + title + (owner ? "\nBy: " + owner.display_name : "");
+ emote._tooltip = "Emoticon: " + (emote.hidden ? "???" : emote.name) + "
" + source + " " + title + (owner ? "
By: " + owner.display_name : "");
return emote._tooltip;
}
diff --git a/src/main.js b/src/main.js
index 598ebf78..3609f2f6 100644
--- a/src/main.js
+++ b/src/main.js
@@ -22,7 +22,7 @@ FFZ.get = function() { return FFZ.instance; }
// Version
var VER = FFZ.version_info = {
- major: 3, minor: 5, revision: 57,
+ major: 3, minor: 5, revision: 62,
toString: function() {
return [VER.major, VER.minor, VER.revision].join(".") + (VER.extra || "");
}
@@ -123,11 +123,13 @@ require('./ember/room');
require('./ember/layout');
require('./ember/line');
require('./ember/chatview');
+require('./ember/conversations');
require('./ember/viewers');
require('./ember/moderation-card');
require('./ember/chat-input');
//require('./ember/teams');
require('./ember/directory');
+require('./ember/following');
require('./debug');
@@ -335,10 +337,12 @@ FFZ.prototype.init_ember = function(delay) {
this.setup_line();
this.setup_layout();
this.setup_chatview();
+ this.setup_conversations();
this.setup_viewers();
this.setup_mod_card();
this.setup_chat_input();
this.setup_directory();
+ this.setup_profile_following();
//this.setup_teams();
diff --git a/src/tokenize.js b/src/tokenize.js
index bd34ed56..1f3d1d51 100644
--- a/src/tokenize.js
+++ b/src/tokenize.js
@@ -35,7 +35,7 @@ var FFZ = window.FrankerFaceZ,
set_type = null;
}
- return "Emoticon: " + data.code + "\n" + (set_type ? set_type + ": " : "") + set + (owner ? "\nBy: " + owner.display_name : "");
+ return "Emoticon: " + data.code + "
" + (set_type ? set_type + ": " : "") + set + (owner ? "
By: " + owner.display_name : "");
},
build_tooltip = function(id) {
@@ -603,7 +603,7 @@ FFZ.prototype.render_tokens = function(tokens, render_links) {
var emote_set = f.emote_sets && f.emote_sets[token.ffzEmoteSet],
emote = emote_set && emote_set.emoticons && emote_set.emoticons[token.ffzEmote];
- tooltip = emote ? utils.sanitize(f._emote_tooltip(emote)) : token.altText;
+ tooltip = emote ? f._emote_tooltip(emote) : token.altText;
srcset = emote ? emote.srcSet : token.srcSet;
extra = (emote ? ' data-ffz-emote="' + emote.id + '"' : '') + (emote_set ? ' data-ffz-set="' + emote_set.id + '"' : '');
@@ -652,7 +652,7 @@ FFZ.prototype.render_tokens = function(tokens, render_links) {
srcset = build_srcset(id);
}
- return '
';
+ return '
';
}
if ( token.isLink ) {
diff --git a/src/ui/menu.js b/src/ui/menu.js
index 07093642..ff29cf0d 100644
--- a/src/ui/menu.js
+++ b/src/ui/menu.js
@@ -224,6 +224,9 @@ FFZ.prototype.build_ui_popup = function(view) {
container.classList.toggle('dark', dark);
+ // Stuff
+ jQuery(inner).find('.html-tooltip').tipsy({live: true, html: true, gravity: jQuery.fn.tipsy.autoNS});
+
// Menu Container
var sub_container = document.createElement('div');
@@ -599,7 +602,7 @@ FFZ.prototype._emotes_for_sets = function(parent, view, sets, header, image, sub
c++;
var s = document.createElement('span');
- s.className = 'emoticon tooltip';
+ s.className = 'emoticon html-tooltip';
s.style.backgroundImage = 'url("' + emote.urls[1] + '")';
if ( srcset ) {
diff --git a/src/ui/my_emotes.js b/src/ui/my_emotes.js
index 06d23479..9d12f761 100644
--- a/src/ui/my_emotes.js
+++ b/src/ui/my_emotes.js
@@ -166,7 +166,7 @@ FFZ.menu_pages.myemotes = {
if ( (settings === 1 && ! emoji.tw) || (settings === 2 && ! emoji.noto) )
continue;
- em.className = 'emoticon tooltip';
+ em.className = 'emoticon html-tooltip';
em.title = 'Emoji: ' + emoji.raw + '\nName: ' + emoji.name + (emoji.short_name ? '\nShort Name: :' + emoji.short_name + ':' : '');
em.addEventListener('click', this._add_emote.bind(this, view, emoji.raw));
@@ -239,7 +239,7 @@ FFZ.menu_pages.myemotes = {
em = document.createElement('span'),
img_set = 'image-set(url("' + TWITCH_BASE + emote.id + '/1.0") 1x, url("' + TWITCH_BASE + emote.id + '/2.0") 2x, url("' + TWITCH_BASE + emote.id + '/3.0") 4x)';
- em.className = 'emoticon tooltip';
+ em.className = 'emoticon html-tooltip';
if ( this.settings.replace_bad_emotes && constants.EMOTE_REPLACEMENTS[emote.id] ) {
em.style.backgroundImage = 'url("' + constants.EMOTE_REPLACEMENT_BASE + constants.EMOTE_REPLACEMENTS[emote.id] + '")';
@@ -316,7 +316,7 @@ FFZ.menu_pages.myemotes = {
img_set += ')';
- em.className = 'emoticon tooltip';
+ em.className = 'emoticon html-tooltip';
em.style.backgroundImage = 'url("' + emote.urls[1] + '")';
em.style.backgroundImage = '-webkit-' + img_set;
em.style.backgroundImage = '-moz-' + img_set;
diff --git a/src/ui/styles.js b/src/ui/styles.js
index 43e6313c..56a134f9 100644
--- a/src/ui/styles.js
+++ b/src/ui/styles.js
@@ -16,7 +16,7 @@ FFZ.prototype.setup_css = function() {
/*var s = this._main_style = document.createElement('style');
s.textContent = styles.style;
- s.id = "ffz-ui-css";
+ s.id = "ffz-main-css";
document.head.appendChild(s);*/
diff --git a/style.css b/style.css
new file mode 100644
index 00000000..dae3d975
--- /dev/null
+++ b/style.css
@@ -0,0 +1,2408 @@
+/* Fix Tooltip Opacity */
+
+body > div.tipsy { opacity: 1 !important; }
+body > div.tipsy .tipsy-inner { background-color: rgba(0,0,0,0.8); }
+body > div.tipsy .tipsy-arrow { opacity: 0.8; }
+
+
+.ffz-flip {
+ -ms-transform: rotate(180deg);
+ -webkit-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+
+.ffz-ui-toggle {
+ display: block;
+ position: absolute;
+ top: 5px; right: 5px;
+ height: 18px; width: 24px;
+ cursor: pointer;
+}
+
+.ffz-hide-recent-past-broadcast .recent-past-broadcast,
+.ffz-hide-view-count .stat.twitch-channel-views,
+.ffz-minimal-chat-input .emoticon-selector-toggle,
+.ffz-menu-replace .emoticon-selector-toggle {
+ display: none !important;
+}
+
+body:not(.ffz-minimal-chat-input):not(.ffz-menu-replace) .emoticon-selector-toggle + .ffz-ui-toggle svg,
+body:not(.ffz-minimal-chat-input):not(.ffz-menu-replace) .emoticon-selector-toggle + script + .ffz-ui-toggle svg
+{
+ height: 14px;
+ width: 18px;
+}
+
+body:not(.ffz-minimal-chat-input):not(.ffz-menu-replace) .emoticon-selector-toggle + .ffz-ui-toggle,
+body:not(.ffz-minimal-chat-input):not(.ffz-menu-replace) .emoticon-selector-toggle + script + .ffz-ui-toggle {
+ height: 14px;
+ width: 18px;
+ top: 28px;
+}
+
+.ffz-ui-toggle svg.svg-emoticons path { fill: rgba(0,0,0,0.2); }
+.ffz-ui-toggle:hover svg.svg-emoticons path { fill: rgba(0,0,0,0.5); }
+
+.streams .stream .content .overlay_info.live svg path,
+.videos .video .content .overlay_info.live svg path { fill: #ff2020; }
+
+.ember-chat-container.dark .ffz-ui-toggle svg.svg-emoticons path,
+.chat-container.dark .ffz-ui-toggle svg.svg-emoticons path,
+.app-main.theatre .ffz-ui-toggle svg.svg-emoticons path,
+.ffz-ui-toggle.dark svg.svg-emoticons path { fill: #888; }
+
+.ember-chat-container.dark .ffz-ui-toggle:hover svg.svg-emoticons path,
+.chat-container.dark .ffz-ui-toggle:hover svg.svg-emoticons path,
+.app-main.theatre .ffz-ui-toggle:hover svg.svg-emoticons path,
+.ffz-ui-toggle.dark:hover svg.svg-emoticons path { fill: #777; }
+
+
+.ffz-ui-toggle.no-emotes svg.svg-emoticons path { fill: rgba(80,0,0,0.2); }
+.ffz-ui-toggle.no-emotes:hover svg.svg-emoticons path { fill: rgba(80,0,0,0.5); }
+
+.ffz-ui-toggle.live svg.svg-emoticons path { fill: rgba(100,65,165,0.5); }
+.ffz-ui-toggle.live:hover svg.svg-emoticons path { fill: rgba(100,65,165,1); }
+
+.ffz-ui-toggle.blue.live svg.svg-emoticons path { fill: rgba(47,88,185,0.5); }
+.ffz-ui-toggle.blue.live:hover svg.svg-emoticons path { fill: rgba(47,88,185,1); }
+
+.ember-chat-container.dark .ffz-ui-toggle.news svg.svg-emoticons path,
+.app-main.theatre .ffz-ui-toggle.news svg.svg-emoticons path,
+.chat-container.dark .ffz-ui-toggle.news svg.svg-emoticons path,
+.ember-chat .chat-interface .textarea-contain .ffz-ui-toggle.dark.news svg.svg-emoticons path,
+.ffz-ui-toggle.news svg.svg-emoticons path { fill: rgba(117, 80, 0, 0.5); }
+
+.ember-chat-container.dark .ffz-ui-toggle.news:hover svg.svg-emoticons path,
+.app-main.theatre .ffz-ui-toggle.news:hover svg.svg-emoticons path,
+.chat-container.dark .ffz-ui-toggle.news:hover svg.svg-emoticons path,
+.ember-chat .chat-interface .textarea-contain .ffz-ui-toggle.dark.news:hover svg.svg-emoticons path,
+.ffz-ui-toggle.news:hover svg.svg-emoticons path { fill: rgba(117, 80, 0, 0.8); }
+
+.ember-chat-container.dark .ffz-ui-toggle.no-emotes svg.svg-emoticons path,
+.app-main.theatre .ffz-ui-toggle.no-emotes svg.svg-emoticons path,
+.chat-container.dark .ffz-ui-toggle.no-emotes svg.svg-emoticons path,
+.ember-chat .chat-interface .textarea-contain .ffz-ui-toggle.dark.no-emotes svg.svg-emoticons path { fill: #453434; }
+
+.ember-chat-container.dark .ffz-ui-toggle.no-emotes:hover svg.svg-emoticons path,
+.app-main.theatre .ffz-ui-toggle.no-emotes:hover svg.svg-emoticons path,
+.chat-container.dark .ffz-ui-toggle.no-emotes:hover svg.svg-emoticons path,
+.ember-chat .chat-interface .textarea-contain .ffz-ui-toggle.dark.no-emotes:hover svg.svg-emoticons path { fill: #543f3f; }
+
+.ember-chat-container.dark .ffz-ui-toggle.live svg.svg-emoticons path,
+.app-main.theatre .ffz-ui-toggle.live svg.svg-emoticons path,
+.chat-container.dark .ffz-ui-toggle.live svg.svg-emoticons path,
+.ember-chat .chat-interface .textarea-contain .ffz-ui-toggle.dark.live svg.svg-emoticons path { fill: #513c78; }
+
+.ember-chat-container.dark .ffz-ui-toggle.live:hover svg.svg-emoticons path,
+.app-main.theatre .ffz-ui-toggle.live:hover svg.svg-emoticons path,
+.chat-container.dark .ffz-ui-toggle.live:hover svg.svg-emoticons path,
+.ember-chat .chat-interface .textarea-contain .ffz-ui-toggle.dark.live:hover svg.svg-emoticons path { fill: #5b4487; }
+
+.ember-chat-container.dark .ffz-ui-toggle.blue.live svg.svg-emoticons path,
+.app-main.theatre .ffz-ui-toggle.blue.live svg.svg-emoticons path,
+.chat-container.dark .ffz-ui-toggle.blue.live svg.svg-emoticons path,
+.ember-chat .chat-interface .textarea-contain .ffz-ui-toggle.dark.blue.live svg.svg-emoticons path { fill: #3c4e78; }
+
+.ember-chat-container.dark .ffz-ui-toggle.blue.live:hover svg.svg-emoticons path,
+.app-main.theatre .ffz-ui-toggle.blue.live:hover svg.svg-emoticons path,
+.chat-container.dark .ffz-ui-toggle.blue.live:hover svg.svg-emoticons path,
+.ember-chat .chat-interface .textarea-contain .ffz-ui-toggle.dark.blue.live:hover svg.svg-emoticons path { fill: #445887; }
+
+
+.ffz-ui-toggle.live {
+ animation: ffzfade 8s linear infinite;
+ -webkit-animation: ffzfade 8s linear infinite;
+}
+
+@-webkit-keyframes ffzfade {
+ from, to { opacity: 1; }
+ 50% { opacity: 0.75; }
+}
+
+@keyframes ffzfade {
+ from, to { opacity: 1; }
+ 50% { opacity: 0.75; }
+}
+
+
+.ember-chat .chat-menu.ffz-ui-popup { padding: 0; }
+
+.ffz-button {
+ float: right;
+ margin-top: -6px;
+ text-transform: none;
+}
+
+.ffz-noty .noty_message {
+ background-image: url("//cdn.frankerfacez.com/icon32.png") !important;
+ background-repeat: no-repeat !important;
+ background-position: 5px 10px !important;
+ padding-left: 42px !important;
+ text-align: left;
+}
+
+.ffz-ui-popup .button.live { overflow: hidden; background: #6441A5; color: #fff; }
+.ffz-ui-popup .button.live span { z-index: 2; position: relative; }
+
+.ffz-ui-popup .button.live:before, .ffz-ui-popup .button.live:after {
+ content: "";
+ display: block;
+ position: absolute;
+ width: 0px;
+ height: 0px;
+ border-radius: 999px;
+ -moz-border-radius: 999px;
+ -webkit-border-radius: 999px;
+ top: 50%;
+ left: 50%;
+ z-index: 1
+}
+
+.ffz-ui-popup .button.live.purple:before, .ffz-ui-popup .button.live.purple:after {
+ box-shadow: 0 0 3px 1px #a68ed2,inset 0 0 3px 1px #a68ed2;
+ -moz-box-shadow: 0 0 3px 1px #a68ed2,inset 0 0 3px 1px #a68ed2;
+ -webkit-box-shadow: 0 0 3px 1px #a68ed2,inset 0 0 3px 1px #a68ed2;
+}
+
+.ffz-ui-popup .button.live.blue:before, .ffz-ui-popup .button.live.blue:after {
+ box-shadow: 0 0 3px 1px #8ea2d1,inset 0 0 3px 1px #8ea2d1;
+ -moz-box-shadow: 0 0 3px 1px #8ea2d1,inset 0 0 3px 1px #8ea2d1;
+ -webkit-box-shadow: 0 0 3px 1px #8ea2d1,inset 0 0 3px 1px #8ea2d1;
+}
+
+.ffz-ui-popup .button.live:before {
+ animation: expand 1500ms infinite ease-in;
+ -moz-animation: expand 1500ms infinite ease-in;
+ -webkit-animation: expand 1500ms infinite ease-in;
+ -o-animation: expand 1500ms infinite ease-in
+}
+
+.ffz-ui-popup .button.live:after {
+ animation: expand 1500ms infinite 750ms ease-in;
+ -moz-animation: expand 1500ms infinite 750ms ease-in;
+ -webkit-animation: expand 1500ms infinite 750ms ease-in;
+ -o-animation: expand 1500ms infinite 750ms ease-in
+}
+
+#dash_main #stats .stat.dark#ffz_count svg path { fill: #cacaca; }
+
+#ffz-ui-following .follow-button a {
+ padding: 0 10px;
+ color: #fff;
+}
+
+#ffz-following-popup {
+ background-image: url('//cdn.frankerfacez.com/script/zreknarf-bg.png');
+ background-repeat: no-repeat;
+ background-position: 115% -75%;
+ background-size: 50%;
+}
+
+.ffz-live-team-channel .ffz-game {
+ display: inline-block;
+ max-width: 150px;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ margin-bottom: -5px;
+}
+
+/* Theater Mode hover bar */
+
+.ffz-theater-stats .app-main.theatre .player-column:focus #hostmode > div.target-meta,
+.ffz-theater-stats .app-main.theatre .player-column:hover #hostmode > div.target-meta,
+.ffz-theater-stats .app-main.theatre #channel .player-column:focus #broadcast-meta,
+.ffz-theater-stats .app-main.theatre #channel .player-column:hover #broadcast-meta {
+ background-color: #19191f;
+ color: #aaa;
+
+ position: absolute;
+ top: -25px;
+ left: 120px;
+ right: 10px;
+ z-index: 7;
+ opacity: 0.95;
+ height: 20px;
+}
+
+.ffz-theater-stats.ffz-sidebar-swap .app-main.theatre .player-column:focus #hostmode > div.target-meta,
+.ffz-theater-stats.ffz-sidebar-swap .app-main.theatre .player-column:hover #hostmode > div.target-meta,
+.ffz-theater-stats.ffz-sidebar-swap .app-main.theatre #channel .player-column:focus #broadcast-meta,
+.ffz-theater-stats.ffz-sidebar-swap .app-main.theatre #channel .player-column:hover #broadcast-meta {
+ left: 145px;
+}
+
+.ffz-theater-stats .app-main.theatre #hostmode > div.target-meta div.target-title {
+ padding: 5px 0 2px 5px;
+}
+
+.ffz-theater-stats .app-main.theatre #hostmode > div.target-meta div.target-title,
+.ffz-theater-stats .app-main.theatre #channel .player-column #broadcast-meta .info { padding-left: 5px; }
+
+.ffz-theater-stats .app-main.theatre #hostmode > div.target-meta div.target-title,
+.ffz-theater-stats .app-main.theatre #channel .player-column #broadcast-meta .info .title {
+ font-size: 12px;
+ line-height: 20px;
+ color: #dedede;
+}
+
+.ffz-theater-stats .app-main.theatre #hostmode > div.target-meta div.target-title,
+.ffz-theater-stats .app-main.theatre #channel .player-column #broadcast-meta .info .title,
+.ffz-theater-stats .app-main.theatre #channel .player-column #broadcast-meta .info .title .over {
+ background-color: rgba(16,16,16,0.3);
+}
+
+.ffz-theater-stats .app-main.theatre #hostmode > div.target-meta .target-user-and-game,
+.ffz-theater-stats .app-main.theatre #channel .player-column #broadcast-meta .info .channel,
+.ffz-theater-stats .app-main.theatre #channel .player-column #broadcast-meta .info .edit-link,
+.ffz-theater-stats .app-main.theatre #broadcast-meta .profile-link {
+ display: none;
+}
+
+.ffz-theater-stats .app-main.theatre .player-column:focus #hostmode > div.clearfix,
+.ffz-theater-stats .app-main.theatre .player-column:hover #hostmode > div.clearfix {
+ margin-bottom: 30px;
+}
+
+.ffz-theater-stats .app-main.theatre .player-column:focus #hostmode > div.clearfix,
+.ffz-theater-stats .app-main.theatre .player-column:hover #hostmode > div.clearfix,
+.ffz-theater-stats .app-main.theatre .player-column:focus .stats-and-actions,
+.ffz-theater-stats .app-main.theatre .player-column:hover .stats-and-actions {
+ background-color: #19191f;
+
+ color: #aaa;
+
+ position: absolute;
+ bottom: 55px;
+ margin-right: 150px;
+ left: 10px;
+ z-index: 7;
+ padding: 10px;
+ opacity: 0.95;
+}
+
+.ffz-theater-stats.ffz-top-conversations .app-main.theatre .player-column:focus #hostmode > div.clearfix,
+.ffz-theater-stats.ffz-top-conversations .app-main.theatre .player-column:hover #hostmode > div.clearfix,
+.ffz-theater-stats.ffz-top-conversations .app-main.theatre .player-column:focus .stats-and-actions,
+.ffz-theater-stats.ffz-top-conversations .app-main.theatre .player-column:hover .stats-and-actions {
+ bottom: 15px;
+}
+
+.ffz-theater-stats .app-main.theatre .channel-stats .stat { color: #aaa; }
+
+.ffz-theater-stats .app-main.theatre .channel-stats span:not(.live-count) svg path {
+ fill: rgba(255,255,255,0.35) !important;
+}
+
+.ffz-theater-stats .app-main.theatre .follow-button .notify:before,
+.ffz-theater-stats .app-main.theatre .button.drop:after,
+.ffz-theater-stats .app-main.theatre .follow-button .drop.follow:after {
+ border: 5px solid rgba(255,255,255,0.35);
+ border-left-color: transparent;
+ border-right-color: transparent;
+ border-bottom-color: transparent;
+}
+
+.ffz-theater-stats .app-main.theatre .follow-button .notify {
+ background-color: #25252a;
+}
+
+.ffz-theater-stats .app-main.theatre .button:not(.primary) {
+ color: #a68ed2;
+}
+
+.ffz-theater-stats .app-main.theatre .button.glyph-only svg path {
+ fill: #a68ed2;
+}
+
+.ffz-theater-stats .app-main.theatre .button.primary.subscribe-button {
+ color: #fff;
+}
+
+
+/* SRL Race Support */
+
+#ffz-following-popup.right {
+ right: 0;
+ left: auto;
+}
+
+#ffz-ui-following .notification-controls,
+#ffz-ui-race {
+ position: relative;
+}
+
+#ffz-ui-race .button span {
+ display: inline-block;
+ height: 30px;
+ background: no-repeat 0 50%;
+}
+
+#ffz-ui-race .button span.logo {
+ padding-left: 44px;
+ background-image: url("//cdn.frankerfacez.com/script/srl_button.png");
+}
+
+
+#ffz-race-popup {
+ position: absolute;
+ bottom: 0;
+ background-image: url("//cdn.frankerfacez.com/script/zreknarf-bg.png");
+ background-repeat: no-repeat;
+ background-position: 115% 110%;
+}
+
+#ffz-race-popup.right { right: 10px; }
+
+#ffz-race-popup .heading {
+ margin: -20px -20px 20px;
+ width: 340px; height: 65px;
+ position: relative;
+}
+
+#ffz-race-popup .heading div {
+ padding: 10px 0 0 20px;
+ max-width: 240px;
+}
+
+#ffz-race-popup .heading h2 {
+ font-size: 1.5em;
+ padding-bottom: 5px;
+ display: block;
+ width: 240px;
+ max-height: 45px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+#ffz-race-popup .heading span {
+ line-height: 30px;
+ position: absolute;
+ top: 17.5px;
+ right: 20px;
+ padding: 0 5px;
+ background: rgba(0,0,0,0.5);
+ color: #fff;
+ border-radius: 5px;
+}
+
+#ffz-race-popup .right { text-align: right; }
+
+#ffz-race-popup .table {
+ overflow-y: auto;
+}
+
+#ffz-race-popup table {
+ width: 100%;
+ text-align: center;
+ border-spacing: 0;
+}
+
+#ffz-race-popup table a {
+ color: inherit;
+}
+
+.ffz-about-table a.twitch,
+.ffz-about-table a.youtube,
+.ffz-about-table a.twitter,
+#ffz-race-popup a.twitch,
+#ffz-race-popup a.hitbox {
+ display: inline-block;
+ height: 16px;
+ margin-left: 5px;
+ background-repeat: no-repeat;
+}
+
+.ffz-about-table a.youtube {
+ width: 23px;
+ background-image: url("//cdn.frankerfacez.com/script/youtube_logo.png");
+}
+
+.ffz-about-table a.twitter {
+ width: 20px;
+ background-image: url("//cdn.frankerfacez.com/script/twitter_logo.png");
+}
+
+#ffz-race-popup a.twitch,
+.ffz-about-table a.twitch {
+ width: 15px;
+ background-image: url("//cdn.frankerfacez.com/script/twitch_logo.png");
+}
+
+#ffz-race-popup a.hitbox {
+ width: 12px;
+ background-image: url("//cdn.frankerfacez.com/script/hitbox_logo.png");
+}
+
+#ffz-race-popup table tbody tr.done:nth-child(0n+1) td { background-color: rgba(255,255,0,.2); }
+#ffz-race-popup table tbody tr.done:nth-child(0n+2) td { background-color: rgba(128,128,128,.2); }
+#ffz-race-popup table tbody tr.done:nth-child(0n+3) td { background-color: rgba(210,100,0,.2); }
+#ffz-race-popup table tbody tr.forfeit td { opacity: 0.5; background-color: rgba(210,100,100,.2); }
+#ffz-race-popup table tbody tr.racing td.time { opacity: 0.5; }
+
+#ffz-race-popup table th, #ffz-race-popup td { padding: 1px; }
+#ffz-race-popup table th { border-bottom: 1px solid; }
+
+
+/* Menu Options */
+
+.chat-menu.ffz-ui-popup .ffz-ui-menu-page .chat-menu-content.menu-side-padding { padding-left: 20px; padding-right: 20px; }
+
+.emoticon-grid.collapsed span,
+.chat-menu-content.collapsed p { display: none; }
+
+.chat-menu.ffz-ui-popup .ffz-ui-menu-page .chat-menu-content.collapsed .heading,
+.chat-menu.ffz-ui-popup .ffz-ui-menu-page .emoticon-grid.collapsed .heading {
+ padding-bottom: 0;
+}
+
+.emoticon-grid.collapsable .heading,
+.emoticon-grid.collapsed,
+.chat-menu-content.collapsed {
+ cursor: pointer;
+}
+
+.emoticon-grid.collapsable .heading,
+.chat-menu-content.collapsable .heading {
+ position: relative;
+}
+
+.list-header span.right { float: right; }
+
+.chat-menu-content.collapsable .heading span.right {
+ padding-right: 15px;
+}
+
+.emoticon-grid.collapsable .heading:before,
+.chat-menu-content.collapsable .heading:before {
+ content: "";
+ border: 5px solid #666;
+ border-left-color: transparent;
+ border-right-color: transparent;
+
+ position: absolute;
+ margin-top: 6px;
+ right: 20px;
+}
+
+.emoticon-grid.collapsable.collapsed .heading:before,
+.chat-menu-content.collapsable.collapsed .heading:before { border-bottom-color: transparent; }
+
+.emoticon-grid.collapsable:not(.collapsed) .heading:before {
+ display: none;
+}
+
+.chat-menu-content.collapsable:not(.collapsed) .heading:before {
+ border-top-color: transparent;
+ margin-top: 1px;
+}
+
+
+#small_nav .content ul li#ffz_small_menu .filter_icon svg {
+ margin: 11px 13px;
+}
+
+.ffz-ui-sub-menu-page,
+.ffz-ui-menu-page { overflow-y: auto; }
+
+.ffz-ui-menu-page[data-page="about"],
+.ffz-ui-menu-page .chat-menu-content p { padding: 0 20px; }
+
+
+.chat-container.dark .chat-interface .ffz-ui-popup.emoticon-selector .emoticon-selector-box,
+.app-main.theatre .chat-container .chat-interface .ffz-ui-popup.emoticon-selector .emoticon-selector-box,
+.chat-container.force-dark .chat-interface .ffz-ui-popup.emoticon-selector .emoticon-selector-box,
+.ember-chat-container.dark .chat-interface .ffz-ui-popup.emoticon-selector .emoticon-selector-box,
+.ember-chat-container.force-dark .chat-interface .ffz-ui-popup.emoticon-selector .emoticon-selector-box {
+ background-color: rgb(16,16,16);
+ color: rgb(195,195,195);
+ border-color: #32323e;
+}
+
+
+.chat-menu.ffz-ui-popup .ffz-ui-menu-page .chat-menu-content .heading,
+.chat-menu.ffz-ui-popup .ffz-ui-menu-page .emoticon-grid .heading {
+ padding: 10px 20px;
+ border-top: 1px solid rgba(0,0,0,0.2);
+ text-align: left;
+}
+
+.chat-menu.ffz-ui-popup .ffz-ui-menu-page .emoticon-grid .heading {
+ padding-left: 43px;
+ background-repeat: no-repeat;
+ background-position: 20px 10px;
+}
+
+.chat-menu.ffz-ui-popup .ffz-ui-menu-page .emoticon-grid + .emoticon-grid { padding-top: 0; }
+
+.chat-menu.ffz-ui-popup .ffz-ui-menu-page .chat-menu-content:first-of-type .heading,
+.chat-menu.ffz-ui-popup .ffz-ui-menu-page .emoticon-grid:first-of-type .heading {
+ border-top: none;
+ padding-top: 0;
+ background-position-y: 0;
+}
+
+.chat-menu.ffz-ui-popup .ffz-ui-menu-page .chat-menu-content {
+ padding: 10px 0;
+ background-color: transparent;
+}
+
+.chat-menu.ffz-ui-popup .ffz-ui-menu-page .chat-menu-content + .chat-menu-content {
+ padding-top: 0;
+}
+
+.ffz-ui-menu-page span.help {
+ display: block;
+ opacity: 0.75;
+}
+
+.ffz-ui-menu-page p.disabled span.switch-label,
+.ffz-ui-menu-page span.help,
+.ffz-ui-menu-page span.option-label,
+.ffz-ui-menu-page p.option a {
+ margin-left: 50px;
+}
+
+.ffz-ui-menu-page span.option-label {
+ line-height: 25px;
+}
+
+.ffz-ui-menu-page input,
+.ffz-ui-menu-page select {
+ margin: 0 10px 5px;
+}
+
+.ffz-ui-menu-page input[type="file"] {
+ width: auto;
+}
+
+#ffz-chat-menu { pointer-events: none; }
+
+.ffz-ui-popup ul.menu {
+ list-style-type: none;
+ border-top: 1px solid rgba(0,0,0,0.2);
+ background-color: #eee;
+}
+
+.ffz-ui-popup ul.menu:not(.sub-menu) {
+ cursor: ew-resize;
+}
+
+.ffz-ui-popup .emoticon-selector-box {
+ width: 10000px !important; /* Max-width has our back */
+ max-width: 300px;
+ pointer-events: auto;
+}
+
+.ember-chat .chat-interface .ffz-ui-popup.emoticon-selector .emoticon-selector-box .emoticon-grid { background-color: transparent; }
+
+.app-main.theatre .ffz-ui-popup ul.menu,
+.chat-container.dark .ffz-ui-popup ul.menu,
+.chat-container.force-dark .ffz-ui-popup ul.menu,
+.ember-chat-container.dark .ffz-ui-popup ul.menu,
+.ember-chat-container.force-dark .ffz-ui-popup ul.menu,
+.ffz-ui-popup.dark ul.menu {
+ background-color: #282828;
+}
+
+.ffz-ui-popup ul.sub-menu li.title,
+.ffz-ui-menu-page .heading .right,
+.ffz-ui-popup ul.menu li.item {
+ float: right;
+}
+
+.ffz-ui-popup ul.sub-menu li.item,
+.ffz-ui-popup ul.menu li.title {
+ float: left;
+}
+
+.ffz-ui-popup ul.sub-menu { background-color: #dfdfdf; }
+
+.app-main.theatre .ffz-ui-popup ul.sub-menu,
+.chat-container.dark .ffz-ui-popup ul.sub-menu,
+.chat-container.force-dark .ffz-ui-popup ul.sub-menu,
+.ember-chat-container.dark .ffz-ui-popup ul.sub-menu,
+.ember-chat-container.force-dark .ffz-ui-popup ul.sub-menu,
+.ffz-ui-popup.dark ul.sub-menu {
+ background-color: #181818;
+}
+
+.ffz-ui-popup ul.sub-menu a {
+ text-decoration: none;
+ color: #333;
+}
+
+.app-main.theatre .ffz-ui-popup ul.sub-menu a,
+.chat-container.dark .ffz-ui-popup ul.sub-menu a,
+.chat-container.force-dark .ffz-ui-popup ul.sub-menu a,
+.ember-chat-container.dark .ffz-ui-popup ul.sub-menu a,
+.ember-chat-container.force-dark .ffz-ui-popup ul.sub-menu a,
+.ffz-ui-popup.dark ul.sub-menu a {
+ color: #d3d3d3 !important;
+}
+
+span.ffz-handle {
+ display: inline-block;
+ position: relative;
+ height: 26px;
+ width: 14px;
+ transition: width 500ms;
+}
+
+span.ffz-handle:before,
+span.ffz-handle:after {
+ position: absolute;
+ left: 4px;
+ top: 5px;
+ content: "";
+ height: 14px;
+ border: 1px solid #bbb;
+ border-radius: 4px;
+ transition: transform 500ms, left 500ms, border-color 500ms, border-width 500ms, height 500ms;
+}
+
+span.ffz-handle:after { left: 8px }
+
+.ffz-ui-popup.ui-moved span.ffz-handle { width: 24px; cursor: pointer; }
+
+.ffz-ui-popup.ui-moved span.ffz-handle:before,
+.ffz-ui-popup.ui-moved span.ffz-handle:after {
+ left: 11px;
+ border-color: #333;
+}
+
+.ffz-ui-popup.ui-moved span.ffz-handle:before { transform: rotate(45deg); }
+.ffz-ui-popup.ui-moved span.ffz-handle:after { transform: rotate(-45deg); }
+
+.app-main.theatre span.ffz-handle:before,
+.chat-container.dark span.ffz-handle:before,
+.chat-container.force-dark span.ffz-handle:before,
+.ember-chat-container.dark span.ffz-handle:before,
+.ember-chat-container.force-dark span.ffz-handle:before,
+.ffz-ui-popup.dark span.ffz-handle:before,
+.app-main.theatre span.ffz-handle:after,
+.chat-container.dark span.ffz-handle:after,
+.chat-container.force-dark span.ffz-handle:after,
+.ember-chat-container.dark span.ffz-handle:after,
+.ember-chat-container.force-dark span.ffz-handle:after,
+.ffz-ui-popup.dark span.ffz-handle:after {
+ border-color: #666;
+}
+
+.app-main.theatre .ffz-ui-popup.ui-moved span.ffz-handle:before,
+.chat-container.dark .ffz-ui-popup.ui-moved span.ffz-handle:before,
+.chat-container.force-dark .ffz-ui-popup.ui-moved span.ffz-handle:before,
+.ember-chat-container.dark .ffz-ui-popup.ui-moved span.ffz-handle:before,
+.ember-chat-container.force-dark .ffz-ui-popup.ui-moved span.ffz-handle:before,
+.ffz-ui-popup.ui-moved.dark span.ffz-handle:before,
+.app-main.theatre .ffz-ui-popup.ui-moved span.ffz-handle:after,
+.chat-container.dark .ffz-ui-popup.ui-moved span.ffz-handle:after,
+.chat-container.force-dark .ffz-ui-popup.ui-moved span.ffz-handle:after,
+.ember-chat-container.dark .ffz-ui-popup.ui-moved span.ffz-handle:after,
+.ember-chat-container.force-dark .ffz-ui-popup.ui-moved span.ffz-handle:after,
+.ffz-ui-popup.ui-moved.dark span.ffz-handle:after {
+ border-color: #d3d3d3;
+}
+
+
+.ffz-ui-popup ul.menu li.title > span.ffz-handle {
+ float: left;
+ margin: 5px;
+}
+
+.ffz-ui-popup ul.menu li.title > span.title {
+ display: block;
+ margin-left: 24px;
+ padding: 10px 20px 10px 0;
+ line-height: 16px;
+ transition: margin-left 500ms;
+}
+
+.ffz-ui-popup.ui-moved ul.menu li.title > span.title { margin-left: 34px; }
+
+.ffz-ui-popup ul.menu a {
+ display: block;
+ padding: 10px;
+ height: 16px;
+ margin-top: -1px;
+ cursor: pointer;
+ border-left: 1px solid rgba(0,0,0,0.2);
+ border-top: 1px solid transparent;
+}
+
+.ffz-ui-popup ul.sub-menu a {
+ border-left: none;
+ border-right: 1px solid rgba(0,0,0,0.2);
+}
+
+.ffz-ui-popup ul.menu li.active {
+ background-color: #fff;
+}
+
+.ffz-ui-popup ul.menu li.active a {
+ border-top-color: #fff;
+}
+
+.ffz-ui-popup ul.menu li.active.has-sub-menu {
+ background-color: #dfdfdf;
+}
+
+.ffz-ui-popup ul.menu li.active.has-sub-menu a {
+ border-top-color: #dfdfdf;
+}
+
+
+.chat-container.dark .chat-interface .ffz-ui-popup ul.menu li.active,
+.chat-container.force-dark .chat-interface .ffz-ui-popup ul.menu li.active,
+.ember-chat-container.dark .chat-interface .ffz-ui-popup ul.menu li.active,
+.ember-chat-container.force-dark .chat-interface .ffz-ui-popup ul.menu li.active,
+.app-main.theatre .chat-container .chat-interface .ffz-ui-popup ul.menu li.active,
+.ffz-ui-popup.dark ul.menu li.active {
+ background-color: rgb(16,16,16);
+}
+
+.chat-container.dark .chat-interface .ffz-ui-popup ul.menu li.active a,
+.chat-container.force-dark .chat-interface .ffz-ui-popup ul.menu li.active a,
+.ember-chat-container.dark .chat-interface .ffz-ui-popup ul.menu li.active a,
+.ember-chat-container.force-dark .chat-interface .ffz-ui-popup ul.menu li.active a,
+.app-main.theatre .chat-container .chat-interface .ffz-ui-popup ul.menu li.active a,
+.ffz-ui-popup.dark ul.menu li.active a {
+ border-top-color: rgb(16,16,16);
+}
+
+.chat-container.dark .chat-interface .ffz-ui-popup ul.menu li.active.has-sub-menu,
+.chat-container.force-dark .chat-interface .ffz-ui-popup ul.menu li.active.has-sub-menu,
+.ember-chat-container.dark .chat-interface .ffz-ui-popup ul.menu li.active.has-sub-menu,
+.ember-chat-container.force-dark .chat-interface .ffz-ui-popup ul.menu li.active.has-sub-menu,
+.app-main.theatre .chat-container .chat-interface .ffz-ui-popup ul.menu li.active.has-sub-menu,
+.ffz-ui-popup.dark ul.menu li.active.has-sub-menu {
+ background-color: #181818;
+}
+
+.chat-container.dark .chat-interface .ffz-ui-popup ul.menu li.active.has-sub-menu a,
+.chat-container.force-dark .chat-interface .ffz-ui-popup ul.menu li.active.has-sub-menu a,
+.ember-chat-container.dark .chat-interface .ffz-ui-popup ul.menu li.active.has-sub-menu a,
+.ember-chat-container.force-dark .chat-interface .ffz-ui-popup ul.menu li.active.has-sub-menu a,
+.app-main.theatre .chat-container .chat-interface .ffz-ui-popup ul.menu li.active.has-sub-menu a,
+.ffz-ui-popup.dark ul.menu li.active.has-sub-menu a {
+ border-top-color: #181818;
+}
+
+.chat-container.dark .chat-interface .ffz-ui-popup a,
+.chat-container.force-dark .chat-interface .ffz-ui-popup a,
+.ember-chat-container.dark .chat-interface .ffz-ui-popup a,
+.ember-chat-container.force-dark .chat-interface .ffz-ui-popup a,
+.app-main.theatre .chat-container .chat-interface .ffz-ui-popup a,
+.ffz-ui-popup.dark .ffz-ui-menu-page a { color: #fff; }
+
+
+.chat-container.dark .chat-interface .ffz-ui-popup ul.menu svg path,
+.chat-container.force-dark .chat-interface .ffz-ui-popup ul.menu svg path,
+.ember-chat-container.dark .chat-interface .ffz-ui-popup ul.menu svg path,
+.ember-chat-container.force-dark .chat-interface .ffz-ui-popup ul.menu svg path,
+.app-main.theatre .chat-container .chat-interface .ffz-ui-popup ul.menu svg path,
+.ffz-dark .ffz-ui-popup ul.menu svg path,
+.ffz-ui-popup.dark ul.menu svg path { fill: #d3d3d3; }
+
+.ffz-ui-popup ul.menu svg path { fill: #333; }
+
+
+.ffz-ui-popup .option-label span,
+.ffz-ui-popup .switch-label span {
+ opacity: 0.8;
+ font-size: 10px;
+ line-height: 20px;
+ padding: 4px;
+ background: rgba(0,0,0,0.2);
+ vertical-align: top;
+}
+
+/* BTTV Menu Fixes */
+
+.ffz-ui-popup.dark .emoticon-grid .heading,
+.ffz-ui-popup.dark li.title { color: #fff; }
+.ffz-ui-popup.dark .ffz-ui-menu-page { background-color: #1e1e1e; }
+
+
+/* Menu Scrollbar */
+
+.conversations-list .conversations-list-inner::-webkit-scrollbar,
+.conversation-window .conversation-content::-webkit-scrollbar,
+.chat-history::-webkit-scrollbar,
+#ffz-race-popup .table::-webkit-scrollbar,
+.emoticon-selector-box .all-emotes::-webkit-scrollbar,
+.ffz-ui-sub-menu-page::-webkit-scrollbar,
+.ffz-ui-menu-page::-webkit-scrollbar {
+ width: 6px;
+}
+
+.conversations-list .conversations-list-inner::-webkit-scrollbar-thumb,
+.conversation-window .conversation-content::-webkit-scrollbar-thumb,
+.chat-history::-webkit-scrollbar-thumb,
+#ffz-race-popup .table::-webkit-scrollbar-thumb,
+.emoticon-selector-box .all-emotes::-webkit-scrollbar-thumb,
+.ffz-ui-sub-menu-page::-webkit-scrollbar-thumb,
+.ffz-ui-menu-page::-webkit-scrollbar-thumb {
+ border-radius: 7px;
+ background: rgba(0,0,0,0.7);
+ box-shadow: 0 0 1px 1px rgba(255,255,255,0.25);
+}
+
+.ffz-dark .chat-history::-webkit-scrollbar-thumb,
+.ffz-dark .table::-webkit-scrollbar-thumb,
+.ffz-dark .conversation-window .conversation-content::-webkit-scrollbar-thumb,
+.ffz-dark .conversations-list .conversations-list-inner::-webkit-scrollbar-thumb,
+.app-main.theatre .conversation-window .conversation-content::-webkit-scrollbar-thumb,
+.app-main.theatre .conversations-list .conversations-list-inner::-webkit-scrollbar-thumb,
+.ember-chat-container.dark .emoticon-selector-box .all-emotes::-webkit-scrollbar-thumb,
+.chat-container.dark .emoticon-selector-box .all-emotes::-webkit-scrollbar-thumb,
+.app-main.theatre .emoticon-selector-box .all-emotes::-webkit-scrollbar-thumb,
+.ember-chat-container.dark .ffz-ui-menu-page::-webkit-scrollbar-thumb,
+.chat-container.dark .ffz-ui-menu-page::-webkit-scrollbar-thumb,
+.app-main.theatre .ffz-ui-menu-page::-webkit-scrollbar-thumb,
+.ember-chat-container.dark .ffz-ui-sub-menu-page::-webkit-scrollbar-thumb,
+.chat-container.dark .ffz-ui-sub-menu-page::-webkit-scrollbar-thumb,
+.app-main.theatre .ffz-ui-sub-menu-page::-webkit-scrollbar-thumb {
+ background: rgba(255,255,255,0.6);
+ box-shadow: 0 0 1px 1px rgba(0,0,0,0.25);
+}
+
+
+/* Chat Mentions */
+
+.ember-chat .mentioned:empty,
+.ember-chat .mentioning:empty {
+ display: none;
+}
+
+.ffz-chat-colors-gray .chat-line:not(.admin):not(.notification) span.from,
+.ffz-chat-colors-gray .chat-line:not(.admin):not(.notification) span.message {
+ color: inherit !important
+}
+
+.ffz-chat-background .ember-chat .mentioning,
+.ffz-chat-background .ember-chat .mentioned {
+ border-radius: 10px;
+ padding: 3px 7px;
+ font-weight: bold;
+ color: #32323e;
+ background-color: rgba(255,255,255, 0.75);
+}
+
+.ffz-chat-background .app-main.theatre .chat-container .chat-line .mentioned,
+.ffz-chat-background .ember-chat-container.dark .chat-line .mentioned,
+.ffz-chat-background .chat-container.dark .chat-line .mentioned,
+.ffz-chat-background .app-main.theatre .chat-container .chat-line .mentioning,
+.ffz-chat-background .ember-chat-container.dark .chat-line .mentioning,
+.ffz-chat-background .chat-container.dark .chat-line .mentioning {
+ color: #8c8c9c;
+ background-color: rgba(16,16,20, 0.75);
+}
+
+
+/* Fix Moderation Cards */
+
+img.channel_background[src="null"] { display: none; }
+
+.ember-chat .ffz-moderation-card {
+ border: 2px solid #cbcbcb;
+ max-width: 340px;
+ /*box-shadow: #808080 0 0 5px;*/
+}
+
+.ember-chat .ffz-moderation-card .extra-interface {
+ padding-top: 0;
+}
+
+.ember-chat .ffz-moderation-card .extra-interface + .extra-interface {
+ margin-top: -10px;
+}
+
+.ember-chat .ffz-moderation-card.ffz-has-info h3.name {
+ margin-top: 0;
+}
+
+.ember-chat .ffz-moderation-card .info {
+ float: none;
+ position: relative;
+ z-index: 4;
+ margin-left: 50px;
+ height: 18px;
+ line-height: 18px;
+}
+
+.ember-chat .ffz-moderation-card .info.channel-stats .stat {
+ color: #fff;
+}
+
+.ember-chat .ffz-moderation-card .info.channel-stats .stat svg {
+ margin: 1px 5px 1px 0;
+ pointer-events: none;
+}
+
+.ember-chat .ffz-moderation-card .info svg path { fill: #fff; }
+
+.ember-chat .ffz-moderation-card button {
+ margin: 0;
+ padding: 0 5px;
+}
+
+.ember-chat .ffz-moderation-card button:not(.glyph-only):hover,
+.ember-chat .ffz-moderation-card button:not(.glyph-only):focus {
+ color: #fff;
+ background-color: rgba(117,80,186, 1);
+}
+
+.ember-chat .ffz-moderation-card button.message {
+ height: 30px; width: 28px;
+}
+
+.ember-chat .ffz-moderation-card.ffz-is-mod .interface .mod-controls:last-of-type,
+.ember-chat .ffz-moderation-card .interface span.right {
+ float: right;
+}
+
+.ember-chat .ffz-moderation-card:focus {
+ outline: none;
+ border-color: #444;
+ /*box-shadow: #000 0 0 5px;*/
+}
+
+.ember-chat .ffz-moderation-card .interface:not(:last-of-type) {
+ border-bottom: none;
+}
+
+.ember-chat .ffz-moderation-card .interface {
+ border-top: none;
+}
+
+.ember-chat .ffz-moderation-card h3.name { display: inline-block; }
+
+.ember-chat .ffz-moderation-card .info,
+.ember-chat .ffz-moderation-card h3.name {
+ text-shadow: black 0 0 5px;
+}
+
+.ember-chat .ffz-moderation-card .channel_background {
+ width: 100%;
+ top: 0;
+}
+
+
+body:not(.ffz-chat-purge-icon) .ember-chat .mod-icons .purge { display: none; }
+
+.ember-chat .mod-icons .purge {
+ background-image: url('//cdn.frankerfacez.com/script/PurgeButton.svg');
+ background-repeat: no-repeat;
+}
+
+.ember-chat .mod-icons .custom {
+ text-indent: 0;
+ text-align: center;
+ text-decoration: none;
+ font-size: 18px;
+ font-weight: bold;
+ color: #888 !important;
+}
+
+
+/* Chat Rows */
+
+.ffz-alias { font-style: italic; }
+
+.ember-chat .chat-messages .chat-line.ffz-has-deleted {
+ line-height: 30px;
+}
+
+.chat-line.ffz-deleted > span {
+ opacity: 0.5;
+}
+
+.chat-line.ffz-deleted > span.message {
+ text-decoration: line-through;
+}
+
+.chat-line.ffz-deleted:hover > span {
+ opacity: 0.9;
+}
+
+.chat-line.ffz-deleted:hover > span.message {
+ text-decoration: none;
+}
+
+.ffz-chat-background .more-messages-indicator {
+ /* This looks better when it's full width. */
+ margin: 0 -20px;
+}
+
+.ffz-chat-background .chat-line .message {
+ word-break: break-word;
+}
+
+.ffz-chat-background .ember-chat .chat-messages .tse-scroll-content {
+ padding: 0;
+}
+
+/* This cuts off emotes.
+.ffz-chat-background .ember-chat .chat-messages .chat-line {
+ padding: 3px 20px;
+ margin: 0px 0px;
+} */
+
+.ffz-chat-separator .conversation-chat-lines > div,
+.ffz-chat-background .conversation-chat-lines > div,
+.ffz-chat-separator .chat-line,
+.ffz-chat-background .chat-line {
+ position: relative;
+ z-index: 1;
+}
+
+.ffz-chat-padding .conversation-window .conversation-chat-lines {
+ padding-top: 0;
+}
+
+.ffz-chat-padding .ember-chat .chat-messages .chat-line,
+.ffz-chat-padding .ember-chat .chat-messages .chat-line.admin,
+.ffz-chat-padding .conversation-window .conversation-system-messages,
+.ffz-chat-padding .conversation-window .conversation-chat-line,
+.ffz-chat-padding .conversation-window .timestamp-line {
+ padding: 5px;
+}
+
+.ffz-chat-separator .conversation-chat-lines > div:before,
+.ffz-chat-background .conversation-chat-lines > div:before,
+.ffz-chat-separator .chat-line:before,
+.ffz-chat-background .chat-line:before {
+ content: "";
+ position: absolute;
+ z-index: -1;
+ left: 0; right: 0;
+ top: 2px; bottom: 1px;
+}
+
+.ffz-chat-background .chat-history .chat-line:before {
+ top: 0; bottom: 0;
+}
+
+
+.ffz-chat-separator .conversation-chat-lines > div:before,
+.ffz-chat-separator .chat-line:before {
+ border-bottom: 1px solid #aaa;
+}
+
+.ffz-chat-separator-wide .conversation-chat-lines > div:before,
+.ffz-chat-separator-wide .chat-line:before {
+ border-top: 1px solid #aaa;
+}
+
+.ffz-chat-separator-3d .conversation-chat-lines > div:before,
+.ffz-chat-separator-3d .chat-line:before {
+ border-top: 1px solid rgba(255,255,255,0.5);
+}
+
+.ffz-chat-separator-3d-inset .conversation-chat-lines > div:before,
+.ffz-chat-separator-3d-inset .chat-line:before {
+ border-bottom-color: rgba(255,255,255,0.5);
+ border-top: 1px solid #aaa;
+}
+
+.ffz-chat-separator-wide .conversation-chat-lines > div:first-of-type:before,
+.ffz-chat-separator-3d .conversation-chat-lines > div:first-of-type:before,
+.ffz-chat-separator-wide ul.chat-lines div:first-of-type .chat-line:before,
+.ffz-chat-separator-3d ul.chat-lines div:first-of-type .chat-line:before {
+ border-top: none;
+}
+
+.ffz-chat-separator:not(.ffz-chat-background) .conversation-chat-lines > div:last-of-type:before,
+.ffz-chat-separator:not(.ffz-chat-background) ul.chat-lines div:last-of-type .chat-line:before,
+.ffz-chat-separator ul.chat-lines div:last-of-type .chat-line:not(.ffz-alternate):before {
+ border-bottom: none;
+}
+
+.ffz-chat-separator .theatre .conversation-chat-lines > div:before,
+.ffz-chat-separator.ffz-dark .conversation-chat-lines > div:before,
+.ffz-chat-separator .app-main.theatre .chat-line:before,
+.ffz-chat-separator .chat-container.dark .chat-line:before,
+.ffz-chat-separator .chat-container.force-dark .chat-line:before,
+.ffz-chat-separator .ember-chat-container.dark .chat-line:before,
+.ffz-chat-separator .ember-chat-container.force-dark .chat-line:before {
+ border-bottom-color: #000;
+}
+
+.ffz-chat-separator-wide .theatre .conversation-chat-lines > div:before,
+.ffz-chat-separator-wide.ffz-dark .conversation-chat-lines > div:before,
+.ffz-chat-separator-wide .app-main.theatre .chat-line:before,
+.ffz-chat-separator-wide .chat-container.dark .chat-line:before,
+.ffz-chat-separator-wide .chat-container.force-dark .chat-line:before,
+.ffz-chat-separator-wide .ember-chat-container.dark .chat-line:before,
+.ffz-chat-separator-wide .ember-chat-container.force-dark .chat-line:before {
+ border-top-color: #000;
+}
+
+.ffz-chat-separator-3d .theatre .conversation-chat-lines > div:before,
+.ffz-chat-separator-3d.ffz-dark .conversation-chat-lines > div:before,
+.ffz-chat-separator-3d .app-main.theatre .chat-line:before,
+.ffz-chat-separator-3d .chat-container.dark .chat-line:before,
+.ffz-chat-separator-3d .chat-container.force-dark .chat-line:before,
+.ffz-chat-separator-3d .ember-chat-container.dark .chat-line:before,
+.ffz-chat-separator-3d .ember-chat-container.force-dark .chat-line:before {
+ border-top-color: rgba(255,255,255,0.1);
+}
+
+.ffz-chat-separator-3d-inset .theatre .conversation-chat-lines > div:before,
+.ffz-chat-separator-3d-inset.ffz-dark .conversation-chat-lines > div:before,
+.ffz-chat-separator-3d-inset .app-main.theatre .chat-line:before,
+.ffz-chat-separator-3d-inset .chat-container.dark .chat-line:before,
+.ffz-chat-separator-3d-inset .chat-container.force-dark .chat-line:before,
+.ffz-chat-separator-3d-inset .ember-chat-container.dark .chat-line:before,
+.ffz-chat-separator-3d-inset .ember-chat-container.force-dark .chat-line:before {
+ border-bottom-color: rgba(255,255,255,0.1);
+ border-top-color: #000;
+}
+
+.ffz-chat-background .conversation-chat-lines > div:nth-child(2n+0):before,
+.ffz-chat-background .chat-history .chat-line.ffz-alternate:before,
+.ffz-chat-background .ember-chat .chat-messages .chat-line.ffz-alternate:before {
+ background-color: rgba(0,0,0, 0.1);
+}
+
+.ffz-chat-background .chat-history .chat-line.ffz-mentioned:before,
+.ffz-chat-background .ember-chat .chat-messages .chat-line.ffz-mentioned:before {
+ background-color: rgba(255,127,127, 0.2);
+}
+
+.ffz-chat-background .chat-history .chat-line.ffz-mentioned-ffz-alternate:before,
+.ffz-chat-background .ember-chat .chat-messages .chat-line.ffz-mentioned.ffz-alternate:before {
+ background-color: rgba(255,127,127, 0.4);
+}
+
+.ffz-chat-background .theatre .conversation-chat-lines > div:nth-child(2n+0):before,
+.ffz-chat-background.ffz-dark .conversation-chat-lines > div:nth-child(2n+0):before,
+
+.ffz-chat-background .app-main.theatre .chat-history .chat-line.ffz-alternate:before,
+.ffz-chat-background .chat-container.dark .chat-history .chat-line.ffz-alternate:before,
+.ffz-chat-background .ember-chat-container.dark .chat-history .chat-line.ffz-alternate:before,
+.ffz-chat-background .app-main.theatre .ember-chat .chat-messages .chat-line.ffz-alternate:before,
+.ffz-chat-background .chat-container.dark .ember-chat .chat-messages .chat-line.ffz-alternate:before,
+.ffz-chat-background .ember-chat-container.dark .ember-chat .chat-messages .chat-line.ffz-alternate:before {
+ background-color: rgba(255,255,255, 0.05);
+}
+
+
+.ffz-chat-background .app-main.theatre .chat-history .chat-line.ffz-mentioned:before,
+.ffz-chat-background .chat-container.dark .chat-history .chat-line.ffz-mentioned:before,
+.ffz-chat-background .ember-chat-container.dark .chat-history .chat-line.ffz-mentioned:before,
+.ffz-chat-background .app-main.theatre .ember-chat .chat-messages .chat-line.ffz-mentioned:before,
+.ffz-chat-background .chat-container.dark .ember-chat .chat-messages .chat-line.ffz-mentioned:before,
+.ffz-chat-background .ember-chat-container.dark .ember-chat .chat-messages .chat-line.ffz-mentioned:before {
+ background-color: rgba(255,0,0, 0.2);
+}
+
+.ffz-chat-background .app-main.theatre .chat-history .chat-line.ffz-mentioned.ffz-alternate:before,
+.ffz-chat-background .chat-container.dark .chat-history .chat-line.ffz-mentioned.ffz-alternate:before,
+.ffz-chat-background .ember-chat-container.dark .chat-history .chat-line.ffz-mentioned.ffz-alternate:before,
+.ffz-chat-background .app-main.theatre .ember-chat .chat-messages .chat-line.ffz-mentioned.ffz-alternate:before,
+.ffz-chat-background .chat-container.dark .ember-chat .chat-messages .chat-line.ffz-mentioned.ffz-alternate:before,
+.ffz-chat-background .ember-chat-container.dark .ember-chat .chat-messages .chat-line.ffz-mentioned.ffz-alternate:before {
+ background-color: rgba(255,0,0, 0.3);
+}
+*/
+
+/* The New Whispers */
+
+.ffz-chat-background .ember-chat .chat-messages .whisper-line {
+ padding-left: 16px;
+ border-left-width: 4px !important;
+}
+
+.ffz-chat-background .app-main.theatre .ember-chat .chat-messages .whisper-line.whisper-incoming:before,
+.ffz-chat-background .chat-container.dark .ember-chat .chat-messages .whisper-line.whisper-incoming:before,
+.ffz-chat-background .ember-chat-container.dark .ember-chat .chat-messages .whisper-line.whisper-incoming:before {
+ /* 675980 */
+ background-color: rgba(78,51,128, 0.4);
+}
+
+.ffz-chat-background .app-main.theatre .ember-chat .chat-messages .whisper-line.whisper-incoming.ffz-alternate:before,
+.ffz-chat-background .chat-container.dark .ember-chat .chat-messages .whisper-line.whisper-incoming.ffz-alternate:before,
+.ffz-chat-background .ember-chat-container.dark .ember-chat .chat-messages .whisper-line.whisper-incoming.ffz-alternate:before {
+ /* 675980 */
+ background-color: rgba(78,51,128, 0.5);
+}
+
+.ffz-chat-background .ember-chat .chat-messages .whisper-line.whisper-incoming:before {
+ background-color: rgba(205,178,255, 0.4);
+}
+
+.ffz-chat-background .ember-chat .chat-messages .whisper-line.whisper-incoming.ffz-alternate:before {
+ background-color: rgba(205,178,255, 0.6);
+}
+
+
+
+/* Temporary Fix */
+
+.chat-container.dark .ember-chat .chat-messages .whisper-line.whisper-incoming,
+.app-main.theatre .chat-container .ember-chat .chat-messages .whisper-line.whisper-incoming,
+.chat-container.force-dark .ember-chat .chat-messages .whisper-line.whisper-incoming,
+.ember-chat-container.dark .ember-chat .chat-messages .whisper-line.whisper-incoming,
+.app-main.theatre .ember-chat-container.chat-container .ember-chat .chat-messages .whisper-line.whisper-incoming,
+.ember-chat-container.force-dark .ember-chat .chat-messages .whisper-line.whisper-incoming {
+ background-color: #101014;
+ border-left: 2px solid #a68ed2
+}
+
+
+/* Emoticon Tooltips */
+
+.ffz-wide-tip .tipsy-inner {
+ min-width: 300px;
+ max-width: 600px;
+ text-align: left;
+ position: relative;
+}
+
+.ffz-wide-tip span.stat {
+ float: right;
+ margin-left: 5px;
+}
+
+.ffz-wide-tip b { margin-right: 20px; }
+
+.ffz-wide-tip span.stat svg {
+ float: left;
+ margin: 1px;
+}
+
+.ffz-wide-tip svg path { fill: #fff; }
+.ffz-wide-tip span.playing {
+ opacity: 0.7;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ display: block;
+ position: relative;
+ left: 0;
+ right: 0;
+}
+
+.tipsy .tipsy-inner {
+ white-space: pre-wrap;
+}
+
+/* Menu Page Loader */
+
+.ffz-ui-sub-menu-page:empty,
+.ffz-ui-menu-page:empty {
+ overflow: hidden;
+}
+
+.ffz-ui-sub-menu-page:empty::after,
+.ffz-ui-menu-page:empty::after {
+ content: " ";
+ display: block;
+ width: 80px;
+ height: 63px;
+
+ background-image: url("//cdn.frankerfacez.com/script/spinner-dark.png");
+
+ margin: 50px auto;
+ -webkit-animation: ffz-rotateplane 1.2s infinite linear;
+ animation: ffz-rotateplane 1.2s infinite linear;
+}
+
+@-webkit-keyframes ffz-rotateplane {
+ 0% { -webkit-transform: perspective(120px) rotateY(90deg) }
+ 25% { -webkit-transform: perspective(120px) rotateY(180deg) }
+ 75% { -webkit-transform: perspective(120px) rotateY(180deg) rotateX(180deg) }
+ 100% { -webkit-transform: perspective(120px) rotateY(90deg) rotateX(180deg) }
+}
+
+@keyframes ffz-rotateplane {
+ 0% { transform: perspective(120px) rotateY(90deg) }
+ 25% { transform: perspective(120px) rotateY(180deg) }
+ 75% { transform: perspective(120px) rotateY(180deg) rotateX(180deg) }
+ 100% { transform: perspective(120px) rotateY(90deg) rotateX(180deg) }
+}
+
+/* Menu About Page */
+
+.ffz-about-table {
+ width: 100%;
+}
+
+.ffz-about-table td:first-child {
+ text-align: left;
+ width: 100%;
+}
+
+.ffz-about-table .debug td {
+ padding-top: 10px;
+ opacity: 0.8;
+ font-size: 10px;
+}
+
+.ffz-about-subheading {
+ /*text-transform: uppercase;*/
+ letter-spacing: 2px;
+ margin: -5px 0 5px;
+}
+
+.button.ffz-news,
+.button.ffz-donate {
+ margin-left: 10px;
+ color: #fff !important;
+ padding: 0 10px;
+ font-size: 12px;
+}
+
+.button.ffz-donate { background: #00b132; }
+.button.ffz-donate:not(.disabled):hover { background: #08c43d; }
+
+.button.ffz-news { background: #755000; }
+.button.ffz-news:not(.disabled):hover { background: #8a5f03; }
+
+
+/* Dumb Fixes */
+
+.ffz-bttv .no-bttv { display: none; }
+
+.chat-container.dark, .app-main.theatre .chat-container,
+.chat-container.force-dark, .ember-chat-container.dark,
+.app-main.theatre .ember-chat-container.chat-container,
+.ember-chat-container.force-dark {
+ box-shadow: none;
+}
+
+
+/* Unsafe Links */
+
+a.unsafe-link {
+ color: #a64141 !important;
+}
+
+.chat-container.dark .chat-line a.unsafe-link {
+ color: #d28e8e !important;
+}
+
+/* Chat Menu */
+
+.ffz-room-list > div.ffz + ul.room-list { display: block !important; }
+
+.ffz-room-list > div:not(.ffz),
+.ffz-room-list > ul:not(.ffz) {
+ display: none !important;
+}
+
+.ffz-room-list > table {
+ padding: 15px 0 0;
+}
+
+.ffz-room-list > table + table {
+ margin-top: 10px;
+}
+
+.ffz-room-list > table th {
+ padding: 2px 5px;
+ color: #8c8c8c;
+ font-weight: normal;
+ text-transform: uppercase;
+}
+
+.ffz-room-list > table > tbody tr {
+ line-height: 26px;
+}
+
+.ffz-room-list > table td {
+ padding: 2px 0;
+ text-align: center;
+}
+
+.ffz-room-list > table th:first-child,
+.ffz-room-list > table td:nth-child(0n+2) {
+ width: 100%;
+ text-align: left;
+}
+
+.ffz-room-row {
+ cursor: pointer;
+}
+
+.ffz-room-list > table th:first-child,
+.ffz-room-list > table td:first-child {
+ padding-left: 18px;
+}
+
+.ffz-room-list > table th:last-child,
+.ffz-room-list > table td:last-child {
+ padding-right: 18px;
+}
+
+.ffz-room-list td svg {
+ margin: 5px;
+ float: left;
+}
+
+.ffz-dark .ffz-room-row { color: #a68ed2; }
+.ffz-dark .ffz-room-row svg path { fill: #a68ed2; }
+
+.ffz-room-row { color: #6441a5; }
+.ffz-room-row svg path { fill: #6441a5; }
+
+.ffz-room-row:hover svg path,
+.ffz-room-row:focus svg path,
+.ffz-room-row.active svg path { fill: #fff; }
+
+.ffz-room-row:hover td,
+.ffz-room-row:focus td,
+.ffz-room-row.active td {
+ background-color: #6441A5;
+ color: #fff !important;
+}
+
+th.ffz-row-switch {
+ min-width: 40px;
+}
+
+.ffz-room-row a.leave-chat {
+ float: right;
+ margin-right: 12px;
+}
+
+.ffz-row-switch .switch {
+ float: none;
+ margin: 5px 0 -4px;
+}
+
+.ffz-row-switch .switch.active {
+ background-color: #362359;
+}
+
+
+/* Chat Tabs */
+
+#ffz-group-tabs {
+ padding: 10px 10px 6px;
+ box-shadow: inset 0 -1px 0 0 rgba(0,0,0,0.2);
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.ffz-chat-tab {
+ flex-grow: 1;
+ position: relative;
+
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ min-width: 70px;
+
+ cursor: pointer;
+ padding: 5px;
+ margin: 0 4px 4px 0;
+
+ display: inline-block;
+
+ background-color: rgba(127,127,127,0.1);
+ color: #6441A5;
+}
+
+
+.ffz-chat-tab svg path {
+ fill: #6441A5;
+}
+
+#ffz-group-tabs .button {
+ height: 18px;
+ padding-bottom: 10px;
+ margin-bottom: -10px;
+ margin-right: 4px;
+}
+
+#ffz-group-tabs .button.glyph-only svg {
+ margin: 6px 0;
+}
+
+.ffz-chat-tab svg {
+ width: 18px;
+ height: 18px;
+ margin: -5px 5px -5px 0;
+}
+
+.ffz-chat-tab:hover,
+.ffz-chat-tab:focus,
+.ffz-chat-tab.active {
+ background-color: #6441A5;
+ color: #fff !important;
+}
+
+.ffz-chat-tab.tab-mentioned {
+ background-color: rgba(128,50,50,0.1);
+ color: red !important;
+}
+
+.ffz-chat-tab.tab-mentioned:not(.active):hover,
+.ffz-chat-tab.tab-mentioned:not(.active):focus {
+ background-color: #a54141;
+ color: #fff !important;
+}
+
+.ffz-chat-tab:not(.active):hover,
+.ffz-chat-tab:not(.active):focus {
+ background-color: #7550ba;
+}
+
+.ffz-chat-tab:hover svg path,
+.ffz-chat-tab:focus svg path,
+.ffz-chat-tab.active svg path {
+ fill: #fff !important;
+}
+
+.ffz-chat-tab.active {
+ cursor: default;
+}
+
+.ffz-chat-tab span:empty { display: none; }
+
+.ffz-chat-tab span {
+ padding: 0 4px;
+ display: inline-block;
+ border-radius: 2px;
+ text-align: center;
+ background-color: #f2f2f2;
+ color: #666;
+ position: absolute;
+ right: 5px;
+}
+
+
+/* Dark Group Tabs */
+
+.app-main.theatre #ffz-group-tabs,
+.chat-container.dark #ffz-group-tabs,
+.ember-chat-container.dark #ffz-group-tabs {
+ box-shadow: inset 0 -1px 0 0 #32323e;
+}
+
+.app-main.theatre .ffz-chat-tab,
+.chat-container.dark .ffz-chat-tab,
+.ember-chat-container.dark .ffz-chat-tab {
+ color: #B9A3E3;
+}
+
+.app-main.theatre .ffz-chat-tab span,
+.chat-container.dark .ffz-chat-tab span,
+.ember-chat-container.dark .ffz-chat-tab span {
+ background-color: #19191f;
+ color: #fff;
+}
+
+.app-main.theatre .ffz-chat-tab svg path,
+.chat-container.dark .ffz-chat-tab svg path,
+.ember-chat-container.dark .ffz-chat-tab svg path {
+ fill: #B9A3E3;
+}
+
+/* Minimalistic Chat */
+
+body.ffz-minimal-chat-head .ember-chat > .chat-header,
+body.ffz-minimal-chat-head .ember-chat #ffz-group-tabs,
+body.ffz-minimal-chat-input .ember-chat .chat-buttons-container {
+ display: none !important;
+}
+
+/*body.ffz-minimal-chat .ember-chat .chat-messages,
+body.ffz-minimal-chat .ember-chat .chat-interface .emoticon-selector {
+ bottom: 33px;
+}*/
+
+body.ffz-minimal-chat-input .ember-chat .chat-interface .emoticon-selector {
+ right: 10px;
+}
+
+body.ffz-minimal-chat-input .ember-chat .chat-interface .emoticon-selector .dropmenu {
+ margin-bottom: 10px;
+}
+
+body.ffz-minimal-chat-head .ember-chat .chat-room {
+ top: 0 !important;
+}
+
+body.ffz-minimal-chat-input .ember-chat .chat-interface {
+ /*height: 33px !important;*/
+ padding: 0;
+}
+
+body.ffz-minimal-chat-input .ember-chat .chat-interface .textarea-contain {
+ top: 0 !important;
+ margin: 0 !important;
+ height: auto;
+}
+
+body.ffz-minimal-chat-input .ember-chat .chat-interface .textarea-contain textarea {
+ /*height: 33px !important;*/
+ overflow: hidden;
+ border-bottom: 0 !important;
+ border-left: 0;
+ border-right: 0;
+}
+
+/* Chat Pause */
+
+.ember-chat .chat-interface .more-messages-indicator.ffz-freeze-indicator {
+ opacity: 1;
+ cursor: default;
+ top: 0;
+}
+
+/* Chat History */
+
+.ember-chat .moderation-card .chat-history,
+.chat-history {
+ list-style-type: none;
+ padding: 0;
+ max-height: 200px;
+ overflow-y: scroll;
+}
+
+.chat-history.interface li:first-child { padding-top: 10px; }
+.chat-history.interface li:last-child { padding-bottom: 10px; }
+
+.chat-history .chat-line {
+ line-height: 20px;
+ padding: 4px 10px;
+ word-wrap: break-word;
+ list-style-position: unset;
+}
+
+.ember-chat .moderation-card .interface.chat-history .chat-line.action {
+ float: none;
+ margin-right: 0px;
+}
+
+.chat-history .chat-line.admin .message { color: #666; }
+
+.chat-history .timestamp {
+ color: #8c8c8c;
+ margin-right: 5px;
+}
+
+/* Room State */
+
+.ffz.room-state.stat {
+ line-height: 30px;
+ margin-left: -10px;
+ margin-right: 15px;
+}
+
+.ffz.room-state.truncated span { font-size: 8px; }
+
+.button.primary.ffz-waiting:not(:hover) {
+ background-color: rgba(0,0,0,0.1);
+ color: #32323e;
+}
+
+.button.primary.ffz-waiting.ffz-banned:not(:hover) {
+ background-color: rgba(128,0,0,0.1);
+ color: #88323e;
+}
+
+.chat-container.dark .button.primary.ffz-waiting:not(:hover),
+.app-main.theatre .button-primary.ffz-waiting:not(:hover),
+.chat-container.force-dark .button-primary.ffz-waiting:not(:hover),
+.ember-chat-container.dark .button-primary.ffz-waiting:not(:hover),
+.ember-chat-container.force-dark .button-primary.ffz-waiting:not(:hover) {
+ background-color: rgba(255,255,255,0.1);
+ color: #fff;
+}
+
+.chat-container.dark .button.primary.ffz-waiting.ffz-banned:not(:hover),
+.app-main.theatre .button-primary.ffz-waiting.ffz-banned:not(:hover),
+.chat-container.force-dark .button-primary.ffz-waiting.ffz-banned:not(:hover),
+.ember-chat-container.dark .button-primary.ffz-waiting.ffz-banned:not(:hover),
+.ember-chat-container.force-dark .button-primary.ffz-waiting.ffz-banned:not(:hover) {
+ background-color: rgba(255,128,128,0.1);
+ color: #f66;
+}
+
+/* Swap Sidebars */
+
+body[data-current-path^="user."].ffz-portrait #right_close { transform: rotate(90deg); }
+body[data-current-path^="user."].ffz-portrait .archives-contain .more-archives { width: 100%; }
+
+body:not([data-current-path^="user."]) .ffz-sidebar-swap .ember-chat .chat-interface .emoticon-selector,
+.ffz-sidebar-swap:not(.ffz-portrait) .ember-chat .chat-interface .emoticon-selector {
+ right: auto;
+ left: 20px;
+}
+
+.ffz-sidebar-swap #left_col {
+ left: auto;
+ right: 0;
+}
+
+.ffz-sidebar-swap #right_col {
+ right: auto;
+ left: 0;
+}
+
+.ffz-sidebar-swap:not(.ffz-portrait) #right_close,
+.ffz-sidebar-swap #left_close {
+ transform: scaleX(-1);
+}
+
+.ffz-sidebar-swap #right_close {
+ right: auto;
+ left: 5px;
+}
+
+.ffz-sidebar-swap #left_close {
+ right: auto;
+ left: -25px;
+}
+
+.ffz-sidebar-swap #main_col {
+ margin-left: 340px;
+ margin-right: 240px;
+}
+
+.ffz-sidebar-swap .app-main.theatre #main_col {
+ margin-left: 340px;
+ margin-right: 0px;
+}
+
+.ffz-sidebar-swap .app-main.theatre #main_col.expandRight {
+ margin-left: 0px;
+}
+
+
+.ffz-sidebar-swap .exit-theatre {
+ left: 30px;
+}
+
+.ffz-sidebar-swap #main_col.expandLeft {
+ margin-right: 50px;
+}
+
+.ffz-sidebar-swap #main_col.expandRight {
+ margin-left: 0px;
+}
+
+.ffz-sidebar-swap #flyout {
+ left: auto !important;
+ right: 50px;
+}
+
+.ffz-sidebar-swap #flyout .content {
+ right: 10px;
+}
+
+.ffz-sidebar-swap #flyout .point {
+ left: auto;
+ right: -1px;
+}
+
+.ffz-sidebar-swap #flyout .point:before {
+ border-left-color: #fff;
+ border-right-color: transparent;
+ right: auto;
+ left: 0px;
+}
+
+.ffz-sidebar-swap #flyout .point:after {
+ border-right-color: transparent;
+ border-left-color: rgba(0,0,0,0.25);
+ right: auto;
+ left: 1px;
+}
+
+.ffz-dark.ffz-sidebar-swap #flyout .point:after {
+ border-left-color: #32323e;
+ border-right-color: transparent;
+}
+
+.ffz-dark.ffz-sidebar-swap #flyout .point:before {
+ border-left-color: #101010;
+ border-right-color: transparent;
+}
+
+/* Badge Styles */
+
+.ffz-rounded-badges .conversation-window .badges .badge:not(.subscriber),
+.ffz-rounded-badges .ember-chat .badges .badge:not(.subscriber) { border-radius: 2px; }
+
+.ffz-circular-blank-badges .conversation-window .badges .badge:not(.subscriber),
+.ffz-circular-small-badges .conversation-window .badges .badge:not(.subscriber),
+.ffz-circular-badges .conversation-window .badges .badge:not(.subscriber),
+.ffz-circular-blank-badges .ember-chat .badges .badge:not(.subscriber),
+.ffz-circular-small-badges .ember-chat .badges .badge:not(.subscriber),
+.ffz-circular-badges .ember-chat .badges .badge:not(.subscriber) {
+ border-radius: 9px;
+ background-size: 16px;
+ background-repeat: no-repeat;
+ background-position: center center;
+}
+
+.ffz-circular-small-badges .conversation-window .badges .badge:not(.subscriber),
+.ffz-circular-blank-badges .conversation-window .badges .badge:not(.subscriber),
+.ffz-circular-small-badges .ember-chat .badges .badge:not(.subscriber),
+.ffz-circular-blank-badges .ember-chat .badges .badge:not(.subscriber) {
+ background-size: 0px;
+}
+
+.ffz-circular-small-badges .conversation-window .badges .badge:not(.subscriber),
+.ffz-circular-small-badges .ember-chat .badges .badge:not(.subscriber) {
+ height: 10px;
+ min-width: 10px;
+ margin: 5px 3px 5px 0;
+}
+
+.ffz-transparent-badges .conversation-window .badges .badge,
+.ffz-transparent-badges .ember-chat .badges .badge {
+ background-color: transparent !important;
+}
+
+.ffz-transparent-badges:not(.ffz-dark) .app-main:not(.theatre) .conversation-window .badges .badge:not(.ffz-badge-0):not(.subscriber),
+.ffz-transparent-badges > .chat-container:not(.dark):not(.force-dark) .ember-chat .badges .badge:not(.ffz-badge-0):not(.subscriber),
+.ffz-transparent-badges > .ember-chat-container:not(.dark):not(.force-dark) .ember-chat .badges .badge:not(.ffz-badge-0):not(.subscriber),
+.ffz-transparent-badges .app-main:not(.theatre) .chat-container:not(.dark):not(.force-dark) .ember-chat .badges .badge:not(.ffz-badge-0):not(.subscriber),
+.ffz-transparent-badges .app-main:not(.theatre) .ember-chat-container:not(.dark):not(.force-dark) .ember-chat .badges .badge:not(.ffz-badge-0):not(.subscriber) {
+ filter: invert(100%);
+ -webkit-filter: invert(100%);
+}
+
+/* No Blue */
+
+.ffz-no-blue .theatre .conversations-list-icon,
+.ffz-no-blue.ffz-dark .conversations-list-icon,
+.ffz-no-blue .theatre .conversations-list,
+.ffz-no-blue.ffz-dark .conversations-list,
+.ffz-no-blue .theatre .conversation-window,
+.ffz-no-blue.ffz-dark .conversation-window,
+.ffz-no-blue .theatre .conversations-list .conversations-list-header,
+.ffz-no-blue.ffz-dark .conversations-list .conversations-list-header,
+
+.ffz-no-blue #large_nav .content,
+.ffz-no-blue #small_nav .content,
+.ffz-no-blue .chat-container.dark,
+.ffz-no-blue .app-main.theatre .chat-container,
+.ffz-no-blue .chat-container.force-dark,
+.ffz-no-blue .ember-chat-container.dark,
+.ffz-no-blue .app-main.theatre .ember-chat-container.chat-container,
+.ffz-no-blue .ember-chat-container.force-dark,
+.ffz-no-blue .chat-container.dark .chat-hidden-overlay,
+.ffz-no-blue .app-main.theatre .chat-container .chat-hidden-overlay,
+.ffz-no-blue .chat-container.force-dark .chat-hidden-overlay,
+.ffz-no-blue .ember-chat-container.dark .chat-hidden-overlay,
+.ffz-no-blue .app-main.theatre .ember-chat-container.chat-container .chat-hidden-overlay,
+.ffz-no-blue .ember-chat-container.force-dark .chat-hidden-overlay,
+.ffz-no-blue .chat-container.dark .chatters-view,
+.ffz-no-blue .app-main.theatre .chat-container .chatters-view,
+.ffz-no-blue .chat-container.force-dark .chatters-view,
+.ffz-no-blue .ember-chat-container.dark .chatters-view,
+.ffz-no-blue .app-main.theatre .ember-chat-container.chat-container .chatters-view,
+.ffz-no-blue .ember-chat-container.force-dark .chatters-view,
+.ffz-no-blue .chat-container.dark .emoticon-selector .emoticon-selector-box,
+.ffz-no-blue .app-main.theatre .chat-container .emoticon-selector .emoticon-selector-box,
+.ffz-no-blue .chat-container.force-dark .emoticon-selector .emoticon-selector-box,
+.ffz-no-blue .ember-chat-container.dark .emoticon-selector .emoticon-selector-box,
+.ffz-no-blue .app-main.theatre .ember-chat-container.chat-container .emoticon-selector .emoticon-selector-box,
+.ffz-no-blue .ember-chat-container.force-dark .emoticon-selector .emoticon-selector-box,
+.ffz-no-blue .chat-container.dark .emoticon-selector .emoticon-grid,
+.ffz-no-blue .app-main.theatre .chat-container .emoticon-selector .emoticon-grid,
+.ffz-no-blue .chat-container.force-dark .emoticon-selector .emoticon-grid,
+.ffz-no-blue .ember-chat-container.dark .emoticon-selector .emoticon-grid,
+.ffz-no-blue .app-main.theatre .ember-chat-container.chat-container .emoticon-selector .emoticon-grid,
+.ffz-no-blue .ember-chat-container.force-dark .emoticon-selector .emoticon-grid,
+.ffz-no-blue .chat-container.dark .chat-commands-dropdown,
+.ffz-no-blue .app-main.theatre .chat-container .chat-commands-dropdown,
+.ffz-no-blue .chat-container.force-dark .chat-commands-dropdown,
+.ffz-no-blue .ember-chat-container.dark .chat-commands-dropdown,
+.ffz-no-blue .app-main.theatre .ember-chat-container.chat-container .chat-commands-dropdown,
+.ffz-no-blue .ember-chat-container.force-dark .chat-commands-dropdown,
+.ffz-no-blue .chat-container.dark .chat-commands-dropdown li,
+.ffz-no-blue .app-main.theatre .chat-container .chat-commands-dropdown li,
+.ffz-no-blue .chat-container.force-dark .chat-commands-dropdown li,
+.ffz-no-blue .ember-chat-container.dark .chat-commands-dropdown li,
+.ffz-no-blue .app-main.theatre .ember-chat-container.chat-container .chat-commands-dropdown li,
+.ffz-no-blue .ember-chat-container.force-dark .chat-commands-dropdown li,
+.ffz-no-blue.error_500,
+.ffz-no-blue.error_400,
+.ffz-no-blue .takeover #carousel,
+.ffz-no-blue #carousel_and_background,
+.ffz-no-blue #carousel .items .pic img,
+.ffz-no-blue #content .turbo_landing {
+ background-color: #191919;
+}
+
+.ffz-no-blue .chat-container.dark .chat-interface .emoticon-selector .tabs,
+.ffz-no-blue .app-main.theatre .chat-container .chat-interface .emoticon-selector .tabs,
+.ffz-no-blue .chat-container.force-dark .chat-interface .emoticon-selector .tabs,
+.ffz-no-blue .ember-chat-container.dark .chat-interface .emoticon-selector .tabs,
+.ffz-no-blue .app-main.theatre .ember-chat-container.chat-container .chat-interface .emoticon-selector .tabs,
+.ffz-no-blue .ember-chat-container.force-dark .chat-interface .emoticon-selector .tabs {
+ background-color: #232323;
+}
+
+.ffz-no-blue .theatre .conversations-list-icon,
+.ffz-no-blue.ffz-dark .conversations-list-icon,
+.ffz-no-blue .theatre .conversations-list .conversation-preview-line,
+.ffz-no-blue.ffz-dark .conversations-list .conversation-preview-line,
+.ffz-no-blue .theatre .conversation-window,
+.ffz-no-blue.ffz-dark .conversation-window {
+ color: #8c8c8c;
+}
+
+.ffz-no-blue .theatre .conversations-list,
+.ffz-no-blue.ffz-dark .conversations-list {
+ border-color: #323232;
+}
+
+.ffz-no-blue .theatre .converations-list:before,
+.ffz-no-blue.ffz-dark .conversations-list:before {
+ border-color: transparent;
+ border-top-color: #323232;
+}
+
+.ffz-no-blue .theatre .conversations-list:after,
+.ffz-no-blue.ffz-dark .conversations-list:after {
+ border-color: transparent;
+ border-top-color: #191919;
+}
+
+.ffz-no-blue .theatre .conversations-list .conversations-list-header,
+.ffz-no-blue.ffz-dark .conversations-list .conversations-list-header,
+.ffz-no-blue .theatre .conversations-list .conversations-list-item,
+.ffz-no-blue.ffz-dark .conversations-list .conversations-list-item {
+ border-bottom-color: #323232;
+}
+
+.ffz-no-blue .theatre .conversation-header,
+.ffz-no-blue.ffz-dark .conversation-header,
+.ffz-no-blue .theatre .conversation-window.has-focus .conversation-header,
+.ffz-no-blue.ffz-dark .conversation-window.has-focus .conversation-header,
+.ffz-no-blue .theatre .conversations-list .conversations-list-item:hover,
+.ffz-no-blue.ffz-dark .conversations-list .conversations-list-item:hover {
+ background-color: #121212;
+}
+
+/* Following Count */
+
+li[data-name="following"] a {
+ position: relative;
+}
+
+.ffz-follow-count:empty { display: none; }
+
+.ffz-follow-count {
+ display: inline-block;
+ border-radius: 2px;
+ text-align: center;
+ color: #fff;
+}
+
+#header_following .ffz-follow-count {
+ margin: 0 5px;
+ padding: 0 5px;
+ line-height: 20px;
+ background-color: rgba(25,25,25,0.5);
+}
+
+#large_nav .ffz-follow-count,
+.ffz-dark #header_following .ffz-follow-count {
+ background-color: rgba(127,127,127,0.5);
+}
+
+#large_nav .ffz-follow-count {
+ position: absolute;
+ right: 10px;
+ top: 8px;
+
+ line-height: 14px;
+ padding: 2px 5px;
+}
+
+#large_nav .game_filter.selected .ffz-follow-count { right: 13px; }
+
+#small_nav .ffz-follow-count {
+ position: absolute;
+ bottom: 2px;
+ right: 2px;
+ padding: 0 2px;
+ font-size: 10px;
+ background-color: #191919;
+ color: rgba(255,255,255,0.5);
+}
+
+#small_nav .game_filter.selected a .ffz-follow-count,
+#small_nav .content ul li a:hover .ffz-follow-count {
+ background-color: #101014;
+}
+
+#small_nav .game_filter.selected .ffz-follow-count { right: 5px; }
+
+/* Legacy Badges */
+
+.ffz-legacy-mod-badges .ember-chat .badges .moderator,
+.ffz-legacy-badges .ember-chat .badges .moderator {
+ background-color: #068c10;
+ background-image: url('//cdn.frankerfacez.com/script/legacy-mod.png');
+}
+
+.ffz-legacy-badges .ember-chat .badges .staff {
+ background-color: #6441a5;
+ background-image: url('//cdn.frankerfacez.com/script/legacy-staff.png');
+}
+
+.ffz-legacy-badges .ember-chat .badges .broadcaster {
+ background-color: #000;
+ background-image: url('//cdn.frankerfacez.com/script/legacy-broadcaster.png');
+}
+
+.ffz-legacy-badges .ember-chat .badges .admin {
+ background-color: #ff0303;
+ background-image: url('//cdn.frankerfacez.com/script/legacy-admin.png');
+}
+
+.ffz-legacy-turbo-badges .ember-chat .badges .turbo,
+.ffz-legacy-badges .ember-chat .badges .turbo {
+ background-color: #6441a3;
+ background-image: url('//cdn.frankerfacez.com/script/legacy-turbo.png');
+}
+
+/* High Contrast Chat */
+
+.ffz-high-contrast-chat-text .chat-container,
+.ffz-high-contrast-chat-text .ember-chat-container {
+ color: "#000";
+}
+
+.ffz-high-contrast-chat-bg .chat-container,
+.ffz-high-contrast-chat-bg .ember-chat-container {
+ background-color: #fff;
+}
+
+.ffz-high-contrast-chat-bold .ember-chat .chat-messages .chat-line .from,
+.ffz-high-contrast-chat-bold .ember-chat .chat-messages .chat-line .colon,
+.ffz-high-contrast-chat-bold .ember-chat .chat-messages .chat-line .message {
+ font-weight: bold;
+}
+
+/*.ffz-high-contrast-chat .chat-line:before {
+ background-color: transparent !important;
+ border: none !important;
+}*/
+
+.ffz-high-contrast-chat-text .chat-container.dark,
+.ffz-high-contrast-chat-text .chat-container.force-dark,
+.ffz-high-contrast-chat-text .ember-chat-container.dark,
+.ffz-high-contrast-chat-text .ember-chat-container.force-dark,
+.ffz-high-contrast-chat-text .app-main.theatre .chat-container,
+.ffz-high-contrast-chat-text.ffz-dark .ember-chat-container.dark .chat-line,
+.ffz-high-contrast-chat-text.ffz-dark .chat-container.dark .chat-line {
+ color: #fff;
+}
+
+.ffz-high-contrast-chat-bg .chat-container.dark,
+.ffz-high-contrast-chat-bg .chat-container.force-dark,
+.ffz-high-contrast-chat-bg .ember-chat-container.dark,
+.ffz-high-contrast-chat-bg .ember-chat-container.force-dark,
+.ffz-high-contrast-chat-bg .app-main.theatre .chat-container,
+.ffz-high-contrast-chat-bg.ffz-dark .ember-chat-container.dark .chat-line,
+.ffz-high-contrast-chat-bg.ffz-dark .chat-container.dark .chat-line {
+ background-color: #000;
+}
+
+
+/*.ffz-high-contrast-chat .chat-line .mentioned {
+ color: #fff !important;
+ background-color: #000 !important;
+}
+
+.ffz-high-contrast-chat .chat-container.dark .chat-line .mentioned,
+.ffz-high-contrast-chat .chat-container.force-dark .chat-line .mentioned,
+.ffz-high-contrast-chat .ember-chat-container.dark .chat-line .mentioned,
+.ffz-high-contrast-chat .ember-chat-container.force-dark .chat-line .mentioned,
+.ffz-high-contrast-chat .app-main.theatre .chat-container .chat-line .mentioned,
+.ffz-high-contrast-chat.ffz-dark .ember-chat-container.dark .chat-line .chat-line .mentioned,
+.ffz-high-contrast-chat.ffz-dark .chat-container.dark .chat-line .chat-line .mentioned {
+ color: #000 !important;
+ background-color: #fff !important;
+}*/
+
+.ffz-image-hover {
+ border:none;
+ max-width: 186px;
+ max-height: 186px;
+ overflow: hidden;
+}
+
+.emoticon.ffz-image-hover {
+ display: block;
+ margin: 5px auto;
+}
+
+.ffz-yt-thumb {
+ max-height: 90px;
+}
+
+/* Classic Player */
+
+.ffz-classic-player .player .player-video {
+ position: absolute;
+ top: 0; bottom: 32px;
+ left: 0; right: 0;
+}
+
+.ffz-classic-player .player.player-isvod .player-video {
+ bottom: 36px;
+}
+
+.ffz-classic-player .player .player-controls-bottom {
+ opacity: 1;
+
+ padding-top: 0;
+ border-top: 1px solid #000;
+ border-bottom: 1px solid #000;
+
+ background: -webkit-linear-gradient(bottom, #252525, #666);
+ background: linear-gradient(to top, #252525, #666);
+}
+
+.ffz-classic-player .app-main.theatre .player .player-video,
+.ffz-classic-player .player[data-fullscreen="true"] .player-video {
+ bottom: 0;
+}
+
+.ffz-classic-player .app-main.theatre .player .player-controls-bottom,
+.ffz-classic-player .player[data-fullscreen="true"] .player-controls-bottom {
+ margin-bottom: -32px;
+ -webkit-transition: margin-bottom .2s ease-out, padding-bottom .2s ease-out;
+ transition: margin-bottom .2s ease-out, padding-bottom .2s ease-out;
+}
+
+.ffz-classic-player:not(.ffz-top-conversations) .app-main.theatre .player .player-controls-bottom,
+.ffz-classic-player .app-main.theatre .player[data-fullscreen="true"] .player-controls-bottom {
+ padding-bottom: 0;
+}
+
+.ffz-classic-player .app-main.theatre .player.player-isvod .player-controls-bottom,
+.ffz-classic-player .player.player-isvod[data-fullscreen="true"] .player-controls-bottom {
+ margin-bottom: -36px;
+}
+
+.ffz-classic-player .app-main.theatre .player-column:hover .player .player-controls-bottom,
+.ffz-classic-player .app-main.theatre .player-column:focus .player .player-controls-bottom,
+.ffz-classic-player .player[data-fullscreen="true"][data-controls="true"] .player-controls-bottom {
+ margin-bottom: 0;
+}
+
+.ffz-classic-player:not(.ffz-top-conversations) .app-main.theatre .player-column:hover .player[data-fullscreen="false"] .player-controls-bottom {
+ padding-bottom: 40px;
+}
+
+.ffz-classic-player .player .player-button {
+ padding-bottom: 0;
+ height: 30px;
+}
+
+
+.ffz-classic-player .player .player-slider:before,
+.ffz-classic-player .player .player-button,
+.ffz-classic-player .player .player-slider .ui-slider-handle,
+.ffz-classic-player .player .player-seek .player-seek__time {
+ -webkit-filter: drop-shadow(0px 0px 1px #000);
+ filter: drop-shadow(0px 0px 1px #000);
+}
+
+
+.ffz-classic-player .player .player-slider .ui-slider-handle { background-color: #aeaeae; }
+.ffz-classic-player .player .player-button svg { fill: #aeaeae; }
+.ffz-classic-player .player .player-seek .player-seek__time { color: #ddd; }
+
+.ffz-classic-player .player .player-volume__slider-container {
+ width: auto;
+}
+
+
+.ffz-classic-player .player .player-seek {
+ padding: 0;
+}
+
+.ffz-classic-player .player .player-seek .player-slider {
+ margin: -1em 0;
+}
+
+.ffz-classic-player .player .player-seek .player-seek__time-container {
+ position: absolute;
+ bottom: -12px;
+ left: 210px;
+}
+
+.ffz-classic-player .player .player-seek .player-seek__time + .player-seek__time:before {
+ content: "/";
+ padding: 0 5px;
+ opacity: 0.8;
+}
+
+/* Directory Logos */
+
+.ffz-directory-logo .meta p { width: auto; }
+
+.ffz-directory-logo .profile-photo {
+ float: left;
+ height: 46px;
+ width: 46px;
+ margin-right: 10px;
+}
+
+.ffz-directory-logo .profile-photo.is-csgo {
+ margin-bottom: 20px;
+}
+
+/* Flip Dashboard */
+
+.ffz-flip-dashboard #dash_main #controls_column {
+ float: right;
+ margin-left: 20px;
+ margin-right: 0;
+}
+
+.ffz-flip-dashboard #dash_main .dash-chat-column {
+ right: inherit;
+ left: 0;
+ margin-right: 20px;
+}
+
+/* Conversations */
+
+.conversation-preview-line .badges,
+body.ffz-conv-title-clickable .conversation-header span.conversation-header-name,
+body:not(.ffz-conv-title-clickable) .conversation-header a.conversation-header-name { display:none }
+
+.conversation-window.has-unread .conversation-header .conversation-header-name { color: #fff !important; }
+
+.ffz-top-conversations .conversation-window.collapsed .conversation-header,
+.conversations-list .conversations-list-item:last-of-type {
+ border-bottom: none !important;
+}
+
+.ffz-top-conversations .conversations-content .conversations-list-icon,
+.ffz-top-conversations .conversation-window {
+ border-top: 0;
+ border-bottom: 1px solid #dedede;
+}
+
+.ffz-top-conversations.ffz-dark .conversations-content .conversations-list-icon,
+.ffz-top-conversations.ffz-dark .conversation-window,
+.ffz-top-conversations .theatre .conversations-content .conversations-list-icon,
+.ffz-top-conversations .theatre .conversation-window {
+ border-bottom-color: rgba(255,255,255,0.2);
+}
+
+.ffz-top-conversations .conversations-content {
+ left: 30px;
+ right: 30px;
+}
+
+.ffz-top-conversations .conversation-window,
+.ffz-top-conversations .conversations-content {
+ bottom: inherit;
+ top: 0px;
+}
+
+.ffz-top-conversations .conversations-list {
+ bottom: inherit;
+ top: 46px;
+}
+
+.ffz-top-conversations .conversations-list:before,
+.ffz-top-conversations .conversations-list:after {
+ display:none;
+}
+
+.ffz-top-conversations .theatre .player-controls-bottom {
+ padding-bottom: 0;
+}
+
+.ffz-top-conversations .theatre .player-livestatus {
+ top: 40px;
+}
+
+.ffz-top-conversations #directory-list { padding-top: 50px; }
+
+/* Following Page */
+
+.user.item { position: relative; }
+
+.user.item .overlay_info.length {
+ position: absolute;
+ top: 5px;
+ right: 25px;
+ z-index: 1;
+
+ display: inline-block;
+
+ padding: 0 5px;
+ font-size: 11px;
+ line-height: 22px;
+
+ background: black;
+ color: #fff;
+ opacity: 0.75;
+}
+
+.user.item .overlay_info.length svg {
+ float: left;
+ margin: 3px 5px 3px 0;
+}
+
+.user.item .actions .follow svg path,
+.user.item .overlay_info.length svg path { fill: #fff; }
+
+.user.item .actions {
+ margin-top: -15px;
+ margin-bottom: 20px;
+ margin-right: 20px;
+ display: flex;
+ flex-wrap: nowrap;
+}
+
+.user.item .actions button {
+ display: block;
+ font-size: 11px;
+ text-align: center;
+ height: 25px;
+ line-height: 25px;
+}
+
+.user:not(.followed) .actions .follow { width: 100%; }
+
+.user.item .actions .notifications {
+ flex-grow: 1;
+}
+
+.user.item .actions button:hover,
+.user.item .actions .notifications-on {
+ background-color: #6441A5;
+ color: #fff !important;
+}
+
+.user.followed .actions .follow span,
+.user.item:not(.followed) .actions .notifications,
+.user:not(.followed) .actions .follow .svg-unheart,
+.user.followed .actions .follow:not(:hover) .svg-unheart,
+.user.followed .actions .follow:hover .svg-heart { display: none; }
+
+.user.followed .actions .follow {
+ float: left;
+ width: 25px;
+ margin-right: 5px;
+ background-color: #00b132;
+}
+
+.user.followed .actions .follow:hover {
+ background-color: #d44949;
+}
+
+.user.item .actions .follow svg {
+ margin: 4.5px 0 -4.5px -1px;
+}
\ No newline at end of file