From 0162784897b82ea27ea10a1658fb6b962700d734 Mon Sep 17 00:00:00 2001 From: ak95 Date: Fri, 15 Nov 2024 02:24:26 -0800 Subject: [PATCH] preliminary dark mode - has some problems --- background.js | 5 ++ content.js | 185 ++++++++++++++++++++++++++++++++++++++++++++++ icons/icon128.png | Bin 0 -> 12429 bytes icons/icon16.png | Bin 0 -> 1313 bytes icons/icon48.png | Bin 0 -> 4337 bytes icons/icon96.png | Bin 0 -> 9384 bytes manifest.json | 29 ++++++++ 7 files changed, 219 insertions(+) create mode 100644 background.js create mode 100644 content.js create mode 100644 icons/icon128.png create mode 100644 icons/icon16.png create mode 100644 icons/icon48.png create mode 100644 icons/icon96.png create mode 100644 manifest.json diff --git a/background.js b/background.js new file mode 100644 index 0000000..5db2bc6 --- /dev/null +++ b/background.js @@ -0,0 +1,5 @@ +// background.js +chrome.browserAction.onClicked.addListener((tab) => { + // Send a message to the content script to toggle dark mode + chrome.tabs.sendMessage(tab.id, { action: 'toggleDarkMode' }); +}); diff --git a/content.js b/content.js new file mode 100644 index 0000000..e701fb3 --- /dev/null +++ b/content.js @@ -0,0 +1,185 @@ +let isDarkMode = false; // Track current mode (light or dark) + +// Color Palette for Dark Mode +const darkModeStyles = { + backgroundColor: '#121212', // Dark background for general elements + color: '#e0e0e0', // General text color + linkColor: '#bb86fc', // Link color for dark mode + activeLinkColor: '#ff79c6', // Active link color + buttonBackground: '#333333', // Button background color for dark mode + buttonTextColor: '#e0e0e0', // Button text color + inputBackground: '#333333', // Input background color for dark mode + inputTextColor: '#e0e0e0', // Input text color + codeBackground: '#1e1e1e', // Code block background color for dark mode + borderColor: '#444444', // Border color for inputs, buttons, etc. + containerBackground: '#181818', // Even darker shade for containers like .s-topbar + siteSpecificHeaderFooterBackground: '#eeeeee', // Light background color for certain headers +}; + +// Function to apply dark mode via JavaScript only (without using CSS) +function applyDarkMode() { + // Apply the general background and text color to the body + document.body.style.backgroundColor = darkModeStyles.backgroundColor; + document.body.style.color = darkModeStyles.color; + + // 1. Loop through all elements to find light background colors and change them + const allElements = document.querySelectorAll('*'); + allElements.forEach(el => { + const computedBackgroundColor = window.getComputedStyle(el).backgroundColor; + const computedBackgroundImage = window.getComputedStyle(el).backgroundImage; + + // Check for light backgrounds (RGB or hex-based light colors) and ignore background images + if (isLightBackground(computedBackgroundColor) && computedBackgroundImage === 'none') { + el.style.backgroundColor = darkModeStyles.backgroundColor; // Set to dark mode color + } else if (computedBackgroundImage && (computedBackgroundImage.includes('linear-gradient') || computedBackgroundImage.includes('radial-gradient'))) { + // Handle gradients with pure white or light colors + el.style.backgroundImage = adjustLightGradients(computedBackgroundImage); + } + + // Apply text color to all elements except code blocks and pre blocks + if (el.tagName !== 'CODE' && el.tagName !== 'PRE') { + el.style.color = darkModeStyles.color; + } + + // Handle padding and margin issues by checking padding area background + handlePaddingAndMarginBackground(el); + }); + + // 2. Handle site-specific elements such as headers and footers (e.g., Craigslist, MDN, etc.) + const siteSpecificElements = document.querySelectorAll('header, footer, .header, .footer'); + siteSpecificElements.forEach(el => { + const bgColor = window.getComputedStyle(el).backgroundColor; + if (bgColor === 'rgb(238, 238, 238)' || bgColor === 'rgba(238, 238, 238, 1)') { + el.style.backgroundColor = darkModeStyles.siteSpecificHeaderFooterBackground; + } + }); + + // 3. Handle other specific elements like buttons, inputs, code blocks, etc. + handleFormElements(); + handleCodeBlocks(); + handleLinks(); +} + +// Helper function to determine if a background color is light +function isLightBackground(rgbColor) { + if (!rgbColor) return false; // If there's no color or invalid color, return false + const rgb = rgbColor.match(/^rgba?\((\d+), (\d+), (\d+)/); // Match rgb values + if (rgb) { + const r = parseInt(rgb[1], 10); + const g = parseInt(rgb[2], 10); + const b = parseInt(rgb[3], 10); + // Simple luminance calculation to detect light colors + const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b; + return luminance > 150; // Threshold for light background + } + return false; // If it's not an RGB value, assume it's not light +} + +// Function to adjust light colors in a gradient (specifically pure white or light colors) +function adjustLightGradients(gradient) { + const gradientRegex = /(linear-gradient|radial-gradient)\((.*?)\)/; + return gradient.replace(gradientRegex, (match, type, gradientContent) => { + // Regex to match rgb or rgba color values in the gradient + const lightColorRegex = /rgba?\((\d+), (\d+), (\d+)(?:, (\d*\.?\d+))?\)/g; + + // Replace each light color (e.g., rgb(255, 255, 255)) with a darker color + const adjustedGradient = gradientContent.replace(lightColorRegex, (colorMatch, r, g, b, a) => { + // Calculate luminance for detecting light colors + const luminance = 0.2126 * parseInt(r, 10) + 0.7152 * parseInt(g, 10) + 0.0722 * parseInt(b, 10); + + // If the luminance is higher than a threshold (200), it's a light color + if (luminance > 200) { + // Replace light colors with a dark background color (e.g., #282828 or similar) + return `rgb(40, 40, 40)`; // Dark theme color + } + return colorMatch; // Keep dark colors unchanged + }); + + // Return the updated gradient + return `${type}(${adjustedGradient})`; + }); +} + +// Function to ensure padding and margin background colors are applied +function handlePaddingAndMarginBackground(el) { + const padding = window.getComputedStyle(el).padding; + const margin = window.getComputedStyle(el).margin; + const bgColor = window.getComputedStyle(el).backgroundColor; + + // Check if the element has padding or margin and is missing a background + if ((padding !== '0px' || margin !== '0px') && (bgColor === 'rgba(0, 0, 0, 0)' || bgColor === 'transparent')) { + el.style.backgroundColor = darkModeStyles.backgroundColor; // Ensure padding area has a background color + } +} + +// Function to handle links with dark mode styling +function handleLinks() { + const links = document.querySelectorAll('a'); + links.forEach(link => { + link.style.color = darkModeStyles.linkColor; + if (link.hasAttribute('aria-selected') && link.getAttribute('aria-selected') === 'true') { + link.style.color = darkModeStyles.activeLinkColor; // Active state color for links + } + }); +} + +// Function to handle form elements (buttons, inputs) +function handleFormElements() { + const buttons = document.querySelectorAll('button'); + buttons.forEach(button => { + button.style.backgroundColor = darkModeStyles.buttonBackground; + button.style.color = darkModeStyles.buttonTextColor; + button.style.borderColor = darkModeStyles.borderColor; + if (button.hasAttribute('aria-pressed') && button.getAttribute('aria-pressed') === 'true') { + button.style.backgroundColor = darkModeStyles.activeLinkColor; // Active state for buttons + } + }); + + const inputs = document.querySelectorAll('input, textarea, select'); + inputs.forEach(input => { + input.style.backgroundColor = darkModeStyles.inputBackground; + input.style.color = darkModeStyles.inputTextColor; + input.style.borderColor = darkModeStyles.borderColor; + }); +} + +// Function to handle code blocks with dark mode styling +function handleCodeBlocks() { + const codeBlocks = document.querySelectorAll('code, pre'); + codeBlocks.forEach(code => { + code.style.backgroundColor = darkModeStyles.codeBackground; + code.style.color = darkModeStyles.color; // Use the dark text color for code + }); +} + +// Function to revert to light mode (optional) +function revertLightMode() { + // Reset all styles + document.body.style.backgroundColor = ''; + document.body.style.color = ''; + const allElements = document.querySelectorAll('*'); + allElements.forEach(el => { + el.style.backgroundColor = ''; + el.style.backgroundImage = ''; + el.style.color = ''; + }); +} + +// Listen for the toggle dark mode action +chrome.runtime.onMessage.addListener((message) => { + if (message.action === 'toggleDarkMode') { + if (isDarkMode) { + revertLightMode(); + } else { + applyDarkMode(); + } + isDarkMode = !isDarkMode; + } +}); + +// Apply dark mode on page load +if (isDarkMode) { + applyDarkMode(); +} else { + revertLightMode(); +} diff --git a/icons/icon128.png b/icons/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..5240c3daa6c1f99e0ff894f12dd5700db4876049 GIT binary patch literal 12429 zcmWk!V{m3m5dC7?wryi$+qO5hZQIGl*2db{&SqoVw%+${)!eDNKc;U@_w<=Qr=ye< zBoSb7VF3UDg0z&F3UChme?UV5--Ck2lK=onn6;>=lC-EOv7@ttg|(eI06?AOmn0xH zD2zXBs9IW-hUkv$G^XU%7(x_jS}TG=o2v6m9V$ikPocDE^4=bGJ0|{zRt;}E_xafl zEp#vu@eHCuG^5Jicd|$fHd6fi?bX))6#+3jtsF;}Nnn+>1TPBK?+$gAn`psMiue{3(j$*Vd=%Jm!w#d%0Am80>*C3$0$;&;U(fB)P9LLf9wR@bm{(P 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 Db`#Y& literal 0 HcmV?d00001 diff --git a/icons/icon16.png b/icons/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..4390ec90a08826ba76d9f5b8738d5a7b317945a4 GIT binary patch literal 1313 zcmV++1>X9JP)EX>4Tx04R}tkv&MmKpe$iQ>CJn4t5Z6$WV2$gCB@vtwIqhlv<%x2a`*`ph-iL z;^HW{799LotU9+0Yt2!bCV&JIqBE>hzEl0u6Z503ls?%w0>9UwF+Of|b=fT~$W zIuRGMxm7Xniavx8zy!u5X6kdPR1%)!>mEM7-bHzq_qjhuzmhi@;1h{sOgAjz4dR(i zOXs{#9A+g+AwDM_H|T=Ik6f2se&bwpSm2pqBa@yd4ik&T4wgHZl?;`5nmD4U8s!UF zmle)ioYhK=weHDZ7|d%c%Uq{9j06_3gcL-`sG*DsEJSJ5NHLM7{kVsJ$nmGhC6lWR zMvetkp+a)};D7MDTeC1V=_Uo^K=+Gne~bWuU7%UF?eAmTZk_=CXW&X}`>PFL_LKB_ zTZ5#ex~<83z~v4w_@qmQpV2qvfPq_}cg^jswU5&WAVXaxZ-9eC zV6;ft>mKj!>Fn*_Gp+u90L$=l%3tZ_iU0rr24YJ`L;wH)0002_L%V+f000SaNLh0L z01ejw01ejxLMWSf00007bV*G`2j~kA2QwZLTU_1%00SLKL_t(I%XO1oOj~sr#(zCM zg>(7^W3bWkQD8a-j3%Qxbrab9N~SSYNfr~MSH>&jT+D7IyE0J|f?k+#F_(BVVw_Z&+!5_r_uNNdEWQQ`{ZZiUlUf(b_1t`WgHWh zzW@0%hggkfwWW#d&%o$JaroDV^|ptMPGF=|mwjh3In5pODgc>O7DcV1SkU?LyBmzZ zcYO>vJy9Gk0NC%FO)8VCYUH&mne*hV6%O}4OHXcym5nr!=_u8z#LFiK=zBE~nw^Ud zw4{!XYhtP_?F1M}y5{Nq+fkiOCB$0odQ&#+lED`hgJudssc& zrSHz3yPP`D!Hy?ru|Gzm(aY`{AF`o5SlAGBqk3f&wTjkuA68>2Bz}1GYZ-W7OH32A zg=tUrZL1w%=1ofG7Eit1MeQCJvDq}AymSeG7e4GJ{Kf#|Tt6iX%NTs{u+kFkav$~8 ztwi4B*wz* z@5Hnfev8C;@>masE{IR&kYro6W+Kq70=jDhTdje+(tywN2<|488`o|TkEMyuC;0fq zOKhy=33T|`+AIKQ_HM^>y%P42unekp$yj9@My5hyJ%*>`M{WeuGHLH>q~}C4F1Nyk zFMeYB`z1UJPB}Ypr8-`5xJHo`uLVix)Fv6UE^# z<(+m;16{&2`qP;xHQ4}IptfzFSx;=CMed?F9W2kU5ueOm+3{?%poyvS0mt!iNjMtZ zg*_qfJ{PW52gL=8j;HrhDVvz4#pO?L^GCEa2E2J6Cfonv3=9IDwTBdPGbIi9Pn`b( XTOe7pP0^@x00000NkvXXu0mjfWT0NV literal 0 HcmV?d00001 diff --git a/icons/icon48.png b/icons/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..0632b1ed8508b4df34ebdf06a7da1341f4183866 GIT binary patch literal 4337 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"], + "js": ["content.js"] + } + ], + "icons": { + "16": "icons/icon16.png", + "48": "icons/icon48.png", + "96": "icons/icon96.png", + "128": "icons/icon128.png" + } + } + \ No newline at end of file