DocsMaxed SEO
Maxed SEO
Animated Lighthouse SEO score
0
Installation
Dependencies
npm i framer-motion
Create SEO component
'use client'
import { animate, motionValue, motion, useTransform, useSpring } from 'framer-motion'
export const Seo = () => {
const x = motionValue(0)
animate(x, 100, { duration: 0.9 })
const number = useTransform(x, (v) => Number(v.toFixed(0)))
const springX = useSpring(x, { damping: 40 })
const dx = useTransform(springX, (v) => `${v / 100}px 1px`)
return (
<motion.div
whileInView="visible"
viewport={{ once: true }}
initial={{
boxShadow: 'none'
}}
animate={{
boxShadow:
'0 2.0155254638171756px 1.6124203710537404px -.34375px #0099ff24,0 4.777151241141837px 3.8217209929134697px -.6875px #0099ff23,0 8.714017655176574px 6.971214124141261px -1.03125px #0099ff23,0 14.487036858627107px 11.589629486901686px -1.375px #09f2,0 23.395383266347928px 18.71630661307834px -1.71875px #09f2,0 38.29592112890677px 30.636736903125417px -2.0625px #0099ff21,0 65.94299011604161px 52.7543920928333px -2.40625px #0099ff20,0 120px 96px -2.75px #0099ff1d'
}}
transition={{ delay: 2.3, duration: 0.6 }}
className="w-fit h-fit rounded-full p-2 bg-cyan-600 relative flex items-center justify-center"
>
<svg width="150" height="150" viewBox="0 0 150 150" className="-rotate-90" fill="none">
<motion.circle
cx="75"
cy="75"
r="70"
strokeWidth={'0.5rem'}
pathLength="0.99"
strokeDashoffset={'0px'}
className="stroke-white"
strokeDasharray={dx}
/>
</svg>
<motion.div className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 text-4xl font-bold text-white">
{number}
</motion.div>
</motion.div>
)
}