GitHub user dosubot[bot] added a comment to the discussion: How to keep custom 
header-linked page theme consistent with Superset Dark/Light mode (without 
modifying Superset source)?

<!-- Answer -->
You can keep your custom page's theme in sync with Superset's dark/light mode 
by reading the user's theme preference from localStorage and responding to 
changes. Superset v6 stores the current theme mode in localStorage under the 
key superset-theme-mode. The value can be "dark", "light", or "system". If it's 
"system", you should use the browser's prefers-color-scheme media query to 
detect the effective theme. Your custom page can use JavaScript to read this 
value and apply the correct CSS class or stylesheet.

Here's a pattern you can use in your custom page:

```js
function getSupersetTheme() {
  const mode = localStorage.getItem('superset-theme-mode');
  if (mode === 'dark' || mode === 'light') return mode;
  // If 'system', use the browser's color scheme
  if (window.matchMedia('(prefers-color-scheme: dark)').matches) return 'dark';
  return 'light';
}

function applyTheme() {
  const theme = getSupersetTheme();
  document.body.classList.toggle('dark-mode', theme === 'dark');
  document.body.classList.toggle('light-mode', theme === 'light');
}

// Listen for theme changes in Superset (localStorage) or OS (media query)
window.addEventListener('storage', (e) => {
  if (e.key === 'superset-theme-mode') applyTheme();
});
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', 
applyTheme);

// Initial theme application
applyTheme();
```

Then, in your CSS, define styles for both modes:

```css
body.light-mode {
  background: #fff;
  color: #000;
}
body.dark-mode {
  background: #181818;
  color: #fff;
}
```

