# Cta 1

> Horizontal conversion band with blur stagger — registry-native copy and dual install actions.

A shadcn/ui block from the [@nusaiba](https://nusaiba.dev) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/nusaiba/cta-1).

- Page, with a live preview: https://shadcn.exchange/r/nusaiba/cta-1
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/nusaiba/cta-1-light-4c78675ac4e7fd42.png
- Registry item: https://nusaiba.dev/r/base-nova/cta-1.json
- Categories: cta
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://nusaiba.dev/r/base-nova/cta-1.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- npm packages: `motion`
- Registry items: `@nusaiba/foundation`, `button`

## Files

### `registry/blocks/cta/1/cta-bento-section.tsx`

```tsx
"use client";

import Link from "next/link";
import { useRef } from "react";
import { ArrowRightIcon } from "lucide-react";
import { motion, useInView, useReducedMotion } from "motion/react";
import { buttonVariants } from "@/components/ui/button";
import { motionStagger, motionViewport } from "@/lib/motion-tokens";
import { cn } from "@/lib/utils";
import { SectionShell } from "@/components/layout-contract";

const spring = { type: "spring" as const, duration: 0.3, bounce: 0 };

export function CtaBentoSection() {
	const reduceMotion = useReducedMotion();
	const ref = useRef<HTMLElement>(null);
	const inView = useInView(ref, motionViewport);

	const itemVariants = reduceMotion
		? { hidden: { opacity: 1 }, visible: { opacity: 1 } }
		: {
				hidden: { opacity: 0, filter: "blur(4px)", y: 8 },
				visible: { opacity: 1, filter: "blur(0px)", y: 0, transition: spring },
			};

	return (
		<SectionShell spacingMode="section" className="bg-muted/30 shadow-[0_-1px_0_rgba(0,0,0,0.03)] dark:shadow-[0_-1px_0_rgba(255,255,255,0.04)]" ref={ref}>
			<motion.div
				animate={inView ? "visible" : "hidden"}
				className="mx-auto flex w-full max-w-5xl flex-col items-start justify-between gap-8 md:flex-row md:items-center md:gap-12"
				initial="hidden"
				variants={{
					hidden: {},
					visible: { transition: { staggerChildren: motionStagger.item, delayChildren: 0.04 } },
				}}
			>
				<motion.div className="max-w-xl" variants={itemVariants}>
					<p className="font-medium text-primary text-xs uppercase tracking-[0.22em]">
						Registry
					</p>
					<h2 className="mt-3 text-balance font-medium text-2xl tracking-tight md:text-3xl lg:text-4xl">
						Install motion blocks into your repo
					</h2>
					<p className="mt-4 text-pretty text-muted-foreground text-sm md:text-base">
						Preview live on Nusaiba, copy prompts, and add sections with one shadcn
						command — keep every file.
					</p>
				</motion.div>
				<motion.div
					className="flex w-full shrink-0 flex-col gap-3 sm:w-auto sm:flex-row"
					variants={itemVariants}
				>
					<Link
						className={cn(buttonVariants(), "active:scale-[0.96] transition-transform")}
						href="/blocks"
					>
						Browse blocks
						<ArrowRightIcon data-icon="inline-end" />
					</Link>
					<Link
						className={cn(
							buttonVariants({ variant: "outline" }),
							"active:scale-[0.96] transition-transform",
						)}
						href="/pricing"
					>
						View pricing
					</Link>
				</motion.div>
			</motion.div>
		</SectionShell>
	);
}
```
