{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"marketing-about-sections-animated-stats","type":"registry:block","title":"Animated Stats","files":[{"path":"components/blocks/marketing/about-sections/animated-stats.tsx","content":"import { useState, useEffect, useRef } from 'react';\nimport { Card, CardContent } from '@/components/ui/card';\nimport { Trophy, Users, FolderOpen, Calendar } from 'lucide-react';\n\nconst stats = [\n  {\n    icon: Calendar,\n    value: 15,\n    suffix: '+',\n    label: 'Years Experience',\n    description: 'Over a decade of industry leadership.',\n  },\n  {\n    icon: FolderOpen,\n    value: 2500,\n    suffix: '+',\n    label: 'Projects Completed',\n    description: 'Successfully delivered worldwide.',\n  },\n  {\n    icon: Users,\n    value: 10000,\n    suffix: '+',\n    label: 'Happy Clients',\n    description: 'From startups to Fortune 500 companies.',\n  },\n  {\n    icon: Trophy,\n    value: 150,\n    suffix: '+',\n    label: 'Industry Awards',\n    description: 'Recognized for design and innovation excellence.',\n  },\n];\n\nexport default function AboutSectionAnimatedStats() {\n  const [isVisible, setIsVisible] = useState(false);\n  const sectionRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    const observer = new IntersectionObserver(\n      ([entry]) => {\n        if (entry!.isIntersecting) {\n          setIsVisible(true);\n          observer.unobserve(entry!.target);\n        }\n      },\n      { threshold: 0.2 }\n    );\n\n    if (sectionRef.current) {\n      observer.observe(sectionRef.current);\n    }\n\n    return () => {\n      if (sectionRef.current) {\n        observer.unobserve(sectionRef.current);\n      }\n    };\n  }, []);\n\n  return (\n    <section\n      className=\"container mx-auto px-4 py-24 md:px-6 2xl:max-w-[1400px]\"\n      ref={sectionRef}\n    >\n      <div className=\"mx-auto mb-16 max-w-3xl space-y-4 text-center\">\n        <div className=\"bg-primary/10 text-primary inline-block rounded-lg px-3 py-1 text-sm\">\n          Our Achievements\n        </div>\n        <h2 className=\"text-3xl font-bold tracking-tight\">\n          Milestones That Define Our Journey\n        </h2>\n        <p className=\"text-muted-foreground\">\n          Over the years, we&apos;ve achieved remarkable success by focusing on\n          delivering exceptional value to our clients and building lasting\n          relationships.\n        </p>\n      </div>\n\n      <div className=\"grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-4\">\n        {stats.map((stat) => (\n          <Card\n            key={stat.label}\n            className=\"overflow-hidden border-none p-0 shadow-md\"\n          >\n            <CardContent className=\"space-y-4 p-8 text-center\">\n              <div className=\"bg-primary/10 mx-auto flex h-16 w-16 items-center justify-center rounded-full\">\n                <stat.icon className=\"text-primary h-8 w-8\" />\n              </div>\n              <h3 className=\"flex items-center justify-center\">\n                <AnimatedCounter\n                  value={stat.value}\n                  isVisible={isVisible}\n                  duration={2000}\n                />\n                <span className=\"text-4xl font-bold\">{stat.suffix}</span>\n              </h3>\n              <div>\n                <p className=\"text-lg font-semibold\">{stat.label}</p>\n                <p className=\"text-muted-foreground mt-1 text-sm\">\n                  {stat.description}\n                </p>\n              </div>\n            </CardContent>\n          </Card>\n        ))}\n      </div>\n\n      <div className=\"bg-accent/50 mt-20 rounded-lg p-8\">\n        <div className=\"grid grid-cols-1 items-center gap-8 md:grid-cols-2\">\n          <div>\n            <h3 className=\"mb-4 text-2xl font-bold\">Our Story Continues</h3>\n            <p className=\"text-muted-foreground\">\n              While we take pride in these achievements, our journey is ongoing.\n              We remain dedicated to innovation, quality, and creating\n              meaningful impact for our clients and communities worldwide.\n            </p>\n            <p className=\"text-muted-foreground mt-4\">\n              Every day, we strive to exceed expectations and set new standards\n              of excellence in everything we do.\n            </p>\n          </div>\n          <div className=\"grid grid-cols-2 gap-4\">\n            <div className=\"from-primary/20 to-primary/5 rounded-lg bg-gradient-to-br p-6 text-center\">\n              <p className=\"text-primary text-lg font-medium\">Growing Team</p>\n              <p className=\"text-4xl font-bold\">250+</p>\n              <p className=\"text-muted-foreground mt-2 text-sm\">\n                Talented professionals across the globe\n              </p>\n            </div>\n            <div className=\"from-primary/20 to-primary/5 rounded-lg bg-gradient-to-br p-6 text-center\">\n              <p className=\"text-primary text-lg font-medium\">Global Reach</p>\n              <p className=\"text-4xl font-bold\">30+</p>\n              <p className=\"text-muted-foreground mt-2 text-sm\">\n                Countries with active client projects\n              </p>\n            </div>\n          </div>\n        </div>\n      </div>\n    </section>\n  );\n}\n\n// Animated counter component\ninterface AnimatedCounterProps {\n  value: number;\n  isVisible: boolean;\n  duration: number;\n}\n\nfunction AnimatedCounter({ value, isVisible, duration }: AnimatedCounterProps) {\n  const [count, setCount] = useState(0);\n  const stepRef = useRef(0);\n  const countRef = useRef(0);\n\n  useEffect(() => {\n    if (!isVisible) return;\n\n    const steps = 60;\n    const increment = value / steps;\n    const intervalTime = duration / steps;\n\n    stepRef.current = 0;\n    countRef.current = 0;\n\n    const interval = setInterval(() => {\n      stepRef.current += 1;\n      const newCount = Math.min(Math.round(stepRef.current * increment), value);\n\n      if (countRef.current !== newCount) {\n        countRef.current = newCount;\n        setCount(newCount);\n      }\n\n      if (stepRef.current >= steps || newCount >= value) {\n        clearInterval(interval);\n        setCount(value);\n      }\n    }, intervalTime);\n\n    return () => clearInterval(interval);\n  }, [isVisible, value, duration]);\n\n  return <span className=\"text-4xl font-bold\">{count}</span>;\n}\n","type":"registry:component","target":"components/blocks/marketing/about-sections/animated-stats.tsx"},{"path":"components/ui/card.tsx","content":"import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Card({\n  className,\n  size = \"default\",\n  ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n  return (\n    <div\n      data-slot=\"card\"\n      data-size={size}\n      className={cn(\n        \"group/card flex flex-col gap-6 overflow-hidden rounded-xl bg-card py-6 text-sm text-card-foreground shadow-xs ring-1 ring-foreground/10 has-[>img:first-child]:pt-0 data-[size=sm]:gap-4 data-[size=sm]:py-4 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-header\"\n      className={cn(\n        \"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-6 group-data-[size=sm]/card:px-4 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-6 group-data-[size=sm]/card:[.border-b]:pb-4\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-title\"\n      className={cn(\n        \"font-heading text-base leading-normal font-medium group-data-[size=sm]/card:text-sm\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-description\"\n      className={cn(\"text-sm text-muted-foreground\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-action\"\n      className={cn(\n        \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-content\"\n      className={cn(\"px-6 group-data-[size=sm]/card:px-4\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"card-footer\"\n      className={cn(\n        \"flex items-center rounded-b-xl px-6 group-data-[size=sm]/card:px-4 [.border-t]:pt-6 group-data-[size=sm]/card:[.border-t]:pt-4\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nexport {\n  Card,\n  CardHeader,\n  CardFooter,\n  CardTitle,\n  CardAction,\n  CardDescription,\n  CardContent,\n}\n","type":"registry:ui","target":"components/ui/card.tsx"}],"description":"Headline metrics that count up as they scroll into view. Drop it on an about page to make growth, users, and revenue feel alive and concrete.","dependencies":["lucide-react"]}