Hero
The landing page opener: a left-aligned h1, a lede and actions, with a visual beside it (under it on phones).
Examples
Hero with a PatchPanel
One MCP URL for every server your agents use.
Add your MCP servers and skills once. Switchboard serves them from a single endpoint.
- ConnectedGitHubapi.githubcopilot.com/mcp
- ConnectedLinearmcp.linear.app/mcp
- Sign-in neededNotionmcp.notion.com/mcp
Your agents connect toServinghttps://switchboard.example.com/mcp
<Hero
title="One MCP URL for every server your agents use."
lede="Add your MCP servers and skills once. …"
actions={<><Button href={signUp} size="lg">Get started</Button><Button href={docs} size="lg" variant="secondary">Read the docs</Button></>}
aside={<PatchPanel lines={lines} url={mcpUrl} />}
/>SiteSection: content and closing call to action
With children it is a titled band; with only `actions` it becomes a closing call to action with a larger title.
<SiteSection title="How it works" description="…"><StepList steps={…} /></SiteSection>
<SiteSection tone="band" title="Add your first server" description="…" actions={<Button href={signUp}>Get started</Button>} />Usage
import { Hero, SitePage, SiteSection } from '@switchboard/ui'
<SitePage header={<SiteHeader … />} footer={<SiteFooter … />}>
<Hero title lede actions aside />
<SiteSection title description?>…</SiteSection>
</SitePage>Props
Every component also takes mix, for css() and mixins applied after its own style.
Hero
| Prop | Type | Default | Description |
|---|---|---|---|
| title* | RemixNode | – | The page's one h1, at the display size (32px on phones, 44px from 768px). |
| lede | RemixNode | – | One or two sentences, 52ch max. |
| actions | RemixNode | – | One primary and one secondary Button, size lg. |
| aside | RemixNode | – | The visual (a PatchPanel or an IllustrationFrame). Beside the text from 960px. |
| kicker | RemixNode | – | A sentence-case line above the title naming the category (a Kicker). |
| note | RemixNode | – | One quiet line under the actions (compatibility, sign-up methods). |
Also accepts every <section> attribute.
SiteSection
| Prop | Type | Default | Description |
|---|---|---|---|
| title* | RemixNode | – | The h2. |
| description | RemixNode | – | A sentence under the title. |
| actions | RemixNode | – | Buttons under the description. Without children the section is a closing call to action. |
| tone | 'plain' | 'band' | 'plain' | `band` sits on the surface colour between hairlines. |
| titleSize | '2xl' | '3xl' | – | 3xl for a feature section that reads as a second act. |
| kicker | RemixNode | – | Who the section is for, above the title (a Kicker). |
| aside | RemixNode | – | A visual beside the head from 960px (e.g. an IllustrationFrame on a closing call to action). |
| id | string | – | Anchor for in-page nav. Sections clear the sticky SiteHeader (scroll-margin-top). |
SitePage
| Prop | Type | Default | Description |
|---|---|---|---|
| header | RemixNode | – | A SiteHeader. |
| footer | RemixNode | – | A SiteFooter. |
| children | RemixNode | – | Rendered in the one <main>, after a "Skip to content" link. |
Heading (marketing sizes)
| Prop | Type | Default | Description |
|---|---|---|---|
| size | 'display' | '3xl' | '2xl' | – | Marketing only. display: 32→44px, 3xl: 24→32px, 2xl: 24px. |
SiteHeader (signUpLabel)
| Prop | Type | Default | Description |
|---|---|---|---|
| signUpLabel | string | "Create account" | Label of the sign-up button. |
Accessibility
- Hero and each SiteSection are <section>s named by their heading (aria-labelledby).
- SitePage renders exactly one <main> and a skip link to it.
Guidance
Do
- Keep the h1 a plain sentence.
- Use StepList only for a real sequence; capabilities go in a Grid of Cards.
Don’t
- Add all-caps eyebrows or gradients (a Kicker is sentence case and says who it is for).
- Use display sizes in the dashboard.