Iwara UI Fix

An alternate style for 天音's Iwara 1-Click Filter script, also works as a standalone

// ==UserScript==
// @name         Iwara UI Fix
// @namespace    none
// @version      1.11
// @description  An alternate style for 天音's Iwara 1-Click Filter script, also works as a standalone
// @author       Nothson
// @license      CC BY-NC
// @resource     https://creativecommons.org/licenses/by-nc/4.0/
// @match        https://*.iwara.tv/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

/*
	--- Iwara UI Fix by Nothson : https://iwara.tv/users/Nothson ---

		Mainly for scratching the Iwara's UI/UX itches I have.
		I'm not a senior web dev so plz don't scold me if the code below looks messy to you.

		21 Jul 2020

		- Added fullscreen fit mode button in the video player
			- The button only appears in fullscreen, as a square icon on the bottom right
			- Alternate fit mode fits the video by minimum dimension, good for some videos wider than your screen
			- Do note that this mode doesn't work well with videos with black paddings.
		- Various video player adjustments
			- +20% UI size
			- Loop button size & reordering some buttons
			- Font for floating time texts
			- Colored active toggle buttons (for clarity)
		- Known issue: After loading the page, if you play the video too quickly, the video player isn't properly modified. I'll look into that later.

		19 Jul 2020

		- Fixed video height in fullscreen

		21 Apr 2020

		- Added drop shadow under the profile picture borders
		- Fixed video player size for vertical videos, it should look better in landscape screen/view like desktop monitor
		- Now also clears 1-Click Filter's transparency on hover

		25 Mar 2020

		- Changed external player flair detection (thanks once again, Erono!)
		- Now, the accept/reject all friend requests button should actually work. I just lacked test subjects back then.

		10 Mar 2020

		- On hover, 1-Click Filter's thumbnail background colors are now cleared to white
		- Fixed page number spacing and responsive scaling in forums and forum posts
		- Updated 1-Click Filter style conflict detection

		8 Mar 2020

		- Improved page number styles
		- Added accept/reject all friend requests in friends page (with confirmation dialog)
			- The buttons only appear if there are more than 1 pending request in the page

		4 Mar 2020

		- In the cards (video/image page or sidebar), improved view count and likes formatting (k and M prefix, decimals)

		3 Mar 2020

		- Changed the approach to replace the blank images, there were some corner cases that make errors
		- Added profile picture border for special roles (profile page only) + unique animated border for my own
		- Added script version number at the bottom of the page

		2 Mar 2020

		- Now, this script has conflicts with Iwara 1-Click Filter version 1.6 and newer
			- See the note at the bottom of any Iwara page for the workaround

		1 Mar 2020

		- Added like percentage
		- Polaroid print style for video/image cards
		- Repositioned the card stats & icons
		- Added flairs, shown on the right of the card stats
			- Fire Icon: % like reaches the threshold (based on view count) + 200 views or more
			- Star Icon: % like reaches the threshold + 20k views or more
			- Lock Icon: Private video
			- Grid Icon: Multiple images
			- Screen Icon: External player (YouTube, Vimeo, etc.)
		- Card transitions on hover + extra transitions for some flairs
		- Added block backgrounds on many regions + made paddings and margins consistent
		- Fixed video player seek head
		- Changed forum post timestamp text color
		- Fixed user profile background, user lists (following/followers), and layout
		- Perhaps a few more things I did but couldn't remember, idk

		Expected to run after Erono's Iwara 1-Click Filter Script: https://greasyfork.org/scripts/393957
		However, this script works as a standalone UI fix as well
		Tested on the latest version of Firefox & Chrome, plus responsive
*/

