Greasyfork 暗黑主题

Greasyfork 的暗黑主题

目前为 2024-08-10 提交的版本。查看 最新版本

// ==UserScript==
// @name           Dark Greasyfork
// @name:en        Dark Greasyfork
// @name:vi        Greasyfork Tối
// @name:zh-CN     Greasyfork 暗黑主题
// @name:zh-TW     Greasyfork 夜間模式
// @name:ja        Greasyfork ダークテーマ
// @name:ko        Greasyfork 다크 테마
// @name:es        Greasyfork Oscuro
// @name:ru        Greasyfork Тёмная тема
// @name:id        Greasyfork Gelap
// @name:hi        Greasyfork डार्क थीम
// @namespace    http://tampermonkey.net/
// @version        1.2.3
// @description    dark theme for greasyfork
// @description:en dark theme for greasyfork
// @description:vi Giao diện tối cho greasyfork
// @description:zh-CN Greasyfork 的暗黑主题
// @description:zh-TW Greasyfork 的夜間模式
// @description:ja Greasyfork のダークテーマ
// @description:ko Greasyfork의 다크 테마
// @description:es Tema oscuro para greasyfork
// @description:ru Тёмная тема для greasyfork
// @description:id Tema gelap untuk greasyfork
// @description:hi greasyfork के लिए डार्क थीम
// @author         Jann
// @license        MIT
// @icon           https://greasyfork.org/vite/assets/blacklogo96-CxYTSM_T.png
// @match          *greasyfork.org/*
// @match          *sleazyfork.org/*
// @grant          GM_addStyle
// ==/UserScript==