This approach ensures your custom page always matches the current Superset 
theme, including when the user switches themes or changes their OS preference, 
without modifying Superset source code. For more details on how Superset 
manages theme state, see 
[ThemeController.tsx](https://github.com/apache/superset/blob/master/superset-frontend/src/theme/ThemeController.tsx).


<!-- Dosu Comment Footer -->
*To reply, just mention [@dosu](https://go.dosu.dev/dosubot).*

---
<sup>How did I do? 
[Good](https://app.dosu.dev/response-feedback/79969aea-37fb-4bfb-98b7-183b1f50108f?feedback_type=great_response)
 | 
[Irrelevant](https://app.dosu.dev/response-feedback/79969aea-37fb-4bfb-98b7-183b1f50108f?feedback_type=irrelevant_answer)
 | 
[Incorrect](https://app.dosu.dev/response-feedback/79969aea-37fb-4bfb-98b7-183b1f50108f?feedback_type=incorrect_sources)
 | 
[Verbose](https://app.dosu.dev/response-feedback/79969aea-37fb-4bfb-98b7-183b1f50108f?feedback_type=too_verbose)
 | 
[Hallucination](https://app.dosu.dev/response-feedback/79969aea-37fb-4bfb-98b7-183b1f50108f?feedback_type=hallucination)
 | [Report 
🐛](https://app.dosu.dev/response-feedback/79969aea-37fb-4bfb-98b7-183b1f50108f?feedback_type=bug_report)
 | 
[Other](https://app.dosu.dev/response-feedback/79969aea-37fb-4bfb-98b7-183b1f50108f?feedback_type=other)</sup>

[![Chat with 
Dosu](https://dosu.dev/dosu-chat-badge.svg)](https://app.dosu.dev/a28d3c7e-a9d3-459e-9fb6-3a6f9ff4f357/ask?utm_source=github)&nbsp;[![Open
 in 
Cursor](https://dosu.dev/dosu-in-cursor.svg)](https://cursor.com/link/prompt?text=You%20can%20keep%20your%20custom%20page%27s%20theme%20in%20sync%20with%20Superset%27s%20dark/light%20mode%20by%20reading%20the%20user%27s%20theme%20preference%20from%20localStorage%20and%20responding%20to%20changes.%20Superset%20v6%20stores%20the%20current%20theme%20mode%20in%20localStorage%20under%20the%20key%20superset-theme-mode.%20The%20value%20can%20be%20%22dark%22%2C%20%22light%22%2C%20or%20%22system%22.%20If%20it%27s%20%22system%22%2C%20you%20should%20use%20the%20browser%27s%20prefers-color-scheme%20media%20query%20to%20detect%20the%20effective%20theme.%20Your%20custom%20page%20can%20use%20JavaScript%20to%20read%20this%20value%20and%20apply%20the%20correct%20CSS%20class%20or%20stylesheet.%0A%0AHere%27s%20a%20pattern%20you%20can%20use%20in%20you
 
r%20custom%20page%3A%0A%0A%60%60%60js%0Afunction%20getSupersetTheme%28%29%20%7B%0A%20%20const%20mode%20%3D%20localStorage.getItem%28%27superset-theme-mode%27%29%3B%0A%20%20if%20%28mode%20%3D%3D%3D%20%27dark%27%20%7C%7C%20mode%20%3D%3D%3D%20%27light%27%29%20return%20mode%3B%0A%20%20//%20If%20%27system%27%2C%20use%20the%20browser%27s%20color%20scheme%0A%20%20if%20%28window.matchMedia%28%27%28prefers-color-scheme%3A%20dark%29%27%29.matches%29%20return%20%27dark%27%3B%0A%20%20return%20%27light%27%3B%0A%7D%0A%0Afunction%20applyTheme%28%29%20%7B%0A%20%20const%20theme%20%3D%20getSupersetTheme%28%29%3B%0A%20%20document.body.classList.toggle%28%27dark-mode%27%2C%20theme%20%3D%3D%3D%20%27dark%27%29%3B%0A%20%20document.body.classList.toggle%28%27light-mode%27%2C%20theme%20%3D%3D%3D%20%27light%27%29%3B%0A%7D%0A%0A//%20Listen%20for%20theme%20changes%20in%20Superset%20%28localStorage%29%20or%20OS%20%28media%20query%29%0Awindow.addEventListener%28%27storage%27%2C%20%28e%29%20%3D%3E%20%7B%0A%20%20i
 
f%20%28e.key%20%3D%3D%3D%20%27superset-theme-mode%27%29%20applyTheme%28%29%3B%0A%7D%29%3B%0Awindow.matchMedia%28%27%28prefers-color-scheme%3A%20dark%29%27%29.addEventListener%28%27change%27%2C%20applyTheme%29%3B%0A%0A//%20Initial%20theme%20application%0AapplyTheme%28%29%3B%0A%60%60%60%0A%0AThen%2C%20in%20your%20CSS%2C%20define%20styles%20for%20both%20modes%3A%0A%0A%60%60%60css%0Abody.light-mode%20%7B%0A%20%20background%3A%20%23fff%3B%0A%20%20color%3A%20%23000%3B%0A%7D%0Abody.dark-mode%20%7B%0A%20%20background%3A%20%23181818%3B%0A%20%20color%3A%20%23fff%3B%0A%7D%0A%60%60%60%0A%0AThis%20approach%20ensures%20your%20custom%20page%20always%20matches%20the%20current%20Superset%20theme%2C%20including%20when%20the%20user%20switches%20themes%20or%20changes%20their%20OS%20preference%2C%20without%20modifying%20Superset%20source%20code.%20For%20more%20details%20on%20how%20Superset%20manages%20theme%20state%2C%20see%20%5BThemeController.tsx%5D%28https%3A//github.com/apache/superset/blob/master/s
 uperset-frontend/src/theme/ThemeController.tsx%29.)&nbsp;[![Join 
Discord](https://img.shields.io/badge/join-5865F2?logo=discord&logoColor=white&label=)](https://go.dosu.dev/discord-bot)&nbsp;[![Share
 on 
X](https://img.shields.io/badge/X-share-black)](https://twitter.com/intent/tweet?text=%40dosu_ai%20helped%20me%20solve%20this%20issue!&url=https%3A//github.com/apache/superset/discussions/37375)

GitHub link: 
https://github.com/apache/superset/discussions/37375#discussioncomment-15576573

----
This is an automatically sent email for [email protected].
To unsubscribe, please send an email to: 
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to