mirror of
https://github.com/BigBodyCobain/Shadowbroker.git
synced 2026-05-14 20:38:45 +02:00
8cddf6794d
New features:
- NASA GIBS (MODIS Terra) daily satellite imagery with 30-day time slider
- Esri World Imagery high-res satellite layer (sub-meter, zoom 18+)
- KiwiSDR SDR receivers on map with embedded radio tuner
- Sentinel-2 intel card — right-click for recent satellite photo popup
- LOCATE bar — search by coordinates or place name (Nominatim geocoding)
- SATELLITE style preset in bottom bar cycling
- v0.4 changelog modal on first launch
Fixes:
- Satellite imagery renders below data icons (imagery-ceiling anchor)
- Sentinel-2 opens full-res PNG directly (not STAC catalog JSON)
- Light/dark theme: UI stays dark, only map basemap changes
Security:
- Removed test files with hardcoded API keys from tracking
- Removed .git_backup directory from tracking
- Updated .gitignore to exclude test files, dev scripts, cache files
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Former-commit-id: e89e992293
40 lines
1.0 KiB
TypeScript
40 lines
1.0 KiB
TypeScript
"use client";
|
|
|
|
import React, { createContext, useContext, useState, useEffect } from "react";
|
|
|
|
type Theme = "dark" | "light";
|
|
|
|
const ThemeContext = createContext<{ theme: Theme; toggleTheme: () => void }>({
|
|
theme: "dark",
|
|
toggleTheme: () => {},
|
|
});
|
|
|
|
export function ThemeProvider({ children }: { children: React.ReactNode }) {
|
|
const [theme, setTheme] = useState<Theme>("dark");
|
|
|
|
useEffect(() => {
|
|
const saved = localStorage.getItem("sb-theme") as Theme | null;
|
|
if (saved === "light" || saved === "dark") {
|
|
setTheme(saved);
|
|
document.documentElement.setAttribute("data-theme", saved);
|
|
}
|
|
}, []);
|
|
|
|
const toggleTheme = () => {
|
|
const next = theme === "dark" ? "light" : "dark";
|
|
setTheme(next);
|
|
localStorage.setItem("sb-theme", next);
|
|
document.documentElement.setAttribute("data-theme", next);
|
|
};
|
|
|
|
return (
|
|
<ThemeContext.Provider value={{ theme, toggleTheme }}>
|
|
{children}
|
|
</ThemeContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useTheme() {
|
|
return useContext(ThemeContext);
|
|
}
|