Iwara UI Fix

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

As of 2020-07-19. See the latest version.

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