diff --git a/frontend/src/features/authoring/wrapper/FontInput.tsx b/frontend/src/features/authoring/wrapper/FontInput.tsx index 2ca6d27a..019f96b5 100644 --- a/frontend/src/features/authoring/wrapper/FontInput.tsx +++ b/frontend/src/features/authoring/wrapper/FontInput.tsx @@ -1,3 +1,29 @@ +import { useLayoutEffect, useRef, useState } from "react"; +import { createPortal } from "react-dom"; + +function FontFinder(currentSearch: string = "") { + const fonts = [ + "Arial", + "Verdana", + "Tahoma", + "Trebuchet MS", + "Times New Roman", + "Georgia", + "Garamond", + "Courier New", + "Helvetica", + ]; + + const filteredFonts = + currentSearch.length == 0 + ? fonts + : fonts.filter((font) => + font.toLowerCase().includes(currentSearch.toLowerCase()) + ); + + return filteredFonts; +} + function FontInput({ value, onChange, @@ -5,27 +31,55 @@ function FontInput({ value: string; onChange: (value: string) => void; }) { + const [open, setOpen] = useState(false); + const [fonts, setFonts] = useState(FontFinder()); + const inputRef = useRef(null); + const [position, setPosition] = useState({ top: 0, left: 0 }); + + useLayoutEffect(() => { + if (!open || !inputRef.current) return; + const rect = inputRef.current.getBoundingClientRect(); + setPosition({ top: rect.bottom, left: rect.left }); + }, [open]); + + const portal = document.getElementById("modal-portal"); + return ( <> onChange(e.target.value)} - list="fonts" + onChange={(e) => { + setFonts(FontFinder(e.target.value)); + onChange(e.target.value); + }} + onFocus={() => setOpen(true)} /> - - + {open && + portal && + createPortal( +
+ {fonts.map((font, index) => ( +
{ + onChange(font); + setOpen(false); + }} + > + {font} +
+ ))} +
, + portal + )} ); }