add dark mode (!)

This commit is contained in:
2026-02-18 20:23:10 -08:00
parent 35b0c2396f
commit 402ae9bf9b
3 changed files with 85 additions and 9 deletions
+11 -8
View File
@@ -1,4 +1,5 @@
import './App.css'
import { ThemeProvider } from "@/components/theme-provider"
import LatestTemperature from "@/components/latest-temperature"
import TemperatureHistory from "@/components/temperature-history"
import TemperaturePlot from "@/components/temperature-plot"
@@ -9,15 +10,17 @@ import TemperaturePlot from "@/components/temperature-plot"
function App() {
return (
<main className="min-h-screen bg-background p-6">
<div className="max-w-4xl mx-auto space-y-2">
<TemperaturePlot />
<div grid grid-cols-1 md:grid-cols-1 gap-6>
<LatestTemperature />
<TemperatureHistory />
<ThemeProvider defaultTheme="dark" storageKey="vite-ui-theme">
<main className="min-h-screen bg-background p-6 w-full">
<div className="w-full mx-auto space-y-2">
<TemperaturePlot />
<div className="grid grid-cols-4 gap-6">
<LatestTemperature />
<TemperatureHistory />
</div>
</div>
</div>
</main>
</main>
</ThemeProvider>
)
}
+1 -1
View File
@@ -8,7 +8,7 @@ function TemperaturePlot() {
if (error) return <p>Error: {error.message}</p>
return (
<div>
<div className="w-full">
<ResponsiveContainer width="100%" height={400}>
<ScatterChart data={data}>
<XAxis dataKey="id" />
@@ -0,0 +1,73 @@
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 = "system",
storageKey = "vite-ui-theme",
...props
}: ThemeProviderProps) {
const [theme, setTheme] = useState<Theme>(
() => (localStorage.getItem(storageKey) as Theme) || defaultTheme
)
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
}