mirror of
https://github.com/NVIDIA/dgx-spark-playbooks.git
synced 2026-04-23 02:23:53 +00:00
95 lines
2.3 KiB
TypeScript
95 lines
2.3 KiB
TypeScript
//
|
|
// SPDX-FileCopyrightText: Copyright (c) 1993-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
"use client"
|
|
|
|
import type React from "react"
|
|
|
|
import { createContext, useContext, useEffect, useState } from "react"
|
|
|
|
type Theme = "dark" | "light" | "system"
|
|
|
|
type ThemeProviderProps = {
|
|
children: React.ReactNode
|
|
defaultTheme?: Theme
|
|
storageKey?: string
|
|
}
|
|
|
|
type ThemeProviderState = {
|
|
theme: Theme
|
|
setTheme: (theme: Theme) => void
|
|
}
|
|
|
|
const initialState: ThemeProviderState = {
|
|
theme: "system",
|
|
setTheme: () => null,
|
|
}
|
|
|
|
const ThemeProviderContext = createContext<ThemeProviderState>(initialState)
|
|
|
|
export function ThemeProvider({
|
|
children,
|
|
defaultTheme = "dark",
|
|
storageKey = "txt2kg-theme",
|
|
...props
|
|
}: ThemeProviderProps) {
|
|
const [theme, setTheme] = useState<Theme>(defaultTheme)
|
|
|
|
useEffect(() => {
|
|
const savedTheme = localStorage.getItem(storageKey)
|
|
if (savedTheme) {
|
|
setTheme(savedTheme as Theme)
|
|
}
|
|
}, [storageKey])
|
|
|
|
useEffect(() => {
|
|
const root = window.document.documentElement
|
|
|
|
root.classList.remove("light", "dark")
|
|
|
|
if (theme === "system") {
|
|
const systemTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"
|
|
root.classList.add(systemTheme)
|
|
return
|
|
}
|
|
|
|
root.classList.add(theme)
|
|
}, [theme])
|
|
|
|
const value = {
|
|
theme,
|
|
setTheme: (theme: Theme) => {
|
|
localStorage.setItem(storageKey, theme)
|
|
setTheme(theme)
|
|
},
|
|
}
|
|
|
|
return (
|
|
<ThemeProviderContext.Provider {...props} value={value}>
|
|
{children}
|
|
</ThemeProviderContext.Provider>
|
|
)
|
|
}
|
|
|
|
export const useTheme = () => {
|
|
const context = useContext(ThemeProviderContext)
|
|
|
|
if (context === undefined) throw new Error("useTheme must be used within a ThemeProvider")
|
|
|
|
return context
|
|
}
|
|
|