Iwara UI Fix

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

As of 2020-04-21. See the latest version.

  1. // ==UserScript==
  2. // @name Iwara UI Fix
  3. // @namespace none
  4. // @version 1.10
  5. // @description An alternate style for 天音's Iwara 1-Click Filter script, also works as a standalone
  6. // @author Nothson
  7. // @license CC BY-NC
  8. // @resource https://creativecommons.org/licenses/by-nc/4.0/
  9. // @match https://*.iwara.tv/*
  10. // @grant none
  11. // @run-at document-start
  12. // ==/UserScript==
  13.  
  14. /*
  15. --- Iwara UI Fix by Nothson : https://iwara.tv/users/Nothson ---
  16.  
  17. Mainly for scratching the Iwara's UI/UX itches I have.
  18. I'm not a senior web dev so plz don't scold me if the code below looks messy to you.
  19.  
  20. 21 Apr 2020
  21.  
  22. - Added drop shadow under the profile picture borders.
  23. - Fixed video player size for vertical videos, it should look better in landscape screen/view.
  24. - Now also clears 1-Click Filter's transparency on hover
  25.  
  26. 25 Mar 2020
  27.  
  28. - Changed external player flair detection (thanks once again, Erono!)
  29. - Now, the accept/reject all friend requests button should actually work. I just lacked test subjects back then.
  30.  
  31. 10 Mar 2020
  32.  
  33. - On hover, 1-Click Filter's thumbnail background colors are now cleared to white
  34. - Fixed page number spacing and responsive scaling in forums and forum posts
  35. - Updated 1-Click Filter style conflict detection
  36.  
  37. 8 Mar 2020
  38.  
  39. - Improved page number styles
  40. - Added accept/reject all friend requests in friends page (with confirmation dialog)
  41. - The buttons only appear if there are more than 1 pending request in the page
  42.  
  43. 4 Mar 2020
  44.  
  45. - In the cards (video/image page or sidebar), improved view count and likes formatting (k and M prefix, decimals)
  46.  
  47. 3 Mar 2020
  48.  
  49. - Changed the approach to replace the blank images, there were some corner cases that make errors
  50. - Added profile picture border for special roles (profile page only) + unique animated border for my own
  51. - Added script version number at the bottom of the page
  52.  
  53. 2 Mar 2020
  54.  
  55. - Now, this script has conflicts with Iwara 1-Click Filter version 1.6 and newer
  56. - See the note at the bottom of any Iwara page for the workaround
  57.  
  58. 1 Mar 2020
  59.  
  60. - Added like percentage
  61. - Polaroid print style for video/image cards
  62. - Repositioned the card stats & icons
  63. - Added flairs, shown on the right of the card stats
  64. - Fire Icon: % like reaches the threshold (based on view count) + 200 views or more
  65. - Star Icon: % like reaches the threshold + 20k views or more
  66. - Lock Icon: Private video
  67. - Grid Icon: Multiple images
  68. - Screen Icon: External player (YouTube, Vimeo, etc.)
  69. - Card transitions on hover + extra transitions for some flairs
  70. - Added block backgrounds on many regions + made paddings and margins consistent
  71. - Fixed video player seek head
  72. - Changed forum post timestamp text color
  73. - Fixed user profile background, user lists (following/followers), and layout
  74. - Perhaps a few more things I did but couldn't remember, idk
  75.  
  76. Expected to run after Erono's Iwara 1-Click Filter Script: https://greasyfork.org/scripts/393957
  77. However, this script works as a standalone UI fix as well
  78. Tested on the latest version of Firefox & Chrome, plus responsive
  79. */
  80.  
  81. window.addEventListener('load', async function() {
  82. if (!window.location.href.match('://i.iwara.tv')) {
  83. let oneClickFilterConflict = document.head.querySelector('#css_custom') || document.head.querySelector('#css_likes') || document.head.querySelector('#css_colors');
  84.  
  85. let baseCSS = document.createElement('style'); // Add original CSS rules from 1-Click Filter
  86. baseCSS.innerHTML = `
  87. /* fix page */
  88. body {background-color: #eee;}
  89. section#content > .container {background-color: #eee; padding: 10px;}
  90. .container {width: unset;}
  91. @media (min-width: 1300px) {.container {width: 1300px;}}
  92.  
  93. /* fix overflow */
  94. #block-system-main, .row {margin-left: 0; margin-right: 0;}
  95. .col-sm-3, .col-sm-6, .col-sm-9, .col-xs-6, .col-sm-12 {padding-left: 0; padding-right: 0;}
  96. .view-videos .view-content .views-row, .view-images .view-content .views-row {padding-bottom: 0px;}
  97.  
  98. /* compact page */
  99. .view-content .col-sm-3, .view-content .col-sm-6 {width: 50%; float: left;}
  100. @media (min-width: 768px) {
  101. .view-content .col-sm-3 {width: 25%;}
  102. }
  103.  
  104. /* card style */
  105. .node.node-teaser {background-color: #ffffff; border: 1px solid #ccc; border-radius: 4px; padding: 5px; margin: 4px;}
  106. .node.node-teaser .icon-bg, .node.node-teaser .private-video {width: calc(100% - 10px);}
  107. .node.node-teaser .icon-bg .likes-icon {filter: drop-shadow(0px 0px 2px #000);}
  108. .node.node-teaser h3.title {font-size: 1em; line-height: 1em; height: 3em; margin-bottom: 0px; overflow: hidden;}
  109. .node.node-teaser .username {display: block; white-space: nowrap; overflow: hidden;}
  110. .node.node-teaser .field-item {min-height: 2em;}
  111. .node.node-video .content {margin: 4px;}
  112. .sidebar .block.block-views,
  113. .sidebar .block.block-facetapi,
  114. .sidebar .block.block-mainblocks {background-color: #fafafa; border: 1px solid #ccc; border-radius: 4px; padding: 8px; margin: 4px 4px 8px 4px;}
  115. .sidebar .node.node-sidebar_teaser {background-color: #ffffff; border: 1px solid #ccc; border-radius: 2px; padding: 4px; margin: 2px;}
  116. .sidebar .node.node-sidebar_teaser .icon-bg, .node.node-sidebar_teaser .private-video {width: calc(100% - 8px);}
  117. .sidebar .node.node-sidebar_teaser .icon-bg .likes-icon {filter: drop-shadow(0px 0px 2px #000);}
  118. .item-list ul.pager li {margin: 0; padding: 0;}
  119. .item-list ul.pager li.pager-current,
  120. .item-list ul.pager li.pager-ellipsis,
  121. .item-list ul.pager li > a {background: #fafafa; border: 1px solid #ccc; border-radius: 8px; padding: 4px 16px; margin: 0px; display: inline-block;}
  122.  
  123. /* video style for external link (youtube) */
  124. /*
  125. .node.node-teaser .field-type-video-embed-field {border: 4px solid #c33; background-color: #000;}
  126. .node.node-teaser .field-type-video-embed-field .field-items {overflow: hidden;}
  127. .node.node-teaser .field-type-video-embed-field .field-items .field-item {margin: -4px;}
  128. */
  129.  
  130. /* image style in subscriptions page */
  131. .view-subscriptions .field-type-image {border: 1px solid #ccc; background-color: #fff; padding: 5px;}
  132. .view-subscriptions .field-type-image .field-items {overflow: hidden;}
  133. .view-subscriptions .field-type-image .field-items .field-item {margin: -6px;}
  134.  
  135. /* search and playist */
  136. .node-wide_teaser {background-color: #fafafa; border: 1px solid #ccc; border-radius: 4px; padding: 4px; margin: 4px;}
  137. .node-wide_teaser {width: unset; word-break: break-all; min-height: 170px;}
  138. .node-wide_teaser .col-sm-2 {width: 230px; padding: 4px;}
  139. .node-wide_teaser .col-sm-10 {width: calc(100% - 230px); padding: 4px;}
  140. .node-wide_teaser .field-name-field-video {border: 1px solid #999;}
  141. .node-wide_teaser .field-name-field-video-url {border: 1px solid #999; position: absolute; top: 0px; left: -230px; margin: 4px;}
  142. @media (max-width: 768px) {.node-wide_teaser .field-name-field-video-url {display: none;}}
  143. .node-wide_teaser .field-name-field-images .field-item {display: unset;}
  144. .node-wide_teaser .field-name-field-images .field-item > a > img {width: calc(100%/3 - 8px); border: 1px solid #aaa; padding: 4px; margin: 4px;}
  145. .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;}
  146. .node-wide_teaser .node-info {padding: 4px;}
  147. .node-wide_teaser .node-info .submitted {display: inline-block; width: 100%;}
  148. .node-wide_teaser .node-info .submitted h1.title {font-size: 28px; position: unset; margin: unset;}
  149. ul.facetapi-facetapi-tagcloud li > a {white-space: normal;}
  150. ul.facetapi-facetapi-tagcloud .element-invisible {display: none;}
  151.  
  152. /* footer */
  153. #wrapper {margin-bottom: unset; padding-bottom: unset;}
  154. footer {height: unset;}
  155. footer .block {width: 25%; float: left;}
  156. footer .block.block-forum {width: 50%;}
  157. footer .copyright {float: unset;}
  158.  
  159. /* video player */
  160. /* expand volume and seekbar height */
  161. .video-js .vjs-volume-bar {margin: 1em 0em;}
  162. .video-js .vjs-volume-bar.vjs-slider-horizontal, .video-js .vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level {height: 1em;}
  163. .video-js .vjs-progress-holder, .video-js .vjs-progress-holder .vjs-load-progress, .video-js .vjs-progress-holder .vjs-play-progress {height: 1em;}
  164. `;
  165. baseCSS.id = 'xtension-base-css';
  166. document.head.appendChild(baseCSS);
  167.  
  168. let cards = document.querySelectorAll('.node-teaser, .node-sidebar_teaser');
  169. let styleOverride = document.createElement('style');
  170. styleOverride.id = 'xtension-css';
  171.  
  172. function logn (val, base) {
  173. return Math.log(val) / Math.log(base);
  174. }
  175.  
  176. function kilo2Number (text) {
  177. if (text.match('k') == null) {
  178. return {value: parseInt(text), isKilo: false};
  179. }
  180. else {
  181. return {value: parseFloat(text.replace('k', '')) * 1000, isKilo: true};
  182. }
  183. }
  184.  
  185. function number2Prefixed(value) {
  186. if (value < 999) {
  187. return value;
  188. }
  189. else if (value < 99999) {
  190. return (value / 1000).toFixed(1) + 'k';
  191. }
  192. else if (value < 999999) {
  193. return Math.floor(value / 1000) + 'k';
  194. }
  195. else {
  196. return (value / 1000000).toFixed(1) + 'M';
  197. }
  198. }
  199.  
  200. function getFlair (viewCount, likePercentage, card) {
  201. if (card.querySelector('.private-video')) {
  202. return 'lock';
  203. }
  204. else if (card.querySelector('.field-type-video-embed-field')) {
  205. return 'share';
  206. }
  207. else {
  208. let likeThreshold = 8 - logn(viewCount, 6);
  209. if (viewCount < 200) {
  210. return '';
  211. }
  212. else if (viewCount < 20000) {
  213. return (likePercentage > likeThreshold) ? 'fire' : '';
  214. }
  215. else {
  216. return (likePercentage > likeThreshold) ? 'star' : '';
  217. }
  218. }
  219. }
  220.  
  221. // HTML Mod
  222. cards.forEach(card => {
  223. let icons = card.querySelector('.icon-bg');
  224. if (icons) { // Rearrange stat icons, add like percentage and flairs
  225. if ((card.className.match('node-sidebar_teaser') && card.children.length > 1) || card.children.length > 3) {
  226. card.insertBefore(icons, card.children[2]);
  227. }
  228. else {
  229. card.insertBefore(icons, card.children[1]);
  230. }
  231. if (card.className.match('node-image') && icons.children.length == 3) {
  232. icons.appendChild(icons.children[1]);
  233. icons.appendChild(icons.children[0]);
  234. }
  235. else if (icons.children.length == 2) {
  236. icons.appendChild(icons.children[0]);
  237. }
  238.  
  239. let likeNode = icons.querySelector('.glyphicon-heart');
  240. if (likeNode && !(card.className.match('node-image') && card.className.match('node-sidebar_teaser'))) {
  241. likeNode = likeNode.nextSibling;
  242. let viewNode = icons.querySelector('.glyphicon-eye-open').nextSibling;
  243. let viewNodeTxt = viewNode.wholeText.trim();
  244. let likeNodeTxt = likeNode.wholeText.trim();
  245. let like = kilo2Number(likeNodeTxt);
  246. let viewCount = kilo2Number(viewNodeTxt);
  247. let likePercentage = (viewCount == 0) ? 0 : parseFloat(like.value / viewCount.value * 100).toFixed(2);
  248. viewNode.parentElement.setAttribute('title', viewNodeTxt);
  249. viewNode.nodeValue = ' ' + number2Prefixed(viewCount.value);
  250. if (likeNode) {
  251. likeNode.parentElement.setAttribute('title', likeNodeTxt);
  252. likeNode.nodeValue = ' ' + number2Prefixed(like.value);
  253. }
  254. if (!card.className.match('node-sidebar_teaser')) {
  255. let likePercentageHTML = document.createElement('div');
  256. likePercentageHTML.className += 'right-icon likes-icon like-percentage';
  257. if (like.isKilo || viewCount.isKilo) {
  258. likePercentageHTML.innerText = '(~' + likePercentage + '%)';
  259. }
  260. else {
  261. likePercentageHTML.innerText = '(' + likePercentage + '%)';
  262. }
  263. likeNode.parentElement.parentElement.appendChild(likePercentageHTML);
  264. }
  265. if (card.className.match('node-video')) {
  266. let flair = getFlair(viewCount.value, likePercentage, card);
  267. if (flair) {
  268. card.className += ' flair-' + flair;
  269. let flairNode = document.createElement('div');
  270. flairNode.setAttribute('class', 'left-icon flair-icon');
  271. flairNode.innerHTML = '<i class="glyphicon glyphicon-' + flair + '" title="Flair"></i>';
  272. icons.appendChild(flairNode);
  273. }
  274. }
  275. }
  276. }
  277. else {
  278. let blankFooter = document.createElement('div');
  279. blankFooter.setAttribute('class', 'icon-bg');
  280. card.appendChild(blankFooter);
  281. }
  282.  
  283. let thumbnail = card.querySelector('a > img');
  284. if (!thumbnail) { // Fix inconsistent height of the cards with no thumbnail
  285. let imgArea = card.firstElementChild;
  286. let title = card.querySelector('h3.title > a');
  287. if (!title) {
  288. title = card.querySelector('.field-item > a');
  289. }
  290. let url = (title) ? title.getAttribute('href') : '';
  291. imgArea.innerHTML = '<div class="field blankimg"><div class="field-items"><div class="field-item"><a' +
  292. (url ? ' href="' + url + '"' : '') +
  293. (title ? ' title="' + title.innerText + '"' : '') +
  294. '>' +
  295. (card.className.match('node-sidebar_teaser') ? '<img width="141" height="84"></img>' : '<img width="220" height="150"></img>') +
  296. '</a></div></div></div>';
  297. }
  298. });
  299.  
  300. 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');
  301. if (contentInfo) { // Add like percentage for a video/image page
  302. let heartIcon = contentInfo.querySelector('.glyphicon.glyphicon-heart');
  303. if (heartIcon) {
  304. let eyeIcon = contentInfo.querySelector('.glyphicon.glyphicon-eye-open');
  305. let viewCount = parseInt(eyeIcon.nextSibling.nodeValue.replace(/,/g, ''));
  306. let like = parseInt(heartIcon.nextSibling.nodeValue.replace(/,/g, ''));
  307. let likePercentage = (viewCount == 0) ? 0 : parseFloat(like / viewCount * 100).toFixed(4);
  308. heartIcon.nextSibling.nodeValue = ' ' + like + ' (' + likePercentage + '%)';
  309. contentInfo.appendChild(contentInfo.querySelector('.glyphicon.glyphicon-heart'));
  310. contentInfo.appendChild(contentInfo.querySelector('.glyphicon.glyphicon-eye-open').previousSibling);
  311. }
  312. }
  313.  
  314. let copyrightNode = document.querySelector('footer .copyright');
  315. if (copyrightNode) { // Add script credits
  316. 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.';
  317. if (!oneClickFilterConflict) {
  318. 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>.';
  319. }
  320. copyrightNode.innerHTML = copyrightNode.firstChild.nodeValue + innerHTMLExt;
  321. }
  322.  
  323. let addForumCommentElement = document.querySelectorAll('#forum-comments h2.comment-form, #forum-comments noscript, #forum-comments #comment-form');
  324. if (addForumCommentElement.length > 0) { // Wrap forum's "Add new comment" section in a block
  325. let commentBlock = document.createElement('div');
  326. commentBlock.id = 'add-forum-comment-block';
  327. addForumCommentElement.forEach(elem => {
  328. commentBlock.appendChild(elem);
  329. });
  330. document.getElementById('forum-comments').appendChild(commentBlock);
  331. }
  332.  
  333. let creatorProfileCard = document.querySelector('body.page-user.page-user- #block-views-profile-block .field-content');
  334. if (creatorProfileCard) {
  335. if (document.body.className.match('page-user-603563')) { // My special profile pic border + tooltip
  336. creatorProfileCard.innerHTML = creatorProfileCard.innerHTML + creatorProfileCard.innerHTML + creatorProfileCard.innerHTML + creatorProfileCard.innerHTML + creatorProfileCard.innerHTML + creatorProfileCard.innerHTML + creatorProfileCard.innerHTML;
  337. creatorProfileCard.children[5].setAttribute('src', 'https://i.imgur.com/fQZC1bB.png');
  338. creatorProfileCard.setAttribute('title', 'The creator of "Iwara UI Fix"');
  339. }
  340. else { // User role profile pic border
  341. let role = document.querySelector('body.page-user.page-user- #content div.content > div.profile > div:last-child > ul > li');
  342. if (role) {
  343. switch (role.innerText) {
  344. case 'administrator':
  345. creatorProfileCard.className += ' role-admin';
  346. creatorProfileCard.setAttribute('title', 'Administrator');
  347. break;
  348. case 'moderator':
  349. creatorProfileCard.className += ' role-mod';
  350. creatorProfileCard.setAttribute('title', 'Moderator');
  351. break;
  352. }
  353. role = role.parentElement.parentElement;
  354. role.parentElement.removeChild(role);
  355. }
  356. }
  357. }
  358. let friendsList = document.querySelector('body.page-user-friends table.table');
  359. if (friendsList) { // Accept/reject all friends buttons
  360. let acceptReqButton = friendsList.querySelectorAll('tr.warning button[data-original-title="Accept"]');
  361. let rejectReqButton = friendsList.querySelectorAll('tr.warning button[data-original-title="Reject"]');
  362. let doAllReqButtonsArea = null;
  363. if (acceptReqButton.length > 1) {
  364. doAllReqButtonsArea = friendsList.querySelector('tr:first-child th:last-child');
  365. 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>';
  366. document.getElementById('accept-all-friends').addEventListener('click', function acceptAllFriends () {
  367. if (confirm("Accept all pending friend requests?")) {
  368. while (doAllReqButtonsArea.lastElementChild) {
  369. doAllReqButtonsArea.removeChild(doAllReqButtonsArea.lastElementChild);
  370. }
  371. acceptReqButton.forEach(e => {e.click();});
  372. }
  373. }, false);
  374. document.getElementById('reject-all-friends').addEventListener('click', function rejectAllFriends () {
  375. if (confirm("Reject all pending friend requests?")) {
  376. while (doAllReqButtonsArea.lastElementChild) {
  377. doAllReqButtonsArea.removeChild(doAllReqButtonsArea.lastElementChild);
  378. }
  379. rejectReqButton.forEach(e => {e.click();});
  380. }
  381. }, false);
  382. }
  383. }
  384.  
  385. // CSS Override
  386. styleOverride.innerHTML += `
  387. .node.node-teaser,
  388. .node.node-sidebar_teaser,
  389. .node.node-teaser i,
  390. .node.node-sidebar_teaser i,
  391. .node.node-teaser img,
  392. .node.node-sidebar_teaser img {
  393. transition: 0.15s!important;
  394. }
  395.  
  396. /*
  397. .node.node-teaser img,
  398. .node.node-sidebar_teaser img {
  399. filter: contrast(0)!important;
  400. }
  401. */
  402.  
  403. .node.node-teaser h3.title,
  404. .node.node-sidebar_teaser h3.title {
  405. height: auto!important;
  406. white-space: nowrap!important;
  407. text-overflow: ellipsis!important;
  408. }
  409.  
  410. .node.node-teaser:hover,
  411. .node.node-sidebar_teaser:hover {
  412. background: #fff;
  413. opacity: 1!important;
  414. box-shadow: 3pt 12pt 12pt -6pt #0004;
  415. transform: rotate3d(0.9, -0.1, 0.1, 3deg) scale(1.02);
  416. z-index: 42;
  417. }
  418.  
  419. .node.node-teaser.flair-fire:hover,
  420. .node.node-sidebar_teaser.flair-fire:hover {
  421. transform: rotate3d(0.9, -0.1, 0.1, -4.5deg) scale(1.02);
  422. border-color: #f40a;
  423. }
  424.  
  425. .node.node-teaser.flair-star:hover,
  426. .node.node-sidebar_teaser.flair-star:hover {
  427. transform: rotate3d(-0.9, 0.1, -0.2, 4.5deg) scale(1.04);
  428. filter: drop-shadow(-0.2em -0.2em 2em #ffe8);
  429. outline: 0.32em solid #fe8;
  430. border: 0;
  431. border-radius: 0;
  432. }
  433.  
  434. .views-responsive-grid.views-responsive-grid-horizontal.views-columns-2 > * {
  435. margin-bottom: 0;
  436. }
  437.  
  438. .node.node-teaser .icon-bg,
  439. .node.node-sidebar_teaser .icon-bg {
  440. width: 100%!important;
  441. position: unset;
  442. margin-top: 0.4em;
  443. padding: 0;
  444. }
  445.  
  446. .node.node-sidebar_teaser .icon-bg {
  447. min-height: 1.35em;
  448. }
  449.  
  450. .node:hover .icon-bg {
  451. background: unset!important;
  452. }
  453.  
  454. .node.node-teaser .left-icon,
  455. .node.node-sidebar_teaser .left-icon {
  456. color: inherit;
  457. margin-left: 0.1em;
  458. font-size: 0.8em;
  459. filter: unset!important;
  460.  
  461. }
  462.  
  463. .node.node-teaser .right-icon,
  464. .node.node-sidebar_teaser .right-icon {
  465. float: left!important;
  466. color: inherit;
  467. margin-left: 0.5em;
  468. font-size: 0.8em;
  469. filter: unset!important;
  470. }
  471.  
  472. .node-image.node-sidebar_teaser .right-icon:first-of-type {
  473. margin-left: 0;
  474. }
  475.  
  476. .node.node-teaser .left-icon.multiple-icon,
  477. .node.node-sidebar_teaser .left-icon.multiple-icon {
  478. float: right!important;
  479. color: inherit;
  480. margin-left: 0.5em;
  481. font-size: 0.8em;
  482. filter: unset!important;
  483. }
  484.  
  485. .node.node-teaser .left-icon.flair-icon,
  486. .node.node-sidebar_teaser .left-icon.flair-icon {
  487. float: right!important;
  488. color: inherit;
  489. margin-right: 0.1em;
  490. font-size: 0.8em;
  491. filter: unset!important;
  492. }
  493.  
  494. .node.node-teaser .right-icon.like-percentage,
  495. .node.node-sidebar_teaser .right-icon.like-percentage {
  496. margin-left: 0.3em;
  497. }
  498. .right-icon.ratio-icon {
  499. display: none;
  500. }
  501.  
  502. .node.node-teaser h3.title {
  503. width: 100%;
  504. height: 2em;
  505. }
  506.  
  507. .node.node-teaser.flair-lock:hover [title="Flair"],
  508. .node.node-sidebar_teaser.flair-lock:hover [title="Flair"] {
  509. color: #bbbf;
  510. }
  511.  
  512. .node.node-teaser.flair-fire:hover [title="Flair"],
  513. .node.node-sidebar_teaser.flair-fire:hover [title="Flair"] {
  514. color: #f40f;
  515. filter: drop-shadow(0.12em -0.16em 0 #f806) drop-shadow(-0.12em -0.04em 0.06em #fd08);
  516. }
  517.  
  518. .node.node-teaser.flair-star:hover [title="Flair"] {
  519. color: #fd4f;
  520. transform: rotate(18deg) scale(3.2);
  521. 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);
  522. }
  523.  
  524. .node.node-sidebar_teaser.flair-star:hover [title="Flair"] {
  525. color: #fd4f;
  526. transform: rotate(18deg) scale(2.4);
  527. 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);
  528. }
  529.  
  530. .node.node-video.node-teaser.flair-lock:hover > div > div div > a > img,
  531. .node.node-video.node-sidebar_teaser.flair-lock:hover > div div > div > a > img {
  532. filter: grayscale(1);
  533. }
  534.  
  535. .node.node-video.node-teaser.flair-fire:hover > div > div div > a > img,
  536. .node.node-video.node-sidebar_teaser.flair-fire:hover > div > div div > a > img {
  537. filter: sepia(0.3) contrast(1.25) hue-rotate(-15deg) saturate(1.25);
  538. }
  539.  
  540. .node.node-video.node-teaser.flair-star:hover > div > div div > a > img,
  541. .node.node-video.node-sidebar_teaser.flair-star:hover > div > div div > a > img {
  542. filter: sepia(0.5) brightness(1.1) contrast(1.25) saturate(1.5);
  543. }
  544.  
  545. .node.node-teaser .blankimg,
  546. .node.node-sidebar_teaser .blankimg {
  547. display: block;
  548. border: #ccc 0.5pt dashed;
  549. }
  550.  
  551. .node.node-teaser .blankimg a,
  552. .node.node-sidebar_teaser .blankimg a {
  553. filter: opacity(0);
  554. }
  555.  
  556. .node-video.node-full .video-js .vjs-poster, .node-video.node-full video .vjs-poster {
  557. background-size: contain;
  558. }
  559.  
  560. .node-video.node-full .video-js, .node-video.node-full video {
  561. max-height: 90vh;
  562. }
  563.  
  564. .video-js .vjs-play-progress:before {
  565. top: -40%;
  566. color: #fffd;
  567. font-size: 1.8em;
  568. box-shadow: 0 8pt 8pt -4pt #0006;
  569. }
  570.  
  571. .video-js .vjs-volume-level:before {
  572. display: none;
  573. }
  574.  
  575. body.front #wrapper > section > .container,
  576. body.page-node-add form,
  577. body.page-node-edit form,
  578. body.page-user-friends #content > .container,
  579. body.page-user-liked #content > .container,
  580. body.page-subscriptions #content > .container,
  581. body.page-my-content #content > .container,
  582. body.page-messages #content > .container,
  583. body.page-user-edit form,
  584. body.page-comment #content > .container,
  585. body.page-forum #content > .container,
  586. body.node-type-video .node.node-video > .content,
  587. body.node-type-image .node.node-image > .content,
  588. #comments,
  589. #add-forum-comment-block,
  590. .region.region-content .view-id-profile,
  591. .node.node-journal,
  592. [class*="block-views"],
  593. .sidebar .block.block-facetapi,
  594. .sidebar .block.block-mainblocks,
  595. .region.region-sidebar .extra-content-block {
  596. background-color: #fafafa;
  597. border: 1px solid #ccc;
  598. border-radius: 4px!important;
  599. padding: 0.8em!important;
  600. margin: 0.5em 0.5em 1em 0.5em!important;
  601. }
  602.  
  603. body.page-user #content {
  604. background-attachment: fixed;
  605. }
  606.  
  607. body.page-user- #content > .container {
  608. background-color: #eee8;
  609. }
  610.  
  611. body.page-user [class*="block-views"],
  612. body.page-user .sidebar .block.block-views,
  613. #block-mainblocks-user-connect,
  614. body.page-user #comments {
  615. background-color: #fafafad0;
  616. }
  617.  
  618. body.page-user.page-user- #block-views-profile-block .field-content.role-admin > img {
  619. border: #f88 6pt solid;
  620. filter: drop-shadow(2pt 2pt 2pt #c444);
  621. }
  622.  
  623. body.page-user.page-user- #block-views-profile-block .field-content.role-mod > img {
  624. border: #8af 6pt solid;
  625. filter: drop-shadow(2pt 2pt 2pt #48c4);
  626. }
  627.  
  628. body.page-node-add form,
  629. body.page-node-edit form {
  630. background-color: #ffffff;
  631. }
  632.  
  633. body.front #wrapper > section > .container,
  634. body.page-user-friends #content > .container,
  635. body.page-user-liked #content > .container,
  636. body.page-subscriptions #content > .container,
  637. body.page-my-content #content > .container,
  638. body.page-messages #content > .container,
  639. body.page-user-edit form,
  640. body.page-comment #content > .container,
  641. body.page-forum #content > .container {
  642. margin-left: auto!important;
  643. margin-right: auto!important;
  644. }
  645. body.page-user-friends tr:first-child th:last-child {
  646. text-align: right;
  647. }
  648.  
  649. body.page-user-friends #accept-all-friends,
  650. body.page-user-friends #reject-all-friends {
  651. position: relative;
  652. }
  653.  
  654. body.page-user-friends #reject-all-friends {
  655. margin-left: 4px;
  656. }
  657.  
  658. body.page-user-friends #accept-all-friends span:first-child {
  659. transform: translateX(-3px);
  660. filter: drop-shadow(3px 0 0 #2ecc71);
  661. z-index: 1;
  662. }
  663.  
  664. body.page-user-friends #reject-all-friends span:first-child {
  665. transform: translateX(-3px);
  666. filter: drop-shadow(3px 0 0 #e74c3c);
  667. z-index: 1;
  668. }
  669.  
  670. body.page-user-friends #accept-all-friends span:last-child,
  671. body.page-user-friends #reject-all-friends span:last-child {
  672. position: absolute;
  673. top: 29%;
  674. left: 40%;
  675. color: #fffa;
  676. }
  677.  
  678. body.page-forum #content > .container .panel-group > * {
  679. margin-top: 1em;
  680. }
  681.  
  682. body.node-type-video .node.node-video .node-info .node-views .glyphicon.glyphicon-heart,
  683. body.node-type-image .node.node-image .node-info .node-views .glyphicon.glyphicon-heart {
  684. margin-left: 0.5em;
  685. }
  686.  
  687. .node.node-wide_teaser {
  688. padding: 0.8em!important;
  689. margin: 0.5em 0.5em 1em 0.5em!important;
  690. }
  691.  
  692. .forum-post {
  693. margin: 0.5em 0.5em 1em 0.5em!important;
  694. }
  695.  
  696. .forum-post > .panel-heading > .text-muted {
  697. color: #0008;
  698. }
  699.  
  700. body.node-type-video .node.node-video > .content,
  701. body.node-type-image .node.node-image > .content {
  702. padding: 0!important;
  703. }
  704.  
  705. body.node-type-video .node.node-video > .content > .node-buttons,
  706. body.node-type-image .node.node-image > .content > .node-buttons {
  707. margin-bottom: 0;
  708. }
  709.  
  710. body.node-type-video .node.node-video > .content > .well {
  711. max-width: 100%!important;
  712. margin: 0;
  713. }
  714.  
  715. .node-journal #comments {
  716. border: unset;
  717. }
  718.  
  719. .view-profile.view-display-id-block {
  720. background-color: unset;
  721. padding: unset;
  722. box-shadow: unset;
  723. }
  724.  
  725. #block-views-profile-block {
  726. background-color: #fafafa;
  727. box-shadow: 2pt 8pt 8pt -4pt #0004;
  728. }
  729.  
  730. .region.region-sidebar .view-id-profile .views-responsive-grid > .views-row > div img,
  731. .region.region-content .view-id-profile .views-responsive-grid > .views-row > div img {
  732. border-radius: 50%;
  733. overflow: hidden;
  734. border: #0001 0.2em solid;
  735. }
  736.  
  737. h1 {
  738. padding: 0.25em;
  739. margin: 0;
  740. }
  741.  
  742. #comments > h2.title {
  743. padding: 0.4em;
  744. margin-bottom: 0.8em;
  745. }
  746.  
  747. #add-forum-comment-block > h2,
  748. .extra-content-block {
  749. padding: 0.6em 0;
  750. }
  751.  
  752. .region.region-sidebar .extra-content-block {
  753. background-color: #0000;
  754. border: 0;
  755. overflow: hidden;
  756. }
  757.  
  758. .region.region-sidebar .extra-content-block iframe {
  759. transform: translateX(-8.75pt);
  760. }
  761.  
  762. .extra-content-block > center + br,
  763. body.node-type-video #block-extra-content-extra-content-block-5,
  764. body.node-type-video #block-extra-content-extra-content-block-8 {
  765. display: none;
  766. }
  767.  
  768. .pager {
  769. border-top: 0;
  770. }
  771.  
  772. #forum > div.view > div.row:first-of-type > div:first-of-type,
  773. #forum > div.view > div.row:nth-of-type(3) > div:first-of-type {
  774. width: unset;
  775. float: left;
  776. margin: 1.25em 0;
  777. }
  778.  
  779. #forum > div.view > div.row:first-of-type > div:last-of-type,
  780. #forum > div.view > div.row:nth-of-type(3) > div:last-of-type {
  781. width: unset;
  782. float: right;
  783. }
  784.  
  785. .forum-node-create-links {
  786. width: unset;
  787. }
  788.  
  789. #forum .pager {
  790. text-align: right;
  791. }
  792.  
  793. #forum-comments .pager li {
  794. margin: unset;
  795. padding: unset;
  796. }
  797.  
  798. div.item-list ul.pager > li,
  799. div.item-list ul.pager > li.pager-current,
  800. div.item-list ul.pager > li.pager-ellipsis,
  801. div.item-list ul.pager > li > a {
  802. margin: 0.2em 0;
  803. padding: 0;
  804. border: 0.05em #0000 solid;
  805. transition: 0.15s;
  806. }
  807.  
  808. div.item-list ul.pager > li > a,
  809. div.item-list ul.pager > li.pager-current,
  810. div.item-list ul.pager > li.pager-ellipsis {
  811. border-radius: 1em;
  812. padding: 0 0.6em;
  813. border: 0.05em #0002 solid;
  814. }
  815.  
  816. div.item-list ul.pager > li.pager-ellipsis {
  817. border: 0.05em #0000 solid;
  818. background: #0000;
  819. }
  820.  
  821. div.item-list ul.pager > li.pager-current,
  822. #forum-comments div.item-list ul.pager > li.pager-current {
  823. border: 0.05em #16a085c0 solid;
  824. margin: 0 0.1em;
  825. padding: 0 0.6em;
  826. background: #16a085c0;
  827. color: #fafafa;
  828. }
  829.  
  830. div.item-list ul.pager > li > a:hover {
  831. border: 0.05em solid;
  832. }
  833.  
  834. body.page-user-603563 #block-views-profile-block .field-content {
  835. position: relative;
  836. }
  837.  
  838. body.page-user-603563 #block-views-profile-block .field-content > img {
  839. width: 75%;
  840. margin: 3%;
  841. transform-origin: 48%;
  842. border: 0;
  843. }
  844.  
  845. body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(1) {
  846. position: absolute;
  847. filter: contrast(0) brightness(0) drop-shadow(2pt 2pt 2pt #0004);
  848. transform: scale(1.05);
  849. }
  850.  
  851. body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(2) {
  852. position: absolute;
  853. filter: contrast(0) sepia(1) saturate(3) brightness(1.7);
  854. animation: special-border 3.7s infinite linear;
  855. }
  856.  
  857. body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(3) {
  858. position: absolute;
  859. filter: contrast(0) sepia(1) saturate(7) brightness(1.5) hue-rotate(120deg);
  860. animation: special-border 1.2s -0.41s infinite linear;
  861. }
  862.  
  863. body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(4) {
  864. position: absolute;
  865. filter: contrast(0) sepia(1) saturate(7) brightness(1.2) hue-rotate(240deg);
  866. animation: special-border 2.5s -0.83s infinite linear;
  867. }
  868.  
  869. body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(5) {
  870. position: absolute;
  871. filter: contrast(0) brightness(2);
  872. animation: special-border 0.7s -0.24s infinite linear;
  873. }
  874.  
  875. body.page-user-603563 #block-views-profile-block .field-content > img:nth-child(6) {
  876. position: absolute;
  877. }
  878.  
  879. @keyframes special-border {
  880. 0% {transform: translate(2%, 0) rotateZ(40deg) scale(1.03);}
  881. 100% {transform: translate(2%, 0) rotateZ(400deg) scale(1.03);}
  882. }
  883. `;
  884. document.head.appendChild(styleOverride);
  885. }
  886. }, true);