Studio Contact Page

Contact
Two slots left this year

Tell us what is actually wrong.

Not the deliverable, the problem. One paragraph is plenty. A partner reads every enquiry and answers it within two working days, including the ones we turn down.

hello@polaris.exampleLisbon, PortugalReply within two days

The five things everybody asks first.

Before you write

The people you meet. There is no separate delivery team, no account layer, and nobody hands the project to a junior after the pitch.

Person wearing a VR headset

Rather talk it through than write it down?

What happens next

The first conversation, from the other side.

Three clients on what the opening call was actually like, which is the part of this page we cannot write ourselves.

They spent the first call telling us the project we asked for was the wrong one. We hired them that afternoon.
Ida Sundqvist smiling in a studio

Ida Sundqvist

Managing Director, Norrland Ferries

No deck, no discovery phase, no invoice for the thinking. A price and a date by the end of the week.
Tomás Ferreira in an office

Tomás Ferreira

Founder, Halden Press

They turned our first enquiry down and told us who to call instead. We came back two years later with the right one.
Amara Boateng portrait

Amara Boateng

Editor in Chief, Fold Quarterly

The quote came back in two days with a fixed number on it. Three other studios were still asking for a workshop.
Jonas Wieland looking at camera

Jonas Wieland

Chief Executive, Kestrel Group

They asked what the work had to do before they asked what we wanted it to look like. Nobody else did that.
Priya Raman smiling

Priya Raman

Head of Brand, Meridian Labs

We were a small account and never once felt like one. Same two people from the first call to the last file.
Caleb Osei portrait outdoors

Caleb Osei

Founder, Atlas Coffee

About this page

Studio Contact PagePRO

A contact page for a studio that answers before you write: masthead navbar, a contact panel with the address and reply time, a FAQ with a booking aside, three rated accounts of the first call, and a mega footer.

Composed from 5 blocks. Installing this page installs all of them, plus the pieces and primitives they use.

Built in the Polaris collection.

Contact1: Studio Contact Page

A complete contact page for a studio that answers before you write: a masthead navbar carrying the location and inbox, a contact panel on a tinted surface instead of a hero, an FAQ with a booking card beside it, an inverted band of client quotes about the first conversation, and a four-column footer. Five blocks, one install.

Upgrade to Pro

Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.

Upgrade Now

Installation

Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.

bash
npx shadcn add "https://ui.beste.co/page/r/contact1?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the page to components/beste/page/contact1.tsx and everything behind it in one command: the five blocks it composes (navbar52, cta68, faq69, testimonial30, footer102), the button1 and badge6 components they use, and the shadcn/ui button primitive. Eight files, no follow-up installs.

Quick start

The installed file exports contact1Demo alongside the page: the exact props behind the preview above. Spread it to get a working page in one line.

tsx
import { Contact1, contact1Demo } from "@/components/beste/page/contact1";

export default function Page() {
  return <Contact1 {...contact1Demo} />;
}

Each section is a separate prop, so the usual next step is to keep the demo and replace one section at a time rather than writing all five at once.

tsx
import { Contact1, contact1Demo } from "@/components/beste/page/contact1";

export default function Page() {
  return (
    <Contact1
      {...contact1Demo}
      navbar={{
        brand: "Halden",
        tagline: "Design and build, two projects at a time",
        locationLabel: "Oslo, 09:40",
        email: "studio@halden.example",
        links: [
          { label: "Work", href: "/work" },
          { label: "Studio", href: "/studio" },
        ],
        cta: { label: "Start a project", href: "/contact" },
      }}
      contact={{
        label: "Contact",
        badge: { label: "Booking from March" },
        heading: "Tell us what is actually wrong.",
        description: "Not the deliverable, the problem. One paragraph is plenty.",
        button: { label: "Write to the studio", href: "mailto:studio@halden.example" },
        secondaryLink: { label: "Or book a call", href: "/call" },
        meta: ["studio@halden.example", "Oslo, Norway", "Reply within two days"],
      }}
    />
  );
}

Props

Every prop is the full prop object of the block that renders that section, so anything the block accepts is accepted here.

PropTypeDefaultDescription
navbarComponentProps<typeof Navbar52>Masthead: brand, tagline, location, inbox, links, CTA
contactComponentProps<typeof Cta68>The contact panel, standing in for a hero
faqComponentProps<typeof Faq69>Questions, plus the side card that offers a call
testimonialComponentProps<typeof Testimonial30>Client quotes, rendered on the inverted band
footerComponentProps<typeof Footer102>Brand blurb, socials, link columns, legal row
classNamestringExtra classes for the page's outer wrapper

Sections

SectionBlockNotes
Mastheadnavbar52Carries a tagline, local time and email beside the links
Contactcta68Given bg-muted/50 by the page, so it reads as the opening surface
Questionsfaq69Two columns: the questions, and an image card offering a call
Quotestestimonial30Six quotes; the demo fills the grid rather than leaving a gap
Footerfooter102Brand column, three link columns, socials and a legal row

Behavior notes

  • Every section is conditional on its own prop, so omitting faq removes that section entirely rather than rendering an empty one. A page with only navbar and contact is valid.
  • The page sets className="bg-muted/50" on the contact block after spreading contact, so a className passed inside that prop is overridden. Tint that section from the page, not through the prop.
  • The quotes sit inside a wrapper carrying the dark class, which swaps the theme tokens for that subtree. The cards, borders and muted labels inside the block follow the switch, which they would not do if the section were merely painted a dark colour.
  • Because that band uses dark rather than a fixed colour, it inverts against whatever theme is active: on a dark site it is the light band that would need adding, not the dark one removing.
  • The whole page is a client component, since the blocks it composes are. It renders no data fetching of its own and holds no state above the blocks.
  • The page is Pro because blocks inside it are. Installing it delivers their real source, which is why the licence parameters are on the command above.
  • Nothing here is a form: the contact panel is a heading, a paragraph, two links and a row of metadata. Point button.href at a mailto: link or at your own form route.

Blocks in this page

Browse all blocks
PRO

navbar52

Letterhead Navbar

Letterhead-style navbar with a stacked brand block beside stacked rows of location, email and links, closed off by a seal CTA on the right.

PRO

cta68

Contact CTA

Centered contact call to action with an availability badge and big headline.

PRO

faq69

FAQ With Contact

Numbered FAQ accordion beside a contact card with image, prompt and a contact CTA.

PRO

testimonial30

Rated Reviews

Centered grid of star-rated testimonial cards with avatars.

PRO

footer102

Mega Footer

Complete studio mega footer with brand column, link columns, socials and legal bar.