Browse Source

PR Feedback: h/t Dan & Hunter

pull/520/head
bkimmel 1 year ago
parent
commit
9634e1ce39
  1. 21
      src/components/ThemeSwitcher.tsx

21
src/components/ThemeSwitcher.tsx

@ -1,4 +1,3 @@
import { useState } from "react";
import { useTheme } from "../core/hooks/useTheme.ts"; import { useTheme } from "../core/hooks/useTheme.ts";
import { cn } from "../core/utils/cn.ts"; import { cn } from "../core/utils/cn.ts";
import { Monitor, Moon, Sun } from "lucide-react"; import { Monitor, Moon, Sun } from "lucide-react";
@ -11,7 +10,6 @@ export default function ThemeSwitcher({
className?: string; className?: string;
}) { }) {
const { theme, preference, setPreference } = useTheme(); const { theme, preference, setPreference } = useTheme();
const [isFocused, setIsFocused] = useState(false);
const themeIcons = { const themeIcons = {
light: <Sun className="size-5" />, light: <Sun className="size-5" />,
@ -26,30 +24,19 @@ export default function ThemeSwitcher({
setPreference(nextPreference); setPreference(nextPreference);
}; };
const labelStyle = { const [firstCharOfPreference="", ...restOfPreference] = preference;
display: "block",
margin: "0 auto",
fontSize: ".65rem",
width: "100%",
position: "absolute",
top: isFocused ? "-2em" : "2em",
left: "0",
opacity: isFocused ? "100" : "0"
};
return ( return (
<button <button
type="button" type="button"
className={cn( className={cn(
"transition-all duration-300 scale-100 cursor-pointer m-6 p-2", "transition-all duration-300 scale-100 cursor-pointer m-6 p-2 focus:*:data-label:opacity-100",
className, className,
)} )}
onClick={toggleTheme} onClick={toggleTheme}
onFocus={() => setIsFocused(true)} aria-description={'Change current theme'}
onBlur={() => setIsFocused(false)}
aria-description={'Current theme'}
> >
<span style={labelStyle}>{preference}</span> <span data-label className="transition-all block absolute w-full mb-auto mt-auto ml-0 mr-0 text-xs left-0 -top-5 opacity-0 rounded-lg">{firstCharOfPreference.toLocaleUpperCase() + restOfPreference.join("")}</span>
{themeIcons[preference]} {themeIcons[preference]}
</button> </button>
); );

Loading…
Cancel
Save