Skip to content
6

Hero 5

Full-bleed hero card over an animated aurora shader, with a glass pill nav, a glass content panel, a serif headline, dual CTA and an avatar social-proof row.

Preview

Installation

npx shadcn@latest add https://hirael.com/r/hero-05.json

Code

components/blocks/hero-05.tsx
'use client';

import * as React from 'react';
import dynamic from 'next/dynamic';
import Image from 'next/image';
import { ArrowRight, Cloud } from 'lucide-react';

import { Button } from '@/registry/hirael/bases/radix/ui/button';

const Hero05Backdrop = dynamic(() => import('./hero-05-backdrop'), {
  ssr: false,
  loading: () => <div className="size-full bg-muted/20" />,
});

const AVATARS = [
  '/media/blocks/hero-05/avatar-1.jpg',
  '/media/blocks/hero-05/avatar-2.jpg',
  '/media/blocks/hero-05/avatar-3.jpg',
  '/media/blocks/hero-05/avatar-4.jpg',
] as const;

const NAV_LINKS = ['Product', 'Docs', 'Pricing'] as const;

const Hero05 = () => {
  const [active, setActive] = React.useState(false);

  return (
    <section data-slot="hero" className="flex w-full items-center justify-center bg-background px-4 py-12 md:px-6">
      <div
        className="relative w-full max-w-7xl"
        onMouseEnter={() => setActive(true)}
        onMouseLeave={() => setActive(false)}
      >
        <div className="relative isolate flex min-h-[680px] flex-col overflow-hidden rounded-[40px] border border-border bg-card text-card-foreground shadow-sm">
          <div
            aria-hidden
            data-slot="hero-wash"
            className="pointer-events-none absolute inset-0"
            style={{
              backgroundImage: [
                'linear-gradient(160deg, color-mix(in oklch, var(--accent-cool) 26%, transparent), transparent 48%)',
                'radial-gradient(70% 60% at 84% 2%, color-mix(in oklch, var(--primary) 32%, transparent), transparent 62%)',
                'radial-gradient(85% 60% at 38% 110%, color-mix(in oklch, var(--warm) 22%, transparent), transparent 70%)',
              ].join(', '),
            }}
          />
          <div
            aria-hidden
            data-slot="hero-backdrop"
            className="pointer-events-none absolute inset-0 opacity-70 mix-blend-multiply dark:opacity-50 dark:mix-blend-screen"
          >
            <Hero05Backdrop active={active} />
          </div>

          <nav
            data-slot="hero-nav"
            className="relative z-10 flex items-center justify-between gap-4 px-6 py-5 md:px-10"
          >
            <span className="flex items-center gap-2 text-base font-medium tracking-tight text-foreground">
              <span className="grid size-7 place-items-center rounded-lg bg-primary/10 text-primary ring-1 ring-primary/15">
                <Cloud className="size-4" />
              </span>
              Nimbus
            </span>
            <div className="hidden items-center gap-7 text-sm text-muted-foreground md:flex">
              {NAV_LINKS.map((link) => (
                <a key={link} href="#" className="transition-colors hover:text-foreground">
                  {link}
                </a>
              ))}
            </div>
            <Button asChild variant="outline" size="sm" className="rounded-full">
              <a href="#">Get started</a>
            </Button>
          </nav>

          <div className="relative z-10 flex flex-1 items-center justify-center px-6 py-16 md:px-10">
            <div className="flex max-w-2xl flex-col items-center rounded-[32px] border border-border/60 bg-background/40 px-6 py-12 text-center backdrop-blur-md md:px-12">
              <span className="inline-flex items-center gap-2 rounded-full border border-border bg-card/70 px-3.5 py-1.5 font-mono text-[10px] uppercase tracking-[0.14em] backdrop-blur-sm">
                <span className="relative flex size-1.5">
                  <span
                    className="absolute inline-flex size-full animate-ping rounded-full opacity-75"
                    style={{ background: 'var(--accent-cool)' }}
                  />
                  <span
                    className="relative inline-flex size-1.5 rounded-full"
                    style={{ background: 'var(--accent-cool)' }}
                  />
                </span>
                All systems online
              </span>

              <h1 className="mt-7 font-serif text-5xl font-medium leading-[1.04] tracking-tight text-foreground sm:text-6xl md:text-7xl">
                Bring your ideas together.
              </h1>

              <p className="mt-5 max-w-lg text-lg leading-relaxed text-muted-foreground">
                A shared canvas for notes, tasks, and docs, so your team always knows what&apos;s next.
              </p>

              <div className="mt-9 flex flex-col items-stretch gap-3 sm:flex-row sm:items-center">
                <Button asChild size="lg" className="group h-12 rounded-full px-7 text-base">
                  <a href="#">
                    Try it free
                    <ArrowRight className="size-4 transition-transform duration-300 group-hover:translate-x-0.5 rtl:rotate-180 rtl:group-hover:-translate-x-0.5" />
                  </a>
                </Button>
                <Button asChild size="lg" variant="ghost" className="h-12 rounded-full px-7 text-base">
                  <a href="#">See how it works</a>
                </Button>
              </div>

              <div className="mt-10 flex items-center gap-3">
                <div className="flex -space-x-2">
                  {AVATARS.map((src) => (
                    <Image
                      key={src}
                      src={src}
                      alt=""
                      width={32}
                      height={32}
                      className="size-8 rounded-full border-2 border-card object-cover"
                    />
                  ))}
                </div>
                <span className="text-sm text-muted-foreground">Join 2,000+ teams already on board</span>
              </div>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
};

export default Hero05;

Dependencies

shadcn registry

button

npm

shaderslucide-react