USO - Display additional infos & fixes

Display additional information. Total installs, update date, initial release date. Fix site's navigability.

  1. // ==UserScript==
  2. // @name USO - Display additional infos & fixes
  3. // @namespace https://github.com/Procyon-b
  4. // @version 0.3.4
  5. // @description Display additional information. Total installs, update date, initial release date. Fix site's navigability.
  6. // @author Achernar
  7. // @match https://userstyles.org/*
  8. // @run-at document-start
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. "use strict";
  14.  
  15. var initial=true, firstPage=true;
  16.  
  17. // catch site errors
  18. if (location.pathname.startsWith('/styles/[styleId]/')) {
  19. let u=location.pathname.substr(17);
  20. history.replaceState({}, null, u);
  21. location.pathname=u;
  22. return;
  23. }
  24.  
  25.  
  26. // XHR -- XML
  27. self.XMLHttpRequest = class extends self.XMLHttpRequest {
  28. open(...args) {
  29. let t=this;
  30. // intercept and source code
  31. if ( arguments[1].startsWith('https://gateway.userstyles.org/styles/getStyleCss/') ) {
  32. styleLoaded=styleID || -1;
  33. loadCSS=1;
  34. this.addEventListener('load', function(){
  35. var id=t.responseURL.split('/').pop();
  36. if (styles[id] && !styles[id].sourceCode) styles[id].sourceCode=JP(t.response).result;
  37. });
  38. }
  39. return super.open(...args);
  40. }
  41. }
  42.  
  43. // JSON.parse
  44. var JP=JSON.parse;
  45. JSON.parse=function(){
  46. var r=JP(...arguments);
  47. getStyles(r);
  48. return r;
  49. }
  50.  
  51. // stop svg js animation
  52. window.requestAnimationFrame=function(){}
  53.  
  54. // handle data
  55. var stylesA=[], styles={};
  56. var total=0, styleLoaded;
  57. var closeBut;
  58.  
  59. function getStyles(o) {
  60. stylesA=parseObj(o, [], ['styles', 'stylesList', 'style']);
  61. stylesA.forEach((e) => {
  62. if (e.id && !styles[e.id]) {
  63. styles[e.id]=Object.assign({}, e);
  64. total++;
  65. }
  66. });
  67. }
  68.  
  69. function parseObj(o, A, n=[]) {
  70. var k, v;
  71. if ( (typeof o != 'object') || !Array.isArray(A)) return;
  72. for (k in o) {
  73. v=o[k];
  74. if ((typeof v == 'object') && n.includes(k)) A=A.concat(v);
  75. if (typeof v == 'object') A=parseObj(v, A, n);
  76. }
  77. return A;
  78. }
  79.  
  80. var done, newL, Tit, title, title0='Website Themes & Skins by Stylish | Userstyles.org',
  81. userID, cancelNextRS=0, dontCancel='', site='',
  82. bgPage='/', blockTitle;
  83.  
  84. if (document.readyState != 'loading') init('"already done"', 1);
  85. else {
  86. document.addEventListener('DOMContentLoaded', (ev) => { init('DOM');} );
  87. window.addEventListener('load', (ev) => { init('wLoad', 1);} );
  88. }
  89.  
  90.  
  91. function chkState(a) {
  92. var u=a[2];
  93. if (u == '/styles/browse') {
  94. if (bgPage.startsWith(u)) u=bgPage;
  95. }
  96. else if (u.startsWith('/styles/[styleId]/')) {
  97. title='';
  98. document.title=title0;
  99. u=bgPage;
  100. }
  101. else if (u.startsWith('/user-profile/[...userId]')) {
  102. if (userID || __NEXT_DATA__) {
  103. u='/user-profile/'+(userID || __NEXT_DATA__.query.userId);
  104. }
  105. }
  106. a[2]=u;
  107. }
  108.  
  109. // hide logo when scrolled. (saves cpu on old hardware)
  110. var Logo, LHidden=false;
  111. function hideLogo() {
  112. function toggle(set) {
  113. if ( Logo=(Logo && Logo.parentNode && Logo) || document.querySelector('[class^="welcome-banner_top_"] svg') )
  114. LHidden=Logo.classList.toggle('hideMe',set);
  115. else LHidden=set;
  116. }
  117. window.addEventListener('scroll', function() {
  118. if (window.scrollY > 200) {
  119. if (LHidden) return;
  120. toggle(true);
  121. }
  122. else if (LHidden) toggle(false);
  123. });
  124. }
  125.  
  126. var reactID;
  127.  
  128. function init(v, old) {
  129. if (done) return;
  130. newL=document.querySelector('#__next');
  131. if (!newL) {
  132. if (old && ST) ST.remove();
  133. return;
  134. }
  135. addSt();
  136. hideLogo();
  137. let t;
  138. done=true;
  139. reactID= (t=Object.keys(newL).find( (v) => v.startsWith('__react') )) && t.split('$')[1];
  140. if (__NEXT_DATA__.page == '/styles/[styleId]/[[...styleParams]]') bgPage='/';
  141. else if ( (__NEXT_DATA__.page == '/styles/browse/[[...categoryParams]]') || (__NEXT_DATA__.page == '/user-profile/[...userId]') )
  142. bgPage='/'+__NEXT_DATA__.props.metaTagsData.og.url.split('/').slice(3).join('/');
  143. let pushState=history.pushState;
  144. history.pushState=function(){
  145. let u=arguments[2];
  146. // ignore if same state
  147. if (cancelNextRS && (dontCancel == u) ) {
  148. dontCancel='';
  149. }
  150. else if (cancelNextRS || (u == location.pathname) ) {
  151. //cancelNextRS=false;
  152. cancelNextRS && cancelNextRS--;
  153. dontCancel='';
  154. selfTitle=blockTitle=true;
  155. return;
  156. }
  157. initial=false;
  158. firstPage=false;
  159. chkState(arguments);
  160. if (u.startsWith('/user-profile/') && (u[13] != '[') ) userID=u.split('/')[2];
  161. if ( (u == '/') || u.startsWith('/user-profile/') || u.startsWith('/styles/browse/') ) bgPage=u;
  162. pushState.apply(history, arguments);
  163. if (location.pathname.startsWith('/styles/')) {
  164. addData('from pushState (path)');
  165. }
  166. }
  167.  
  168. var hback=history.back,
  169. hforward=history.forward,
  170. hgo=history.go,
  171. hreplaceState=history.replaceState;
  172. history.replaceState=function() {
  173. if (cancelNextRS && (dontCancel == arguments[2]) ) {
  174. dontCancel='';
  175. }
  176. else if (cancelNextRS || (arguments[2] == location.pathname) ) {
  177. cancelNextRS && cancelNextRS--;
  178. dontCancel='';
  179. selfTitle=blockTitle=true;
  180. return;
  181. }
  182. initial=false;
  183. firstPage=false;
  184. return hreplaceState.apply(history, arguments);
  185. }
  186.  
  187.  
  188. window.addEventListener('popstate', (ev) => {
  189. if (location.pathname.startsWith('/user-profile/')) {
  190. if (newL.querySelector(':scope > [class^="style_mainWrapper_"]')) {
  191. let e=newL.querySelector(':scope > [class^="style_mainWrapper_"] a[data-stylish="close-style-page-button"]');
  192. if (e) {
  193. e.click();
  194. }
  195. }
  196. }
  197. else if (location.pathname.startsWith('/styles/')) {
  198. let i, r, e=document.querySelector('a[href^="'+location.pathname+'"]');
  199.  
  200. if (!e) {
  201. r=newL.querySelectorAll('[class^="styles-list_styleRow_"]');
  202. let st, ost;
  203. let ID=location.pathname.split('/')[2]
  204. for (i=0; i < r.length; i++) {
  205. if (r[i]['__reactFiber$'+reactID] && (ID == r[i]['__reactFiber$'+reactID].key.split('-').pop()) ) {
  206. e=r[i];
  207. break;
  208. }
  209. }
  210. }
  211.  
  212. if (!e) {
  213. let A=document.querySelector('a[href^="/styles/"][href*="1"]');
  214. if (A) {
  215. let react=Object.keys(A).find( (v) => v.startsWith('__reactFiber') );
  216. e=document.createElement('a');
  217. e.href=location.pathname;
  218. e.style='display: none !important;';
  219. let r=newL.querySelector(':scope > div > [class^="Home_homepageWrapper_"]')
  220. if (r) r.appendChild(e);
  221. }
  222. }
  223. if (e) e.click();
  224. }
  225. else if (location.pathname == '/') {
  226. let e=newL.querySelector(':scope > [class^="style_mainWrapper_"] a[data-stylish="close-style-page-button"]');
  227. if (e) {
  228. cancelNextRS=1;
  229. e.click();
  230. }
  231. }
  232. });
  233.  
  234. // check Title
  235. var Tit = document.querySelector('title'), selfTitle=false;
  236. new MutationObserver(function(mutations) {
  237. if (selfTitle) { selfTitle=false; return; }
  238. if (title && !Tit.textContent.startsWith(title) ) {
  239. document.title=title;
  240. selfTitle=true;
  241. }
  242. }).observe(Tit, { attributes: false, subtree: false, childList: true });
  243.  
  244. site=document.title.split('|')[1] || '';
  245. if (site) site=' |'+site;
  246.  
  247. // detect (no) popup
  248. new MutationObserver(function(mutations) {
  249. if (!newL.querySelector(':scope > [class^="style_mainWrapper_"]')) {
  250. title='';
  251. document.title=title0;
  252. if (location.pathname.startsWith('/styles/')) {
  253. if (firstPage && !initial) {
  254. }
  255. }
  256. }
  257. else {
  258. addData('from is popup');
  259. }
  260. }).observe(newL, { attributes: false, subtree: false, childList: true });
  261.  
  262. // mutation add-er
  263. // sub Mut
  264. function mutToast() {
  265. let r=newL.querySelector(':scope > .Toastify ~ div[class=""], :scope > .Toastify ~ div[class^="MainLayout_mainLayout__"]');
  266. if (r && r.attributes.obs) {
  267. return;
  268. }
  269. if (r) {
  270. new MutationObserver(function(muts) {
  271. for (let mut of muts) {
  272. if (mut.addedNodes.length && mut.previousSibling && (mut.previousSibling.localName == 'header') ) {
  273. addDataTiles();
  274. watchGrid();
  275. break;
  276. }
  277. }
  278. }).observe(r, { attributes: true, subtree: false, childList: true });
  279. r.setAttribute('obs', 'tiles');
  280. }
  281.  
  282. // added cards ?
  283. watchGrid();
  284. }
  285.  
  286. function watchGrid() {
  287. var r=newL.querySelector('[class^="styles-grid_gridItems_"]') ||
  288. newL.querySelector('[class^="styles-gallery_scrollWrapper_"] > div:not([class])');
  289. if (r.attributes.obs) {
  290. return;
  291. }
  292. if (r) {new MutationObserver(function(muts) {
  293. for (let mut of muts) {
  294. if (mut.addedNodes.length) {
  295. addDataTiles();
  296. break;
  297. }
  298. }
  299. }).observe(r, { attributes: true, subtree: false, childList: true });
  300. r.setAttribute('obs', 'grid');
  301. }
  302. }
  303.  
  304. new MutationObserver(function(muts) {
  305. let mut;
  306. for (mut of muts) {
  307. // new body
  308. if (mut.addedNodes.length && mut.previousSibling && (mut.previousSibling.className == 'Toastify') ) {
  309. addDataTiles();
  310.  
  311. // new list
  312. mutToast();
  313. break;
  314. }
  315. }
  316. }).observe(newL, { attributes: false, subtree: false, childList: true });
  317. newL.setAttribute('obs', null);
  318. mutToast();
  319. addDataTiles();
  320.  
  321. if (location.pathname.startsWith('/styles/')) {
  322. setTimeout((e) => {addData('from ini '+v)}, 0);
  323. }
  324. }
  325.  
  326. var totalI, styleID, showCSS, loadCSS;
  327.  
  328. function getCSS(id, callback) {
  329. if (id && (typeof callback == 'function') ) {
  330. fetch('https://gateway.userstyles.org/styles/getStyleCss/'+id)
  331. .then((response) => response.json())
  332. .then((data) => callback(data));
  333. }
  334. }
  335.  
  336. function addData() {
  337. var id=styleID=location.pathname.split('/')[2],
  338. s=styles[id];
  339.  
  340. if (initial) {
  341. // this is the only case when this has to be done.
  342. var t=newL.querySelector('[class^="style-header_close_"]')
  343. if (!closeBut || (closeBut !== t) ) {
  344. closeBut=t;
  345. if (closeBut) {
  346. closeBut.addEventListener('click', function() {
  347. cancelNextRS=1;
  348. dontCancel='/';
  349. title='';
  350. document.title=title0;
  351. history.pushState({}, null, '/');
  352. });
  353. }
  354. }
  355. }
  356. if (!s) return;
  357. var a=document.querySelector('#weekly-installs');
  358. if (!a) return;
  359.  
  360. if (!totalI || !totalI._root.parentNode) {
  361. totalI=a.cloneNode(true);
  362. totalI.id='totalInstalls';
  363. totalI.dataset.tooltipContent='';
  364. totalI._v=totalI.querySelector(':scope div span');
  365. totalI._v.textContent='';
  366. var tt=a.nextElementSibling, ttTI;
  367. if ( tt.attributes.role && (tt.attributes.role.value == 'tooltip') ) ttTI=tt.cloneNode(true);
  368. if (!ttTI) {
  369. ttTI=document.createElement('div');
  370. ttTI.innerHTML='<div role="tooltip" _model class="react-tooltip styles-module_tooltip__mnnfp styles-module_dark__xNqje react-tooltip__place-top styles-module_show__2NboJ" style="visibility: hidden;">test<div class="react-tooltip-arrow styles-module_arrow__K0L3T" style="left: 40px; bottom: -4px;"></div></div>';
  371. ttTI=ttTI.firstElementChild;
  372. tt=totalI;
  373. }
  374. if (ttTI) {
  375. a.parentNode.insertBefore(ttTI, tt.nextSibling);
  376. if (ttTI.childNodes.length == 1) {
  377. let T=document.createTextNode('Total installs');
  378. ttTI.insertBefore(T, ttTI.firstChild);
  379. }
  380. else ttTI.childNodes[0].textContent='Total installs';
  381. totalI.onmouseenter=function(){
  382. ttTI.style.opacity='0.9';
  383. ttTI.style.visibility='visible';
  384. if (ttTI._init) return;
  385. ttTI._init=true;
  386. if (ttTI.attributes._model) {
  387. ttTI.style.top=(totalI.offsetTop - 47) +'px';
  388. ttTI.style.left=(totalI.offsetLeft -10) +'px';
  389. }
  390. else {
  391. ttTI.style.left=(totalI.offsetLeft - a.offsetLeft + tt.offsetLeft)+'px';
  392. ttTI.style.top=tt.style.top;
  393. ttTI.firstElementChild.setAttribute('style', tt.firstElementChild.attributes.style.value);
  394. }
  395. };
  396. totalI.onmouseleave=function(){ttTI.style.opacity='0'; ttTI.style.visibility='hidden';};
  397. }
  398. var i=totalI.querySelector(':scope > svg'), i2;
  399. if (i) {
  400. i2=i.cloneNode(true);
  401. totalI.insertBefore(i2, i.nextSibling);
  402. i2.style='margin-left: -17px';
  403. }
  404. a.parentNode.insertBefore(totalI, (tt || a).nextSibling);
  405. totalI._root=totalI.closest('[class^="style_mainWrapper_"]');
  406.  
  407. showCSS=totalI._root.querySelector('[class*="style-info_showCss_"]');
  408. if (showCSS) {
  409. new MutationObserver(function(mutations) {
  410. let e;
  411. if (e=showCSS.parentNode.querySelector('[class^="Popup_modalWrapper_"] textarea')) {
  412. if (loadCSS) {loadCSS=0; return;}
  413. if (styles[styleID].sourceCode) e.value=styles[styleID].sourceCode;
  414. else {
  415. e.value='';
  416. getCSS(styleID, function(v){e.value=styles[styleID].sourceCode=v.result;} );
  417. }
  418. }
  419. }).observe(showCSS.parentNode, { attributes: false, subtree: false, childList: true });
  420. }
  421. }
  422. else {
  423. let e=totalI._root.querySelector('[class^="Popup_modalWrapper_"] textarea');
  424. if (e) {
  425. if (styles[styleID].sourceCode) e.value=styles[styleID].sourceCode;
  426. else {
  427. e.value='';
  428. getCSS(styleID, function(v){e.value=styles[styleID].sourceCode=v.result;} );
  429. }
  430. }
  431. }
  432.  
  433. let v=parseInt(s.totalInstallsCount);
  434. let vd=a.querySelector('span'), vdv=vd.innerText;
  435. if (vdv.endsWith('k')) vdv=Math.floor(parseFloat(vdv) * 1000);
  436. else vdv=parseInt(vdv);
  437. if (vdv > v) {vd.style='text-decoration: line-through; text-decoration-color: red;';}
  438. else vd.style='';
  439. if (v > 1000) v=(v/1000).toFixed(1)+'k';
  440. totalI._v.textContent=v;
  441. document.title=title=s.name+site;
  442.  
  443. setTimeout(function(){
  444. if (!totalI._root.parentNode) addData('after');
  445. },10);
  446. }
  447.  
  448. function addDataTiles() {
  449. var a=document.querySelectorAll('[data-stylish^="strip-cube-styles"]:not(._done), [data-stylish^="grid-cube-styles"]:not(._done)');
  450. a.forEach((e) => e.classList.add('_done'));
  451. var i=0;
  452. add2Tiles();
  453. function add2Tiles() {
  454. var max=Date.now() + 100;
  455. for (; i < a.length; i++) {
  456. if (Date.now() > max) {
  457. setTimeout(add2Tiles, 0);
  458. return;
  459. }
  460. let e=a[i].querySelector('[class*="style-cube_activeUsers_"]');
  461. if (!e) continue;
  462. let h=a[i].querySelector('a[href^="/styles/"]');
  463. if (!h) continue;
  464. let s=styles[h.pathname.split('/')[2]];
  465. if (!s) continue;
  466. let r=a[i].querySelector('[class^="style-cube_styleDetails_"]');
  467.  
  468. let tot=e.cloneNode(true);
  469. e.title='Weekly installs';
  470. tot.classList.add('_totalInstalls');
  471. tot.title='Total installs';
  472. let _v=tot.querySelector(':scope div span');
  473. _v.textContent='';
  474. let I=tot.querySelector(':scope > svg'), i2;
  475. if (I) {
  476. i2=I.cloneNode(true);
  477. tot.insertBefore(i2, I.nextSibling);
  478. i2.style='margin-left: -9px';
  479. }
  480. // insert total
  481. e.parentNode.insertBefore(tot, e);
  482. let v=parseInt(s.totalInstallsCount);
  483. if (v > 1000) v=(v/1000).toFixed(1)+'k';
  484. _v.textContent=v;
  485. // add dates
  486. e=document.createElement('div');
  487. e.className='_dates_';
  488. let C=s.created.split('T')[0], U=s.updated.split('T')[0];
  489. e.innerHTML=(C == U ? '':'<span title="Last updated">'+U+'</span>')+'<span title="Date created">'+C+'</span>';
  490. r.appendChild(e);
  491. // add user name
  492. e=a[i].querySelector('[class^="style-cube_authorAvatar_"]');
  493. if (e) e.title=s.user.name;
  494. }
  495. }
  496. }
  497.  
  498.  
  499. var iST=`
  500. .hideMe {
  501. display: none;
  502. }
  503. div[class^="style_mainWrapper__"] {
  504. padding-top: 0;
  505. }
  506.  
  507. [data-stylish^="strip-cube-styles"] [class^="style-cube_topWrapper_"],
  508. [data-stylish^="grid-cube-styles"] [class^="style-cube_topWrapper_"] {
  509. margin-bottom: 0;
  510. }
  511. [data-stylish^="strip-cube-styles"] [class^="style-cube_styleDetails_"],
  512. [data-stylish^="grid-cube-styles"] [class^="style-cube_styleDetails_"] {
  513. flex-direction: row wrap;
  514. background: var(--bg, gray);
  515. margin-top: 2px;
  516. transition: unset !important;
  517. transition-delay: unset !important;
  518. padding-top: 2px;
  519. color: white;
  520. }
  521. [data-stylish^="strip-cube-styles"] [class^="style-cube_styleDetails_"] > *,
  522. [data-stylish^="grid-cube-styles"] [class^="style-cube_styleDetails_"] > * {
  523. text-overflow: ellipsis;
  524. overflow: hidden;
  525. word-break: break-all;
  526. }
  527. [data-stylish^="strip-cube-styles"] [class^="style-cube_styleDetails_"] [class^="style-cube_activeUsers_"],
  528. [data-stylish^="grid-cube-styles"] [class^="style-cube_styleDetails_"] [class^="style-cube_activeUsers_"] {
  529. width: auto !important;
  530. margin-left: auto;
  531. }
  532. [data-stylish^="strip-cube-styles"] [class^="style-cube_styleDetails_"] [class^="style-cube_activeUsers_"] + [class^="style-cube_activeUsers_"],
  533. [data-stylish^="grid-cube-styles"] [class^="style-cube_styleDetails_"] [class^="style-cube_activeUsers_"] + [class^="style-cube_activeUsers_"] {
  534. margin-left: 1em;
  535. }
  536. [data-stylish^="strip-cube-styles"] [class^="style-cube_styleDetails_"] [class^="style-cube_activeUsers_"] svg,
  537. [data-stylish^="grid-cube-styles"] [class^="style-cube_styleDetails_"] [class^="style-cube_activeUsers_"] svg {
  538. fill: white;
  539. display: block;
  540. }
  541. [data-stylish^="strip-cube-styles"] [class^="style-cube_styleDetails_"] [class^="style-cube_name_"] *,
  542. [data-stylish^="grid-cube-styles"] [class^="style-cube_styleDetails_"] [class^="style-cube_name_"] * {
  543. text-overflow: ellipsis;
  544. overflow: hidden;
  545. }
  546. [data-stylish^="strip-cube-styles"] [class^="style-cube_styleDetails_"] > [class^="style-cube_styleName_"],
  547. [data-stylish^="grid-cube-styles"] [class^="style-cube_styleDetails_"] > [class^="style-cube_styleName_"] {
  548. oline-height: normal;
  549. flex-basis: calc(100% - 40px);
  550. }
  551. [data-stylish^="strip-cube-styles"] [class^="style-cube_styleDetails_"] > [class^="style-cube_details_"],
  552. [data-stylish^="grid-cube-styles"] [class^="style-cube_styleDetails_"] > [class^="style-cube_details_"] {
  553. width: auto !important;
  554. margin-left: auto;
  555. ooutline: 2px solid red !important;
  556. }
  557.  
  558. [data-stylish^="strip-cube-styles"] [class*="style-cube_withHover_"]:hover,
  559. [data-stylish^="grid-cube-styles"] [class*="style-cube_withHover_"]:hover {
  560. transform: unset !important;
  561. transition: unset !important;
  562. transition-delay: unset !important;
  563. background-color: unset !important;
  564. --bg: DarkSlateGrey;
  565. }
  566.  
  567. ._dates_._dates_ {
  568. flex-basis: 100%;
  569. margin-top: 2px;
  570. text-align: right;
  571. }
  572. ._dates_ span {
  573. color: lightgray;
  574. font-size: 11px;
  575. }
  576. ._dates_ span + span {
  577. margin-left: 1em;
  578. }
  579.  
  580. [class^="styles-strip_stripItemsWrapper_"] > button {
  581. display: none !important;
  582. }
  583. [class^="styles-strip_stripItemsWrapper_"] {
  584. overflow-x: scroll;
  585. padding-bottom: 4px;
  586. }
  587. [class^="styles-strip_stripItemsWrapper_"]::-webkit-scrollbar {
  588. height: 8px !important;
  589. }
  590. [class^="styles-strip_items_"] {
  591. transform: unset !important;
  592. }
  593.  
  594. :not(g):not(button):not([class^="style_mainWrapper_"])) {
  595. transform: unset !important;
  596. transition: unset !important;
  597. transition-delay: unset !important;
  598. }
  599. svg[transform*="rotate(-180)"] {
  600. transform: rotate(-180deg) !important;
  601. }
  602.  
  603. [class^="category-filter_borderRadios_"] {
  604. display: none;
  605. }
  606.  
  607. [class^="styles-list_styleName_"] {
  608. word-break: break-word;
  609. }
  610.  
  611. [role="tooltip"] .react-tooltip-arrow {
  612. bottom: -7px !important;
  613. border-color: var(--rt-color-dark) transparent;
  614. border-style: solid;
  615. border-width: 7px 7px 0 7px;
  616. display: block;
  617. background: transparent;
  618. transform: none;
  619. }
  620.  
  621. #totalInstalls {
  622. order: -1;
  623. }
  624.  
  625. /* fix prothemes sliding right-left - 20230613*/
  626. [class^="styles-strip_sliderWrapper_"][class*="styles-strip_lastPage_"] {
  627. left: -40px !important;
  628. right: auto !important;
  629. }
  630. `;
  631.  
  632. addSt();
  633.  
  634. var ST;
  635. function addSt() {
  636. if (!iST) {
  637. document.documentElement.appendChild(ST);
  638. return;
  639. }
  640. try {
  641. ST=document.createElement('style');
  642. document.documentElement.appendChild(ST);
  643. ST.textContent=iST;
  644. iST='';
  645. }catch(e){
  646. setTimeout(addSt,0); }
  647. }
  648.  
  649.  
  650. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址