import React, { useState, useMemo, useRef, useEffect } from "react"; import { Undo2, ChevronDown, Check } from "lucide-react"; export const systemFonts = [ "Arial", "Helvetica", "Georgia", "Times New Roman", "Verdana", "Trebuchet MS", "Courier New", "Lucida Sans", "Tahoma" ]; export const googleFonts = [ "Roboto", "Open Sans", "Lato", "Montserrat", "Poppins", "Inter", "Nunito", "Raleway", "Source Sans Pro", "Ubuntu", "PT Sans", "Noto Sans", "Work Sans", "IBM Plex Sans", "Fira Sans", "Source Sans 3", "Public Sans", "Inter Tight", "Albert Sans", "Plus Jakarta Sans", "Merriweather", "Playfair Display", "Lora", "Crimson Text", "Libre Baskerville", "Source Serif Pro", "Noto Serif", "Bitter", "Cormorant Garamond", "EB Garamond", "Oswald", "Bebas Neue", "Anton", "Righteous", "DM Sans", "Outfit", "Manrope", "Space Grotesk", "Lexend", "Dancing Script", "Pacifico", "Great Vibes", "Caveat", "Roboto Mono", "Source Code Pro", "Fira Code", "JetBrains Mono", "IBM Plex Mono", "Quicksand", "Comfortaa", "Josefin Sans", "Barlow", "Cabin", "Rubik", "Mulish" ]; export const loadGoogleFont = (fontFamily) => { if (!fontFamily || systemFonts.includes(fontFamily) || fontFamily === 'inherit') return; const formattedFontName = fontFamily.replace(/ /g, "+"); const fontUrl = `https://fonts.googleapis.com/css2?family=${formattedFontName}:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400;1,600;1,700&display=swap`; if (document.querySelector(`link[href="${fontUrl}"]`)) return; const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = fontUrl; document.head.appendChild(link); }; export default function FontFamilyToggle({ currentFont = "Inter", onSelect, onReset }) { const [isOpen, setIsOpen] = useState(false); const [searchTerm, setSearchTerm] = useState(""); const dropdownRef = useRef(null); const filteredFonts = useMemo(() => { const all = [ ...systemFonts.map(name => ({ name, type: 'System' })), ...googleFonts.map(name => ({ name, type: 'Google' })) ]; if (!searchTerm) return all; return all.filter(f => f.name.toLowerCase().includes(searchTerm.toLowerCase())); }, [searchTerm]); const handleSelect = (name) => { loadGoogleFont(name); if (onSelect) onSelect(name); setIsOpen(false); setSearchTerm(""); }; useEffect(() => { const handler = (e) => { if (dropdownRef.current && !dropdownRef.current.contains(e.target)) { setIsOpen(false); setSearchTerm(""); } }; document.addEventListener('mousedown', handler); return () => document.removeEventListener('mousedown', handler); }, []); return (