Agency Page React template for Tailwind CSS v4
v1.0.0Added in 1.14.0
A React agency website template: rotating hero, services, case studies, process, team, packages and a project inquiry form.
The hero word cycles through brands, products and websites (it holds while the pointer is over it and stays still under reduced motion; screen readers hear the full list once). Start a project, in the header, the hero and the phone bar, glides to the inquiry form and focuses the name field; See our work glides to the case studies. Each case card is one link to its case notes further down (or to its own href): Enter or a tap scrolls there and moves focus to the notes, which offer Start a similar project (it ticks the matching services in the form) and Back to work. On phones the case cards sit in a snap rail with the next card peeking. A package's Get started picks its budget chip and jumps to the form. The form validates name, email, a budget chip and a brief of at least 30 characters, focuses the first problem, keeps the button loading while onInquiry runs and then thanks the sender; the timeline select opens as a bottom sheet on phones. Below 768px a Start a project bar slides up once the hero scrolls away and hides again at the form.
Agency Page is a Pro React template in the React website templates category, written in TypeScript for React 19 and Tailwind CSS v4. It installs as source with npx wingo-ui@latest add agency-page, together with Marketing Section, Marketing Header, Marketing Footer, Logo Cloud, Steps Section and 12 more and the npm packages lucide-react and motion.
Built with
The sections this page is made of. In the full-screen preview, hold Alt to outline each one on the page.
Add to a project
Requirements: React 19 and Tailwind CSS v4, in Next.js (App Router or Pages), Vite or React Router. Installation guide · Next.js setup · Vite setup
npx wingo-ui@latest add agency-pageAgency Page is part of Pro, with 298 more Pro items: $8 a month or $150 once. 14-day refund before you download any Pro item. See plans
Usage
Import AgencyPage from @/components/templates/agency-page.
// app/(marketing)/page.tsx
"use client"
import Link from "next/link"
import { AgencyPage } from "@/components/templates/agency-page"
export default function StudioRoute() {
return (
<AgencyPage
linkComponent={Link}
onInquiry={async (values) => {
await fetch("/api/inquiries", { method: "POST", body: JSON.stringify(values) })
}}
/>
)
}Props
heroWordsdefault"["brands", "products", "websites"]"string[]The words that rotate after labels.heroLead, one per line of the big hero title.
rotatedefaulttruebooleanCycles the hero word; false keeps the first one.
rotateIntervaldefault2600numberMilliseconds each hero word stays on screen.
rotateEffectdefault"slide-up""slide-up" | "slide-down" | "fade" | "blur" | "flip"How the hero word changes.
factsdefault"AGENCY_FACTS"AgencyFact[]{ value, label } key facts under the hero rule; an empty array hides them.
clientsdefault"AGENCY_CLIENTS"LogoCloudItem[]Client wordmarks drawn as a glyph and a name.
servicesdefault"AGENCY_SERVICES"AgencyService[]{ id, icon?, title, description, deliverables } practice cards; they are also the What do you need? chips of the form.
caseStudiesdefault"AGENCY_CASE_STUDIES"AgencyCaseStudy[]{ slug, client, title, summary, tags, year, color, cover?, media?, results, href?, challenge, approach, duration, services?, quote? }. Each card links to href, else to its #case-<slug> notes.
processdefault"AGENCY_PROCESS"StepsSectionItem[]The four steps of the process: { icon?, title, description, meta? }.
teamdefault"AGENCY_TEAM"TeamMember[]{ name, role, bio?, avatar?, socials? } people of the studio.
packagesdefault"AGENCY_PACKAGES"AgencyPackage[]{ id, name, description, price, from?, unit?, duration?, features, featured?, budget? } engagement cards; budget is the chip Get started picks.
budgetsdefault"AGENCY_BUDGETS"AgencyOption[]{ value, label } budget chips of the form; an empty array drops the field.
timelinesdefault"AGENCY_TIMELINES"AgencyOption[]{ value, label } start options of the timeline select; an empty array drops the field.
labelsPartial<AgencyPageLabels>Every visible string, merged over DEFAULT_AGENCY_PAGE_LABELS: the brand, the hero lead and tail, section headings, form copy and errors.
emaildefault"hello@northwind.studio"stringThe studio address beside the form; Start a project mails it when the form is hidden.
availabledefaulttruebooleanThe availability pill and the phone bar: booking new projects, or fully booked.
openRolesdefault1numberThe count on the hiring tile after the team; 0 hides the tile.
careersHrefdefault"/careers"stringWhere the hiring tile goes.
onInquiry(values: AgencyInquiryValues) => void | Promise<unknown>Runs on Send inquiry with { name, email, company, services, budget, timeline, brief }. A returned promise keeps the button loading; a rejection keeps the form and shows labels.failed. Without it the page pretends for 900 ms, then thanks the sender.
currencydefault"USD"stringISO currency of the package prices.
localedefault""stringIntl locale for the prices; empty uses the UIProvider's, else en-US.
tonedefault"neutral""neutral" | "brand" | "success" | "warning" | "danger" | "info"The rotating word, service icon tiles, result figures, process markers, selected chips and the featured package; the page glow follows it unless backgroundColor is set.
accentdefault""stringAny CSS color for everything tone paints; replaces the tone. Leave empty to use the tone.
ctaTonedefault"neutral""neutral" | "brand" | "success" | "warning" | "danger" | "info"Start a project, the featured package, Start a similar project and Send inquiry.
radiusdefault"lg""none" | "sm" | "md" | "lg"Corners of the service, case and package cards: 0 / 12 / 16 / 24px; the covers inside follow.
backgrounddefault"glow""plain" | "soft" | "glow" | "aurora" | "grid" | "dots"The main background: plain is the bare page color; the others tint the page and add a glow, an aurora, a grid or dots over the first screen.
backgroundColordefault"oklch(0.62 0.14 275)"stringThe tint and glow color of the main background; follows tone or accent while left at the default.
bandBackgrounddefault"muted""muted" | "tinted" | "gradient" | "dots"The secondary background of the alternating bands (services, case notes, team, inquiry). Cards and fields inside are lifted one step above it.
bandColordefault"oklch(0.62 0.14 275)"stringThe tint of tinted and gradient bands; defaults to the page color.
showClientsdefaulttruebooleanThe client wordmarks under the hero.
showServicesdefaulttruebooleanThe four practice cards with deliverables.
showWorkdefaulttruebooleanThe case study cards (a snap rail on phones).
showCaseNotesdefaulttruebooleanThe case notes the cards link to; off, cards without href go to /work/<slug>.
showProcessdefaulttruebooleanThe four-step process.
showTeamdefaulttruebooleanThe studio team and the hiring tile.
showPackagesdefaulttruebooleanThe engagement packages.
showInquirydefaulttruebooleanThe project inquiry band; off, Start a project mails the studio.
stickyBardefaulttruebooleanPhones: a Start a project bar pinned to the bottom once the hero scrolls away, hidden again at the form.
headerdefaulttruebooleanThe marketing header with the page's anchor links; off inside a site layout.
footerdefaulttruebooleanThe simple marketing footer.
headerPropsPartial<MarketingHeaderProps>Passed to MarketingHeader; wins over the page's values.
footerPropsPartial<MarketingFooterProps>Passed to MarketingFooter; wins over the page's values.
clientsPropsPartial<LogoCloudProps>Passed to the client LogoCloud (layout marquee, variant tiles...).
processPropsPartial<StepsSectionProps>Passed to the process StepsSection (layout horizontal, vertical, tabs...).
teamPropsPartial<TeamSectionProps>Passed to the TeamSection (layout compact, list, cards...).
animateIndefaulttruebooleanThe hero rises in once on mount; off in thumbnails and under reduced motion.
linkComponent(props: LinkComponentProps) => ReactNodeDefault a plain <a>. The router link for the header, footer and case links (next/link in an app).
classNamestringClasses for the root.
classNamesPartial<Record<AgencyPageSlot, string>>Classes for header, hero, clients, services, service, work, caseCard, cover, caseNotes, process, team, packages, package, inquiry, form, stickyBar and footer.
Parts
AGENCY_PAGE_SAMPLE
constantAll the sample content in one object: facts, clients, services, caseStudies, process, team, packages, budgets and timelines.
AGENCY_FACTS
constantFour studio facts: founded, launches, people, longest client.
AGENCY_CLIENTS
constantEight fictional client wordmarks.
AGENCY_SERVICES
constantBrand identity, product design, websites and engineering.
AGENCY_CASE_STUDIES
constantFour case studies with drawn covers, results, notes and a quote.
AGENCY_PROCESS
constantDiscover, define, design and build, launch and grow.
AGENCY_TEAM
constantSeven people of Northwind Studio.
AGENCY_PACKAGES
constantDesign sprint, retainer and project packages in USD.
AGENCY_BUDGETS
constantFour budget ranges from under $25k to $100k+.
AGENCY_TIMELINES
constantFour start options from as soon as possible to just exploring.
DEFAULT_AGENCY_PAGE_LABELS
constantThe English strings.
AgencyPageProps
typeProps of AgencyPage, including the attributes of the root element.
AgencyInquiryValues
typeWhat onInquiry receives: { name, email, company, services, budget, timeline, brief }.
AgencyService
typeOne practice card: { id, icon?, title, description, deliverables }.
AgencyCaseStudy
typeOne case study: the card (client, title, summary, tags, year, color, cover, results) and its notes.
AgencyCoverKind
type"brand" | "app" | "dashboard" | "site", the drawn cover of a case card.
AgencyResult
typeOne result figure: { value, label }.
AgencyPackage
typeOne engagement card with its price, unit, duration and features.
AgencyOption
type{ value, label } of a budget chip or a timeline option.
AgencyFact
type{ value, label } of a hero fact.
Examples
Custom accent
accent violet with the brand call to action: the rotating word, result figures, process markers, chips and the featured package take the color.
Aurora with tinted bands
background="aurora" and bandBackground="tinted" in teal, with a fading word and square-ish cards.
Freelancer, fully booked
A one-person studio: new labels and words, no team or case notes, the availability pill set to booked and only the sprint and project packages.
Inside a site layout
Without header and footer, process as a vertical rail and the clients as a marquee.
Inquiry only
Hero, services and the inquiry form, for a short contact page of a studio.
Dependencies
Files
- components/templates/agency-page.tsx
- components/templates/agency-page-data.ts
FAQ
Is the React Agency Page template free?
The preview, props and docs are free; copying the source needs a Pro plan. See plans.
How do I install Agency Page?
Run npx wingo-ui@latest add agency-page. It also adds the Wingo UI items it builds on (Marketing Section, Marketing Header, Marketing Footer, Logo Cloud, Steps Section and 12 more) and the npm packages lucide-react and motion. With shadcn, add the @wingo-ui registry with your API key, then run npx shadcn@latest add @wingo-ui/agency-page.
How does Agency Page behave on phones?
On phones the case cards sit in a snap rail with the next card peeking. The form validates name, email, a budget chip and a brief of at least 30 characters, focuses the first problem, keeps the button loading while onInquiry runs and then thanks the sender; the timeline select opens as a bottom sheet on phones.
See also
Related guides
- Nextjs Agency Template That Turns Visitors Into Briefs
Build it: screens and apps8 min read