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

Template Gallery Page

Templates

Template Gallery Page

Design
Status PageWaitlist Page
Design
Live props
Appearance
design
tone
ctaTone
State
defaultCategory
defaultQuery
defaultSort
defaultSource
Layout
columns3
pageSize
ctaVariant
showPopular
showHeroPreviews
showSidebar
showSourceFilter
showSort
showCollection
showSubmit
showCta
header
footer
Behavior
animateIn
locale
Code
import { TemplateGalleryPage } from "@/components/templates/template-gallery-page"

<TemplateGalleryPage />
  1. Home
  2. Templates
  3. Template Gallery Page
Pro

Template Gallery Page

v1.0.0·Added in 1.8.0

A gallery of ready-made workspace templates: search hero with fanned previews, categories, sort, drawn template cards and a detail dialog.

The hero rises in once on mount over three template cards fanned out below the search (bold: cascaded beside the title); each one opens its template. Typing in the search filters the gallery live (/ focuses it, Escape clears, Enter scrolls to the results) and the popular chips fill it in. On desktop a sticky sidebar picks a category with live counts and a Made by filter (Everyone, Acme, Community); below 1024px the categories become a chip row that scrolls sideways and the Made by filter a segmented control. Popular / Newest / A to Z re-sorts the cards, which glide to their new places; twelve show at first and Show more opens the rest. No match shows an empty state with Clear filters. Every card draws a mini app of what the template is (kanban, roadmap, doc, OKRs, calendar, pipeline, bug table, checklist, automation flow, dashboard, sticky notes, form, habit grid) and is one button: it opens a detail dialog (a bottom sheet below 768px) with a large preview, what's included, the views, the creator and related templates, which swap in place. Use template spins, then confirms Added to your workspace with an Open template link, and the card gets an Added badge. The featured collection rail snaps sideways on phones and Add all adds its four templates. The community band links to submitting a template; the closing band and footer newsletter follow. 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
  • CTA Sectioncta-section

Add to a project

npx wingo-ui@latest add template-gallery-page

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

Usage

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

import Link from "next/link"
import { useRouter } from "next/navigation"
import { TemplateGalleryPage } from "@/components/templates/template-gallery-page"

export default function TemplatesRoute() {
  const router = useRouter()
  return (
    <TemplateGalleryPage
      linkComponent={Link}
      ctaTone="brand"
      templateHref={(template) => `/app/templates/${template.id}`}
      onUseTemplate={async (template) => {
        const response = await fetch("/api/templates/copy", { method: "POST", body: JSON.stringify({ id: template.id }) })
        if (response.status === 401) router.push(`/sign-up?template=${template.id}`)
        if (!response.ok) throw new Error("Could not copy the template")
      }}
    />
  )
}

Props

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

    The whole page's look. classic: a centered hero over a fanned stack of three template cards, raised cards and a gray collection band; bold: a pill header, a split hero with heavy type on a gradient mesh and a cascade of cards, bigger tiles, an inverted collection panel, an image band and a wordmark footer; minimal: a transparent header, a quiet hero without previews, flat cards with outlined previews, no gray bands, plain closing and a simple footer.

  • templatesdefault "GALLERY_TEMPLATES"
    GalleryTemplate[]

    The gallery: { id, name, description, summary?, category, preview, previewItems?, creator: { name, role?, team? }, uses, plan: free | business, createdAt, includes, views?, keywords? }. preview picks the drawn mini app; previewItems feeds it words.

  • categoriesdefault "TEMPLATE_CATEGORIES"
    TemplateCategory[]

    { value, label, description? } for the sidebar and the chip row: Product, Engineering, Design, Marketing, HR, Operations, Personal.

  • collectiondefault "TEMPLATE_COLLECTION"
    TemplateCollection

    The featured collection: { eyebrow, title, description, steps: { template (id), label, note }[] }.

  • heroTemplatesdefault "TEMPLATE_GALLERY_HERO"
    string[]

    Three template ids drawn in the hero: back left, front, back right.

  • popularSearchesdefault "TEMPLATE_POPULAR_SEARCHES"
    string[]

    The chips under the search; a tap fills the search and scrolls to the results.

  • labelsdefault "DEFAULT_TEMPLATE_GALLERY_PAGE_LABELS"
    Partial<TemplateGalleryPageLabels>

    Every visible string; counts and names go through small functions (results, uses, previewTemplate...).

  • hrefsdefault "DEFAULT_TEMPLATE_GALLERY_PAGE_HREFS"
    Partial<TemplateGalleryPageHrefs>

    { submit, guidelines, signUp, sales }: the community submit form, its guidelines and the closing band's buttons.

  • category
    string

    The selected category (controlled): "all" or a category value.

  • defaultCategorydefault "all"
    string

    The category selected at first (uncontrolled).

  • onCategoryChange
    (category: string) => void

    Runs when a category is picked.

  • query
    string

    The search text (controlled).

  • defaultQuerydefault ""
    string

    The search text at first (uncontrolled).

  • onQueryChange
    (query: string) => void

    Runs on every keystroke in the search.

  • defaultSortdefault "popular"
    "popular" | "newest" | "az"

    The first order of the cards: most used, most recently published, or by name.

  • defaultSourcedefault "all"
    "all" | "acme" | "community"

    The Made by filter at first: everyone, the Acme team only, or community members only.

  • columnsdefault 3
    2 | 3

    Cards per row from 1280px (two from 640px either way, one on phones).

  • pageSizedefault 12
    number

    Cards shown before a Show more button that opens the rest of the matches; a new search, category, filter or sort pages again. 0 shows every match.

  • 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.

  • showPopulardefault true
    boolean

    The popular search chips under the search.

  • showHeroPreviewsdefault true
    boolean

    The three template cards in the hero (classic and bold).

  • showSidebardefault true
    boolean

    The sticky category sidebar from 1024px; off, the chip row shows at every width.

  • showSourceFilterdefault true
    boolean

    The Made by filter: Everyone, Acme, Community.

  • showSortdefault true
    boolean

    The Popular / Newest / A to Z control.

  • showCollectiondefault true
    boolean

    The featured collection rail.

  • showSubmitdefault true
    boolean

    The community band with the top creators, and the sidebar's submit card.

  • showCtadefault true
    boolean

    The closing call to action.

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

    Accents: the selected category chip, the segmented controls, Business badges, the hero pill, the preview glow and the included checks.

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

    Use template, Add all, Submit a template, the header's Get started and the closing band; brand is the marketing orange.

  • onUseTemplate
    (template: GalleryTemplate) => (void | Promise<unknown>)

    Use template and Add all. A returned promise keeps the button loading; a rejection leaves the template as it was. Without it the button waits 900 ms and confirms.

  • templateHrefdefault "/app/templates/<id>"
    (template: GalleryTemplate) => string

    Where Open template goes once the template was added.

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

    The footer newsletter; a rejected promise shows an error.

  • 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.

  • ctaProps
    Partial<CtaSectionProps>

    Overrides for the closing CtaSection.

  • animateIndefault true
    boolean

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

  • localedefault "en-US"
    string

    Intl locale for the use counts (de-DE: 63,9K), publish dates and the A to Z order.

  • 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<TemplateGalleryPageSlot, string>>

    Classes for header, hero, title, search, fan, gallery, sidebar, chips, toolbar, grid, card, preview, collection, submit, detail, cta and footer.

