CTA 1

Framed CTA card with corner marks, headline + sub-copy on the left, dual buttons stacked on the right.

Preview

Installation

npx shadcn@latest add https://hirael.com/r/cta-01.json

Code

components/blocks/cta-01.tsx
"use client";

import * as React from "react";
import { ArrowRight } from "lucide-react";

import { Button } from "@/registry/hirael/ui/button";

export default function Cta01() {
  return (
    <section data-slot="cta" className="bg-background py-20 md:py-28">
      <div className="mx-auto w-full max-w-5xl px-6 md:px-10">
        <div
          className="relative overflow-hidden rounded-[2rem] border border-border bg-card"
          style={{
            boxShadow:
              "0 30px 70px -40px color-mix(in oklch, var(--foreground) 30%, transparent)",
          }}
        >
          <div
            aria-hidden
            className="pointer-events-none absolute inset-0"
            style={{
              background:
                "radial-gradient(120% 120% at 100% 0%, color-mix(in oklch, var(--primary) 10%, transparent), transparent 60%)",
            }}
          />

          <div className="relative grid grid-cols-1 gap-10 p-8 sm:p-12 lg:grid-cols-12 lg:items-center lg:gap-16 lg:p-14">
            <div className="flex flex-col gap-5 lg:col-span-7">
              <span className="inline-flex w-fit items-center gap-2 font-mono text-[10px] uppercase tracking-[0.14em] text-foreground">
                <span className="size-1 rounded-full bg-foreground" />
                Get started
              </span>
              <h2 className="font-serif text-4xl font-medium leading-[1.04] tracking-tight sm:text-5xl md:text-6xl">
                Stop rebuilding the components{" "}
                <span className="italic text-foreground">every project</span>{" "}
                needs.
              </h2>
              <p className="max-w-xl text-sm text-muted-foreground sm:text-base">
                Pull a real multi-select, year picker, or tag input into your
                repo in one command. No package, no version pin. Just the
                source, in your codebase, yours to shape.
              </p>
            </div>

            <div className="flex flex-col gap-3 lg:col-span-5 lg:items-end">
              <Button
                asChild
                size="lg"
                className="group w-full justify-between rounded-full px-7 lg:w-auto"
              >
                <a href="#">
                  Install via shadcn CLI
                  <ArrowRight className="size-4 transition-transform duration-150 ease-out group-hover:translate-x-0.5 rtl:rotate-180 rtl:group-hover:-translate-x-0.5" />
                </a>
              </Button>
              <Button
                asChild
                variant="outline"
                size="lg"
                className="w-full rounded-full px-7 lg:w-auto"
              >
                <a href="#">Browse blocks</a>
              </Button>
              <p className="text-end font-mono text-[10px] uppercase tracking-[0.12em] text-muted-foreground">
                No runtime dependency
              </p>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

Dependencies

shadcn registry

button

npm

lucide-react