# Pull Request Template ## Description This PR fixes the white background bleed visible in the widget, widget article viewer and help center when dark mode is active. **What was happening** While scrolling, the `<body>` element retained a white background in dark mode. This occurred because dark mode classes were only applied to inner container elements, not the root. **What changed** * **Widget:** Updated the `useDarkMode` composable to sync the `dark` class to `<html>` using `watchEffect`, allowing `<body>` to inherit dark theme variables. Also added background styles to `html`, `body`, and `#app` in `woot.scss`. * **Help center portal:** Moved `bg-white dark:bg-slate-900` from `<main>` to `<body>` in the portal layout so the entire page background responds correctly to dark mode, including within the widget iframe. * **ArticleViewer:** Replaced hardcoded `bg-white` with `bg-n-solid-1` to ensure better theming. Fixes https://linear.app/chatwoot/issue/CW-6704/widget-body-colour-not-implemented ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? ### Screencasts ### Before **Widget** https://github.com/user-attachments/assets/e0224ad1-81a6-440a-a824-e115fb806728 **Help center** https://github.com/user-attachments/assets/40a8ded5-5360-474d-9ec5-fd23e037c845 ### After **Widget** https://github.com/user-attachments/assets/dd37cc68-99fc-4d60-b2ae-cf41f9d4d38c **Help center** https://github.com/user-attachments/assets/bc998c4e-ef77-46fa-ac7f-4ea16d912ce3 ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules
35 lines
988 B
JavaScript
35 lines
988 B
JavaScript
import { computed, watchEffect } from 'vue';
|
|
import { useMapGetter } from 'dashboard/composables/store';
|
|
|
|
const isDarkModeAuto = mode => mode === 'auto';
|
|
const isDarkMode = mode => mode === 'dark';
|
|
|
|
const getSystemPreference = () =>
|
|
window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;
|
|
|
|
const calculatePrefersDarkMode = (mode, systemPreference) =>
|
|
isDarkModeAuto(mode) ? systemPreference : isDarkMode(mode);
|
|
|
|
/**
|
|
* Composable for handling dark mode.
|
|
* @returns {Object} An object containing computed properties and methods for dark mode.
|
|
*/
|
|
export function useDarkMode() {
|
|
const darkMode = useMapGetter('appConfig/darkMode');
|
|
|
|
const systemPreference = computed(getSystemPreference);
|
|
|
|
const prefersDarkMode = computed(() =>
|
|
calculatePrefersDarkMode(darkMode.value, systemPreference.value)
|
|
);
|
|
|
|
watchEffect(() => {
|
|
document.documentElement.classList.toggle('dark', prefersDarkMode.value);
|
|
});
|
|
|
|
return {
|
|
darkMode,
|
|
prefersDarkMode,
|
|
};
|
|
}
|