WingoUI
Buttons & Actions
ButtonButton GroupCopy ButtonDelete ButtonTheme ToggleToggleToggle Group
Inputs
Avatar UploadCalendarCheckboxColor PickerComboboxCron PickerCurrency InputDate PickerDate Range PickerDate Time PickerDuration PickerEmail InputFile UploadFilter BuilderInputInput GroupListboxMasked InputMention InputMonth PickerMulti SelectNumber InputOTP InputPassword InputPhone InputRadio GroupRatingSearch InputSegmented ControlSelectSignature PadSliderSwitchTag InputTextareaTime Picker
Forms
Address InputCSV ImportFieldForm WizardInline EditInvoice line itemsRich Text EditorSchema Builder
Navigation
Back To TopBounce SidebarBreadcrumbCommand MenuGlobal SearchGooey NavHook SidebarNav MenuNav TabsPaginationProximity SidebarScroll ProgressSidebarStepsTable Of ContentsTabsTopbarUser MenuWorkspace Switcher
Overlays
Alert DialogContext MenuDialogDrawerDropdown MenuFamily DrawerHover CardPopoverSheetShortcuts DialogTooltipTour
Feedback
AlertBannerCookie ConsentEmoji ReactionEmpty StateNotification BellNotification CenterProgressRoute ProgressSkeletonSpinnerToast
Data Display
Approval FlowAvatarBadgeCalendar ViewCode BlockComment ThreadContact cardCountdownDescription ListDiff ViewerFile ListFile managerFolderGanttJSON ViewerKbdLog ViewerMarkdownPresenceSchedulerTagTimelineTree View
Tables & Lists
Audit LogData TableDeal PipelineEditable GridKanbanListMembers tablePermissions MatrixTableTask ListVirtual List
Charts & Stats
Animated CounterArea chartBar chartDonut chartFunnel chartGaugeGitHub ActivityHeatmap calendarLeaderboardLine chartRadial barSparklineStat CardTrackerTrend badge
Layout
AccordionApp ShellCardCollapsibleDetail LayoutEntity HeaderPage HeaderScroll AreaSeparatorSettings LayoutSplit ViewToolbar
Media
Audio PlayerCarouselCSV ViewerDOCX EditorDOCX ViewerExcel ViewerFile SystemImage CropperImage LightboxLocation MapPDF ViewerPowerPoint ViewerQR CodeStep PlayerVideo Player
AI Kit
Agent Status CardChat MessageChat ThreadConversation ListFluid OrbGrid RevealMatrix OrbModel PickerPrompt InputReasoning IndicatorRule BuilderSuggestion ChipsTool Call TimelineUsage MeterVoice InputWorkflow Canvas
Text & Effects
Gravity Letters
Mobile
Action SheetBottom Tab BarFABHaptic ButtonHero HeaderInstall PromptLarge Title HeaderNotification BannerOnboarding CarouselPicker WheelPull To RefreshSlide To ConfirmSticky CTA BarSwipe DeckSwipeable Tabs
Commerce
Cart drawerCategory pickerCheckout stepsCoupon inputFavorite buttonFilter panelListing cardListing gridOrder trackerPricePrice rangePricing tableProduct galleryQuantity stepperReviewsSeller card
Marketing Sections
App Download SectionBlog Cards SectionCTA SectionFAQ SectionFeature GridFeature ShowcaseHero SectionIntegrations SectionLogo CloudMarketing FooterMarketing HeaderMarketing SectionNewsletter SectionPricing SectionStats SectionSteps SectionTeam SectionTestimonials SectionTimeline SectionVideo Section
Blocks
Admin Dashboard PageAdmin ShellAI Chat PageAutomation Builder PageCheckout PageCRM Contact PageCRM Pipeline PageError PagesInbox PageInvoice PageKPI DashboardListing Detail PageLogin PageMarketplace Home PageMarketplace Search PageMarketplace ShellMobile App HomeOnboarding FlowPost Listing WizardPricing PageRegister PageSettings PageUsers Admin Page
Templates
About PageAcademy PageAccessibility PageAffiliate PageAI Product PageBlog PageBlog Post PageCareers PageChangelog PageCommunity PageCompare PageContact PageCustomer Story PageCustomers PageDemo Booking PageDevelopers PageDocs Home PageDownload PageEnterprise PageEvents PageExperts PageFAQ PageFeature PageGlossary PageHelp Article PageHelp Center PageIntegration Detail PageIntegrations PageJob Detail PageLanding PageLaunch PageLegal PageManifesto PagePress PageProduct Tour PageReferral PageRoadmap PageROI Calculator PageSecurity PageSolutions PageStartups PageStatus PageTemplate Gallery PageWaitlist PageYear in Review Page
Hooks & Utilities
AI ChatChart kitCommerceDate utilsFile exportFile typesFiltersForm validationHapticsInvoicingMotion presetsNavigationNumber formatRelative timeRomanian locationsSpreadsheetText matchTonesUIProvideruseClipboarduseConsentuseControllableStateuseCooldownuseDebounceuseKeyboardInsetuseLocaleuseLongPressuseMediaControlsuseMediaQueryuseOverflowItemsusePersistedStateuseScrollEdgesuseScrollStateuseSelectionuseShortcutuseStickToBottom
GalleryTheme

