PR Feedback: h/t Dan & Hunter
This commit is contained in:
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user