Iwara UI Fix

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

اعتبارا من 08-03-2020. شاهد أحدث إصدار.

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