From 24cc8c1b6f986dd88a6ce10e51b108e00202b23a Mon Sep 17 00:00:00 2001 From: Bjorn Lammers Date: Thu, 17 Apr 2025 04:30:33 +0200 Subject: [PATCH] feat(icons): refactor IconSearch with smoother animation --- web/src/app/icons/components/icon-search.tsx | 92 +++++++++++++------- 1 file changed, 62 insertions(+), 30 deletions(-) diff --git a/web/src/app/icons/components/icon-search.tsx b/web/src/app/icons/components/icon-search.tsx index 14cc5b01..3a20419d 100644 --- a/web/src/app/icons/components/icon-search.tsx +++ b/web/src/app/icons/components/icon-search.tsx @@ -11,6 +11,7 @@ import Link from "next/link" import { usePathname, useRouter, useSearchParams } from "next/navigation" import { useCallback, useEffect, useRef, useState } from "react" import { useTheme } from "next-themes" +import { useInView } from "framer-motion" export function IconSearch({ icons }: IconSearchProps) { const searchParams = useSearchParams() @@ -133,39 +134,70 @@ export function IconSearch({ icons }: IconSearchProps) { ) : (
{filteredIcons.map(({ name, data }, index) => ( - - -
- -
- {`${name} -
- - {name.replace(/-/g, " ")} - - - + ))}
)} ) } + +function IconCard({ name, data, getIconVariant }: { + name: string; + data: any; + getIconVariant: (name: string, data: any) => string; +}) { + const ref = useRef(null); + const isInView = useInView(ref, { + once: false, + amount: 0.2, + margin: "100px 0px" + }); + + const variants = { + hidden: { opacity: 0, y: 20, scale: 0.95 }, + visible: { + opacity: 1, + y: 0, + scale: 1, + transition: { duration: 0.4, ease: [0.25, 0.1, 0.25, 1.0] } + }, + exit: { + opacity: 0, + y: -10, + scale: 0.98, + transition: { duration: 0.3, ease: [0.25, 0.1, 0.25, 1.0] } + } + }; + + return ( + + +
+ +
+ {`${name} +
+ + {name.replace(/-/g, " ")} + + + + ); +}