Templates

Download Page

Templates

Download Page

Design
Docs Home PageEnterprise Page
Design
Live props
Appearance
design
alternate
phoneColor
tone
ctaTone
State
platform
defaultChannel
Layout
showAnnouncement
showPicker
showFeatures
showMobile
showReleaseNotes
showRequirements
showEnterprise
showFaq
showCta
showPhone
ctaVariant
header
footer
Behavior
animateIn
locale
Code
import { DownloadPage } from "@/components/templates/download-page"

<DownloadPage />
  1. Home
  2. Templates
  3. Download Page
Pro

Download Page

v1.0.0·Added in 1.8.0

An apps download page: OS-aware hero download, a drawn desktop app and phone, a platform picker with files, commands and checksums, and FAQ.

The hero rises in once on mount. Its download button adapts to the visitor's device after hydration (macOS on the server, so the markup never mismatches): Download for macOS, Windows or Linux, Get Acme for iPhone or Android; the line under it shows the variant, version, size and release date, and the other formats (Intel, MSI, .rpm) download from inline links. Under it a drawn desktop app wears macOS traffic lights, Windows caption buttons or a GNOME header bar to match, with a phone, quick add and a notification around it. The platform picker is a tab row (arrow keys, Home and End; a swipeable rail on phones) that opens a panel per platform: download rows, Homebrew, winget, Snap or npm commands with copy buttons, requirements, a SHA-256 with copy, and a drawing (a DMG window, an installer, a terminal, a QR code, a browser extension). Download buttons spin, toast the file name and turn the panel into a thanks state with three drawn install steps, Try again and Back to downloads. The Beta channel switch in the panel and the Stable / Beta segmented control in the release notes share one state and change every version, file name, command and checksum on the page. Desktop features show their real shortcuts, the system requirements table becomes cards below 768px, and the FAQ opens one answer at a time. Reduced motion keeps everything still.

Built with

The sections this page is made of. In the full-screen preview, hold Alt to outline each one on the page.

  • Marketing Sectionmarketing-section
  • Marketing Headermarketing-header
  • Marketing Footermarketing-footer
  • App Download Sectionapp-download-section
  • FAQ Sectionfaq-section
  • CTA Sectioncta-section

Add to a project

npx wingo-ui@latest add download-page

Pro item: the CLI needs a Pro account. See plans

Usage

// app/(marketing)/download/page.tsx
"use client"

import Link from "next/link"
import { DownloadPage } from "@/components/templates/download-page"

const FILES: Record<string, string> = {
  "mac:arm64": "https://downloads.acme.com/Acme-latest-arm64.dmg",
  "windows:exe": "https://downloads.acme.com/AcmeSetup-latest.exe",
}

export default function DownloadRoute() {
  return (
    <DownloadPage
      linkComponent={Link}
      ctaTone="brand"
      onDownload={(platform, variant) => {
        const url = FILES[`${platform}:${variant}`]
        if (url) window.location.assign(url)
      }}
    />
  )
}

