Skip to content

Commit 1fb5d22

Browse files
authoredSep 15, 2023
feat(theme): allow forcing dark mode (#2974)
1 parent a18e5e4 commit 1fb5d22

File tree

6 files changed

+34
-31
lines changed

6 files changed

+34
-31
lines changed
 

‎docs/reference/site-config.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ When set to `true`, the production app will be built in [MPA Mode](../guide/mpa-
426426

427427
### appearance
428428

429-
- Type: `boolean | 'dark' | import('@vueuse/core').UseDarkOptions`
429+
- Type: `boolean | 'dark' | 'force-dark' | import('@vueuse/core').UseDarkOptions`
430430
- Default: `true`
431431

432432
Whether to enable dark mode (by adding the `.dark` class to the `<html>` element).

‎src/client/app/data.ts

+12-12
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,18 @@ export function initData(route: Route): VitePressData {
6969
resolveSiteDataByRoute(siteDataRef.value, route.data.relativePath)
7070
)
7171

72-
const isDark = site.value.appearance
73-
? useDark({
74-
storageKey: APPEARANCE_KEY,
75-
initialValue: () =>
76-
typeof site.value.appearance === 'string'
77-
? site.value.appearance
78-
: 'auto',
79-
...(typeof site.value.appearance === 'object'
80-
? site.value.appearance
81-
: {})
82-
})
83-
: ref(false)
72+
const appearance = site.value.appearance // fine with reactivity being lost here, config change triggers a restart
73+
const isDark =
74+
appearance === 'force-dark'
75+
? ref(true)
76+
: appearance
77+
? useDark({
78+
storageKey: APPEARANCE_KEY,
79+
initialValue: () =>
80+
typeof appearance === 'string' ? appearance : 'auto',
81+
...(typeof appearance === 'object' ? appearance : {})
82+
})
83+
: ref(false)
8484

8585
return {
8686
site,

‎src/client/theme-default/components/VPNavBarAppearance.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const { site } = useData()
66
</script>
77

88
<template>
9-
<div v-if="site.appearance" class="VPNavBarAppearance">
9+
<div v-if="site.appearance && site.appearance !== 'force-dark'" class="VPNavBarAppearance">
1010
<VPSwitchAppearance />
1111
</div>
1212
</template>

‎src/node/config.ts

+18-17
Original file line numberDiff line numberDiff line change
@@ -255,24 +255,25 @@ function resolveSiteDataHead(userConfig?: UserConfig): HeadConfig[] {
255255
? userConfig.appearance.initialValue ?? 'auto'
256256
: 'auto'
257257

258-
head.push(
259-
[
260-
'script',
261-
{ id: 'check-dark-light' },
262-
`;(() => {
263-
const preference = localStorage.getItem('${APPEARANCE_KEY}') || '${fallbackPreference}'
264-
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
265-
if (!preference || preference === 'auto' ? prefersDark : preference === 'dark')
266-
document.documentElement.classList.add('dark')
267-
})()`
268-
],
269-
[
270-
'script',
271-
{ id: 'check-mac-os' },
272-
`document.documentElement.classList.toggle('mac', /Mac|iPhone|iPod|iPad/i.test(navigator.platform))`
273-
]
274-
)
258+
head.push([
259+
'script',
260+
{ id: 'check-dark-mode' },
261+
fallbackPreference === 'force-dark'
262+
? `document.documentElement.classList.add('dark')`
263+
: `;(() => {
264+
const preference = localStorage.getItem('${APPEARANCE_KEY}') || '${fallbackPreference}'
265+
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
266+
if (!preference || preference === 'auto' ? prefersDark : preference === 'dark')
267+
document.documentElement.classList.add('dark')
268+
})()`
269+
])
275270
}
276271

272+
head.push([
273+
'script',
274+
{ id: 'check-mac-os' },
275+
`document.documentElement.classList.toggle('mac', /Mac|iPhone|iPod|iPad/i.test(navigator.platform))`
276+
])
277+
277278
return head
278279
}

‎src/node/siteConfig.ts

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ export interface UserConfig<ThemeConfig = any>
7272
appearance?:
7373
| boolean
7474
| 'dark'
75+
| 'force-dark'
7576
| (Omit<UseDarkOptions, 'initialValue'> & { initialValue?: 'dark' })
7677
lastUpdated?: boolean
7778
contentProps?: Record<string, any>

‎types/shared.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ export interface SiteData<ThemeConfig = any> {
6060
appearance:
6161
| boolean
6262
| 'dark'
63+
| 'force-dark'
6364
| (Omit<UseDarkOptions, 'initialValue'> & { initialValue?: 'dark' })
6465
themeConfig: ThemeConfig
6566
scrollOffset:

0 commit comments

Comments
 (0)
Please sign in to comment.