diff --git a/apps/website/components/dev/DevToolbar.tsx b/apps/website/components/dev/DevToolbar.tsx index c6461c4d1..41d5f89f4 100644 --- a/apps/website/components/dev/DevToolbar.tsx +++ b/apps/website/components/dev/DevToolbar.tsx @@ -229,7 +229,9 @@ export function DevToolbar() { if (isMinimized) { return ( - + setIsMinimized(false)} @@ -243,10 +245,6 @@ export function DevToolbar() { return ( setIsExpanded(!isExpanded)} variant="ghost" size="sm" + title={isExpanded ? "Collapse" : "Expand"} /> setIsMinimized(true)} variant="ghost" size="sm" + title="Minimize" /> diff --git a/apps/website/components/layout/CommandModal.tsx b/apps/website/components/layout/CommandModal.tsx index 08d61ac28..c595a2b8c 100644 --- a/apps/website/components/layout/CommandModal.tsx +++ b/apps/website/components/layout/CommandModal.tsx @@ -1,10 +1,10 @@ 'use client'; -import { Modal } from '@/components/shared/Modal'; import { Box } from '@/ui/Box'; import { Text } from '@/ui/Text'; -import { Search, Command, ArrowRight } from 'lucide-react'; +import { Search, Command, ArrowRight, X } from 'lucide-react'; import { useState, useEffect } from 'react'; +import { createPortal } from 'react-dom'; interface CommandModalProps { isOpen: boolean; @@ -13,6 +13,27 @@ interface CommandModalProps { export function CommandModal({ isOpen, onClose }: CommandModalProps) { const [query, setQuery] = useState(''); + const [mounted, setMounted] = useState(false); + + useEffect(() => { + setMounted(true); + }, []); + + useEffect(() => { + const down = (e: KeyboardEvent) => { + if (e.key === 'Escape') { + onClose(); + } + }; + if (isOpen) { + document.addEventListener('keydown', down); + document.body.style.overflow = 'hidden'; + } + return () => { + document.removeEventListener('keydown', down); + document.body.style.overflow = 'unset'; + }; + }, [isOpen, onClose]); // Mock results const results = [ @@ -21,50 +42,75 @@ export function CommandModal({ isOpen, onClose }: CommandModalProps) { { label: 'Create League', shortcut: 'C L' }, ].filter(r => r.label.toLowerCase().includes(query.toLowerCase())); - return ( - } - > - - - + if (!mounted) return null; + if (!isOpen) return null; + + return createPortal( +
+ {/* Backdrop */} +
+ + {/* Modal Content */} +
+
+ setQuery(e.target.value)} /> - + +
- - - Suggestions - - {results.map((result, i) => ( - - ))} - - - +
+ {results.length > 0 ? ( +
+
+ Suggestions +
+ {results.map((result, i) => ( + + ))} +
+ ) : ( +
+ No results found. +
+ )} +
+ +
+
+ ↑↓ to navigate + to select +
+ GridPilot Command +
+
+
, + document.body ); }