import "./App.css"; import { maxGuesses, seed } from "./util"; import Game from "./Game"; import { useEffect, useState } from "react"; import { About } from "./About"; function useSetting( key: string, initial: T ): [T, (value: T | ((t: T) => T)) => void] { const [current, setCurrent] = useState(() => { try { const item = window.localStorage.getItem(key); return item ? JSON.parse(item) : initial; } catch (e) { return initial; } }); const setSetting = (value: T | ((t: T) => T)) => { try { const v = value instanceof Function ? value(current) : value; setCurrent(v); window.localStorage.setItem(key, JSON.stringify(v)); } catch (e) {} }; return [current, setSetting]; } function App() { type Page = "game" | "about" | "settings"; const [page, setPage] = useState("game"); const prefersDark = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches; const [dark, setDark] = useSetting("dark", prefersDark); const [colorBlind, setColorBlind] = useSetting("colorblind", false); const [difficulty, setDifficulty] = useSetting("difficulty", 0); const [keyboard, setKeyboard] = useSetting( "keyboard", "qwertyuiop-asdfghjkl-BzxcvbnmE" ); const [enterLeft, setEnterLeft] = useSetting("enter-left", false); useEffect(() => { document.body.className = dark ? "dark" : ""; setTimeout(() => { // Avoid transition on page load document.body.style.transition = "0.3s background-color ease-out"; }, 1); }, [dark]); const link = (emoji: string, label: string, page: Page) => ( setPage(page)} title={label} aria-label={label} > {emoji} ); return (

0 ? "#e66" : "inherit", fontStyle: difficulty > 1 ? "italic" : "inherit", }} > hell o wordl

{page !== "game" ? ( link("❌", "Close", "game") ) : ( <> {link("❓", "About", "about")} {link("⚙️", "Settings", "settings")} )}
{page === "about" && } {page === "settings" && (
setDark((x: boolean) => !x)} />
setColorBlind((x: boolean) => !x)} />
setDifficulty(+e.target.value)} />
{["Normal", "Hard", "Ultra Hard"][difficulty]}
{ [ `Guesses must be valid dictionary words.`, `Wordle's "Hard Mode". Green letters must stay fixed, and yellow letters must be reused.`, `An even stricter Hard Mode. Yellow letters must move away from where they were clued, and gray clues must be obeyed.`, ][difficulty] }
setEnterLeft((x: boolean) => !x)} />
)}
); } export default App;