1(function ($, Drupal, once) { 2 "use strict"; 3 4 // Dark mode integration with Dark reader library. 5 Drupal.behaviors.dark_mode_switch_dark_reader = { 6 attach: function (context) { 7 let darkmodeCss = document.head.querySelector(".darkmode-css"); 8 // Check if DarkReader is available. 9 if (typeof DarkReader !== "undefined") { 10 // Dark mode switch toggle. 11 $("#dark-mode-switch").change(function () { 12 let darkReaderEnabled = DarkReader.isEnabled(); 13 let darkModeStatus = $(this).is(":checked"); 14 if (darkModeStatus === false) { 15 DarkReader.disable(); 16 $(this).attr("aria-checked", false); 17 } else { 18 $(this).attr("aria-checked", true); 19 } 20 updateDarkMode(darkReaderEnabled, darkModeStatus); 21 document.head.append(darkmodeCss); 22 }); 23 24 $(once("dark-mode-keypress", ".custom-control-label")).on( 25 "keypress", 26 function (event) { 27 // Enter key press. 28 if (event.which === 13) { 29 let darkModeSwitch = $("#dark-mode-switch"); 30 if (darkModeSwitch.is(":checked") === true) { 31 darkModeSwitch.prop("checked", false); 32 if ("theme" in localStorage) { 33 localStorage.theme = false; 34 } 35 DarkReader.disable(); 36 } else { 37 $("#dark-mode-switch").prop("checked", true); 38 let darkReaderEnabled = DarkReader.isEnabled(); 39 let darkModeStatus = darkModeSwitch.is(":checked"); 40 41 if (darkModeStatus === false) { 42 DarkReader.disable(); 43 } else { 44 if ("theme" in localStorage) { 45 localStorage.theme = true; 46 } 47 } 48 updateDarkMode(darkReaderEnabled, darkModeStatus); 49 document.head.append(darkmodeCss); 50 } 51 } 52 }, 53 ); 54 } 55 }, 56 }; 57})(jQuery, Drupal, once); 58 59document.addEventListener("DOMContentLoaded", () => { 60 loadDarkMode(); 61}); 62 63function loadDarkMode() { 64 if (typeof DarkReader !== "undefined") { 65 let darkReaderEnabled = DarkReader.isEnabled(); 66 let darkModeStatus = window.matchMedia( 67 "(prefers-color-scheme: dark)", 68 ).matches; 69 if ("theme" in localStorage) { 70 darkModeStatus = localStorage.theme === "false" ? false : true; 71 } 72 if (darkReaderEnabled === true) { 73 document 74 .querySelector("#dark-mode-switch") 75 .setAttribute("aria-checked", true); 76 } 77 updateDarkMode(darkReaderEnabled, darkModeStatus); 78 } 79} 80 81loadDarkMode(); 82 83function updateDarkMode(darkReaderEnabled, darkModeStatus) { 84 if (darkReaderEnabled === false && darkModeStatus === true) { 85 DarkReader.setFetchMethod(window.fetch); 86 87 // Update global fetch to add query param for image-related requests only. 88 const originalFetch = window.fetch; 89 window.fetch = function (url, options) { 90 try { 91 if (typeof url === "string") { 92 const isImage = /\.(png|jpe?g|gif|svg|webp|ico)$/i.test(url); 93 // Append ?theme=da_vinci_code or &theme=da_vinci_code if query params 94 // already exist. 95 if (isImage && !url.includes("theme=da_vinci_code")) { 96 const separator = url.includes("?") ? "&" : "?"; 97 url = url + separator + "theme=da_vinci_code"; 98 } 99 } 100 } catch (e) { 101 console.warn("Global fetch failed:", e); 102 } 103 104 return originalFetch(url, options); 105 }; 106 DarkReader.enable({ 107 brightness: 100, 108 contrast: 90, 109 sepia: 10, 110 }); 111 } 112}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.