1
0

coder.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. const body = document.body;
  2. const darkModeToggle = document.getElementById('dark-mode-toggle');
  3. const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
  4. // Check if user preference is set, if not check value of body class for light or dark else it means that colorscheme = auto
  5. if (localStorage.getItem("colorscheme")) {
  6. setTheme(localStorage.getItem("colorscheme"));
  7. } else if (body.classList.contains('colorscheme-light') || body.classList.contains('colorscheme-dark')) {
  8. setTheme(body.classList.contains("colorscheme-dark") ? "dark" : "light");
  9. } else {
  10. setTheme(darkModeMediaQuery.matches ? "dark" : "light");
  11. }
  12. if (darkModeToggle) {
  13. darkModeToggle.addEventListener('click', () => {
  14. let theme = body.classList.contains("colorscheme-dark") ? "light" : "dark";
  15. setTheme(theme);
  16. rememberTheme(theme);
  17. });
  18. }
  19. darkModeMediaQuery.addListener((event) => {
  20. setTheme(event.matches ? "dark" : "light");
  21. });
  22. document.addEventListener("DOMContentLoaded", function () {
  23. let node = document.querySelector('.preload-transitions');
  24. node.classList.remove('preload-transitions');
  25. });
  26. function setTheme(theme) {
  27. body.classList.remove('colorscheme-auto');
  28. let inverse = theme === 'dark' ? 'light' : 'dark';
  29. body.classList.remove('colorscheme-' + inverse);
  30. body.classList.add('colorscheme-' + theme);
  31. document.documentElement.style['color-scheme'] = theme;
  32. function waitForElm(selector) {
  33. return new Promise(resolve => {
  34. if (document.querySelector(selector)) {
  35. return resolve(document.querySelector(selector));
  36. }
  37. const observer = new MutationObserver(mutations => {
  38. if (document.querySelector(selector)) {
  39. resolve(document.querySelector(selector));
  40. observer.disconnect();
  41. }
  42. });
  43. observer.observe(document.body, {
  44. childList: true,
  45. subtree: true
  46. });
  47. });
  48. }
  49. if (theme === 'dark') {
  50. const message = {
  51. type: 'set-theme',
  52. theme: 'github-dark'
  53. };
  54. waitForElm('.utterances-frame').then((iframe) => {
  55. iframe.contentWindow.postMessage(message, 'https://utteranc.es');
  56. })
  57. }
  58. else {
  59. const message = {
  60. type: 'set-theme',
  61. theme: 'github-light'
  62. };
  63. waitForElm('.utterances-frame').then((iframe) => {
  64. iframe.contentWindow.postMessage(message, 'https://utteranc.es');
  65. })
  66. }
  67. function sendMessage(message) {
  68. const iframe = document.querySelector('iframe.giscus-frame');
  69. if (!iframe) return;
  70. iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
  71. }
  72. sendMessage({
  73. setConfig: {
  74. theme: theme,
  75. },
  76. });
  77. // Create and send event
  78. const event = new Event('themeChanged');
  79. document.dispatchEvent(event);
  80. }
  81. function rememberTheme(theme) {
  82. localStorage.setItem('colorscheme', theme);
  83. }