Skip to content

Commit

Permalink
feat(theme): allow forcing dark mode (#2974)
Browse files Browse the repository at this point in the history
  • Loading branch information
brc-dd committed Sep 15, 2023
1 parent a18e5e4 commit 1fb5d22
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 31 deletions.
2 changes: 1 addition & 1 deletion docs/reference/site-config.md
Expand Up @@ -426,7 +426,7 @@ When set to `true`, the production app will be built in [MPA Mode](../guide/mpa-

### appearance

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

Whether to enable dark mode (by adding the `.dark` class to the `<html>` element).
Expand Down
24 changes: 12 additions & 12 deletions src/client/app/data.ts
Expand Up @@ -69,18 +69,18 @@ export function initData(route: Route): VitePressData {
resolveSiteDataByRoute(siteDataRef.value, route.data.relativePath)
)

const isDark = site.value.appearance
? useDark({
storageKey: APPEARANCE_KEY,
initialValue: () =>
typeof site.value.appearance === 'string'
? site.value.appearance
: 'auto',
...(typeof site.value.appearance === 'object'
? site.value.appearance
: {})
})
: ref(false)
const appearance = site.value.appearance // fine with reactivity being lost here, config change triggers a restart
const isDark =
appearance === 'force-dark'
? ref(true)
: appearance
? useDark({
storageKey: APPEARANCE_KEY,
initialValue: () =>
typeof appearance === 'string' ? appearance : 'auto',
...(typeof appearance === 'object' ? appearance : {})
})
: ref(false)

return {
site,
Expand Down
2 changes: 1 addition & 1 deletion src/client/theme-default/components/VPNavBarAppearance.vue
Expand Up @@ -6,7 +6,7 @@ const { site } = useData()
</script>

<template>
<div v-if="site.appearance" class="VPNavBarAppearance">
<div v-if="site.appearance && site.appearance !== 'force-dark'" class="VPNavBarAppearance">
<VPSwitchAppearance />
</div>
</template>
Expand Down
35 changes: 18 additions & 17 deletions src/node/config.ts
Expand Up @@ -255,24 +255,25 @@ function resolveSiteDataHead(userConfig?: UserConfig): HeadConfig[] {
? userConfig.appearance.initialValue ?? 'auto'
: 'auto'

head.push(
[
'script',
{ id: 'check-dark-light' },
`;(() => {
const preference = localStorage.getItem('${APPEARANCE_KEY}') || '${fallbackPreference}'
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
if (!preference || preference === 'auto' ? prefersDark : preference === 'dark')
document.documentElement.classList.add('dark')
})()`
],
[
'script',
{ id: 'check-mac-os' },
`document.documentElement.classList.toggle('mac', /Mac|iPhone|iPod|iPad/i.test(navigator.platform))`
]
)
head.push([
'script',
{ id: 'check-dark-mode' },
fallbackPreference === 'force-dark'
? `document.documentElement.classList.add('dark')`
: `;(() => {
const preference = localStorage.getItem('${APPEARANCE_KEY}') || '${fallbackPreference}'
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
if (!preference || preference === 'auto' ? prefersDark : preference === 'dark')
document.documentElement.classList.add('dark')
})()`
])
}

head.push([
'script',
{ id: 'check-mac-os' },
`document.documentElement.classList.toggle('mac', /Mac|iPhone|iPod|iPad/i.test(navigator.platform))`
])

return head
}
1 change: 1 addition & 0 deletions src/node/siteConfig.ts
Expand Up @@ -72,6 +72,7 @@ export interface UserConfig<ThemeConfig = any>
appearance?:
| boolean
| 'dark'
| 'force-dark'
| (Omit<UseDarkOptions, 'initialValue'> & { initialValue?: 'dark' })
lastUpdated?: boolean
contentProps?: Record<string, any>
Expand Down
1 change: 1 addition & 0 deletions types/shared.d.ts
Expand Up @@ -60,6 +60,7 @@ export interface SiteData<ThemeConfig = any> {
appearance:
| boolean
| 'dark'
| 'force-dark'
| (Omit<UseDarkOptions, 'initialValue'> & { initialValue?: 'dark' })
themeConfig: ThemeConfig
scrollOffset:
Expand Down

0 comments on commit 1fb5d22

Please sign in to comment.