| 6dd74de | | | 1 | "use client"; |
| 6dd74de | | | 2 | |
| 6dd74de | | | 3 | import { useCallback, useId, useRef } from "react"; |
| 6dd74de | | | 4 | |
| 818dc90 | | | 5 | interface Props { |
| 818dc90 | | | 6 | size?: number; |
| 818dc90 | | | 7 | } |
| 818dc90 | | | 8 | |
| 818dc90 | | | 9 | export function GroveLogo({ size = 24 }: Props) { |
| 6dd74de | | | 10 | const svgRef = useRef<SVGSVGElement>(null); |
| 6dd74de | | | 11 | const id = useId(); |
| 6dd74de | | | 12 | const styleId = id.replace(/:/g, ""); |
| 6dd74de | | | 13 | |
| 6dd74de | | | 14 | const onMouseMove = useCallback((e: React.MouseEvent<SVGSVGElement>) => { |
| 6dd74de | | | 15 | const rect = e.currentTarget.getBoundingClientRect(); |
| 6dd74de | | | 16 | const relX = ((e.clientX - rect.left) / rect.width - 0.5) * 2; |
| 6dd74de | | | 17 | e.currentTarget.style.setProperty("--sway", `${relX * 6}deg`); |
| 6dd74de | | | 18 | }, []); |
| 6dd74de | | | 19 | |
| 6dd74de | | | 20 | const onMouseLeave = useCallback((e: React.MouseEvent<SVGSVGElement>) => { |
| 6dd74de | | | 21 | e.currentTarget.style.setProperty("--sway", "0deg"); |
| 6dd74de | | | 22 | }, []); |
| 6dd74de | | | 23 | |
| 818dc90 | | | 24 | return ( |
| 818dc90 | | | 25 | <svg |
| 6dd74de | | | 26 | ref={svgRef} |
| 6dd74de | | | 27 | className={`grove-logo-${styleId}`} |
| 818dc90 | | | 28 | width={size} |
| 818dc90 | | | 29 | height={size} |
| 818dc90 | | | 30 | viewBox="0 0 64 64" |
| 818dc90 | | | 31 | fill="none" |
| 6dd74de | | | 32 | onMouseMove={onMouseMove} |
| 6dd74de | | | 33 | onMouseLeave={onMouseLeave} |
| 818dc90 | | | 34 | > |
| 6dd74de | | | 35 | <style>{` |
| 6dd74de | | | 36 | .grove-logo-${styleId} { |
| 6dd74de | | | 37 | cursor: pointer; |
| 6dd74de | | | 38 | transition: transform 0.5s cubic-bezier(0.25, 1, 0.5, 1); |
| 6dd74de | | | 39 | } |
| 10621c5 | | | 40 | .grove-logo-${styleId}:hover, |
| 10621c5 | | | 41 | .hover-row:hover .grove-logo-${styleId} { |
| 6dd74de | | | 42 | } |
| 6dd74de | | | 43 | .grove-logo-${styleId} .gl-bg { |
| 6dd74de | | | 44 | transition: fill 0.6s ease; |
| 6dd74de | | | 45 | } |
| 10621c5 | | | 46 | .grove-logo-${styleId}:hover .gl-bg, |
| 10621c5 | | | 47 | .hover-row:hover .grove-logo-${styleId} .gl-bg { |
| 6dd74de | | | 48 | filter: brightness(0.9); |
| 6dd74de | | | 49 | } |
| 6dd74de | | | 50 | .grove-logo-${styleId} .gl-tree { |
| 6dd74de | | | 51 | transform-origin: 30px 52px; |
| 6dd74de | | | 52 | transform: rotate(var(--sway, 0deg)); |
| 6dd74de | | | 53 | transition: transform 0.8s cubic-bezier(0.34, 1.56, 0.64, 1); |
| 6dd74de | | | 54 | } |
| 10621c5 | | | 55 | .grove-logo-${styleId}:hover .gl-tree, |
| 10621c5 | | | 56 | .hover-row:hover .grove-logo-${styleId} .gl-tree { |
| 10621c5 | | | 57 | transition: transform 0.15s ease-out; |
| 10621c5 | | | 58 | } |
| 6dd74de | | | 59 | .grove-logo-${styleId} .gl-branch { |
| 6dd74de | | | 60 | transition: stroke-width 0.5s cubic-bezier(0.25, 1, 0.5, 1); |
| 6dd74de | | | 61 | } |
| 10621c5 | | | 62 | .grove-logo-${styleId}:hover .gl-b0, .hover-row:hover .grove-logo-${styleId} .gl-b0 { stroke-width: 4.5; transition-delay: 0s; } |
| 10621c5 | | | 63 | .grove-logo-${styleId}:hover .gl-b1, .hover-row:hover .grove-logo-${styleId} .gl-b1 { stroke-width: 3.5; transition-delay: 0.05s; } |
| 10621c5 | | | 64 | .grove-logo-${styleId}:hover .gl-b2, .hover-row:hover .grove-logo-${styleId} .gl-b2 { stroke-width: 3; transition-delay: 0.1s; } |
| 10621c5 | | | 65 | .grove-logo-${styleId}:hover .gl-b3, .hover-row:hover .grove-logo-${styleId} .gl-b3 { stroke-width: 2.5; transition-delay: 0.15s; } |
| 6dd74de | | | 66 | .grove-logo-${styleId} .gl-node { |
| 6dd74de | | | 67 | transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); |
| 6dd74de | | | 68 | } |
| 6dd74de | | | 69 | .grove-logo-${styleId} .gl-n0 { transform-origin: 30px 52px; } |
| 6dd74de | | | 70 | .grove-logo-${styleId} .gl-n1 { transform-origin: 34px 8px; } |
| 6dd74de | | | 71 | .grove-logo-${styleId} .gl-n2 { transform-origin: 48px 23px; } |
| 6dd74de | | | 72 | .grove-logo-${styleId} .gl-n3 { transform-origin: 14px 33px; } |
| 6dd74de | | | 73 | .grove-logo-${styleId} .gl-n4 { transform-origin: 19px 11px; } |
| 10621c5 | | | 74 | .grove-logo-${styleId}:hover .gl-node, .hover-row:hover .grove-logo-${styleId} .gl-node { transform: scale(1.25); } |
| 10621c5 | | | 75 | .grove-logo-${styleId}:hover .gl-n0, .hover-row:hover .grove-logo-${styleId} .gl-n0 { transition-delay: 0s; } |
| 10621c5 | | | 76 | .grove-logo-${styleId}:hover .gl-n3, .hover-row:hover .grove-logo-${styleId} .gl-n3 { transition-delay: 0.05s; } |
| 10621c5 | | | 77 | .grove-logo-${styleId}:hover .gl-n2, .hover-row:hover .grove-logo-${styleId} .gl-n2 { transition-delay: 0.1s; } |
| 10621c5 | | | 78 | .grove-logo-${styleId}:hover .gl-n4, .hover-row:hover .grove-logo-${styleId} .gl-n4 { transition-delay: 0.15s; } |
| 10621c5 | | | 79 | .grove-logo-${styleId}:hover .gl-n1, .hover-row:hover .grove-logo-${styleId} .gl-n1 { transition-delay: 0.2s; } |
| 6dd74de | | | 80 | `}</style> |
| 6dd74de | | | 81 | |
| 6dd74de | | | 82 | <circle cx="32" cy="32" r="32" fill="var(--accent)" className="gl-bg" /> |
| 6dd74de | | | 83 | |
| 6dd74de | | | 84 | <g className="gl-tree"> |
| 6dd74de | | | 85 | <path className="gl-branch gl-b0" d="M30,52 C29,44 33,37 31,30 C29,23 32,16 34,8" stroke="white" strokeWidth="4" fill="none" strokeLinecap="round"/> |
| 6dd74de | | | 86 | <path className="gl-branch gl-b1" d="M32,31 C37,28 42,26 48,23" stroke="white" strokeWidth="3" fill="none" strokeLinecap="round"/> |
| 6dd74de | | | 87 | <path className="gl-branch gl-b2" d="M30,40 C25,37 20,35 14,33" stroke="white" strokeWidth="2.5" fill="none" strokeLinecap="round"/> |
| 6dd74de | | | 88 | <path className="gl-branch gl-b3" d="M33,18 C29,15 24,13 19,11" stroke="white" strokeWidth="2" fill="none" strokeLinecap="round"/> |
| 6dd74de | | | 89 | |
| 6dd74de | | | 90 | <circle className="gl-node gl-n0" cx="30" cy="52" r="4" fill="white"/> |
| 6dd74de | | | 91 | <circle className="gl-node gl-n1" cx="34" cy="8" r="3.5" fill="white"/> |
| 6dd74de | | | 92 | <circle className="gl-node gl-n2" cx="48" cy="23" r="3.5" fill="white"/> |
| 6dd74de | | | 93 | <circle className="gl-node gl-n3" cx="14" cy="33" r="3" fill="white"/> |
| 6dd74de | | | 94 | <circle className="gl-node gl-n4" cx="19" cy="11" r="2.5" fill="white"/> |
| 6dd74de | | | 95 | </g> |
| 818dc90 | | | 96 | </svg> |
| 818dc90 | | | 97 | ); |
| 818dc90 | | | 98 | } |