Parts

  • TemplatePreview

    component

    The drawn mini app of a template (an app window peeking out of a tinted panel), sized by its container. Takes div props.

    • template
      GalleryTemplate

      The template to draw; its preview kind picks the scene and previewItems the words.

    • label
      string

      The spoken label; without it the scene is decorative.

  • TEMPLATE_GALLERY_SAMPLE

    constant

    All the sample content in one object: categories, templates, collection, heroTemplates and popularSearches.

  • GALLERY_TEMPLATES

    constant

    Twenty-four Acme templates across seven categories, from Sprint board to Personal goals.

  • TEMPLATE_CATEGORIES

    constant

    Product, Engineering, Design, Marketing, HR, Operations and Personal.

  • TEMPLATE_COLLECTION

    constant

    Ship a launch in 30 days: PRD, roadmap, sprint board and launch checklist.

  • TEMPLATE_GALLERY_HERO

    constant

    The three hero template ids.

  • TEMPLATE_POPULAR_SEARCHES

    constant

    Sprint, Roadmap, OKRs, Meeting notes and Hiring.

  • DEFAULT_TEMPLATE_GALLERY_PAGE_LABELS

    constant

    The English strings.

  • DEFAULT_TEMPLATE_GALLERY_PAGE_HREFS

    constant

    The default link targets.

  • TEMPLATE_GALLERY_PAGE_DESIGNS

    constant

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

  • TemplateGalleryPageProps

    type

    Props of TemplateGalleryPage.

  • TemplateGalleryPageDesign

    type

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

  • TemplateGallerySort

    type

    "popular" | "newest" | "az".

  • TemplateGallerySource

    type

    "all" | "acme" | "community".

  • TemplatePreviewProps

    type

    Props of TemplatePreview.

  • GalleryTemplate

    type

    One template of the gallery.

  • TemplatePreviewKind

    type

    The drawn scenes: kanban, roadmap, doc, meeting, okr, calendar, pipeline, bugs, table, checklist, automation, report, retro, form, habits.

  • TemplateCategory

    type

    One category.

  • TemplateCollection

    type

    The featured collection.

  • TemplateGalleryPageLabels

    type

    The strings labels can override.

  • TemplateGalleryPageHrefs

    type

    The link targets hrefs can override.

Examples

Open

Bold design

design="bold": a split hero with heavy type and a cascade of cards, big tiles, an inverted collection panel and a wordmark footer.

Open

Minimal design

design="minimal": a quiet hero without previews, flat cards with outlined previews, no gray bands and a simple footer.

Open

Brand orange, newest first

tone and ctaTone brand with the gallery sorted by Newest: orange chips, Business badges and Use template.

Open

Community engineering templates

defaultCategory engineering and defaultSource community, two columns, without the hero previews.

Open

No results

A search with no match: the empty state with Clear filters.

Dependencies

lucide-reactmotionmarketing-sectionmarketing-headermarketing-footercta-sectionavatarbadgebuttondialogempty-statesearch-inputsegmented-controluse-controllable-statemotionnavigationtext-matchtonesui-config

Files

  • components/templates/template-gallery-page.tsx
  • components/templates/template-gallery-page-data.ts

See also

Integrations PageLanding PageSearch InputDialogEmpty State
PreviousStatus PageNext Waitlist Page