diff --git a/.gitignore b/.gitignore index 3c3629e..1380c2e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules +.next \ No newline at end of file diff --git a/components/PerformanceOptimizedFontCard.jsx b/components/PerformanceOptimizedFontCard.jsx index a2279f5..b0330c3 100644 --- a/components/PerformanceOptimizedFontCard.jsx +++ b/components/PerformanceOptimizedFontCard.jsx @@ -9,169 +9,169 @@ import { fontTransforms } from "@/components/fontTransforms"; const sStr = (v) => (v ?? "").toString(); const updateFontHistory = (fontName) => { -  if (typeof window === "undefined") return; -  try { -    const key = "fancytext_recent_fonts"; -    const stored = JSON.parse(sessionStorage.getItem(key) || "[]"); -    const updated = [fontName, ...stored.filter((f) => f !== fontName)].slice(0, 5); -    sessionStorage.setItem(key, JSON.stringify(updated)); -  } catch {} + if (typeof window === "undefined") return; + try { + const key = "fancytext_recent_fonts"; + const stored = JSON.parse(sessionStorage.getItem(key) || "[]"); + const updated = [fontName, ...stored.filter((f) => f !== fontName)].slice(0, 5); + sessionStorage.setItem(key, JSON.stringify(updated)); + } catch {} }; const PerformanceOptimizedFontCard = forwardRef(({ -  fontName, -  transformedText, -  category, -  isPopular, -  animationsEnabled, -  index, -  onCopy, -  onLike, -  onShare + fontName, + transformedText, + category, + isPopular, + animationsEnabled, + index, + onCopy, + onLike, + onShare }, ref) => { -  const [copied, setCopied] = useState(false); -  const [liked, setLiked] = useState(() => { -    if (typeof window === "undefined") return false; -    try { -      return localStorage.getItem(`liked_${fontName}`) === "true"; -    } catch { -      return false; -    } -  }); + const [copied, setCopied] = useState(false); + const [liked, setLiked] = useState(() => { + if (typeof window === "undefined") return false; + try { + return localStorage.getItem(`liked_${fontName}`) === "true"; + } catch { + return false; + } + }); -  const handleCopy = useCallback(async () => { -    const textToCopy = sStr(transformedText?.transformed ?? transformedText); -    try { -      await navigator.clipboard.writeText(textToCopy); -      setCopied(true); -      updateFontHistory(fontName); -      navigator.vibrate?.(50); -      onCopy?.(fontName, textToCopy); -      setTimeout(() => setCopied(false), 2000); -    } catch { -      const textarea = document.createElement("textarea"); -      textarea.value = textToCopy; -      textarea.setAttribute("readonly", ""); -      textarea.style.position = "fixed"; -      textarea.style.opacity = "0"; -      document.body.appendChild(textarea); -      textarea.select(); -      try { -        document.execCommand("copy"); -        setCopied(true); -        updateFontHistory(fontName); -        setTimeout(() => setCopied(false), 2000); -      } catch (e) { -        console.error("Fallback copy failed:", e); -      } -      document.body.removeChild(textarea); -    } -  }, [transformedText, fontName, onCopy]); + const handleCopy = useCallback(async () => { + const textToCopy = sStr(transformedText?.transformed ?? transformedText); + try { + await navigator.clipboard.writeText(textToCopy); + setCopied(true); + updateFontHistory(fontName); + navigator.vibrate?.(50); + onCopy?.(fontName, textToCopy); + setTimeout(() => setCopied(false), 2000); + } catch { + const textarea = document.createElement("textarea"); + textarea.value = textToCopy; + textarea.setAttribute("readonly", ""); + textarea.style.position = "fixed"; + textarea.style.opacity = "0"; + document.body.appendChild(textarea); + textarea.select(); + try { + document.execCommand("copy"); + setCopied(true); + updateFontHistory(fontName); + setTimeout(() => setCopied(false), 2000); + } catch (e) { + console.error("Fallback copy failed:", e); + } + document.body.removeChild(textarea); + } + }, [transformedText, fontName, onCopy]); -  const handleLike = useCallback(() => { -    const newLiked = !liked; -    setLiked(newLiked); -    try { localStorage.setItem(`liked_${fontName}`, newLiked.toString()); } catch {} -    navigator.vibrate?.(newLiked ? 30 : 0); -    onLike?.(fontName, newLiked); -  }, [liked, fontName, onLike]); + const handleLike = useCallback(() => { + const newLiked = !liked; + setLiked(newLiked); + try { localStorage.setItem(`liked_${fontName}`, newLiked.toString()); } catch {} + navigator.vibrate?.(newLiked ? 30 : 0); + onLike?.(fontName, newLiked); + }, [liked, fontName, onLike]); -  const handleShare = useCallback(async () => { -    const shareText = `${sStr(transformedText?.transformed ?? transformedText)}\n\nErstellt mit FancyText: ${window.location.href}`; -    if (navigator.share) { -      try { -        await navigator.share({ title: "Schau dir diese coole Schriftart an! 🔥", text: shareText, url: window.location.href }); -        onShare?.(fontName); -      } catch {} -    } else { -      try { -        await navigator.clipboard.writeText(shareText); -        setCopied(true); -        setTimeout(() => setCopied(false), 2000); -      } catch (e) { -        console.error("Share fallback failed:", e); -      } -    } -  }, [transformedText, fontName, onShare]); + const handleShare = useCallback(async () => { + const shareText = `${sStr(transformedText?.transformed ?? transformedText)}\n\nErstellt mit FancyText: ${window.location.href}`; + if (navigator.share) { + try { + await navigator.share({ title: "Schau dir diese coole Schriftart an! 🔥", text: shareText, url: window.location.href }); + onShare?.(fontName); + } catch {} + } else { + try { + await navigator.clipboard.writeText(shareText); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch (e) { + console.error("Share fallback failed:", e); + } + } + }, [transformedText, fontName, onShare]); -  const previewText = sStr(transformedText?.transformed ?? transformedText) || "Hallo Instagram!"; -  const fontClass = transformedText?.fontClassName ?? ""; -  const displayName = fontTransforms[fontName]?.description; + const previewText = sStr(transformedText?.transformed ?? transformedText) || "Hallo Instagram!"; + const fontClass = transformedText?.fontClassName ?? ""; + const displayName = fontTransforms[fontName]?.description; -  return ( -   
-      -       
-         
-           
-             

{fontName}

-              {isPopular && ( -                -                  Top -                -              )} -           
-           
-              -              -           
-         
-          {displayName && ( -           

-              -              {displayName} -           

-          )} -         
(e.key === "Enter" || e.key === " ") && handleCopy()} -            aria-label="Click to copy text" -            style={{ pointerEvents: "auto" }} -            className={`text-xl sm-text-2xl md-text-3xl mb-4 p-3 sm:p-4 bg-gray-50 rounded-xl text-center select-all text-gray-800 min-h-[70px] sm:min-h-[80px] flex items-center justify-center cursor-pointer hover:bg-gray-100 transition-colors ${fontClass}`} -          > -            {previewText} -         
-          -       
-     
-   
-  ); + return ( +
+ +
+
+
+

{fontName}

+ {isPopular && ( + + Top + + )} +
+
+ + +
+
+ {displayName && ( +

+ + {displayName} +

+ )} +
(e.key === "Enter" || e.key === " ") && handleCopy()} + aria-label="Click to copy text" + style={{ pointerEvents: "auto" }} + className={`text-xl sm-text-2xl md-text-3xl mb-4 p-3 sm:p-4 bg-gray-50 rounded-xl text-center select-all text-gray-800 min-h-[70px] sm:min-h-[80px] flex items-center justify-center cursor-pointer hover:bg-gray-100 transition-colors ${fontClass}`} + > + {previewText} +
+ +
+
+
+ ); }); PerformanceOptimizedFontCard.displayName = "PerformanceOptimizedFontCard";