Props

  • designdefault "classic"
    "classic" | "bold" | "minimal"

    The whole page's look. classic follows the layout props; bold: a pill header, a giant start-aligned title on a gradient mesh with the download beside the description, rounder panels, a colored mobile card, FAQ cards, a scene band and a wordmark footer; minimal: a transparent header, no glow or floating cards, outlined flat panels, no gray bands and a simple footer. The *Props overrides still win.

  • platformdefault "auto"
    "auto" | "mac" | "windows" | "linux" | "ios" | "android" | "extension" | "cli"

    The platform the hero button downloads and the picker opens on. auto detects the visitor's device after hydration and renders macOS on the server; a value pins it (and the drawn window's chrome).

  • channel
    "stable" | "beta"

    The release channel, controlled. Every version, file name, install command and checksum follows it. Leave it out to let the page own it.

  • defaultChanneldefault "stable"
    "stable" | "beta"

    The channel while uncontrolled: beta shows the 3.3.0-beta.2 files, commands and notes from the first render.

  • onChannelChange
    (channel: DownloadChannel) => void

    Runs when the Beta channel switch or the Stable / Beta control changes.

  • platformsdefault "DOWNLOAD_PLATFORMS"
    DownloadPlatform[]

    The picker: { id, name, short, icon?, kind, tagline, meta, variants, commands?, requirements, visual, lines?, qr?, steps } per platform. A variant is { id, label, detail?, file? ({version} filled in), size?, recommended?, store?, action?, href?, checksum? }.

  • releasesdefault "DOWNLOAD_RELEASES"
    Record<DownloadChannel, DownloadRelease>

    { stable, beta }: { version, date (yyyy-mm-dd), notes: { type, text }[] } per channel.

  • featuresdefault "DOWNLOAD_FEATURES"
    DownloadFeature[]

    Desktop features: { id, icon?, title, description, shortcut?, shortcutLabel?, visual? }; visual is quick-add, offline, notifications, menu-bar or any node.

  • requirementsdefault "DOWNLOAD_REQUIREMENTS"
    DownloadRequirement[]

    { id, platform, icon?, os, processor, memory, disk } rows of the requirements table.

  • enterprisedefault "DOWNLOAD_ENTERPRISE_POINTS"
    DownloadEnterprisePoint[]

    { icon?, title, description } points of the IT deployment panel.

  • faqdefault "DOWNLOAD_FAQ"
    FaqItem[]

    { question, answer } pairs about installing.

  • labelsdefault "DEFAULT_DOWNLOAD_PAGE_LABELS"
    Partial<DownloadPageLabels>

    Every visible string; the ones with a name, file or version are functions.

  • hrefsdefault "DEFAULT_DOWNLOAD_PAGE_HREFS"
    Partial<DownloadPageHrefs>

    { changelog, sales, guide, web }: release notes, contact, the admin guide and the web app.

  • showAnnouncementdefault true
    boolean

    The strip above the header bar.

  • showPickerdefault true
    boolean

    The platform picker and its download panel.

  • showFeaturesdefault true
    boolean

    The desktop features with their shortcuts.

  • showMobiledefault true
    boolean

    The mobile apps section (AppDownloadSection).

  • showReleaseNotesdefault true
    boolean

    The latest release notes and the release channel card.

  • showRequirementsdefault true
    boolean

    The system requirements table (cards on phones).

  • showEnterprisedefault true
    boolean

    The IT deployment panel.

  • showFaqdefault true
    boolean

    The FAQ.

  • showCtadefault true
    boolean

    The closing call to action.

  • showPhonedefault true
    boolean

    The phone overlapping the drawn desktop app. Applies to the classic and minimal designs.

  • ctaVariantdefault "inverted"
    "inverted" | "soft" | "split"

    The closing band: a solid band, a gray band, or copy beside the buttons on a raised panel. Applies to the classic design.

  • alternatedefault true
    boolean

    Gray bands on every other visible section. Applies to the classic and bold designs.

  • phoneColordefault "#0A0A0A"
    string

    The frame of the drawn phones.

  • tonedefault "neutral"
    "neutral" | "brand" | "success" | "warning" | "danger" | "info"

    Accents: the hero glow, the drawn apps and app icon, the selected platform, icon tiles, checks, steps and the channel controls.

  • ctaTonedefault "neutral"
    "neutral" | "brand" | "success" | "warning" | "danger" | "info"

    The download buttons, Talk to sales, the header's Get started and the closing band; brand is the marketing orange.

  • headerdefault true
    boolean

    The marketing header; off inside a site layout.

  • footerdefault true
    boolean

    The marketing footer with its newsletter form.

  • headerProps
    Partial<MarketingHeaderProps>

    Passed to MarketingHeader.

  • footerProps
    Partial<MarketingFooterProps>

    Passed to MarketingFooter.

  • mobileProps
    Partial<AppDownloadSectionProps>

    Overrides for the mobile AppDownloadSection (stores, layout, qrValue...).

  • faqProps
    Partial<FaqSectionProps>

    Overrides for the FaqSection.

  • ctaProps
    Partial<CtaSectionProps>

    Overrides for the CtaSection.

  • onDownload
    (platform: DownloadPlatformId, variant: string, channel: DownloadChannel) => (void | Promise<unknown>)

    Every download and store button. A returned promise keeps the button loading and a rejection toasts downloadFailed; then the panel shows the install steps. Without it the button spins for 700 ms, toasts the file name and shows the steps.

  • onSubscribe
    (email: string) => (void | Promise<unknown>)

    The footer newsletter; a rejected promise shows an error.

  • toastOptionsdefault "{}"
    ToastOptions | false

    Options for the download toasts ({ toasterId, duration... }); false sends none. A Toaster must be mounted to see them.

  • animateIndefault true
    boolean

    The hero rises in once on mount; false keeps the page still (thumbnails). Reduced motion always does.

  • localedefault "en-US"
    string

    Intl locale for the release dates.

  • linkComponentdefault "<a>"
    (props: LinkComponentProps) => ReactNode

    The router link for every link on the page (next/link in an app).

  • className
    string

    Classes for the root.

  • classNames
    Partial<Record<DownloadPageSlot, string>>

    Classes for header, hero, title, download, shot, picker, tile, panel, thanks, features, feature, mobile, release, requirements, enterprise, faq, cta and footer.

