Skip to content

Commit 2ee70f6

Browse files
authored
fix(ui): prevent dark mode from mutating host document (#480)
1 parent 8beccdf commit 2ee70f6

5 files changed

Lines changed: 32 additions & 8 deletions

File tree

packages/core/src/client/webcomponents/components/icons/ViteDevTools.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
<script setup lang="ts">
2-
import { isDark } from '@vitejs/devtools-ui/composables/dark'
2+
import { usePreferredDark } from '@vueuse/core'
33
import { computed } from 'vue'
44
5+
const isDark = usePreferredDark()
56
const theme = computed(() => isDark.value ? 'white' : 'black')
67
</script>
78

packages/oxc/src/app/app.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
<script setup lang="ts">
2+
import { applyDarkClassToHtml } from '@vitejs/devtools-ui/composables/dark'
23
import { connect, connectionState } from './composables/rpc'
34
import 'floating-vue/dist/style.css'
45
import './assets/css/main.css'
5-
import '@vitejs/devtools-ui/composables/dark'
6+
7+
applyDarkClassToHtml()
68
79
connect()
810
</script>

packages/rolldown/src/app/app.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
<script setup lang="ts">
2+
import { applyDarkClassToHtml } from '@vitejs/devtools-ui/composables/dark'
23
import { useSeoMeta } from '#app/composables/head'
34
45
import { connect, connectionState } from './composables/rpc'
56
import 'floating-vue/dist/style.css'
67
import './styles/cm.css'
78
import './styles/splitpanes.css'
89
import './styles/global.css'
9-
import '@vitejs/devtools-ui/composables/dark'
10+
11+
applyDarkClassToHtml()
1012
1113
useSeoMeta({
1214
title: 'Rolldown DevTools',
Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,27 @@
1-
import { useDark } from '@vueuse/core'
1+
import type { WritableComputedRef } from 'vue'
2+
import { usePreferredDark, useStorage } from '@vueuse/core'
3+
import { computed, watchEffect } from 'vue'
24

3-
export const isDark = useDark({
4-
storageKey: 'vite-devtools-color-scheme',
5-
valueLight: 'light',
5+
export type ColorSchemePreference = 'auto' | 'dark' | 'light'
6+
7+
const preference = useStorage<ColorSchemePreference>('vite-devtools-color-scheme', 'auto')
8+
const preferredDark = usePreferredDark()
9+
10+
export const isDark: WritableComputedRef<boolean> = computed({
11+
get: () => (preference.value === 'auto' ? preferredDark.value : preference.value === 'dark'),
12+
set: (value) => { preference.value = value ? 'dark' : 'light' },
613
})
714

815
export function toggleDark() {
916
isDark.value = !isDark.value
1017
}
18+
19+
export function applyDarkClassToHtml() {
20+
if (typeof document === 'undefined')
21+
return
22+
watchEffect(() => {
23+
const el = document.documentElement
24+
el.classList.toggle('dark', isDark.value)
25+
el.classList.toggle('light', !isDark.value)
26+
})
27+
}

packages/vite/src/app/app.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
<script setup lang="ts">
22
import PanelSideNav from '@vitejs/devtools-ui/components/Panel/PanelSideNav.vue'
3+
import { applyDarkClassToHtml } from '@vitejs/devtools-ui/composables/dark'
34
import { useSideNav } from '@vitejs/devtools-ui/composables/nav'
45
import { useSeoMeta } from '#app/composables/head'
56
import { connect, rpcConnectionState } from './composables/rpc'
67
import 'floating-vue/dist/style.css'
78
import './styles/cm.css'
89
import './styles/splitpanes.css'
910
import './styles/global.css'
10-
import '@vitejs/devtools-ui/composables/dark'
11+
12+
applyDarkClassToHtml()
1113
1214
useSeoMeta({
1315
title: 'Vite DevTools',

0 commit comments

Comments
 (0)