window.addEventListener('load', async function() {
	if (!window.location.href.match('://i.iwara.tv')) {
		let oneClickFilterConflict = document.head.querySelector('#css_custom') || document.head.querySelector('#css_likes') || document.head.querySelector('#css_colors');

		let baseCSS = document.createElement('style');	// Add original CSS rules from 1-Click Filter
		baseCSS.innerHTML = `
			/* fix page */
			body {background-color: #eee;}
			section#content > .container {background-color: #eee; padding: 10px;}
			.container {width: unset;}
			@media (min-width: 1300px) {.container {width: 1300px;}}

			/* fix overflow */
			#block-system-main, .row {margin-left: 0; margin-right: 0;}
			.col-sm-3, .col-sm-6, .col-sm-9, .col-xs-6, .col-sm-12 {padding-left: 0; padding-right: 0;}
			.view-videos .view-content .views-row, .view-images .view-content .views-row {padding-bottom: 0px;}

			/* compact page */
			.view-content .col-sm-3, .view-content .col-sm-6 {width: 50%; float: left;}
			@media (min-width: 768px) {
			.view-content .col-sm-3 {width: 25%;}
			}

			/* card style */
			.node.node-teaser {background-color: #ffffff; border: 1px solid #ccc; border-radius: 4px; padding: 5px; margin: 4px;}
			.node.node-teaser .icon-bg, .node.node-teaser .private-video {width: calc(100% - 10px);}
			.node.node-teaser .icon-bg .likes-icon {filter: drop-shadow(0px 0px 2px #000);}
			.node.node-teaser h3.title {font-size: 1em; line-height: 1em; height: 3em; margin-bottom: 0px; overflow: hidden;}
			.node.node-teaser .username {display: block; white-space: nowrap; overflow: hidden;}
			.node.node-teaser .field-item {min-height: 2em;}
			.node.node-video .content {margin: 4px;}
			.sidebar .block.block-views,
			.sidebar .block.block-facetapi,
			.sidebar .block.block-mainblocks   {background-color: #fafafa; border: 1px solid #ccc; border-radius: 4px; padding: 8px; margin: 4px 4px 8px 4px;}
			.sidebar .node.node-sidebar_teaser {background-color: #ffffff; border: 1px solid #ccc; border-radius: 2px; padding: 4px; margin: 2px;}
			.sidebar .node.node-sidebar_teaser .icon-bg, .node.node-sidebar_teaser .private-video {width: calc(100% - 8px);}
			.sidebar .node.node-sidebar_teaser .icon-bg .likes-icon {filter: drop-shadow(0px 0px 2px #000);}
			.item-list ul.pager li {margin: 0; padding: 0;}
			.item-list ul.pager li.pager-current,
			.item-list ul.pager li.pager-ellipsis,
			.item-list ul.pager li > a {background: #fafafa; border: 1px solid #ccc; border-radius: 8px; padding: 4px 16px; margin: 0px; display: inline-block;}

			/* video style for external link (youtube) */
			/*
			.node.node-teaser .field-type-video-embed-field {border: 4px solid #c33; background-color: #000;}
			.node.node-teaser .field-type-video-embed-field .field-items {overflow: hidden;}
			.node.node-teaser .field-type-video-embed-field .field-items .field-item {margin: -4px;}
			*/

			/* image style in subscriptions page */
			.view-subscriptions .field-type-image {border: 1px solid #ccc; background-color: #fff; padding: 5px;}
			.view-subscriptions .field-type-image .field-items {overflow: hidden;}
			.view-subscriptions .field-type-image .field-items .field-item {margin: -6px;}

			/* search and playist */
			.node-wide_teaser {background-color: #fafafa; border: 1px solid #ccc; border-radius: 4px; padding: 4px; margin: 4px;}
			.node-wide_teaser {width: unset; word-break: break-all; min-height: 170px;}
			.node-wide_teaser .col-sm-2 {width: 230px; padding: 4px;}
			.node-wide_teaser .col-sm-10 {width: calc(100% - 230px); padding: 4px;}
			.node-wide_teaser .field-name-field-video {border: 1px solid #999;}
			.node-wide_teaser .field-name-field-video-url {border: 1px solid #999; position: absolute; top: 0px; left: -230px; margin: 4px;}
			@media (max-width: 768px) {.node-wide_teaser .field-name-field-video-url {display: none;}}
			.node-wide_teaser .field-name-field-images .field-item {display: unset;}
			.node-wide_teaser .field-name-field-images .field-item > a > img {width: calc(100%/3 - 8px); border: 1px solid #aaa; padding: 4px; margin: 4px;}
			.node-wide_teaser .field-name-field-images .field-item > video {width: calc(100%/1 - 8px); margin: 4px; border: 1px solid #aaa; padding: 4px; height: auto;}
			.node-wide_teaser .node-info {padding: 4px;}
			.node-wide_teaser .node-info .submitted {display: inline-block; width: 100%;}
			.node-wide_teaser .node-info .submitted h1.title {font-size: 28px; position: unset; margin: unset;}
			ul.facetapi-facetapi-tagcloud li > a {white-space: normal;}
			ul.facetapi-facetapi-tagcloud .element-invisible {display: none;}

			/* footer */
			#wrapper {margin-bottom: unset; padding-bottom: unset;}
			footer {height: unset;}
			footer .block {width: 25%; float: left;}
			footer .block.block-forum {width: 50%;}
			footer .copyright {float: unset;}

			/* video player */
			/* expand volume and seekbar height */
			.video-js .vjs-volume-bar {margin: 1em 0em;}
			.video-js .vjs-volume-bar.vjs-slider-horizontal, .video-js .vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level {height: 1em;}
			.video-js .vjs-progress-holder, .video-js .vjs-progress-holder .vjs-load-progress, .video-js .vjs-progress-holder .vjs-play-progress {height: 0.7em;}
		`;
		baseCSS.id = 'xtension-base-css';
		document.head.appendChild(baseCSS);

		let cards = document.querySelectorAll('.node-teaser, .node-sidebar_teaser');
		let styleOverride = document.createElement('style');
		styleOverride.id = 'xtension-css';

		function logn (val, base) {
			return Math.log(val) / Math.log(base);
		}

		function kilo2Number (text) {
			if (text.match('k') == null) {
				return {value: parseInt(text), isKilo: false};
			}
			else {
				return {value: parseFloat(text.replace('k', '')) * 1000, isKilo: true};
			}
		}

		function number2Prefixed(value) {
			if (value < 999) {
				return value;
			}
			else if (value < 99999) {
				return (value / 1000).toFixed(1) + 'k';
			}
			else if (value < 999999) {
				return Math.floor(value / 1000) + 'k';
			}
			else {
				return (value / 1000000).toFixed(1) + 'M';
			}
		}

		function getFlair (viewCount, likePercentage, card) {
			if (card.querySelector('.private-video')) {
				return 'lock';
			}
			else if (card.querySelector('.field-type-video-embed-field')) {
				return 'share';
			}
			else {
				let likeThreshold = 8 - logn(viewCount, 6);
				if (viewCount < 200) {
					return '';
				}
				else if (viewCount < 20000) {
					return (likePercentage > likeThreshold) ? 'fire' : '';
				}
				else {
					return (likePercentage > likeThreshold) ? 'star' : '';
				}
			}
		}

		// HTML Mod
		cards.forEach(card => {
			let icons = card.querySelector('.icon-bg');
			if (icons) {	// Rearrange stat icons, add like percentage and flairs
				if ((card.className.match('node-sidebar_teaser') && card.children.length > 1) || card.children.length > 3) {
					card.insertBefore(icons, card.children[2]);
				}
				else {
					card.insertBefore(icons, card.children[1]);
				}
				if (card.className.match('node-image') && icons.children.length == 3) {
						icons.appendChild(icons.children[1]);
						icons.appendChild(icons.children[0]);
				}
				else if (icons.children.length == 2) {
					icons.appendChild(icons.children[0]);
				}

				let likeNode = icons.querySelector('.glyphicon-heart');
				if (likeNode && !(card.className.match('node-image') && card.className.match('node-sidebar_teaser'))) {
					likeNode = likeNode.nextSibling;
					let viewNode = icons.querySelector('.glyphicon-eye-open').nextSibling;
					let viewNodeTxt = viewNode.wholeText.trim();
					let likeNodeTxt = likeNode.wholeText.trim();
					let like = kilo2Number(likeNodeTxt);
					let viewCount = kilo2Number(viewNodeTxt);
					let likePercentage = (viewCount == 0) ? 0 : parseFloat(like.value / viewCount.value * 100).toFixed(2);
					viewNode.parentElement.setAttribute('title', viewNodeTxt);
					viewNode.nodeValue = ' ' + number2Prefixed(viewCount.value);
					if (likeNode) {
						likeNode.parentElement.setAttribute('title', likeNodeTxt);
						likeNode.nodeValue = ' ' + number2Prefixed(like.value);
					}
					if (!card.className.match('node-sidebar_teaser')) {
						let likePercentageHTML = document.createElement('div');
						likePercentageHTML.className += 'right-icon likes-icon like-percentage';
						if (like.isKilo || viewCount.isKilo) {
							likePercentageHTML.innerText = '(~' + likePercentage + '%)';
						}
						else {
							likePercentageHTML.innerText = '(' + likePercentage + '%)';
						}
						likeNode.parentElement.parentElement.appendChild(likePercentageHTML);
					}
					if (card.className.match('node-video')) {
						let flair = getFlair(viewCount.value, likePercentage, card);
						if (flair) {
							card.className += ' flair-' + flair;
							let flairNode = document.createElement('div');
							flairNode.setAttribute('class', 'left-icon flair-icon');
							flairNode.innerHTML = '<i class="glyphicon glyphicon-' + flair + '" title="Flair"></i>';
							icons.appendChild(flairNode);
						}
					}
				}
			}
			else {
				let blankFooter = document.createElement('div');
				blankFooter.setAttribute('class', 'icon-bg');
				card.appendChild(blankFooter);
			}

			let thumbnail = card.querySelector('a > img');
			if (!thumbnail) {	// Fix inconsistent height of the cards with no thumbnail
				let imgArea = card.firstElementChild;
				let title = card.querySelector('h3.title > a');
				if (!title) {
					title = card.querySelector('.field-item > a');
				}
				let url = (title) ? title.getAttribute('href') : '';
				imgArea.innerHTML = '<div class="field blankimg"><div class="field-items"><div class="field-item"><a' +
					(url ? ' href="' + url + '"' : '') +
					(title ? ' title="' + title.innerText + '"' : '') +
					'>' + 
					(card.className.match('node-sidebar_teaser') ? '<img width="141" height="84"></img>' : '<img width="220" height="150"></img>') +
					'</a></div></div></div>';
			}
		});

		let contentInfo = document.querySelector('body.node-type-video .node.node-video .node-info .node-views, body.node-type-image .node.node-image .node-info .node-views');
		if (contentInfo) {	// Add like percentage for a video/image page
			let heartIcon = contentInfo.querySelector('.glyphicon.glyphicon-heart');
			if (heartIcon) {
				let eyeIcon = contentInfo.querySelector('.glyphicon.glyphicon-eye-open');
				let viewCount = parseInt(eyeIcon.nextSibling.nodeValue.replace(/,/g, ''));
				let like = parseInt(heartIcon.nextSibling.nodeValue.replace(/,/g, ''));
				let likePercentage = (viewCount == 0) ? 0 : parseFloat(like / viewCount * 100).toFixed(4);
				heartIcon.nextSibling.nodeValue = ' ' + like + ' (' + likePercentage + '%)';
				contentInfo.appendChild(contentInfo.querySelector('.glyphicon.glyphicon-heart'));
				contentInfo.appendChild(contentInfo.querySelector('.glyphicon.glyphicon-eye-open').previousSibling);
			}
		}

		let copyrightNode = document.querySelector('footer .copyright');
		if (copyrightNode) {	// Add script credits
			let innerHTMLExt = '<br><u><b><a href="https://greasyfork.org/en/scripts/397126">Iwara UI Fix</a></b></u> version ' + GM_info.script.version + ' by <u><b><a href="/users/nothson">Nothson</a></b></u><br><b>Note:</b> <u><b><a href="/images/iwara-1-click-filter">Iwara 1-Click Filter</a></b></u>\'s <b>User Style</b> and/or <b>Like Colors</b> are enabled. Disable them in the in-page settings, then refresh to prevent style conflict.';
			if (!oneClickFilterConflict) {
				innerHTMLExt = '<br><u><b><a href="https://greasyfork.org/en/scripts/397126">Iwara UI Fix</a></b></u> version ' + GM_info.script.version + ' by <u><b><a href="/users/nothson">Nothson</a></b></u><br><i>Based on CSS rules from <u><b><a href="/images/iwara-1-click-filter">Iwara 1-Click Filter</a></b></u> (version 1.5) by <u><b><a href="/users/erono">Erono</a></b></u></i>.';
			}
			copyrightNode.innerHTML = copyrightNode.firstChild.nodeValue + innerHTMLExt;
		}

		let addForumCommentElement = document.querySelectorAll('#forum-comments h2.comment-form, #forum-comments noscript, #forum-comments #comment-form');
		if (addForumCommentElement.length > 0) {	// Wrap forum's "Add new comment" section in a block
			let commentBlock = document.createElement('div');
			commentBlock.id = 'add-forum-comment-block';
			addForumCommentElement.forEach(elem => {
				commentBlock.appendChild(elem);
			});
			document.getElementById('forum-comments').appendChild(commentBlock);
		}

		let creatorProfileCard = document.querySelector('body.page-user.page-user- #block-views-profile-block .field-content');
		if (creatorProfileCard) {
			if (document.body.className.match('page-user-603563')) {	// My special profile pic border + tooltip
				creatorProfileCard.innerHTML = creatorProfileCard.innerHTML + creatorProfileCard.innerHTML + creatorProfileCard.innerHTML + creatorProfileCard.innerHTML + creatorProfileCard.innerHTML + creatorProfileCard.innerHTML + creatorProfileCard.innerHTML;
				creatorProfileCard.children[5].setAttribute('src', 'https://i.imgur.com/fQZC1bB.png');
				creatorProfileCard.setAttribute('title', 'The creator of "Iwara UI Fix"');
			}
			else {	// User role profile pic border
				let role = document.querySelector('body.page-user.page-user- #content div.content > div.profile > div:last-child > ul > li');
				if (role) {
					switch (role.innerText) {
						case 'administrator':
							creatorProfileCard.className += ' role-admin';
							creatorProfileCard.setAttribute('title', 'Administrator');
							break;
						case 'moderator':
							creatorProfileCard.className += ' role-mod';
							creatorProfileCard.setAttribute('title', 'Moderator');
							break;
					}
					role = role.parentElement.parentElement;
					role.parentElement.removeChild(role);
				}
			}
		}
		
		let friendsList = document.querySelector('body.page-user-friends table.table');
		if (friendsList) {	// Accept/reject all friends buttons
			let acceptReqButton = friendsList.querySelectorAll('tr.warning button[data-original-title="Accept"]');
			let rejectReqButton = friendsList.querySelectorAll('tr.warning button[data-original-title="Reject"]');
			let doAllReqButtonsArea = null;
			if (acceptReqButton.length > 1) {
				doAllReqButtonsArea = friendsList.querySelector('tr:first-child th:last-child');
				doAllReqButtonsArea.innerHTML = '<button id="accept-all-friends" class="btn btn-xs btn-success accept-friend" title="Accept all pending requests"><span class="glyphicon glyphicon-ok"></span><span class="glyphicon glyphicon-ok"></span></button><button id="reject-all-friends" class="btn btn-xs btn-danger remove-friend" title="Reject all pending requests"><span class="glyphicon glyphicon-remove"></span><span class="glyphicon glyphicon-remove"></span></button>';
				document.getElementById('accept-all-friends').addEventListener('click', function acceptAllFriends () {
					if (confirm("Accept all pending friend requests?")) {
						while (doAllReqButtonsArea.lastElementChild) {
							doAllReqButtonsArea.removeChild(doAllReqButtonsArea.lastElementChild);
						}
						acceptReqButton.forEach(e => {e.click();});
					}
				}, false);
				document.getElementById('reject-all-friends').addEventListener('click', function rejectAllFriends () {
					if (confirm("Reject all pending friend requests?")) {
						while (doAllReqButtonsArea.lastElementChild) {
							doAllReqButtonsArea.removeChild(doAllReqButtonsArea.lastElementChild);
						}
						rejectReqButton.forEach(e => {e.click();});
					}
				}, false);
			}
		}

		document.addEventListener('click', function modifyVideoPlayer (event) {
			let videoPlayerRoot = document.querySelector('#video-player.video-js');
			if (
				videoPlayerRoot &&
				(event.target.className.match('vjs-big-play-button') || event.target.className.match('vjs-poster'))
			) {
				document.removeEventListener('click', modifyVideoPlayer);
				let videoControlBar = videoPlayerRoot.querySelector('.vjs-control-bar');

				// Fix replay button HTML structure (which makes the size inconsistent), along with reordering it
				let videoResButton = videoControlBar.querySelector('.vjs-resolution-button');
				let videoFullscreenButton = videoControlBar.querySelector('.vjs-fullscreen-control');
				let videoReplayButton = videoControlBar.querySelector('.vjs-loop-button');
				if (videoReplayButton) {
					videoReplayButton.innerHTML = '';
					videoReplayButton.className = 'vjs-icon-replay vjs-control vjs-button';
				}
				videoControlBar.insertBefore(videoReplayButton, videoResButton);

				// Add toggle fullscreen fit mode button to the video player
				let videoFitButton = document.createElement('button');
				videoFitButton.className = 'vjs-icon-square vjs-control vjs-button';
				videoFitButton.setAttribute('type', 'button');
				videoFitButton.setAttribute('aria-live', 'polite');
				videoFitButton.innerHTML = '<span class="vjs-control-text">Fullscreen Fit Mode</span>';
				videoControlBar.insertBefore(videoFitButton, videoFullscreenButton);
				videoFitButton.addEventListener ('click', function toggleVideoFitMode () {
					if (videoPlayerRoot.className.match('alt-fit')) {
						videoPlayerRoot.className = videoPlayerRoot.className.replace(' alt-fit', '');
						videoFitButton.className = videoFitButton.className.replace(' vjs-control-active', '');
					}
					else {
						videoPlayerRoot.className += ' alt-fit';
						videoFitButton.className += ' vjs-control-active';
					}
				}, false);
			}
		}, false);

		// CSS Override
		styleOverride.innerHTML += `
			.node.node-teaser,
			.node.node-sidebar_teaser,
			.node.node-teaser i,
			.node.node-sidebar_teaser i,
			.node.node-teaser img,
			.node.node-sidebar_teaser img {
				transition: 0.15s!important;
			}

			/*
			.node.node-teaser img,
			.node.node-sidebar_teaser img {
				filter: contrast(0)!important;
			}
			*/

			.node.node-teaser h3.title,
			.node.node-sidebar_teaser h3.title {
				height: auto!important;
				white-space: nowrap!important;
				text-overflow: ellipsis!important;
			}

			.node.node-teaser:hover,
			.node.node-sidebar_teaser:hover {
				background: #fff;
				opacity: 1!important;
				box-shadow: 3pt 12pt 12pt -6pt #0004;
				transform: rotate3d(0.9, -0.1, 0.1, 3deg) scale(1.02);
				z-index: 42;
			}

			.node.node-teaser.flair-fire:hover,
			.node.node-sidebar_teaser.flair-fire:hover {
				transform: rotate3d(0.9, -0.1, 0.1, -4.5deg) scale(1.02);
				border-color: #f40a;
			}

			.node.node-teaser.flair-star:hover,
			.node.node-sidebar_teaser.flair-star:hover {
				transform: rotate3d(-0.9, 0.1, -0.2, 4.5deg) scale(1.04);
				filter: drop-shadow(-0.2em -0.2em 2em #ffe8);
				outline: 0.32em solid #fe8;
				border: 0;
				border-radius: 0;
			}

			.views-responsive-grid.views-responsive-grid-horizontal.views-columns-2 > * {
				margin-bottom: 0;
			}

			.node.node-teaser .icon-bg,
			.node.node-sidebar_teaser .icon-bg {
				width: 100%!important;
				position: unset;
				margin-top: 0.4em;
				padding: 0;
			}

			.node.node-sidebar_teaser .icon-bg {
				min-height: 1.35em;
			}

			.node:hover .icon-bg {
				background: unset!important;
			}

			.node.node-teaser .left-icon,
			.node.node-sidebar_teaser .left-icon {
				color: inherit;
				margin-left: 0.1em;
				font-size: 0.8em;
				filter: unset!important;

			}

			.node.node-teaser .right-icon,
			.node.node-sidebar_teaser .right-icon {
				float: left!important;
				color: inherit;
				margin-left: 0.5em;
				font-size: 0.8em;
				filter: unset!important;
			}

			.node-image.node-sidebar_teaser .right-icon:first-of-type {
				margin-left: 0;
			}

			.node.node-teaser .left-icon.multiple-icon,
			.node.node-sidebar_teaser .left-icon.multiple-icon {
				float: right!important;
				color: inherit;
				margin-left: 0.5em;
				font-size: 0.8em;
				filter: unset!important;
			}

			.node.node-teaser .left-icon.flair-icon,
			.node.node-sidebar_teaser .left-icon.flair-icon {
				float: right!important;
				color: inherit;
				margin-right: 0.1em;
				font-size: 0.8em;
				filter: unset!important;
			}

			.node.node-teaser .right-icon.like-percentage,
			.node.node-sidebar_teaser .right-icon.like-percentage {
				margin-left: 0.3em;
			}
			
			.right-icon.ratio-icon {
				display: none;
			}

			.node.node-teaser h3.title {
				width: 100%;
				height: 2em;
			}

			.node.node-teaser.flair-lock:hover [title="Flair"],
			.node.node-sidebar_teaser.flair-lock:hover [title="Flair"] {
				color: #bbbf;
			}

			.node.node-teaser.flair-fire:hover [title="Flair"],
			.node.node-sidebar_teaser.flair-fire:hover [title="Flair"] {
				color: #f40f;
				filter: drop-shadow(0.12em -0.16em 0 #f806) drop-shadow(-0.12em -0.04em 0.06em #fd08);
			}

			.node.node-teaser.flair-star:hover [title="Flair"] {
				color: #fd4f;
				transform: rotate(18deg) scale(3.2);
				filter: drop-shadow(1pt 0.5pt 0.5pt #0002) drop-shadow(-0.04em -0.04em 0.1em #ffd8) drop-shadow(0.08em 0.08em 0.02em #fb0f);
			}

			.node.node-sidebar_teaser.flair-star:hover [title="Flair"] {
				color: #fd4f;
				transform: rotate(18deg) scale(2.4);
				filter: drop-shadow(1pt 0.5pt 0.5pt #0002) drop-shadow(-0.04em -0.04em 0.1em #ffd8) drop-shadow(0.12em 0.12em 0.01em #fb0f);
			}

			.node.node-video.node-teaser.flair-lock:hover > div > div div > a > img,
			.node.node-video.node-sidebar_teaser.flair-lock:hover > div div > div > a > img {
				filter: grayscale(1);
			}

			.node.node-video.node-teaser.flair-fire:hover > div > div div > a > img,
			.node.node-video.node-sidebar_teaser.flair-fire:hover > div > div div > a > img {
				filter: sepia(0.3) contrast(1.25) hue-rotate(-15deg) saturate(1.25);
			}

			.node.node-video.node-teaser.flair-star:hover > div > div div > a > img,
			.node.node-video.node-sidebar_teaser.flair-star:hover > div > div div > a > img {
				filter: sepia(0.5) brightness(1.1) contrast(1.25) saturate(1.5);
			}

			.node.node-teaser .blankimg,
			.node.node-sidebar_teaser .blankimg {
				display: block;
				border: #ccc 0.5pt dashed;
			}

			.node.node-teaser .blankimg a,
			.node.node-sidebar_teaser .blankimg a {
				filter: opacity(0);
			}

			.node-video.node-full .video-js .vjs-poster, .node-video.node-full video .vjs-poster {
				background-size: contain;
			}

			.node-video.node-full .video-js, .node-video.node-full video {
				max-height: 90vh;
			}

			.node-video.node-full .vjs-fullscreen video {
				max-height: unset;
			}

			.node-video.node-full .vjs-fullscreen.alt-fit video {
				object-fit: cover;
			}

			#video-player.video-js > .vjs-control-bar {
				font-size: 1.2em;
			}

			.video-js .vjs-play-progress:before {
				top: -56%;
				color: #fffd;
				font-size: 1.4em;
				box-shadow: 0 8pt 8pt -4pt #0006;
			}

			.video-js .vjs-volume-level:before {
				display: none;
			}

			#video-player.video-js > .vjs-control-bar > .vjs-icon-square {
				display: none;
			}

			#video-player.video-js.vjs-fullscreen > .vjs-control-bar > .vjs-icon-square {
				display: inline-block;
			}

			.video-js .vjs-fullscreen-control {
				transform: scale(1.25);
			}

			.video-js button.vjs-control-active {
				color: #8bcba1;
			}

			.video-js div.vjs-mouse-display, .video-js div.vjs-play-progress {
				font-family: inherit;
			}

			.vjs-play-progress::before {
				font-family: VideoJS;
			}

			body.front #wrapper > section > .container,
			body.page-node-add form,
			body.page-node-edit form,
			body.page-user-friends #content > .container,
			body.page-user-liked #content > .container,
			body.page-subscriptions #content > .container,
			body.page-my-content #content > .container,
			body.page-messages #content > .container,
			body.page-user-edit form,
			body.page-comment #content > .container,
			body.page-forum #content > .container,
			body.node-type-video .node.node-video > .content,
			body.node-type-image .node.node-image > .content,
			#comments,
			#add-forum-comment-block,
			.region.region-content .view-id-profile,
			.node.node-journal,
			[class*="block-views"],
			.sidebar .block.block-facetapi,
			.sidebar .block.block-mainblocks,
			.region.region-sidebar .extra-content-block {
				background-color: #fafafa;
				border: 1px solid #ccc;
				border-radius: 4px!important;
				padding: 0.8em!important;
				margin: 0.5em 0.5em 1em 0.5em!important;
			}

			body.page-user #content {
				background-attachment: fixed;
			}

			body.page-user- #content > .container {
				background-color: #eee8;
			}

			body.page-user [class*="block-views"],
			body.page-user .sidebar .block.block-views,
			#block-mainblocks-user-connect,
			body.page-user #comments {
				background-color: #fafafad0;
			}

			body.page-user.page-user- #block-views-profile-block .field-content.role-admin > img {
				border: #f88 6pt solid;
				filter: drop-shadow(2pt 2pt 2pt #c444);
			}

			body.page-user.page-user- #block-views-profile-block .field-content.role-mod > img {
				border: #8af 6pt solid;
				filter: drop-shadow(2pt 2pt 2pt #48c4);
			}

			body.page-node-add form,
			body.page-node-edit form {
				background-color: #ffffff;
			}

			body.front #wrapper > section > .container,
			body.page-user-friends #content > .container,
			body.page-user-liked #content > .container,
			body.page-subscriptions #content > .container,
			body.page-my-content #content > .container,
			body.page-messages #content > .container,
			body.page-user-edit form,
			body.page-comment #content > .container,
			body.page-forum #content > .container {
				margin-left: auto!important;
				margin-right: auto!important;
			}
			
			body.page-user-friends tr:first-child th:last-child {
				text-align: right;
			}

			body.page-user-friends #accept-all-friends,
			body.page-user-friends #reject-all-friends {
				position: relative;
			}

			body.page-user-friends #reject-all-friends {
				margin-left: 4px;
			}

			body.page-user-friends #accept-all-friends span:first-child {
				transform: translateX(-3px);
				filter: drop-shadow(3px 0 0 #2ecc71);
				z-index: 1;
			}

			body.page-user-friends #reject-all-friends span:first-child {
				transform: translateX(-3px);
				filter: drop-shadow(3px 0 0 #e74c3c);
				z-index: 1;
			}

			body.page-user-friends #accept-all-friends span:last-child,
			body.page-user-friends #reject-all-friends span:last-child {
				position: absolute;
				top: 29%;
				left: 40%;
				color: #fffa;
			}

			body.page-forum #content > .container .panel-group > * {
				margin-top: 1em;
			}

			body.node-type-video .node.node-video .node-info .node-views .glyphicon.glyphicon-heart,
			body.node-type-image .node.node-image .node-info .node-views .glyphicon.glyphicon-heart {
				margin-left: 0.5em;
			}

			.node.node-wide_teaser {
				padding: 0.8em!important;
				margin: 0.5em 0.5em 1em 0.5em!important;
			}

			.forum-post {
				margin: 0.5em 0.5em 1em 0.5em!important;
			}

			.forum-post > .panel-heading > .text-muted {
				color: #0008;
			}

			body.node-type-video .node.node-video > .content,
			body.node-type-image .node.node-image > .content {
				padding: 0!important;
			}

			body.node-type-video .node.node-video > .content > .node-buttons,
			body.node-type-image .node.node-image > .content > .node-buttons {
				margin-bottom: 0;
			}

			body.node-type-video .node.node-video > .content > .well {
				max-width: 100%!important;
				margin: 0;
			}

			.node-journal #comments {
				border: unset;
			}

			.view-profile.view-display-id-block {
				background-color: unset;
				padding: unset;
				box-shadow: unset;
			}

			#block-views-profile-block {
				background-color: #fafafa;
				box-shadow: 2pt 8pt 8pt -4pt #0004;
			}

			.region.region-sidebar .view-id-profile .views-responsive-grid > .views-row > div img,
			.region.region-content .view-id-profile .views-responsive-grid > .views-row > div img {
				border-radius: 50%;
				overflow: hidden;
				border: #0001 0.2em solid;
			}

			h1 {
				padding: 0.25em;
				margin: 0;
			}

			#comments > h2.title {
				padding: 0.4em;
				margin-bottom: 0.8em;
			}

			#add-forum-comment-block > h2,
			.extra-content-block {
				padding: 0.6em 0;
			}

			.region.region-sidebar .extra-content-block {
				background-color: #0000;
				border: 0;
				overflow: hidden;
			}

			.region.region-sidebar .extra-content-block iframe {
				transform: translateX(-8.75pt);
			}

			.extra-content-block > center + br,
			body.node-type-video #block-extra-content-extra-content-block-5, 
			body.node-type-video #block-extra-content-extra-content-block-8 {
				display: none;
			}

			.pager {
				border-top: 0;
			}

			#forum > div.view > div.row:first-of-type > div:first-of-type,
			#forum > div.view > div.row:nth-of-type(3) > div:first-of-type {
				width: unset;
				float: left;
				margin: 1.25em 0;
			}

			#forum > div.view > div.row:first-of-type > div:last-of-type,
			#forum > div.view > div.row:nth-of-type(3) > div:last-of-type {
				width: unset;
				float: right;
			}

			.forum-node-create-links {
				width: unset;
			}

			#forum .pager {
				text-align: right;
			}

			#forum-comments .pager li {
				margin: unset;
				padding: unset;
			}

			div.item-list ul.pager > li,
			div.item-list ul.pager > li.pager-current,
			div.item-list ul.pager > li.pager-ellipsis,
			div.item-list ul.pager > li > a {
				margin: 0.2em 0;
				padding: 0;
				border: 0.05em #0000 solid;
				transition: 0.15s;
			}

			div.item-list ul.pager > li > a,
			div.item-list ul.pager > li.pager-current,
			div.item-list ul.pager > li.pager-ellipsis {
				border-radius: 1em;
				padding: 0 0.6em;
				border: 0.05em #0002 solid;
			}

			div.item-list ul.pager > li.pager-ellipsis {
				border: 0.05em #0000 solid;
				background: #0000;
			}

			div.item-list ul.pager > li.pager-current,
			#forum-comments div.item-list ul.pager > li.pager-current {
				border: 0.05em #16a085c0 solid;
				margin: 0 0.1em;
				padding: 0 0.6em;
				background: #16a085c0;
				color: #fafafa;
			}

			div.item-list ul.pager > li > a:hover {
				border: 0.05em solid;
			}

			body.page-user-603563 #block-views-profile-block .field-content {
				position: relative;
				filter: drop-shadow(0.1em 0.3em 0.4em #0002);
			}

			body.page-user-603563 #block-views-profile-block .field-content > img {
				width: 75%;
				margin: 3%;
				transform-origin: 48%;
				border: 0;
				border-radius: 0;
				clip-path: circle(50% at center);
			}

			body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(1) {
				position: absolute;
				filter: contrast(0) brightness(0);
				transform: scale(1.05);
			}

			body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(2) {
				position: absolute;
				filter: contrast(0) sepia(1) saturate(3) brightness(1.7);
				animation: special-border 3.7s infinite linear;
			}

			body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(3) {
				position: absolute;
				filter: contrast(0) sepia(1) saturate(7) brightness(1.5) hue-rotate(120deg);
				animation: special-border 1.2s -0.41s infinite linear;
			}

			body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(4) {
				position: absolute;
				filter: contrast(0) sepia(1) saturate(7) brightness(1.2) hue-rotate(240deg);
				animation: special-border 2.5s -0.83s infinite linear;
			}

			body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(5) {
				position: absolute;
				filter: contrast(0) brightness(2);
				animation: special-border 0.7s -0.24s infinite linear;
			}

			body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(6) {
				position: absolute;
			}

			body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(7) {
				visibility: hidden;
			}

			@keyframes special-border {
				0% {transform: translate(2%, 0) rotateZ(40deg) scale(1.03);}
				100% {transform: translate(2%, 0) rotateZ(400deg) scale(1.03);}
			}
			`;
		document.head.appendChild(styleOverride);
	}
}, true);