diff --git a/src/components/cmdk/CommandKClient.tsx b/src/components/cmdk/CommandKClient.tsx index 96b0b62b..1b225372 100644 --- a/src/components/cmdk/CommandKClient.tsx +++ b/src/components/cmdk/CommandKClient.tsx @@ -71,6 +71,7 @@ import IconRecipe from '../icons/IconRecipe'; import IconFocalLength from '../icons/IconFocalLength'; import IconFilmSimulation from '../icons/IconFilmSimulation'; import IconLock from '../icons/IconLock'; +import useVisualViewportHeight from '@/utility/useVisualViewport'; const DIALOG_TITLE = 'Global Command-K Menu'; const DIALOG_DESCRIPTION = 'For searching photos, views, and settings'; @@ -151,6 +152,16 @@ export default function CommandKClient({ } = useAppState(); const isOpenRef = useRef(isOpen); + + const ref = useRef(null); + const mobileViewportHeight = useVisualViewportHeight(); + const heightMinimum = '20rem'; + const maxHeight = useMemo(() => { + const positionY = ref.current?.getBoundingClientRect().y; + return mobileViewportHeight && positionY + ? `min(${mobileViewportHeight - positionY - 32}px, ${heightMinimum})` + : heightMinimum; + }, [mobileViewportHeight]); // Manage action/path waiting state const [keyWaiting, setKeyWaiting] = useState(); @@ -537,6 +548,7 @@ export default function CommandKClient({ )}>
setQueryLive(e.currentTarget.value)} className={clsx( 'w-full min-w-0!', @@ -563,10 +575,9 @@ export default function CommandKClient({
diff --git a/src/utility/useVisualViewport.ts b/src/utility/useVisualViewport.ts new file mode 100644 index 00000000..1b1d42de --- /dev/null +++ b/src/utility/useVisualViewport.ts @@ -0,0 +1,18 @@ +import { useState } from 'react'; + +import { useEffect } from 'react'; + +export default function useVisualViewportHeight() { + const [viewportHeight, setViewportHeight] = useState(); + + useEffect(() => { + const handleResize = () => { + setViewportHeight(window.visualViewport?.height); + }; + window.visualViewport?.addEventListener('resize', handleResize); + return () => + window.visualViewport?.removeEventListener('resize', handleResize); + }, []); + + return viewportHeight; +}