Logo and Improved dropdowns

This commit is contained in:
2026-04-03 16:15:17 +02:00
parent 736583177b
commit a48f5a19f3
2 changed files with 74 additions and 37 deletions
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

+46 -9
View File
@@ -33,6 +33,9 @@ const App: React.FC = () => {
const [isVersionDropdownOpen, setIsVersionDropdownOpen] = useState(false); const [isVersionDropdownOpen, setIsVersionDropdownOpen] = useState(false);
const [isAccountDropdownOpen, setIsAccountDropdownOpen] = useState(false); const [isAccountDropdownOpen, setIsAccountDropdownOpen] = useState(false);
const versionRef = React.useRef<HTMLDivElement | null>(null);
const accountRef = React.useRef<HTMLDivElement | null>(null);
useEffect(() => { useEffect(() => {
const fetchVersions = async () => { const fetchVersions = async () => {
const v = await launcherService.getVersions(); const v = await launcherService.getVersions();
@@ -42,6 +45,27 @@ const App: React.FC = () => {
fetchVersions(); fetchVersions();
}, []); }, []);
useEffect(() => {
function handleClickOutside(event: MouseEvent) {
const target = event.target as Node;
// Close version dropdown if clicked outside
if (versionRef.current && !versionRef.current.contains(target)) {
setIsVersionDropdownOpen(false);
}
// Close account dropdown if clicked outside
if (accountRef.current && !accountRef.current.contains(target)) {
setIsAccountDropdownOpen(false);
}
}
document.addEventListener("mousedown", handleClickOutside);
return () => {
document.removeEventListener("mousedown", handleClickOutside);
};
}, []);
return ( return (
<div className="flex h-screen w-screen bg-saturn-bg text-saturn-text-primary overflow-hidden font-sans"> <div className="flex h-screen w-screen bg-saturn-bg text-saturn-text-primary overflow-hidden font-sans">
{/* Sidebar */} {/* Sidebar */}
@@ -94,13 +118,16 @@ const App: React.FC = () => {
{/* Top Bar */} {/* Top Bar */}
<header className="h-14 border-b border-saturn-border flex items-center justify-between px-6 bg-saturn-panel/30 backdrop-blur-md z-100 py-10"> <header className="h-14 border-b border-saturn-border flex items-center justify-between px-6 bg-saturn-panel/30 backdrop-blur-md z-100 py-10">
{/* Version Selector */} {/* Version Selector */}
<div className="relative"> <div ref={versionRef} className="relative">
<div className="relative group overflow-visible inline-block"> <div className="relative group overflow-visible inline-block">
{/* Glow */} {/* Glow */}
<div className="absolute -inset-1 bg-linear-to-r from-blue-600 to-cyan-500 rounded-md blur opacity-25 group-hover:opacity-50 transition duration-500 pointer-events-none" /> <div className="absolute -inset-1 bg-linear-to-r from-blue-600 to-cyan-500 rounded-md blur opacity-25 group-hover:opacity-50 transition duration-500 pointer-events-none" />
<button <button
onClick={() => setIsVersionDropdownOpen(!isVersionDropdownOpen)} onClick={() => {
setIsVersionDropdownOpen((prev) => !prev);
setIsAccountDropdownOpen(false);
}}
className="relative z-10 flex items-center gap-2 px-3 py-1.5 rounded-md btn-primary text-sm font-medium" className="relative z-10 flex items-center gap-2 px-3 py-1.5 rounded-md btn-primary text-sm font-medium"
> >
<span>{selectedVersion?.name || "Loading..."}</span> <span>{selectedVersion?.name || "Loading..."}</span>
@@ -115,8 +142,14 @@ const App: React.FC = () => {
</button> </button>
</div> </div>
{isVersionDropdownOpen && ( <div
<div className="absolute top-full left-0 mt-2 w-48 bg-saturn-panel border border-saturn-border rounded-lg shadow-2xl z-50 py-1 overflow-hidden"> className={cn(
"absolute top-full left-0 mt-2 w-48 bg-saturn-panel border border-saturn-border rounded-lg shadow-2xl z-50 py-1 overflow-hidden transition-all duration-200 origin-top",
isVersionDropdownOpen
? "opacity-100 scale-100 translate-y-0 pointer-events-auto"
: "opacity-0 scale-95 -translate-y-2 pointer-events-none",
)}
>
{versions.map((v) => ( {versions.map((v) => (
<button <button
key={v.id} key={v.id}
@@ -131,11 +164,10 @@ const App: React.FC = () => {
</button> </button>
))} ))}
</div> </div>
)}
</div> </div>
{/* Account Selector */} {/* Account Selector */}
<div className="relative group overflow-visible"> <div ref={accountRef} className="relative group overflow-visible">
{/* Glow */} {/* Glow */}
<div className="absolute -inset-1 bg-linear-to-r from-blue-600 to-cyan-500 rounded-lg blur opacity-25 group-hover:opacity-50 transition pointer-events-none duration-700" /> <div className="absolute -inset-1 bg-linear-to-r from-blue-600 to-cyan-500 rounded-lg blur opacity-25 group-hover:opacity-50 transition pointer-events-none duration-700" />
@@ -159,8 +191,14 @@ const App: React.FC = () => {
</div> </div>
</button> </button>
{isAccountDropdownOpen && ( <div
<div className="absolute top-full right-0 mt-2 w-48 bg-saturn-panel border border-saturn-border rounded-lg shadow-2xl z-50 py-1 overflow-hidden"> className={cn(
"absolute top-full right-0 mt-2 w-48 bg-saturn-panel border border-saturn-border rounded-lg shadow-2xl z-50 py-1 overflow-hidden transition-all duration-200 origin-top",
isAccountDropdownOpen
? "opacity-100 scale-100 translate-y-0 pointer-events-auto"
: "opacity-0 scale-95 -translate-y-2 pointer-events-none",
)}
>
<div className="px-4 py-3 border-b border-saturn-border"> <div className="px-4 py-3 border-b border-saturn-border">
<p className="text-sm font-bold">SaturnDev</p> <p className="text-sm font-bold">SaturnDev</p>
<p className="text-xs text-saturn-text-secondary truncate"> <p className="text-xs text-saturn-text-secondary truncate">
@@ -176,7 +214,6 @@ const App: React.FC = () => {
<span>Logout</span> <span>Logout</span>
</button> </button>
</div> </div>
)}
</div> </div>
</header> </header>