Skip to content

Cta App

App-download CTA on a peach block: headline and ink store buttons on the left, a flat white phone mock-up with a “Today” checklist (mint done items) rising from the bottom on the right.

soft-flat/section/cta-app
Open ↗

Source

import { Check } from "lucide-react";
import { cn } from "@/lib/utils";

export interface CtaAppProps {
  title?: string;
  description?: string;
  stores?: { label: string; sub: string; href: string }[];
  className?: string;
}

/** App-download CTA on a peach block: copy and rounded store buttons on the left, a flat phone mock-up with a “Today” checklist on the right. */
export function CtaApp({
  title = "Your week, in your pocket",
  description = "Check off tasks on the go, get gentle reminders and add ideas the moment they pop up.",
  stores = [
    { label: "App Store", sub: "Download on the", href: "#ios" },
    { label: "Google Play", sub: "Get it on", href: "#android" },
  ],
  className,
}: CtaAppProps) {
  const tasks = [
    { t: "Send invoice to Lumen", done: true },
    { t: "Review homepage copy", done: true },
    { t: "Call Ana about venue", done: false },
    { t: "Water the plants 🌱", done: false },
  ];
  return (
    <section className={cn("da-section bg-da-bg text-da-fg", className)}>
      <div className="da-container">
        <div className="grid items-center gap-10 overflow-hidden rounded-[40px] bg-da-accent px-6 pt-12 text-da-accent-fg sm:px-12 md:grid-cols-2 md:pt-0">
          <div className="md:py-16">
            <h2 className="font-da-display text-[clamp(2rem,4.5vw,3.25rem)] leading-[1.05] font-extrabold tracking-da-display text-balance">{title}</h2>
            <p className="mt-4 max-w-md text-lg opacity-90">{description}</p>
            <div className="mt-8 flex flex-wrap gap-3">
              {stores.map((s) => (
                <a
                  key={s.href}
                  href={s.href}
                  className="da-focus da-transition flex h-14 items-center rounded-da-md bg-da-fg px-5 text-da-bg hover:-translate-y-0.5"
                >
                  <span className="leading-tight">
                    <span className="block text-[11px] opacity-80">{s.sub}</span>
                    <span className="block font-da-display text-lg font-extrabold">{s.label}</span>
                  </span>
                </a>
              ))}
            </div>
          </div>
          <div aria-hidden className="relative mx-auto h-[360px] w-[230px] self-end">
            <div className="absolute inset-x-0 top-0 h-[440px] rounded-[40px] bg-da-surface p-4 text-da-fg shadow-da-lg">
              <div className="mx-auto h-5 w-20 rounded-full bg-da-surface-2" />
              <p className="mt-5 font-da-display text-2xl font-extrabold">Today</p>
              <p className="text-xs text-da-muted-fg">2 of 4 done · nice pace</p>
              <ul className="mt-4 space-y-2">
                {tasks.map((t) => (
                  <li
                    key={t.t}
                    className={cn("flex items-center gap-2.5 rounded-da-md p-2.5 text-sm", t.done ? "bg-da-secondary text-da-secondary-fg" : "bg-da-surface-2")}
                  >
                    <span
                      className={cn(
                        "grid size-5 shrink-0 place-items-center rounded-full border-2",
                        t.done ? "border-da-secondary-fg bg-da-secondary-fg text-da-secondary" : "border-da-border-strong",
                      )}
                    >
                      {t.done && <Check className="size-3" strokeWidth={3} />}
                    </span>
                    <span className={cn(t.done && "line-through opacity-80")}>{t.t}</span>
                  </li>
                ))}
              </ul>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

export default CtaApp;

modules/soft-flat/section/cta-app/index.tsx

Props

PropTypeDefaultDescription
title / descriptionstring—Copy.
stores{ label, sub, href }[]—Store buttons.
classNamestring—Classes.

Other cta variants in Soft Flat

CTA in other art directions

CTA Banner

Full-bleed yellow slab with a giant uppercase headline and an inline email capture form (pending + success states), ruled pattern in the corner.

BrutalistCTA

CTA Countdown

Limited-offer CTA in an ink slab: uppercase offer headline, yellow claim button, dashed promo code, and a four-cell live countdown (days/hours/min/sec) with the first cell in yellow.

BrutalistCTA

CTA Split

Two-audience CTA: a big headline over two fully clickable cards (yellow for engineers, blue for product teams) with audience label, title, pitch and a button chip; cards slam into their shadow on hover.

BrutalistCTA

CTA Sticker

Full-bleed pink CTA with a giant centered uppercase headline, an oversized ink button that slams into its shadow on hover, and a yellow circular text-path sticker ticking around in steps.

BrutalistCTA

Cta App

App download CTA in a glass panel: headline, ink store buttons and rating on the left; an HTML phone mock-up recording an in-person meeting (mic orb, waveform, AI chip) rising from the bottom on the right.

GlassCTA

Cta Gradient

Bold full-gradient CTA card with a masked grid overlay and top glow, white primary button, translucent secondary button and three frosted stat chips.

GlassCTA

CTA Orb

Large frosted panel with a slowly spinning, heavily blurred conic-gradient orb glowing through the glass, centered headline, ink + frosted CTAs and a reassurance line.

GlassCTA

Cta Waitlist

Frosted CTA panel haloed by a blurred gradient ring: headline, copy, pill email form with gradient button (success state) and three check perks.

GlassCTA

Cta Banner

Compact inverted ink banner on a single row: title and one-liner on the left, solid and outline actions on the right, with a faint grid fading in from the right edge.

MinimalCTA

CTA Glow

Closing call-to-action card: centered headline and copy, ink button with keyboard hint, ghost secondary link, an indigo glow rising from the bottom edge and a gradient hairline on top.

MinimalCTA

Cta Newsletter

Centered email capture card with an indigo hairline on top: headline, copy, email field and ink button, with client validation plus pending, success and error states.

MinimalCTA

Cta Split

Wide two-column CTA card: headline, copy and two buttons on the left; a tinted panel on the right with a numbered ‘first 10 minutes’ onboarding checklist and time estimates.

MinimalCTA

Cta Contact

Studio-style contact CTA: mono label, headline, the email address set huge as a link, and a row of contact channels (studio, press, careers) in mono under a hairline.

Mono CleanCTA

Cta Email

Underline-input signup: large headline, then an email field drawn as a single bottom rule with an inline “Get started →” button; confirmation replaces the form.

Mono CleanCTA

Cta Giant

Full-width CTA as a giant link: the whole headline is the link, an arrow slides in on hover and an ink underline wipes across; a mono note sits below.

Mono CleanCTA

Cta Split

Two-door CTA: the section is split into two equal halves (white | ink) with a mono label and a large title each; hovering a half inverts it and nudges the arrow.

Mono CleanCTA

Cta Band

Full-width primary-blue band with a faint grid pattern, headline + subline on the left and inverted white + outlined buttons on the right.

Neo CorporateCTA

Cta Demo

Book-a-demo CTA: benefits list on the left, bordered form card (work email, company, team size select) on the right with an inline success state.

Neo CorporateCTA

Cta Stats

Split CTA on a dark (fg-colored) panel: copy + buttons on the left, a 2×2 grid of large outcome stats divided by hairlines on the right.

Neo CorporateCTA

Cta Trust

Centered CTA inside a bordered panel: headline, two buttons, a line of compliance assurances with shield icons, and a strip of customer wordmarks below a hairline.

Neo CorporateCTA

Cta Blob

Closing CTA inside a large sage organic blob (SVG shape scaled to the content) with a clay pebble and two leaves around it; serif headline and cream pill buttons.

Organic SoftCTA

Cta Journal

Newsletter CTA styled like a paper journal: clay-tinted card with serif title, recent issue list with mono numbers, and a rounded email + button form with a warm thank-you state.

Organic SoftCTA

Cta Pledge

Interactive pledge CTA: pick the commitments your team is ready for (round check cards), a counter of companies who pledged, and a CTA that reflects how many you chose.

Organic SoftCTA

Cta Wave

Full-width sage band with soft wavy top and bottom edges (SVG), centered serif headline with an italic word, and two pill buttons; flows naturally between cream sections.

Organic SoftCTA