Research Report Page React template for Tailwind CSS v4
v1.0.0Added in 1.9.0
A gated research report landing page: a drawn report cover, a download form, five key findings with charts and a benchmark explorer.
The hero sets the report title beside a tilted, layered report cover whose pattern is drawn from the survey's week split, and a gated download form. Name, work email (personal addresses are turned away), company size and role validate on submit and focus the first problem; the button spins, then the form turns into a success card with a Download PDF link, an Add to calendar file for the live briefing and Send to another email (onDownload, or a 900 ms pretend). The headline numbers and the five findings roll up and their charts grow once (final in the server markup). Every chart has a title, the survey question as a note, a legend where it needs one and a View data toggle that swaps the drawing for its table; hover, tap or Tab to a dot group (arrow keys switch groups), a week segment, a slope line, a blocker bar, a Likert answer or a histogram bin for its values, Escape hides the tooltip. The explorer filters the survey by industry and region (selects, bottom sheets on phones) and company size (a segmented control); the respondent count, a small sample warning, four KPIs with their difference from all respondents and three charts update live, and Reset filters clears them. Two sliders (arrow keys work) place your team on the meeting hours and tools distributions with a marker and a Top N% badge. Two chapters expand inline to read; the others show a lock until the report is downloaded. The press block copies an iframe embed code for any chart and a citation in APA, MLA or Chicago.
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
npx wingo-ui@latest add research-report-pagePro item: the CLI needs a Pro account. See plans
Usage
Import ResearchReportPage from @/components/templates/research-report-page.
// app/(marketing)/report/page.tsx
"use client"
import Link from "next/link"
import { ResearchReportPage } from "@/components/templates/research-report-page"
export default function ReportRoute() {
return (
<ResearchReportPage
linkComponent={Link}
ctaTone="brand"
onDownload={async (values) => {
await fetch("/api/report-leads", { method: "POST", body: JSON.stringify(values) })
}}
/>
)
}Props
designdefault"classic""classic" | "editorial" | "bold"The whole page's look. classic: copy, a tilted report cover and a form card side by side, raised chart cards and muted bands over a faint grid; editorial: a printed journal with a masthead, giant start-aligned type, an inline form, numbered ruled findings and flat charts; bold: a deep dark cover band in the page tint with a glowing report, giant numbers on flat tiles and a wordmark footer. ctaProps, headerProps and footerProps still win.
backgrounddefault"grid""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. A design picks its own unless you set one. classic uses grid, editorial and bold soft (bold covers it with a dark band in the page tint).
backgroundColordefault"oklch(0.62 0.14 275)"stringThe tint and glow color of the main background.
bandBackgrounddefault"muted""muted" | "tinted" | "gradient" | "dots"The secondary background of the alternating bands (classic design). Cards, fields and tiles inside a band are lifted one step above it, so they never share its color.
bandColordefault"oklch(0.62 0.14 275)"stringThe tint of tinted and gradient bands; defaults to backgroundColor.
reportdefault"REPORT_INFO"ReportInfo{ title, year, subtitle, publisher, volume, published, pages, respondents, countries, marginOfError, fileSize }: the cover, the hero copy and the form.
headlinesdefault"REPORT_HEADLINES"ReportHeadline[]{ id, value, decimals?, prefix?, suffix?, label }: the strip of survey facts under the hero.
findingsdefault"REPORT_FINDINGS"ReportFinding[]{ id, value, prefix?, suffix?, title, body, chartTitle, source, chart }: the key findings; chart.type is dots, stack, slope, ranked or likert. They also feed the embed picker.
cellsdefault"REPORT_CELLS"ReportCell[]The explorer cube: one cell per industry, size and region with its respondents (n), weekly hours, tools, shares and two histograms. Every view is the respondent weighted average of the matching cells.
industriesdefault"REPORT_INDUSTRIES"ReportOption[]{ value, label }: the industry filter and the sample chart.
sizesdefault"REPORT_SIZES"ReportOption[]{ value, label }: the company size segments.
regionsdefault"REPORT_REGIONS"ReportOption[]{ value, label }: the region filter.
filtersReportExplorerFilters{ industry, size, region }, each an option value or "all": the explorer's filters, controlled.
defaultFiltersPartial<ReportExplorerFilters>The explorer's filters on load, uncontrolled; missing keys are "all".
onFiltersChange(filters: ReportExplorerFilters) => voidRuns when a filter changes or Reset filters is pressed.
defaultMeetingHoursdefault10numberWhere the Your team meeting hours slider starts (0 to 30).
defaultToolsdefault8numberWhere the Your team tools slider starts (1 to 20).
minSampledefault100numberExplorer views with fewer respondents show a small sample warning.
quotesdefault"REPORT_QUOTES"ReportQuote[]{ id, quote, role, context }: anonymous respondent quotes; the first is the large one.
chaptersdefault"REPORT_CHAPTERS"ReportChapter[]{ id, title, summary, page, unlocked?, body?, takeaway? }: the table of contents; unlocked chapters with a body expand inline.
methoddefault"REPORT_METHOD"ReportMethodItem[]{ id, label, value, detail }: sample, fieldwork, margin of error and weighting.
authorsdefault"REPORT_AUTHORS"ReportAuthor[]{ id, name, role, bio }: the research team, with initials avatars.
citationsdefault"REPORT_CITATIONS"ReportCitation[]{ id, label, text }: the citation styles to copy.
pastReportsdefault"REPORT_PAST"ReportPastReport[]{ id, year, title, headline, pages, href }: earlier editions, each with its own drawn cover.
briefingdefault"REPORT_BRIEFING"ReportBriefing{ title, start (iso), durationMinutes, timeZone, timeZoneLabel, href }: the live briefing in the announcement, the calendar file and the closing band.
companySizesdefault"REPORT_COMPANY_SIZES"ReportOption[]The form's company size options.
rolesdefault"REPORT_ROLES"ReportOption[]The form's role options.
requireWorkEmaildefaulttruebooleanTurns away personal email addresses (freeEmailDomains) with an error.
freeEmailDomainsdefault"REPORT_FREE_EMAIL_DOMAINS"string[]The personal email domains requireWorkEmail rejects.
reportHrefdefault"/report/acme-state-of-teamwork-2026.pdf"stringThe PDF behind Download PDF after the form succeeds.
pressKitHrefdefault"/report/acme-state-of-teamwork-2026-press-kit.zip"stringThe press kit link.
privacyHrefdefault"/legal/privacy"stringThe privacy policy link under the form.
siteUrldefault"https://acme.com"stringThe base url of the embed codes and the calendar file.
onDownload(values: ResearchReportDownloadValues) => (void | Promise<unknown>)Runs with { name, email, companySize, role } once the form is valid. A returned promise keeps the button loading; a rejection shows an error. Without it: 900 ms, then the success card.
coverColordefault"#14213d"stringThe drawn report covers' paper color; the cover text turns black or white to match.
headerdefaulttruebooleanThe marketing header; off inside a site layout that has one.
footerdefaulttruebooleanThe marketing footer.
showAnnouncementdefaulttruebooleanThe strip above the header bar with the briefing date (labels.announcement).
showHeadlinesdefaulttruebooleanThe survey facts under the hero.
showFindingsdefaulttruebooleanThe key findings and their charts.
showExplorerdefaulttruebooleanThe benchmark explorer with filters, KPIs, distributions and the Your team sliders.
showQuotesdefaulttruebooleanRespondent quotes.
showChaptersdefaulttruebooleanThe table of contents with the readable and locked chapters.
showMethodologydefaulttruebooleanSample, fieldwork, margin of error, weighting and the sample composition chart.
showAuthorsdefaulttruebooleanThe research team and the press contact.
showPressdefaulttruebooleanEmbed a chart, cite the report and the press kit.
showArchivedefaulttruebooleanPast reports.
showCtadefaulttruebooleanThe closing band.
ctaVariantdefault"inverted""inverted" | "soft" | "split"The closing band: a solid band, a soft band, or copy beside the buttons on a raised panel. Applies to the classic design.
tonedefault"neutral""neutral" | "brand" | "success" | "warning" | "danger" | "info"The explorer's size segments, sliders and Top N% badges, and the citation style switch.
ctaTonedefault"neutral""neutral" | "brand" | "success" | "warning" | "danger" | "info"Download the report, Download PDF, Get the full report, the header's Get started and the closing band.
headerPropsPartial<MarketingHeaderProps>Passed to MarketingHeader.
footerPropsPartial<MarketingFooterProps>Passed to MarketingFooter.
ctaPropsPartial<CtaSectionProps>Passed to the closing CtaSection, spread last.
onSubscribe(email: string) => (void | Promise<unknown>)The footer newsletter; a rejected promise shows an error. Without it: 900 ms, then success.
animateIndefaulttruebooleanThe hero rises in once, numbers roll up and charts grow the first time they scroll into view (never under reduced motion). Everything is final in the server markup.
localedefault"en-US"stringIntl locale for every number, percent and date.
linkComponentdefault"<a>"(props: LinkComponentProps) => ReactNodeThe router link for every link on the page (next/link in an app).
labelsdefault"DEFAULT_RESEARCH_REPORT_PAGE_LABELS"Partial<ResearchReportPageLabels>Every visible string; {placeholders} are filled from the data.
classNamestringClasses for the root.
classNamesPartial<Record<ResearchReportPageSlot, string>>Classes for header, hero, cover, form, headlines, findings, finding, panel, explorer, quotes, chapters, methodology, authors, press, archive, cta and footer.
Parts
RESEARCH_REPORT_PAGE_DESIGNS
constantThe design names: classic, editorial, bold.
DEFAULT_RESEARCH_REPORT_PAGE_LABELS
constantEvery default string, in English.
REPORT_SAMPLE
constantAll the sample content in one object.
REPORT_INFO
constantThe State of Teamwork 2026: 64 pages, 4,200 respondents in 18 countries.
REPORT_HEADLINES
constantRespondents, countries, pages and the margin of error.
REPORT_WEEK
constantThe 40 hour week split: deep work, meetings, status updates, chat and admin.
REPORT_FINDINGS
constantFive findings, one of each chart type.
REPORT_INDUSTRIES
constantFive industries.
REPORT_SIZES
constantFour company size bands.
REPORT_REGIONS
constantFour regions.
REPORT_MEETING_BINS
constantMeeting hours histogram edges; the last bin is open.
REPORT_TOOL_BINS
constantTools histogram edges; the last bin is open.
REPORT_WORK_WEEK
constant40, the hours the week split is read against.
REPORT_CELLS
constant80 cells generated from a few factors and normalized so every view agrees with the findings.
REPORT_QUOTES
constantFive anonymous respondent quotes.
REPORT_CHAPTERS
constantSeven chapters with page numbers; the first two are readable.
REPORT_METHOD
constantSample, fieldwork, margin of error and weighting.
REPORT_AUTHORS
constantSophia Reed, Ethan Parker, Mason Hayes and Olivia Bennett.
REPORT_CITATIONS
constantAPA, MLA and Chicago citations.
REPORT_PAST
constantThe 2025 and 2024 editions.
REPORT_BRIEFING
constantThe live briefing on Nov 18, 2026, 45 minutes.
REPORT_COMPANY_SIZES
constantThe form's company size options.
REPORT_ROLES
constantThe form's role options.
REPORT_FREE_EMAIL_DOMAINS
constantPersonal email domains the work email check rejects.
ResearchReportPageDesign
typeclassic | editorial | bold.
ResearchReportPageSlot
typeThe classNames keys.
ResearchReportPageLabels
typeThe labels object.
ResearchReportDownloadValues
type{ name, email, companySize, role }: what onDownload gets.
ReportInfo
typeThe report's title, year and numbers.
ReportHeadline
typeOne survey fact.
ReportSegment
type{ id, label, value }: a part of a whole or a ranked item.
ReportLikertItem
typeOne statement with its five answer shares.
ReportFindingChart
typeThe chart of a finding: dots, stack, slope, ranked or likert.
ReportFinding
typeOne key finding.
ReportOption
type{ value, label }.
ReportCell
typeOne explorer cell.
ReportExplorerFilters
type{ industry, size, region }.
ReportQuote
typeOne respondent quote.
ReportChapter
typeOne chapter of the report.
ReportMethodItem
typeOne methodology fact.
ReportAuthor
typeOne author.
ReportCitation
typeOne citation style.
ReportPastReport
typeOne earlier edition.
ReportBriefing
typeThe live briefing.
Examples
Editorial design
design="editorial": a printed journal. A masthead, giant start-aligned type, the form in one ruled row, numbered findings with flat charts.
Bold design
design="bold": a dark cover band with a glowing report, giant numbers on flat tiles and a wordmark footer.
Brand orange, burgundy cover
ctaTone="brand" on the download buttons and the closing band, tone="brand" on the explorer, a custom coverColor and ctaVariant="split".
Benchmark only, filtered
Without the header and footer, the explorer starts on European software companies with 51 to 250 people and a busier team.
Dependencies
Files
- components/templates/research-report-page.tsx
- components/templates/research-report-page-data.ts