Full-width animated marquee stats ticker, split layout with intro text and leadership avatars on the left, full-height image on the right. For SaaS and product companies.
A full-bleed, infinitely scrolling stats ticker sits above a split section: intro copy, body paragraph, and a leadership avatar row on the left, a full-height photo on the right. Built for SaaS and product companies with a longer list of headline numbers than a static row can comfortably hold.
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://ui.beste.co/r/about28?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/about28?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/about28.tsx and the avatar, badge, and button shadcn/ui primitives it depends on.
The installed file exports about28Demo alongside the block: the exact props behind the preview above. Spread it to get a working about section in one line.
import { About28, about28Demo } from "@/components/beste/block/about28";
export default function AboutPage() {
return <About28 {...about28Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { About28 } from "@/components/beste/block/about28";
export default function AboutPage() {
return (
<About28
badge={{ label: "About Us", variant: "outline" }}
heading="We design tools that respect your time"
description="A small, focused team building software millions use every day."
body="Founded in 2019 by former product designers and engineers who wanted less bloat."
image={{
src: "https://images.unsplash.com/photo-1497366216548-37526070297c?w=900&h=700&fit=crop",
alt: "Modern workspace",
}}
stats={[
{ value: "2.4M", label: "Active Users" },
{ value: "99.99%", label: "Uptime" },
{ value: "42", label: "Team Members" },
]}
team={[
{
name: "Maya Torres",
role: "CEO & Co-founder",
avatar: {
src: "https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=100&h=100&fit=crop",
alt: "Maya Torres",
},
},
]}
buttons={[{ label: "Open Positions", href: "https://beste.co" }]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string; variant?: "default" | "secondary" | "outline" } | – | Eyebrow badge above the heading |
heading | string | – | Left-column section heading |
description | string | – | Left-column lead paragraph |
body | string | – | Longer founding-story paragraph below the description |
image | { src: string; alt: string } | – | Full-height photo in the right column |
stats | StatItem[] | [] | Entries looped into the top marquee ticker |
team | TeamMember[] | [] | Leadership avatar row below the body text |
buttons | ButtonItem[] | [] | CTA row at the bottom of the left column |
className | string | – | Extra classes for the outer <section> |
type StatItem = { value: string; label: string };
type TeamMember = { name: string; role: string; avatar: { src: string; alt: string } };
type ButtonItem = {
label: string;
href?: string;
variant?: "default" | "secondary" | "outline" | "ghost" | "link" | "destructive";
};max-w-6xl content wrapper (directly in the <section>), so it spans the full viewport width edge to edge, bordered top and bottom.stats array ([...stats, ...stats, ...stats]) and animates a translateX(0) to translateX(-33.333%) loop over 30 seconds (linear infinite) via a scoped <style jsx> keyframe, so the strip appears to scroll infinitely with no visible seam as the first copy exits and the second begins.avatar (unlike about23/about28's siblings that make avatar optional), so every entry always shows a photo, falling back to initials only if the image itself fails to load.lg:aspect-auto so it stretches to match the height of the left column's content; below lg it falls back to a fixed aspect-[4/3] box.about5
Side-by-side layout with a tall image on the left and company story, inline stats, and CTAs on the right.
about21
Two-column layout with checklist highlights on the left, featured image and testimonial quote on the right, plus a full-width stats row.
about23
Two-column layout with company story, stats, and leadership quote on the left, team photo and avatar row on the right.
about66
Two-column about with a tall image on one side and an eyebrow, heading, description, and 2x2 stats grid on the other.
about27
Left intro with image, right vertical timeline with staggered scroll-reveal animation. Numbered steps with sliding content. For startup journeys.
about11
Wide hero image with gradient overlay text, inline stats, and a stacked avatar strip of team members.