Skip to content

Commit d482648

Browse files
jxomampcode-com
andcommitted
feat: hide theme toggle when colorScheme is statically set
Amp-Thread-ID: https://ampcode.com/threads/T-019c30b1-cab4-75ae-9638-ebd1d8f0c1ae Co-authored-by: Amp <amp@ampcode.com>
1 parent 331ed5d commit d482648

File tree

4 files changed

+24
-11
lines changed

4 files changed

+24
-11
lines changed

src/react/Head.tsx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ export function Head() {
99
const { path: pathname } = useRouter()
1010
const { frontmatter } = MdxPageContext.use()
1111

12-
const { basePath, baseUrl, iconUrl, logoUrl, ogImageUrl, renderStrategy } = config
12+
const { basePath, baseUrl, colorScheme, iconUrl, logoUrl, ogImageUrl, renderStrategy } = config
13+
14+
const staticScheme = colorScheme !== 'light dark'
1315

1416
const title = frontmatter?.title ?? config.title
1517
const titleTemplate = title.includes(config.title) ? undefined : config.titleTemplate
@@ -40,12 +42,14 @@ export function Head() {
4042
return (
4143
<>
4244
{/* Theme initialization (prevents FOUC) */}
43-
<script
44-
// biome-ignore lint/security/noDangerouslySetInnerHtml: blocking script to prevent FOUC
45-
dangerouslySetInnerHTML={{
46-
__html: `(function(){try{var t=localStorage.getItem('vocs-theme');if(t==='light'||t==='dark'){document.documentElement.style.colorScheme=t}else if(window.matchMedia('(prefers-color-scheme:dark)').matches){document.documentElement.style.colorScheme='dark'}else if(window.matchMedia('(prefers-color-scheme:light)').matches){document.documentElement.style.colorScheme='light'}else{document.documentElement.style.colorScheme='dark'}}catch(e){}})()`,
47-
}}
48-
/>
45+
{!staticScheme && (
46+
<script
47+
// biome-ignore lint/security/noDangerouslySetInnerHtml: blocking script to prevent FOUC
48+
dangerouslySetInnerHTML={{
49+
__html: `(function(){try{var t=localStorage.getItem('vocs-theme');if(t==='light'||t==='dark'){document.documentElement.style.colorScheme=t}else if(window.matchMedia('(prefers-color-scheme:dark)').matches){document.documentElement.style.colorScheme='dark'}else if(window.matchMedia('(prefers-color-scheme:light)').matches){document.documentElement.style.colorScheme='light'}else{document.documentElement.style.colorScheme='dark'}}catch(e){}})()`,
50+
}}
51+
/>
52+
)}
4953

5054
{/* Robots */}
5155
<meta

src/react/Layout.client.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,11 @@ export function Main(props: Main.Props) {
2626

2727
const { layout, showAskAi, showSearch, showSidebar, showTopNav, showLogo, showOutline } =
2828
useLayout()
29+
const { colorScheme } = useConfig()
2930
const { Footer, OutlineFooter, SidebarHeader } = useSlots()
3031

32+
const showThemeToggle = colorScheme === 'light dark'
33+
3134
const sidebarScrollRef = React.useRef<HTMLDivElement>(null)
3235
const topGutterRef = useTopGutterRef()
3336

@@ -90,7 +93,7 @@ export function Main(props: Main.Props) {
9093
data-v-sidebar-footer-content
9194
>
9295
<Socials.Socials />
93-
<ThemeToggle.ThemeToggle />
96+
{showThemeToggle && <ThemeToggle.ThemeToggle />}
9497
</div>
9598
</div>
9699
</aside>

src/react/Root.client.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ function applyTheme(theme: 'light' | 'dark' | 'system') {
4242
}
4343

4444
export function Root_client({ children }: { children: React.ReactNode }) {
45-
const { accentColor } = useConfig()
45+
const { accentColor, colorScheme } = useConfig()
46+
47+
const staticScheme = colorScheme !== 'light dark'
4648

4749
// react to theme config changes.
4850
useEffect(() => {
@@ -55,14 +57,15 @@ export function Root_client({ children }: { children: React.ReactNode }) {
5557

5658
// Listen for system theme changes (needed for pages without ThemeToggle)
5759
useEffect(() => {
60+
if (staticScheme) return
5861
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
5962
const handler = () => {
6063
const storedTheme = getStoredTheme()
6164
if (storedTheme === 'system') applyTheme('system')
6265
}
6366
mediaQuery.addEventListener('change', handler)
6467
return () => mediaQuery.removeEventListener('change', handler)
65-
}, [])
68+
}, [staticScheme])
6669

6770
return (
6871
<NuqsAdapter>

src/react/internal/MobileNav.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ import * as ThemeToggle from './ThemeToggle.client.js'
1919

2020
export function MobileNav(props: MobileNav.Props) {
2121
const { className } = props
22+
const { colorScheme } = useConfig()
23+
24+
const showThemeToggle = colorScheme === 'light dark'
2225

2326
const sidebarScrollRef = React.useRef<HTMLDivElement>(null)
2427

@@ -65,7 +68,7 @@ export function MobileNav(props: MobileNav.Props) {
6568
data-v-mobile-nav-footer
6669
>
6770
<Socials.Socials />
68-
<ThemeToggle.ThemeToggle />
71+
{showThemeToggle && <ThemeToggle.ThemeToggle />}
6972
</div>
7073
</div>
7174
</Dialog.Popup>

0 commit comments

Comments
 (0)