(function() {
  'use strict';

  // Variables (you can customize these)
  const headerBkg = 'rgb(29, 32, 37)';
  const dark1 = 'rgb(29, 32, 37)';
  const dark2 = 'rgb(40, 44, 52)';
  const dark3 = 'rgb(37, 41, 49)';
  const dark4 = 'rgb(33, 36, 43)';
  const blue1 = 'rgb(82, 139, 255)';
  const blue2 = 'rgb(97, 175, 239)';
  const bluePool = 'rgb(86, 182, 194)';
  const lavender = 'rgb(198, 120, 221)';
  const green = 'rgb(152, 195, 121)';
  const pink = 'rgb(224, 108, 117)';
  const lightBrown = 'rgb(209, 154, 102)';
  const red = 'rgb(190, 80, 70)';
  const yellow = 'rgb(235, 215, 17)';
  const lightYellow = 'rgb(229, 192, 123)';
  const blueIce = 'rgb(171, 178, 191)';
  const lightGray = 'rgb(204, 204, 204)';
  const lightGreen = 'rgba(130, 255, 130, 0.6)';
  const lightRed = 'rgba(255, 130, 130, 0.6)';
  const translucent = 'rgba(255, 255, 255, .3)';
  const black = 'rgba(0, 0, 0, 1)';
  const dBorderRadius = '5px 0 100px 1px';
  const wrapCode = false; // Set to true to wrap code in container
  const modHeaders = true; // Set to true to apply to headers
  const invertBkgHPP = false; // Set to true to invert background color for Greasyfork++ header
  const modScrollbars = true; // Set to true to apply to scrollbars

  // CSS styles
  const css = `
    :root {
      --dark-1: ${dark1} !important;
      --dark-2: ${dark2} !important;
      --dark-3: ${dark3} !important;
      --dark-4: ${dark3} !important;
      --blue-1: ${blue1} !important;
      --blue-2: ${blue2} !important;
      --blue-pool: ${bluePool} !important;
      --lavender: ${lavender} !important;
      --green: ${green} !important;
      --pink:  ${pink} !important;
      --light-brown: ${lightBrown} !important;
      --red: ${red} !important;
      --yellow: ${yellow} !important;
      --light-yellow: ${lightYellow} !important;
      --blue-ice: ${blueIce} !important;
      --light-gray: ${lightGray} !important;
      --light-green: ${lightGreen} !important;
      --light-red: ${lightRed} !important;
      --translucent: ${translucent} !important;
      --black: ${black} !important;
      --default-border-radius: ${dBorderRadius} !important;
    }
    .bradius {
      border-radius: var(--default-border-radius);
    }
    body {
      background-color: var(--dark-3) !important;
      color: var(--light-gray) !important;
    }
    #main-header,
    #main-header a,
    #main-header a:visited,
    #main-header a:active {
      color: var(--light-gray) !important;
    }
    nav nav {
      background-color: var(--dark-3) !important;
      border: 1px solid var(--dark-2) !important;
      box-shadow: 0 0 5px var(--dark-2) !important;
    }
    a:not(.install-link, .install-help-link) {
      color: var(--pink) !important;
    }
    #main-header {
      ${modHeaders ? 'background-image: none !important;' : ''}
      background-color: ${headerBkg} !important;
    }
    .script-list,
    .user-list,
    .text-content,
    .discussion-list,
    .list-option-group ul,
    #script-info,
    .discussion-read,
    #discussion-locale{
      ${modHeaders ? 'background-image: unset !important;' : ''}
      background-color: var(--dark-1) !important;
      box-shadow: 0 0 5px var(--dark-2) !important;
      border: 1px solid var(--dark-2) !important;
      border-radius: var(--default-border-radius) !important;
    }
    .block-button {
      background-color: var(--dark-2) !important;
      border: 1px solid var(--dark-3) !important;
      color: var(--light-gray) !important;
    }
    .user-content,
    #script_version_code {
      background-image: unset !important;
      background-color: var(--dark-1) !important;
      border-color: var(--dark-2) !important;
    }
    .code-container {
      border-color: var(--dark-3) !important;
      border-style: solid !important;
    }
    pre.prettyprint {
      border: none !important;
    }
    #script_version_code {
      color: var(--light-gray) !important;
    }
    .default-input,
    .sidebar-search input[type="search"],
    .home-search input[type="search"],
    .list-option-button,
    input[type="search"],
    #language-selector-locale,
    form.new_user input[type="text"],
    form.new_user input[type="email"],
    form.new_user input[type="password"],
    #favorite-groups {
      background-color: var(--dark-4) !important;
      border: 1px solid var(--dark-2) !important;
      color: var(--blue-ice) !important;
      border-radius: var(--default-border-radius) !important;
    }
    .notice {
      background-color: var(--dark-1);
      border-left: 6px solid var(--blue-pool);
    }
    form.external-login-form,
    form.new_user {
      background-color: var(--dark-3);
      border: 1px solid var(--dark-2);
    }
    form.new_user input[type="submit"] {
      background-color: var(--blue-pool);
      color: #fff;
      background-image: unset;
    }
    .list-option-button:hover,
    .list-option-button:focus {
      background-image: unset !important;
      background-color: var(--dark-2) !important;
    }
    .sidebar-search input[type="search"]:focus-visible,
    .home-search input[type="search"]:focus-visible {
      background-color: var(--dark-3) !important;
      border: 1px solid var(--blue-pool) !important;
      outline: none !important;
    }
    input[type="submit"] {
      background-color: var(--dark-3) !important;
      color: var(--light-gray) !important;
      border: 1px solid var(--dark-2) !important;
    }
    input[type="submit"]:hover {
      background-color: var(--dark-2) !important;
    }
    .sidebar-search input[type="search"] {
      font-size: 14px !important;
    }
    .list-option-group ul {
      background-color: var(--dark-1) !important;
    }
    .list-option-group .list-current,
    .tabs .current {
      border-color: var(--red) !important;
      background-image: unset !important;
      background-color: var(--dark-2) !important;
    }
    .list-option-group a:hover,
    .list-option-group a:focus {
      background-image: unset !important;
      background-color: var(--dark-2) !important;
      box-shadow: unset !important;
    }
    input[type="checkbox"] {
      accent-color: var(--blue-1) !important;
    }
    input[type="radio"] {
      accent-color: var(--blue-1) !important;
    }
    .script-list li:not(.ad-entry) {
      border: 1px solid var(--dark-3)
    }
    .pagination > *,
    .script-list + .pagination > *,
    .user-list + .pagination > * {
      background-color: var(--dark-2) !important;
    }
    .pagination .current,
    .pagination .gap {
      background-color: transparent !important;
    }
    a.next_page,
    .pagination a:not(.current) {
      color: var(--red) !important;
    }
    .previewable textarea,
    #discussion_comments_attributes_0_text {
      background-color: var(--dark-2) !important;
      border: 1px solid var(--dark-3) !important;
      color: var(--light-gray) !important;
    }
    #discussion_comments_attributes_0_text:focus-visible {
      outline: none !important;
      border: 1px solid var(--dark-3) !important;
    }
    .rating-icon {
      background-color: var(--dark-3) !important;
    }
    .rating-icon-bad,
    .bad-rating-count {
      color: var(--red) !important;
      border-color: currentColor !important;
    }
    .rating-icon-ok,
    .ok-rating-count {
      color: var(--yellow) !important;
      border-color: currentColor !important;
    }
    .rating-icon-good,
    .good-rating-count {
      color: var(--green) !important;
      border-color: currentColor !important;
    }
    pre:not(pre.prettyprint),
    code {
      border: 1px solid var(--dark-2) !important;
    }
    code {
      background-color: var(--dark-1) !important;
    }
    li.L1,
    li.L3,
    li.L5,
    li.L7,
    li.L9 {
      background-color: var(--dark-3) !important;
    }
    .diff li.unchanged:nth-child(odd) {
      background-color: var(--dark-3) !important;
    }
    .diff ul {
      background-color: var(--dark-1) !important;
    }
    .diff li.del {
      background: var(--light-red) !important;
      color: rgb(30, 0, 0) !important;
    }
    .diff li.ins {
      background: var(--light-green) !important;
      color: rgb(0, 30, 5) !important;
    }
    .diff li:hover {
      background: unset;
    }
    .com {
      color: var(--lavender) !important;
    }
    .clo,
    .opn,
    .pun {
      color: var(--yellow) !important;
    }
    .kwd {
      color: var(--blue-2) !important;
    }
    .str {
      color: var(--green) !important;
    }
    .pln {
      color: var(--light-yellow) !important;
    }
    .lit {
      color: var(--pink) !important;
    }
    .typ {
      color: var(--blue-pool) !important;
    }
    ol.linenums {
      padding-left: 55px !important
    }
    ${modScrollbars ? `
      .code-container, select {
        &::-webkit-scrollbar {
          width: 8px !important;
          height: 8px !important;
        }
      }
      ::-webkit-scrollbar-track {
        background: alpha(black, .2) !important;
      }
      ::-webkit-scrollbar-thumb {
        background: alpha(var(--translucent), .2) !important;
        border-radius: var(--default-border-radius) !important;
      }
      ::-webkit-scrollbar-thumb:hover {
        background: alpha(var(--translucent), .3) !important;
      }
      ::-webkit-scrollbar-corner {
        background: alpha(black, .2) !important;
      }
      ::-webkit-scrollbar-button {
        display: none !important;
      }
    ` : ''}
    .validation-errors {
      border-color: var(--light-yellow) !important;
      background-color: var(--dark-3) !important;
    }
    iframe#greasyfork-plus {
      border: 1px solid var(--dark-2) !important;
      box-shadow: 0px 0px 50px 10px rgba(0, 0, 0, .4)
      @extend .bradius;
    }
    ${wrapCode ? `
      .code-container > pre {
        width: 100% !important;
        overflow-x: hidden !important;
        text-wrap: wrap !important;
        padding: 0 !important;
      }
    ` : ''}
    /* Integrating the provided CSS for Waterfox Classic */
    .comment-meta-item.comment-meta-item-main + .comment-meta-item  + .comment-meta-item {
        display: inline-block !important;
        width: 100% !important;
        min-width: 189px !important;
        max-width: 189px !important;
    }
    .comment-meta-item.comment-meta-item-main + .comment-meta-item  + .comment-meta-item  > relative-time:before {
        content: attr(datetime) !important;
        clip-path: inset(0px 125px 0px 0px) !important;
        position: absolute !important;
        display: inline-block !important;
        height: 100% !important;
        min-height: 20px !important;
        max-height: 20px !important;
        line-height: 20px !important;
        width: 201px !important;
        margin: 1px 0 0 2px !important;
        padding: 0 2px 0 0 !important;
        letter-spacing: 1.4px !important;
        font-size: 12px !important;
        visibility: visible !important;
        opacity: 1 !important;
        text-align: left !important;
        color: red !important;
        background: #111 !important;
    }
    .comment-meta-item.comment-meta-item-main + .comment-meta-item  + .comment-meta-item  > relative-time:after{
        content: attr(datetime)!important;
        clip-path: inset(0px 98px 0px 114px) !important;
        position: absolute !important;
        display: inline-block !important;
        height: 100% !important;
        min-height: 20px !important;
        max-height: 20px !important;
        line-height: 20px !important;
        width: 250px !important;
        margin: 1px 10vw 0 0vw !important;
        left: 30px !important;
        letter-spacing: 1.4px !important;
        font-size: 12px !important;
        visibility: visible !important;
        opacity: 1 !important;
        text-align: center !important;
        color: gold !important;
    }
    .comment-meta-item.comment-meta-item-main + .comment-meta-item  + .comment-meta-item + .comment-meta-item{
        display: inline-block !important;
        height: 100% !important;
        min-height: 20px !important;
        max-height: 20px !important;
        line-height: 20px !important;
        width: 100% !important;
        min-width: 160px !important;
        max-width: 160px !important;
    }
    .comment-meta-item.comment-meta-item-main + .comment-meta-item  + .comment-meta-item + .comment-meta-item  > relative-time:after {
        content: attr(datetime) !important;
        clip-path: inset(0px 98px 0px 114px) !important;
        position: absolute !important;
        display: inline-block !important;
        height: 100% !important;
        min-height: 20px !important;
        max-height: 20px !important;
        line-height: 20px !important;
        width: 250px !important;
        margin: 0px 0 0 -100px !important;
        letter-spacing: 1.4px !important;
        font-size: 12px !important;
        visibility: visible !important;
        opacity: 1 !important;
        text-align: center !important;
        color: pink !important;
    }
    #script-meta dd.script-show-updated-date > span relative-time:before  ,
    #script-meta dd.script-show-created-date > span relative-time:before {
        content: attr(datetime) !important;
        clip-path: inset(0px 115px 0px 0px) !important;
        position: absolute !important;
        display: inline-block !important;
        height: 100% !important;
        min-height: 15px !important;
        max-height: 15px !important;
        line-height: 15px !important;
        width: 201px !important;
        margin: 1px 0 0 -10px !important;
        padding: 0 2px 0 0 !important;
        letter-spacing: 1.4px !important;
        font-size: 12px !important;
        visibility: visible !important;
        opacity: 1 !important;
        text-align: left !important;
        color: red !important;
        background: #111 !important;
    }
    .post-discussion .script-discussion-list .discussion-list-container .discussion-meta > .discussion-meta-item:first-of-type > relative-time:before {
        content: attr(datetime) !important;
        clip-path: inset(0px 127px 0px 0px) !important;
        position: absolute !important;
        display: inline-block !important;
        height: 100% !important;
        min-height: 15px !important;
        max-height: 15px !important;
        line-height: 15px !important;
        width: 201px !important;
        margin: 1px 0 0 20px !important;
        padding: 0 2px 0 0 !important;
        letter-spacing: 1.4px !important;
        font-size: 12px !important;
        visibility: visible !important;
        opacity: 1 !important;
        text-align: left !important;
        color: gold !important;
        background: #111 !important;
    }
    .post-discussion .script-discussion-list .discussion-list-container .discussion-meta > .discussion-meta-item:last-of-type .discussion-meta-item> relative-time:before {
        content: attr(datetime) !important;
        clip-path: inset(0px 127px 0px 0px) !important;
        position: relative !important;
        display: inline-block !important;
        height: 100% !important;
        min-height: 15px !important;
        max-height: 15px !important;
        line-height: 15px !important;
        width: 201px !important;
        margin: 1px 0 0 10px !important;
        padding: 0 2px 0 0 !important;
        letter-spacing: 1.4px !important;
        font-size: 12px !important;
        visibility: visible !important;
        opacity: 1 !important;
        text-align: left !important;
        color: red !important;
        background: #111 !important;
    }
    /* Hiding the datetime elements for non-Waterfox Classic browsers */
    @supports (contain:paint) {
        .post-discussion .script-discussion-list .discussion-list-container .discussion-meta > .discussion-meta-item:first-of-type > relative-time:before ,
        .post-discussion .script-discussion-list .discussion-list-container .discussion-meta > .discussion-meta-item:last-of-type .discussion-meta-item> relative-time:before ,
        #script-meta dd.script-show-updated-date > span relative-time:before  ,
        #script-meta dd.script-show-created-date > span relative-time:before ,
        .comment-meta-item.comment-meta-item-main + .comment-meta-item  + .comment-meta-item + .comment-meta-item  > relative-time:before ,
        .comment-meta-item.comment-meta-item-main + .comment-meta-item  + .comment-meta-item + .comment-meta-item  > relative-time:after ,
        .comment-meta-item.comment-meta-item-main + .comment-meta-item  + .comment-meta-item  > relative-time:before {
            display: none !important;
        }
        .comment-meta-item.comment-meta-item-main + .comment-meta-item  + .comment-meta-item  > relative-time:after {
            content: attr(datetime)!important;
            clip-path: inset(0px 98px 0px 114px) !important;
            display: none !important;
        }
    }
  `;

  // Greasyfork++ specific styles
  const greasyforkPlusCSS = `
    html:has(body#greasyfork-plus) {
      background: var(--dark-1) !important;

      body {
        background: var(--dark-1) !important;
      }
      #greasyfork-plus_wrapper {
        background: var(--dark-1) !important;
        border: none !important;
      }

      button[id^="greasyfork-plus"] {
        background: var(--dark-4) !important;
        border: 1px solid var(--dark-2) !important;
        color: var(--blue-ice) !important;
        @extend .bradius;
      }
      input, textarea {
        margin-block: 5px !important;
        @extend .default-input;
      }
      .section_header.center {
        ${modHeaders ? 'background-image: unset !important;' : ''}
        background-color: var(--dark-3) !important;
        @extend .bradius;
      }
      b {
        color: var(--lavender) !important;
      }
      ${modScrollbars ? `
        #greasyfork-plus_wrapper {
          &::-webkit-scrollbar {
            width: 8px !important;
            height: 8px !important;
          }
        }
        ::-webkit-scrollbar-track {
          background: alpha(black, .2) !important;
        }
        ::-webkit-scrollbar-thumb {
          background: alpha(var(--translucent), .2) !important;
          border-radius: var(--default-border-radius) !important;
        }
        ::-webkit-scrollbar-thumb:hover {
          background: alpha(var(--translucent), .3) !important;
        }
        ::-webkit-scrollbar-corner {
          background: alpha(black, .2) !important;
        }
        ::-webkit-scrollbar-button {
          display: none !important;
        }
      ` : ''}
      ${invertBkgHPP ? `
        background: var(--dark-3) !important;

        body, #greasyfork-plus_wrapper {
          background: var(--dark-3) !important;
        }
        .section_header.center {
          background: var(--dark-1) !important;
        }
      ` : ''}
    }
  `;

  // Apply styles
  GM_addStyle(css);
  GM_addStyle(greasyforkPlusCSS);
})();