Parts

  • DOWNLOAD_PAGE_SAMPLE

    constant

    All the sample content in one object: platforms, releases, features, requirements, enterprise and faq.

  • DOWNLOAD_PLATFORMS

    constant

    Seven platforms: macOS, Windows, Linux, iPhone and iPad, Android, the web extension and the CLI, with files, commands and install steps.

  • DOWNLOAD_RELEASES

    constant

    The stable 3.2.1 and beta 3.3.0-beta.2 releases with their notes.

  • DOWNLOAD_FEATURES

    constant

    Four desktop features: quick add, offline, native notifications and the menu bar widget.

  • DOWNLOAD_REQUIREMENTS

    constant

    Requirement rows for macOS, Windows, Linux, iOS and Android.

  • DOWNLOAD_ENTERPRISE_POINTS

    constant

    Packages, MDM, SSO and SCIM, and update rings.

  • DOWNLOAD_FAQ

    constant

    Six questions about price, Apple silicon vs Intel, updates, the beta, offline use and checksums.

  • DEFAULT_DOWNLOAD_PAGE_LABELS

    constant

    The English strings.

  • DEFAULT_DOWNLOAD_PAGE_HREFS

    constant

    The default link targets.

  • DOWNLOAD_PAGE_DESIGNS

    constant

    The design names, classic first: ["classic", "bold", "minimal"].

  • DownloadPageProps

    type

    Props of DownloadPage.

  • DownloadPageDesign

    type

    "classic" | "bold" | "minimal".

  • DownloadPagePlatform

    type

    A platform id or "auto".

  • DownloadPlatformId

    type

    "mac" | "windows" | "linux" | "ios" | "android" | "extension" | "cli".

  • DownloadChannel

    type

    "stable" | "beta".

  • DownloadPlatform

    type

    One platform of the picker.

  • DownloadVariant

    type

    One file or store listing of a platform.

  • DownloadRelease

    type

    A channel's version, date and notes.

  • DownloadFeature

    type

    One desktop feature card.

  • DownloadRequirement

    type

    One row of the requirements table.

  • DownloadPageLabels

    type

    The strings labels can override.

  • DownloadPageHrefs

    type

    The link targets hrefs can override.

Examples

Open

Bold design

design="bold": a giant start-aligned title on a gradient mesh, the download beside the description, a colored mobile card and a wordmark footer.

Open

Minimal design

design="minimal": a transparent header, no glow or floating cards, outlined flat panels and no gray bands.

Open

Windows visitor on the beta

platform="windows" and channel beta: Windows window chrome, Download for Windows, 3.3.0-beta.2 files and winget beta commands.

Open

Brand orange, Linux

tone and ctaTone brand on a Linux visitor: an orange glow, GNOME window chrome, the .deb as the hero download and a split closing panel.

Open

Real downloads

onDownload returns a promise: the button spins for 1.2 s, then the install steps show; every call toasts what a real app would fetch.

Dependencies

lucide-reactmotionmarketing-sectionmarketing-headermarketing-footerapp-download-sectionfaq-sectioncta-sectionbadgebuttoncopy-buttonkbdqr-codesegmented-controlswitchtoastuse-controllable-statemotionnavigationtonesui-config

Files

  • components/templates/download-page.tsx
  • components/templates/download-page-data.ts

See also

App Download SectionLanding PageChangelog PageQR CodeCopy Button
PreviousDocs Home PageNext Enterprise Page