Bilibili 暗黑模式

启用 Bilibili 暗黑模式

  1. // ==UserScript==
  2. // @name Bilibili 暗黑模式
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.2.2
  5. // @description 启用 Bilibili 暗黑模式
  6. // @author K
  7. // @match https://*.bilibili.com/*
  8. // @grant GM_setValue
  9. // @grant GM_getValue
  10. // @grant GM_registerMenuCommand
  11. // @grant GM_unregisterMenuCommand
  12. // @grant GM_addValueChangeListener
  13.  
  14. // @icon https://www.google.com/s2/favicons?domain=www.bilibili.com
  15. // @license MIT
  16. // ==/UserScript==
  17.  
  18. (function () {
  19. "use strict";
  20. const USER_PREFERS_MODE_KEY = "user-prefers-mode"; // "dark" | "light"
  21. const SYSTEM_PREFERS_FIRST_KEY = "system-prefers-first"; // true | false
  22. const DARK_MODE_CLASS_NAME = "bili_dark";
  23. const DARK_MODE_BRIGHTNESS = 0.95;
  24.  
  25. let containerSelectors;
  26.  
  27. // Uitl
  28. function hasDarkModeClass() {
  29. return document.documentElement.classList.contains(DARK_MODE_CLASS_NAME);
  30. }
  31. function setDarkMode() {
  32. GM_setValue(USER_PREFERS_MODE_KEY, "dark");
  33. document.documentElement.classList.toggle(DARK_MODE_CLASS_NAME, true);
  34. }
  35.  
  36. function setLightMode() {
  37. GM_setValue(USER_PREFERS_MODE_KEY, "light");
  38. document.documentElement.classList.toggle(DARK_MODE_CLASS_NAME, false);
  39. }
  40. function toggleDarkMode() {
  41. if (hasDarkModeClass()) {
  42. setLightMode();
  43. } else {
  44. setDarkMode();
  45. }
  46. }
  47. function enableSystemPrefersFirst() {
  48. GM_setValue(SYSTEM_PREFERS_FIRST_KEY, true);
  49. handlePrefersColorSchemeChange();
  50. }
  51. function disableSystemPrefersFirst() {
  52. GM_setValue(SYSTEM_PREFERS_FIRST_KEY, false);
  53. const userPrefersMode = GM_getValue(USER_PREFERS_MODE_KEY);
  54. userPrefersMode === "dark" ? setDarkMode() : setLightMode();
  55. }
  56. function handlePrefersColorSchemeChange(event) {
  57. if (!event) {
  58. event = window.matchMedia("(prefers-color-scheme: dark)");
  59. }
  60. const isSystemFirst = GM_getValue(SYSTEM_PREFERS_FIRST_KEY);
  61. document.documentElement.classList.toggle(
  62. DARK_MODE_CLASS_NAME,
  63. isSystemFirst && event.matches
  64. );
  65. }
  66.  
  67. // Init
  68. function initDarkMode() {
  69. const userPrefersMode = GM_getValue(USER_PREFERS_MODE_KEY);
  70. const isSystemFirst = GM_getValue(SYSTEM_PREFERS_FIRST_KEY);
  71. window
  72. .matchMedia("(prefers-color-scheme: dark)")
  73. .addEventListener("change", handlePrefersColorSchemeChange);
  74. if (isSystemFirst) {
  75. handlePrefersColorSchemeChange();
  76. } else {
  77. userPrefersMode === "dark" ? setDarkMode() : setLightMode();
  78. }
  79. }
  80.  
  81. // Menu
  82. async function registerMenuCommand() {
  83. await GM_registerMenuCommand("深色模式", setDarkMode);
  84. await GM_registerMenuCommand("浅色模式", setLightMode);
  85. await GM_registerMenuCommand("开启跟随系统变化", enableSystemPrefersFirst);
  86. await GM_registerMenuCommand("关闭跟随系统变化", disableSystemPrefersFirst);
  87. }
  88.  
  89. // Style
  90. function addDarkModeStyle() {
  91. const style = document.createElement("style");
  92. // 基本暗黑模式样式
  93. style.textContent = `
  94. :root:not(.${DARK_MODE_CLASS_NAME}) {
  95. }
  96. :root.${DARK_MODE_CLASS_NAME} {
  97. --Ga0: #0d0d0e;
  98. --Ga0_s: #1e2022;
  99. --Ga0_t: #1e2022;
  100. --Ga1: #000;
  101. --Ga1_s: #232527;
  102. --Ga1_t: #232527;
  103. --Ga1_e: #232527;
  104. --Ga2: #2f3134;
  105. --Ga2_t: #2f3134;
  106. --Ga3: #46494d;
  107. --Ga3_t: #46494d;
  108. --Ga4: #5e6267;
  109. --Ga4_t: #5e6267;
  110. --Ga5: #757a81;
  111. --Ga5_t: #757a81;
  112. --Ga6: #8b9097;
  113. --Ga6_t: #8b9097;
  114. --Ga7: #a2a7ae;
  115. --Ga7_t: #a2a7ae;
  116. --Ga8: #b9bdc2;
  117. --Ga8_t: #b9bdc2;
  118. --Ga9: #d0d3d7;
  119. --Ga9_t: #d0d3d7;
  120. --Ga10: #e7e9eb;
  121. --Ga10_t: #e7e9eb;
  122. --Ga11: #242628;
  123. --Ga12: #1f2022;
  124. --Wh0: #17181a;
  125. --Wh0_t: #17181a;
  126. --Ba0: #000;
  127. --Ba0_s: #fff;
  128. --Ba0_t: #000;
  129. --Pi0: #26161c;
  130. --Pi1: #2f1a22;
  131. --Pi2: #472030;
  132. --Pi3: #76304b;
  133. --Pi4: #a73e65;
  134. --Pi5: #d44e7d;
  135. --Pi5_t: #d44e7d;
  136. --Pi6: #dc6d94;
  137. --Pi7: #e38caa;
  138. --Pi8: #ebabc1;
  139. --Pi9: #f2cad8;
  140. --Pi10: #fae9ef;
  141. --Ma0: #261525;
  142. --Ma1: #2e182d;
  143. --Ma2: #461c43;
  144. --Ma3: #72296c;
  145. --Ma4: #a13396;
  146. --Ma5: #cb41bb;
  147. --Ma6: #d462c7;
  148. --Ma7: #dd83d3;
  149. --Ma8: #e6a4de;
  150. --Ma9: #efc5ea;
  151. --Ma10: #f8e6f6;
  152. --Re0: #261314;
  153. --Re1: #2e1617;
  154. --Re2: #471a1c;
  155. --Re3: #742728;
  156. --Re4: #a63131;
  157. --Re5: #d1403e;
  158. --Re6: #d9615f;
  159. --Re7: #e18281;
  160. --Re8: #e9a3a2;
  161. --Re9: #f1c5c4;
  162. --Re10: #f9e5e5;
  163. --Or0: #28180f;
  164. --Or1: #301b10;
  165. --Or2: #4a230e;
  166. --Or3: #783610;
  167. --Or4: #a9490d;
  168. --Or5: #d66011;
  169. --Or6: #dd7c3a;
  170. --Or7: #e49764;
  171. --Or8: #ebb38d;
  172. --Or9: #f2ceb6;
  173. --Or10: #faeadf;
  174. --Ye0: #2a1e0f;
  175. --Ye1: #342410;
  176. --Ye2: #4d300b;
  177. --Ye3: #7c4c08;
  178. --Ye4: #ad6800;
  179. --Ye5: #db8700;
  180. --Ye6: #e19c2c;
  181. --Ye7: #e7b158;
  182. --Ye8: #eec584;
  183. --Ye9: #f4dab1;
  184. --Ye10: #faefdd;
  185. --Ly0: #2a2310;
  186. --Ly1: #332a11;
  187. --Ly2: #49390c;
  188. --Ly3: #745909;
  189. --Ly4: #a27c00;
  190. --Ly5: #cca000;
  191. --Ly6: #d5b02c;
  192. --Ly7: #dec158;
  193. --Ly8: #e7d184;
  194. --Ly9: #efe2b1;
  195. --Ly10: #f8f2dd;
  196. --Lg0: #19220f;
  197. --Lg1: #1e2911;
  198. --Lg2: #273c0e;
  199. --Lg3: #3c600f;
  200. --Lg4: #50840b;
  201. --Lg5: #67a70e;
  202. --Lg6: #81b638;
  203. --Lg7: #9cc562;
  204. --Lg8: #b6d58b;
  205. --Lg9: #d0e4b5;
  206. --Lg10: #ebf3df;
  207. --Gr0: #102017;
  208. --Gr1: #11271b;
  209. --Gr2: #123923;
  210. --Gr3: #175c34;
  211. --Gr4: #198042;
  212. --Gr5: #1fa251;
  213. --Gr6: #46b26f;
  214. --Gr7: #6dc28d;
  215. --Gr8: #93d2ab;
  216. --Gr9: #bae2c9;
  217. --Gr10: #e1f3e8;
  218. --Cy0: #0c1f20;
  219. --Cy1: #0d2627;
  220. --Cy2: #093739;
  221. --Cy3: #085b5c;
  222. --Cy4: #028080;
  223. --Cy5: #03a29f;
  224. --Cy6: #2fb2b0;
  225. --Cy7: #5ac2c0;
  226. --Cy8: #86d2d1;
  227. --Cy9: #b2e2e1;
  228. --Cy10: #ddf3f3;
  229. --Lb0: #0a1b23;
  230. --Lb1: #0b202a;
  231. --Lb2: #082d40;
  232. --Lb3: #064a69;
  233. --Lb4: #006996;
  234. --Lb5: #0087bd;
  235. --Lb6: #2c9cc8;
  236. --Lb7: #58b1d4;
  237. --Lb8: #84c5df;
  238. --Lb9: #b1dbeb;
  239. --Lb10: #ddeff6;
  240. --Bl0: #151826;
  241. --Bl1: #181c2f;
  242. --Bl2: #1f2748;
  243. --Bl3: #2e3c76;
  244. --Bl4: #3b53a8;
  245. --Bl5: #4b6bd4;
  246. --Bl6: #6a85db;
  247. --Bl7: #899ee3;
  248. --Bl8: #a9b8ea;
  249. --Bl9: #c8d2f2;
  250. --Bl10: #e7ebf9;
  251. --Pu0: #1d1628;
  252. --Pu1: #221a31;
  253. --Pu2: #31214c;
  254. --Pu3: #4e317d;
  255. --Pu4: #6d3fb1;
  256. --Pu5: #8c50e0;
  257. --Pu6: #a06ee5;
  258. --Pu7: #b48deb;
  259. --Pu8: #c8abf0;
  260. --Pu9: #dbc9f5;
  261. --Pu10: #f0e8fb;
  262. --Br0: #211d1b;
  263. --Br1: #282320;
  264. --Br2: #382f2a;
  265. --Br3: #59483f;
  266. --Br4: #7a6154;
  267. --Br5: #9a7c6a;
  268. --Br6: #ac9384;
  269. --Br7: #bda99e;
  270. --Br8: #cebfb7;
  271. --Br9: #e0d7d1;
  272. --Br10: #f2eeeb;
  273. --Si0: #212325;
  274. --Si1: #27292c;
  275. --Si2: #36393f;
  276. --Si3: #535962;
  277. --Si4: #6f7987;
  278. --Si5: #8c99aa;
  279. --Si6: #a0abb9;
  280. --Si7: #b4bcc7;
  281. --Si8: #c8ced6;
  282. --Si9: #dce0e5;
  283. --Si10: #f0f2f4;
  284. --Pi5_rgb: 212, 78, 125;
  285. --Pi1_rgb: 47, 26, 34;
  286. --Lb5_rgb: 0, 135, 189;
  287. --Lb1_rgb: 11, 32, 42;
  288. --Re5_rgb: 209, 64, 62;
  289. --Re1_rgb: 46, 22, 23;
  290. --Gr5_rgb: 31, 162, 81;
  291. --Gr1_rgb: 17, 39, 27;
  292. --Or5_rgb: 214, 96, 17;
  293. --Or1_rgb: 48, 27, 16;
  294. --Ye5_rgb: 219, 135, 0;
  295. --Ye1_rgb: 52, 36, 16;
  296. --Wh0_rgb: 23, 24, 26;
  297. --Ga0_rgb: 13, 13, 14;
  298. --Ga1_rgb: 0, 0, 0;
  299. --Ga11_rgb: 36, 38, 40;
  300. --Ga12_rgb: 31, 32, 34;
  301. --Wh0_u_rgb: 255, 255, 255;
  302. --Ga10_rgb: 231, 233, 235;
  303. --Ga7_rgb: 162, 167, 174;
  304. --Ga5_rgb: 117, 122, 129;
  305. --Ga3_rgb: 70, 73, 77;
  306. --Lb6_rgb: 44, 156, 200;
  307. --Ye6_rgb: 225, 156, 44;
  308. --Ga1_s_rgb: 35, 37, 39;
  309. --Ga2_rgb: 47, 49, 52;
  310. --Ga0_s_rgb: 30, 32, 34;
  311. --Ba0_rgb: 0, 0, 0;
  312. filter: brightness(${DARK_MODE_BRIGHTNESS});
  313. }
  314. .${DARK_MODE_CLASS_NAME} .bg {
  315. background-image: url('https://s1.hdslb.com/bfs/static/blive/blfe-message-web/static/img/dark_bg.e136e3d5.png') !important;
  316. }
  317. .${DARK_MODE_CLASS_NAME} .bili-dyn-item ,
  318. .${DARK_MODE_CLASS_NAME} .bili-dyn-list-tabs {
  319. background: var(--bg2_float) ;
  320. }
  321. .${DARK_MODE_CLASS_NAME} .bili-dyn-card-video__body{
  322. background-color: var(--bg2_float) ;
  323. border: 1px solid var(--line_regular) ;
  324. }
  325. `;
  326. document.head.appendChild(style);
  327. }
  328.  
  329. addDarkModeStyle();
  330. initDarkMode();
  331. registerMenuCommand();
  332. })();