@@ -10,7 +10,7 @@ import {createRequire} from 'module';
10
10
import rtlcss from 'rtlcss' ;
11
11
import { readDefaultCodeTranslationMessages } from '@docusaurus/theme-translations' ;
12
12
import { getTranslationFiles , translateThemeConfig } from './translations' ;
13
- import type { LoadContext , Plugin } from '@docusaurus/types' ;
13
+ import type { LoadContext , Plugin , SiteStorage } from '@docusaurus/types' ;
14
14
import type { ThemeConfig } from '@docusaurus/theme-common' ;
15
15
import type { Plugin as PostCssPlugin } from 'postcss' ;
16
16
import type { PluginOptions } from '@docusaurus/theme-classic' ;
@@ -23,58 +23,66 @@ const ContextReplacementPlugin = requireFromDocusaurusCore(
23
23
'webpack/lib/ContextReplacementPlugin' ,
24
24
) as typeof webpack . ContextReplacementPlugin ;
25
25
26
- // Need to be inlined to prevent dark mode FOUC
27
- // Make sure the key is the same as the one in `/theme/hooks/useTheme.js`
28
- const ThemeStorageKey = 'theme' ;
29
26
// Support for ?docusaurus-theme=dark
30
27
const ThemeQueryStringKey = 'docusaurus-theme' ;
31
28
// Support for ?docusaurus-data-mode=embed&docusaurus-data-myAttr=42
32
29
const DataQueryStringPrefixKey = 'docusaurus-data-' ;
33
30
34
31
const noFlashColorMode = ( {
35
- defaultMode,
36
- respectPrefersColorScheme,
37
- } : ThemeConfig [ 'colorMode' ] ) =>
32
+ colorMode : { defaultMode, respectPrefersColorScheme} ,
33
+ siteStorage,
34
+ } : {
35
+ colorMode : ThemeConfig [ 'colorMode' ] ;
36
+ siteStorage : SiteStorage ;
37
+ } ) => {
38
+ // Need to be inlined to prevent dark mode FOUC
39
+ // Make sure the key is the same as the one in the color mode React context
40
+ // Currently defined in: `docusaurus-theme-common/src/contexts/colorMode.tsx`
41
+ const themeStorageKey = `theme${ siteStorage . namespace } ` ;
42
+
38
43
/* language=js */
39
- `(function() {
40
- var defaultMode = '${ defaultMode } ';
41
- var respectPrefersColorScheme = ${ respectPrefersColorScheme } ;
44
+ return `(function() {
45
+ var defaultMode = '${ defaultMode } ';
46
+ var respectPrefersColorScheme = ${ respectPrefersColorScheme } ;
42
47
43
- function setDataThemeAttribute(theme) {
44
- document.documentElement.setAttribute('data-theme', theme);
45
- }
48
+ function setDataThemeAttribute(theme) {
49
+ document.documentElement.setAttribute('data-theme', theme);
50
+ }
46
51
47
- function getQueryStringTheme() {
48
- try {
49
- return new URLSearchParams(window.location.search).get('${ ThemeQueryStringKey } ')
50
- } catch(e) {}
51
- }
52
+ function getQueryStringTheme() {
53
+ try {
54
+ return new URLSearchParams(window.location.search).get('${ ThemeQueryStringKey } ')
55
+ } catch (e) {
56
+ }
57
+ }
52
58
53
- function getStoredTheme() {
54
- try {
55
- return localStorage.getItem('${ ThemeStorageKey } ');
56
- } catch (err) {}
57
- }
59
+ function getStoredTheme() {
60
+ try {
61
+ return window['${ siteStorage . type } '].getItem('${ themeStorageKey } ');
62
+ } catch (err) {
63
+ }
64
+ }
58
65
59
- var initialTheme = getQueryStringTheme() || getStoredTheme();
60
- if (initialTheme !== null) {
61
- setDataThemeAttribute(initialTheme);
62
- } else {
63
- if (
64
- respectPrefersColorScheme &&
65
- window.matchMedia('(prefers-color-scheme: dark)').matches
66
- ) {
67
- setDataThemeAttribute('dark');
68
- } else if (
69
- respectPrefersColorScheme &&
70
- window.matchMedia('(prefers-color-scheme: light)').matches
71
- ) {
72
- setDataThemeAttribute('light');
66
+ var initialTheme = getQueryStringTheme() || getStoredTheme();
67
+ if (initialTheme !== null) {
68
+ setDataThemeAttribute(initialTheme);
73
69
} else {
74
- setDataThemeAttribute(defaultMode === 'dark' ? 'dark' : 'light');
70
+ if (
71
+ respectPrefersColorScheme &&
72
+ window.matchMedia('(prefers-color-scheme: dark)').matches
73
+ ) {
74
+ setDataThemeAttribute('dark');
75
+ } else if (
76
+ respectPrefersColorScheme &&
77
+ window.matchMedia('(prefers-color-scheme: light)').matches
78
+ ) {
79
+ setDataThemeAttribute('light');
80
+ } else {
81
+ setDataThemeAttribute(defaultMode === 'dark' ? 'dark' : 'light');
82
+ }
75
83
}
76
- }
77
- })();` ;
84
+ })();` ;
85
+ } ;
78
86
79
87
/* language=js */
80
88
const DataAttributeQueryStringInlineJavaScript = `
@@ -126,6 +134,7 @@ export default function themeClassic(
126
134
) : Plugin < undefined > {
127
135
const {
128
136
i18n : { currentLocale, localeConfigs} ,
137
+ siteStorage,
129
138
} = context ;
130
139
const themeConfig = context . siteConfig . themeConfig as ThemeConfig ;
131
140
const {
@@ -218,7 +227,7 @@ export default function themeClassic(
218
227
{
219
228
tagName : 'script' ,
220
229
innerHTML : `
221
- ${ noFlashColorMode ( colorMode ) }
230
+ ${ noFlashColorMode ( { colorMode, siteStorage } ) }
222
231
${ DataAttributeQueryStringInlineJavaScript }
223
232
${ announcementBar ? AnnouncementBarInlineJavaScript : '' }
224
233
` ,
0 commit comments