Skip to content

Sticky CTA Bar

Mobile and tablet bottom CTA bar that slides in past the hero, keeping the primary conversion one thumb-tap away. Dismissible and safe-area aware.

Growth & Conversion · React · Subscription · commercial licence · v1.0.3 · updated 2026-10-16 · Live demo

Terminal window
velocityx add sticky-cta-bar

Subscription component. Run velocityx login with your key first — get one.

---
import StickyCtaBar from '../components/velocity/sticky-cta-bar/StickyCtaBar.tsx';
---
<StickyCtaBar client:visible />

A persistent bottom CTA bar for mobile/tablet (lg:hidden) — the highest-value real estate on a phone. Slides in once the visitor scrolls past the hero, keeping the primary conversion one thumb-tap away.

src/components/growth/StickyCtaBar.tsx · live demo: /components/sticky-cta-bar

Mount once at the app shell:

---
import StickyCtaBar from '../components/growth/StickyCtaBar.tsx';
---
<StickyCtaBar client:idle />
PropTypeDefaultDescription
enabledbooleantrueMaster switch.
labelstringGet Velocity X — from $4,995Button text.
hrefstring/pricingButton target.
showAfternumber700Show after scrolling this many px (past-the-hero intent).
excludePathsstring[]checkout/contact/…Path prefixes to suppress on.
  • Mobile/tablet only — desktop is excluded because the header CTA is always visible there.
  • Appears after showAfter px of scroll (an intent signal), slides up from the bottom.
  • Dismissible; stays dismissed for the session (velocity.stickycta.dismissed).
  • Respects the iOS safe-area inset.

Fires cta_clicked with { location: 'sticky_bar', label } on tap.

Real <a> link (keyboard + screen-reader friendly), visible dismiss button with aria-label, dark-mode, reduced-motion aware.

velocityx drops these into your project:

  • components/velocity/sticky-cta-bar/StickyCtaBar.tsx
  • components/lib/analytics.ts
  • components/lib/consent.ts

react — nothing else. Zero external dependencies is the point.

Colours come from the primary-* / accent-* Tailwind scales, so this drops into a project that is not Velocity without dragging our brand in. Install the contract once:

Terminal window
velocityx theme

Then set your whole brand in one place — raw RGB channels, not hex (a hex here silently breaks every opacity variant):

:root {
--vx-brand: custom;
--vx-primary-600: 220 38 38;
}

There is no component-level font-family anywhere in the library — your font cascade wins.

Commercial, for the duration of an active Velocity X subscription. The source is served by the licence-gated endpoint, never by the public CDN.