A scrolling strip of claims and round stamps, a mission paragraph, two link columns and a newsletter signup, then a giant wordmark and the copyright, on a tinted band.

Last updated

Open block
Show code
---
/**
 * Wordmark marquee 01: A scrolling strip of claims and round stamps, a mission paragraph, two link columns and a newsletter signup, then a giant wordmark and the copyright, on a tinted band.
 *
 * @block footers
 * @order 44
 */
import Section from '@/components/apogee/Section/Section.astro'
import Button from '@/components/apogee/Button/Button.astro'
import Input from '@/components/apogee/Input/Input.astro'
import Link from '@/components/apogee/Link/Link.astro'
import Marquee from '@/components/apogee/Marquee/Marquee.astro'
import { plain } from '@/components/apogee/sections/_shared/spine.ts'
import { type FooterContent } from '@/components/apogee/sections/_shared/footers.ts'

/** @composable */
interface Props extends FooterContent {
  /** The claims scrolling along the top strip. @category content */
  claims?: string[] | null
}

const {
  brand = 'Pastureland',
  tagline = 'We aren’t just a shop, and we aren’t a courier either. We work with small family farms that do things the slow way, because we believe in food that does you good.',
  newsletterHeading = 'Join the family',
  newsletterDescription = 'Save 10% on your first order and hear first about new products and restocks.',
  submitLabel = 'Sign up',
  columns = [
    { heading: 'The fine print', links: [{ label: 'Contact us', href: '#' }, { label: 'Terms of service', href: '#' }, { label: 'Manage your account', href: '#' }, { label: 'Refunds', href: '#' }, { label: 'Shipping', href: '#' }, { label: 'Accessibility statement', href: '#' }, { label: 'Get the app', href: '#' }] },
    { heading: 'Helpful links', links: [{ label: 'Your account', href: '#' }, { label: 'Contact us', href: '#' }, { label: 'Questions', href: '#' }, { label: 'Returns', href: '#' }, { label: 'Blog', href: '#' }, { label: 'Rewards', href: '#' }] },
  ],
  copyright = '© 2026 Pastureland.',
  claims = ['Grown and harvested close to home', '4,000+ five-star reviews', 'Small farms, slow growing'],
} = Astro.props
---

<Section as="footer" spacing="none" container={false} class="overflow-hidden bg-primary-faded">
  {claims && <div data-theme="dark" class="bg-page py-4 text-neutral">
    <Marquee label="What we stand for">
      {claims.map((c) => (
        <span class="flex items-center gap-8 px-8 font-mono text-sm uppercase tracking-wider">
          <span class="grid size-14 place-items-center rounded-full border-2 border-current text-xs font-bold" aria-hidden="true">PF</span>{c}
        </span>
      ))}
    </Marquee>
  </div>}

  <div class="px-gutter pt-12">
    <div class="grid gap-10 md:grid-cols-2 lg:grid-cols-[1.2fr_1fr_1fr_1.4fr]">
      <div>
        <p class="text-2xl tracking-tight">Our mission</p>
        {tagline && <p class="mt-4 max-w-sm text-neutral-faded">{plain(tagline)}</p>}
      </div>
      {columns.map((c) => (
        <nav aria-label={c.heading}>
          <p class="text-2xl tracking-tight">{c.heading}</p>
          <ul class="mt-4 flex list-none flex-col gap-2 p-0">
            {c.links.map((l) => <li><Link href={l.href} color="neutral" underline="hover">{l.label}</Link></li>)}
          </ul>
        </nav>
      ))}
      <form class="flex flex-col gap-4" onsubmit="return false">
        {newsletterHeading && <p class="text-3xl tracking-tight">{newsletterHeading}</p>}
        {newsletterDescription && <p class="text-neutral-faded">{newsletterDescription}</p>}
        <Input type="email" name="email" placeholder="Your email" aria-label="Email" autocomplete="email" size="large" />
        <Button type="submit" size="large" rounded fullWidth class="uppercase tracking-widest">{submitLabel}</Button>
      </form>
    </div>

    <div class="@container mt-12"><p class="whitespace-nowrap text-[20cqi] font-bold leading-none tracking-tighter text-primary" aria-hidden="true">{brand}</p></div>
    {copyright && <p class="py-6 text-xs text-neutral-faded">{copyright}</p>}
  </div>
</Section>

Add

npx @ava-ui/apogee add footers/wordmark-marquee-01

Every piece of copy is a prop, with the sample copy as its default. Pass yours, or null to hide a part; see copy is props.