// ==UserScript==
// @name Greasyfork Dark Theme
// @name:en Greasyfork Dark Theme
// @name:vi Giao diện chủ đề tối Greasyfork
// @name:zh-CN Greasyfork 暗黑主题
// @name:zh-TW Greasyfork 暗黑主題
// @name:ja Greasyfork ダークテーマ
// @name:ko Greasyfork 다크 테마
// @name:es Greasyfork 테마 어두움
// @name:ru Темная тема Greasyfork
// @name:id Tema Gelap Greasyfork
// @name:hi Greasyfork डार्क थीम
// @namespace http://tampermonkey.net/
// @version 1.8.2
// @description A sleek and modern dark theme for Greasyfork.
// @description:en A sleek and modern dark theme for Greasyfork.
// @description:vi Giao diện chủ đề tối cho Greasyfork.
// @description:zh-CN 为 Greasyfork 打造的时尚现代暗黑主题。
// @description:zh-TW 為 Greasyfork 打造的時尚現代暗黑主題。
// @description:ja Greasyfork の洗練されたモダンなダークテーマ。
// @description:ko Greasyfork를 위한 세련되고 현대적인 다크 테마。
// @description:es Un tema oscuro elegante y moderno para Greasyfork.
// @description:ru Изящная и современная темная тема для Greasyfork с улучшенными визуальными эффектами и удобочитаемостью.
// @description:id Tema gelap yang ramping dan modern untuk Greasyfork, dengan visual dan keterbacaan yang ditingkatkan.
// @description:hi Greasyfork के लिए एक आकर्षक और आधुनिक डार्क थीम, जिसमें बेहतर विजुअल और पठनीयता है।
// @author RenjiYuusei
// @license GPL-3.0-only
// @icon https://greasyfork.org/vite/assets/blacklogo96-CxYTSM_T.png
// @match https://greasyfork.org/*
// @match https://sleazyfork.org/*
// @grant GM_addStyle
// ==/UserScript==
(() => {
'use strict';
// Định nghĩa biến màu và cấu hình
const colors = {
header: 'rgb(32, 33, 36)',
dark: {
1: 'rgb(32, 33, 36)',
2: 'rgb(40, 41, 45)',
3: 'rgb(48, 49, 54)',
4: 'rgb(55, 56, 62)',
5: 'rgb(62, 63, 69)',
},
blue: {
1: 'rgb(138, 180, 248)',
2: 'rgb(138, 180, 248)',
3: 'rgb(120, 160, 255)',
pool: 'rgb(138, 180, 248)',
},
accent: {
lavender: 'rgb(204, 120, 250)',
green: 'rgb(106, 135, 89)',
pink: 'rgb(198, 120, 221)',
lightBrown: 'rgb(190, 144, 99)',
red: 'rgb(204, 120, 50)',
yellow: 'rgb(255, 198, 109)',
lightYellow: 'rgb(255, 198, 109)',
blueIce: 'rgb(169, 183, 198)',
orange: 'rgb(204, 120, 50)',
purple: 'rgb(155, 89, 182)',
teal: 'rgb(100, 180, 160)',
coral: 'rgb(255, 127, 80)',
},
text: {
light: 'rgb(169, 183, 198)',
success: 'rgba(106, 135, 89, 0.6)',
error: 'rgba(204, 120, 50, 0.6)',
warning: 'rgba(255, 198, 109, 0.6)',
info: 'rgba(138, 180, 248, 0.6)',
},
utils: {
translucent: 'rgba(255, 255, 255, .2)',
black: 'rgba(0, 0, 0, 1)',
overlay: 'rgba(0, 0, 0, 0.5)',
shadow: 'rgba(0, 0, 0, 0.15)',
},
gradient: {
primary: 'linear-gradient(45deg, var(--blue-1), var(--lavender))',
secondary: 'linear-gradient(45deg, var(--green), var(--blue-ice))',
},
};
// Cấu hình giao diện
const config = {
borderRadius: '8px',
wrapCode: true,
modHeaders: true,
invertBkgHPP: false,
modScrollbars: true,
animations: true,
glassmorphism: true,
customFonts: true,
darkMode: {
auto: true,
level: 'dark',
},
performance: {
reducedMotion: false,
optimizeRendering: true,
},
};
// Tạo biến CSS root với các biến mới
const createRootVars = () => {
const vars = {
'--dark-1': colors.dark[1],
'--dark-2': colors.dark[2],
'--dark-3': colors.dark[3],
'--dark-4': colors.dark[4],
'--dark-5': colors.dark[5],
'--blue-1': colors.blue[1],
'--blue-2': colors.blue[2],
'--blue-3': colors.blue[3],
'--blue-pool': colors.blue.pool,
'--lavender': colors.accent.lavender,
'--green': colors.accent.green,
'--pink': colors.accent.pink,
'--light-brown': colors.accent.lightBrown,
'--red': colors.accent.red,
'--yellow': colors.accent.yellow,
'--light-yellow': colors.accent.lightYellow,
'--blue-ice': colors.accent.blueIce,
'--orange': colors.accent.orange,
'--purple': colors.accent.purple,
'--teal': colors.accent.teal,
'--coral': colors.accent.coral,
'--light-gray': colors.text.light,
'--light-green': colors.text.success,
'--light-red': colors.text.error,
'--light-warning': colors.text.warning,
'--light-info': colors.text.info,
'--translucent': colors.utils.translucent,
'--black': colors.utils.black,
'--overlay': colors.utils.overlay,
'--shadow': colors.utils.shadow,
'--gradient-primary': colors.gradient.primary,
'--gradient-secondary': colors.gradient.secondary,
'--default-border-radius': config.borderRadius,
'--transition-speed': config.performance.reducedMotion ? '0s' : '0.3s',
'--font-primary': '"Segoe UI", system-ui, -apple-system, sans-serif',
'--font-code': '"Fira Code", monospace',
};
return Object.entries(vars)
.map(([key, value]) => `${key}: ${value} !important;`)
.join('\n');
};
// Tạo CSS styles với các cải tiến mới
const css = `
:root {
${createRootVars()}
}
/* Base styles */
body {
background-color: var(--dark-3) !important;
color: var(--light-gray) !important;
font-size: 14px !important;
line-height: 1.5 !important;
font-family: var(--font-primary) !important;
transition: background-color var(--transition-speed) ease !important;
will-change: transform !important;
backface-visibility: hidden !important;
-webkit-font-smoothing: antialiased !important;
}
/* Header styles với glassmorphism */
#main-header {
${config.modHeaders ? 'background-image: none !important;' : ''}
background-color: ${config.glassmorphism ? 'rgba(32, 33, 36, 0.8)' : colors.header} !important;
backdrop-filter: ${config.glassmorphism ? 'blur(10px)' : 'none'} !important;
padding: 10px 0 !important;
position: sticky !important;
top: 0 !important;
z-index: 1000 !important;
box-shadow: 0 1px 3px var(--shadow) !important;
}
#main-header .width-constraint {
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
flex-wrap: wrap !important;
max-width: 1200px !important;
margin: 0 auto !important;
padding: 0 20px !important;
}
#main-header,
#main-header a,
#main-header a:visited,
#main-header a:active {
color: var(--light-gray) !important;
text-decoration: none !important;
}
/* Navigation styles với animation */
nav {
background-color: var(--dark-3) !important;
border: 1px solid var(--dark-2) !important;
box-shadow: 0 1px 2px var(--shadow) !important;
border-radius: var(--default-border-radius) !important;
margin: 8px 0 !important;
transition: all var(--transition-speed) ease !important;
will-change: transform !important;
}
nav ul {
display: flex !important;
flex-wrap: wrap !important;
gap: 15px !important;
padding: 10px !important;
margin: 0 !important;
list-style: none !important;
}
nav li {
margin: 0 !important;
}
nav a {
padding: 8px 15px !important;
border-radius: var(--default-border-radius) !important;
transition: all var(--transition-speed) ease !important;
position: relative !important;
overflow: hidden !important;
will-change: transform !important;
}
nav a:hover {
background-color: var(--dark-4) !important;
transform: translateY(-2px) !important;
}
nav a::after {
content: '' !important;
position: absolute !important;
bottom: 0 !important;
left: 0 !important;
width: 100% !important;
height: 2px !important;
background: var(--gradient-primary) !important;
transform: scaleX(0) !important;
transition: transform var(--transition-speed) ease !important;
will-change: transform !important;
}
nav a:hover::after {
transform: scaleX(1) !important;
}
/* Link styles với hiệu ứng */
a:not(.install-link, .install-help-link) {
color: var(--blue-1) !important;
text-decoration: none !important;
transition: all var(--transition-speed) ease !important;
position: relative !important;
will-change: transform !important;
}
a:not(.install-link, .install-help-link):hover {
color: var(--blue-ice) !important;
text-decoration: none !important;
}
a:not(.install-link, .install-help-link)::after {
content: '' !important;
position: absolute !important;
width: 100% !important;
height: 1px !important;
bottom: -2px !important;
left: 0 !important;
background-color: var(--blue-ice) !important;
transform: scaleX(0) !important;
transform-origin: right !important;
transition: transform var(--transition-speed) ease !important;
will-change: transform !important;
}
a:not(.install-link, .install-help-link):hover::after {
transform: scaleX(1) !important;
transform-origin: left !important;
}
/* Content containers với glassmorphism */
.script-list,
.user-list,
.text-content,
.discussion-list,
.list-option-group ul,
#script-info,
.discussion-read,
#discussion-locale,
#about-user,
.form-section,
.script-screenshot-control {
${config.modHeaders ? 'background-image: unset !important;' : ''}
background-color: ${config.glassmorphism ? 'rgba(32, 33, 36, 0.8)' : 'var(--dark-1)'} !important;
backdrop-filter: ${config.glassmorphism ? 'blur(10px)' : 'none'} !important;
box-shadow: 0 1px 3px var(--shadow) !important;
border: 1px solid var(--dark-2) !important;
border-radius: var(--default-border-radius) !important;
padding: 15px !important;
margin-bottom: 15px !important;
transition: all var(--transition-speed) ease !important;
will-change: transform !important;
}
/* Hover effects với animation */
.discussion-list li,
.script-list li,
.user-list li {
padding: 15px !important;
border-radius: var(--default-border-radius) !important;
transition: all var(--transition-speed) ease !important;
position: relative !important;
z-index: 1 !important;
will-change: transform !important;
transform: translateZ(0) !important;
}
.discussion-list li:hover,
.script-list li:hover,
.user-list li:hover {
background-color: var(--dark-2) !important;
transform: translateY(-2px) translateZ(0) !important;
box-shadow: 0 5px 15px var(--shadow) !important;
}
/* Form elements với hiệu ứng */
.default-input,
input[type="search"],
input[type="text"],
input[type="email"],
input[type="password"],
select,
textarea {
background-color: var(--dark-4) !important;
border: 2px solid var(--dark-2) !important;
color: var(--blue-ice) !important;
border-radius: var(--default-border-radius) !important;
padding: 8px 12px !important;
margin: 8px 0 !important;
width: 100% !important;
max-width: 100% !important;
transition: all var(--transition-speed) ease !important;
font-size: 14px !important;
font-family: var(--font-primary) !important;
will-change: transform !important;
}
input:focus,
select:focus,
textarea:focus {
outline: none !important;
border-color: var(--blue-pool) !important;
box-shadow: 0 0 0 2px rgba(104, 151, 187, 0.2) !important;
transform: translateY(-1px) !important;
}
/* Buttons với gradient và animation */
.install-link,
.install-help-link,
input[type="submit"],
.button {
background: var(--gradient-primary) !important;
color: var(--dark-1) !important;
border: none !important;
border-radius: var(--default-border-radius) !important;
padding: 8px 16px !important;
font-size: 14px !important;
font-weight: 600 !important;
cursor: pointer !important;
transition: all var(--transition-speed) ease !important;
text-align: center !important;
display: inline-block !important;
text-decoration: none !important;
margin: 5px !important;
box-shadow: 0 1px 2px var(--shadow) !important;
position: relative !important;
overflow: hidden !important;
will-change: transform !important;
}
.install-link:hover,
.install-help-link:hover,
input[type="submit"]:hover,
.button:hover {
transform: translateY(-2px) !important;
box-shadow: 0 5px 15px var(--shadow) !important;
}
.install-link::before,
.install-help-link::before,
input[type="submit"]::before,
.button::before {
content: '' !important;
position: absolute !important;
top: 0 !important;
left: -100% !important;
width: 100% !important;
height: 100% !important;
background: linear-gradient(
120deg,
transparent,
rgba(255, 255, 255, 0.2),
transparent
) !important;
transition: all 0.6s ease !important;
will-change: transform !important;
}
.install-link:hover::before,
.install-help-link:hover::before,
input[type="submit"]:hover::before,
.button:hover::before {
left: 100% !important;
}
/* Responsive design */
@media (max-width: 1024px) {
body {
font-size: 15px !important;
}
.width-constraint {
padding: 0 15px !important;
}
#main-header .width-constraint {
flex-direction: column !important;
align-items: flex-start !important;
}
nav {
display: block !important;
width: 100% !important;
}
.menu-toggle {
display: block !important;
padding: 10px !important;
background: none !important;
border: none !important;
color: var(--light-gray) !important;
cursor: pointer !important;
}
nav ul {
display: none !important;
}
nav.active ul {
display: flex !important;
flex-direction: column !important;
width: 100% !important;
}
nav li {
width: 100% !important;
}
nav a {
display: block !important;
text-align: left !important;
padding: 12px 15px !important;
}
/* Mobile Menu Toggle Button */
.menu-toggle {
position: absolute !important;
right: 15px !important;
top: 15px !important;
z-index: 1001 !important;
width: 30px !important;
height: 30px !important;
background: transparent !important;
border: none !important;
cursor: pointer !important;
padding: 0 !important;
}
.menu-toggle span {
display: block !important;
width: 100% !important;
height: 2px !important;
background: var(--light-gray) !important;
margin: 6px 0 !important;
transition: all 0.3s ease !important;
}
.menu-toggle.active span:nth-child(1) {
transform: rotate(45deg) translate(6px, 6px) !important;
}
.menu-toggle.active span:nth-child(2) {
opacity: 0 !important;
}
.menu-toggle.active span:nth-child(3) {
transform: rotate(-45deg) translate(6px, -6px) !important;
}
/* Mobile Navigation */
nav {
position: fixed !important;
top: 60px !important;
left: 0 !important;
width: 100% !important;
height: auto !important;
background: var(--dark-2) !important;
transform: translateX(-100%) !important;
transition: transform 0.3s ease !important;
z-index: 1000 !important;
}
nav.active {
transform: translateX(0) !important;
}
nav ul {
padding: 20px !important;
}
nav li {
margin: 10px 0 !important;
}
nav a {
font-size: 16px !important;
padding: 12px 20px !important;
display: block !important;
color: var(--light-gray) !important;
border-radius: var(--default-border-radius) !important;
}
}
@media (max-width: 600px) {
body {
font-size: 14px !important;
}
#main-header .width-constraint {
padding: 0 10px !important;
}
.script-list,
.user-list,
.text-content {
padding: 10px !important;
margin-bottom: 10px !important;
}
.install-link,
.install-help-link,
input[type="submit"],
.button {
width: 100% !important;
margin: 5px 0 !important;
padding: 12px 16px !important;
}
.discussion-list li,
.script-list li,
.user-list li {
padding: 10px !important;
}
.form-section {
padding: 10px !important;
}
input[type="search"],
input[type="text"],
input[type="email"],
input[type="password"],
select,
textarea {
padding: 10px !important;
}
}
@media (max-width: 480px) {
body {
font-size: 13px !important;
}
.script-list,
.user-list,
.text-content {
padding: 8px !important;
}
input,
select,
textarea {
font-size: 16px !important;
}
#main-header {
padding: 5px 0 !important;
}
.width-constraint {
padding: 0 8px !important;
}
.discussion-list li,
.script-list li,
.user-list li {
margin-bottom: 8px !important;
}
.install-link,
.install-help-link,
input[type="submit"],
.button {
font-size: 14px !important;
padding: 10px 14px !important;
}
}
/* Scrollbar styles với animation */
${
config.modScrollbars
? `
* {
scrollbar-width: thin !important;
scrollbar-color: var(--translucent) var(--dark-2) !important;
}
::-webkit-scrollbar {
width: 8px !important;
height: 8px !important;
}
::-webkit-scrollbar-track {
background: var(--dark-2) !important;
border-radius: var(--default-border-radius) !important;
}
::-webkit-scrollbar-thumb {
background: var(--translucent) !important;
border-radius: var(--default-border-radius) !important;
border: 2px solid var(--dark-2) !important;
transition: all var(--transition-speed) ease !important;
will-change: transform !important;
}
::-webkit-scrollbar-thumb:hover {
background: var(--gradient-primary) !important;
}
`
: ''
}
/* Code blocks với font và hiệu ứng mới */
pre, code {
font-family: var(--font-code) !important;
background-color: var(--dark-4) !important;
border-radius: var(--default-border-radius) !important;
padding: 0.2em 0.4em !important;
transition: all var(--transition-speed) ease !important;
will-change: transform !important;
max-width: 100% !important;
overflow-x: auto !important;
}
pre:hover, code:hover {
background-color: var(--dark-5) !important;
}
/* Tooltip styles mới */
[data-tooltip] {
position: relative !important;
}
[data-tooltip]:before {
content: attr(data-tooltip) !important;
position: absolute !important;
bottom: 100% !important;
left: 50% !important;
transform: translateX(-50%) !important;
padding: 5px 10px !important;
background: var(--dark-4) !important;
color: var(--light-gray) !important;
border-radius: var(--default-border-radius) !important;
font-size: 12px !important;
white-space: nowrap !important;
opacity: 0 !important;
visibility: hidden !important;
transition: all var(--transition-speed) ease !important;
will-change: transform, opacity !important;
}
[data-tooltip]:hover:before {
opacity: 1 !important;
visibility: visible !important;
transform: translateX(-50%) translateY(-5px) !important;
}
/* Login Form Styles */
.centered-sections {
display: flex !important;
flex-direction: column !important;
gap: 20px !important;
max-width: 600px !important;
margin: 0 auto !important;
padding: 0 10px !important;
}
.external-login-form {
display: flex !important;
flex-direction: column !important;
gap: 15px !important;
}
.external-login-container {
display: block !important;
margin: 5px 0 !important;
}
.external-login {
width: 100% !important;
padding: 12px !important;
border-radius: var(--default-border-radius) !important;
border: none !important;
color: var(--light-gray) !important;
font-weight: 600 !important;
cursor: pointer !important;
transition: all var(--transition-speed) ease !important;
will-change: transform !important;
font-size: 14px !important;
}
.google_oauth2-login {
background-color: #4285f4 !important;
}
.gitlab-login {
background-color: #fc6d26 !important;
}
.github-login {
background-color: #333 !important;
}
.external-login:hover {
transform: translateY(-2px) !important;
box-shadow: 0 5px 15px var(--shadow) !important;
}
.remember-me {
display: flex !important;
align-items: center !important;
gap: 8px !important;
margin: 10px 0 !important;
}
.remember-me input[type="checkbox"] {
width: auto !important;
margin: 0 !important;
height: 20px !important;
width: 20px !important;
}
.field {
margin-bottom: 15px !important;
}
.field label {
display: block !important;
margin-bottom: 5px !important;
color: var(--light-gray) !important;
font-size: 14px !important;
}
.actions {
margin-top: 20px !important;
}
.width-constraint {
max-width: 1200px !important;
margin: 0 auto !important;
padding: 20px !important;
}
.text-content {
background-color: var(--dark-2) !important;
padding: 15px !important;
border-radius: var(--default-border-radius) !important;
margin-bottom: 15px !important;
}
.text-content p {
margin-bottom: 15px !important;
line-height: 1.6 !important;
font-size: 14px !important;
}
`;
// Áp dụng CSS
GM_addStyle(css);
// Add mobile menu toggle functionality
const addMobileMenuToggle = () => {
const header = document.querySelector('#main-header');
if (!header) return;
// Create menu toggle button if it doesn't exist
if (!document.querySelector('.menu-toggle')) {
const menuToggle = document.createElement('button');
menuToggle.className = 'menu-toggle';
menuToggle.innerHTML = '<span></span><span></span><span></span>';
header.appendChild(menuToggle);
// Add click event listener
menuToggle.addEventListener('click', () => {
menuToggle.classList.toggle('active');
const nav = document.querySelector('nav');
if (nav) {
nav.classList.toggle('active');
}
});
}
};
// Run when DOM is loaded
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', addMobileMenuToggle);
} else {
addMobileMenuToggle();
}
})();