Page kits. Copy, adapt, ship.
Guidance stops at rules. These kits go further — copyable scaffolds that assemble the right components, tokens, and meta in the right order, with a tight checklist of what to change before you ship.
Subsidiary microsite page kit
Canonical structure for a /[subsidiary] page. One structural envelope governed by the Digital Architecture Standards; Layer 2 subsidiary accent scoped to the page root; semantic headings and page-level meta per the SEO page.
Not yet set — flag for review
--subsidiary-accent is not yet a formal system token. The scaffold shows one approach (inline CSS custom property on the page root), but the mechanism for how subsidiary accent propagates across a page — data attribute, token override, or something else — needs to be set before a subsidiary ships its own colour.
Not yet set — flag for review
OG image path convention (/og/[subsidiary].png) is not yet formally set. The scaffold proposes /og/ as the directory; confirm this is the right home before the first subsidiary page deploys.
// Subsidiary microsite — reference scaffold
// Route: /[subsidiary] (e.g. /surveillance, /energy)
//
// This is reference scaffolding — not a deployable page.
// Copy, replace every [...] placeholder, delete this comment block.
import type { Metadata } from 'next'
// ── Subsidiary accent (Layer 2 colour) ────────────────────────────────
// Defaults to CBC Blue until the subsidiary defines its own.
// Scoped to this page's root via a CSS custom property.
// Convention: --subsidiary-accent is not yet a formal system token.
const SUBSIDIARY_ACCENT = 'var(--cbc-blue)' // ← replace with subsidiary colour
// ── Page metadata ──────────────────────────────────────────────────────
export const metadata: Metadata = {
title: '[Subsidiary name] — CBC emea', // pattern: Name — CBC emea
description: '[One sentence. 120–155 characters. Unique per page.]',
openGraph: {
title: '[Subsidiary name] — CBC emea',
description: '[OG description. Under 155 characters.]',
images: [{
url: '/og/[subsidiary].png', // 1200×630 — brand surface; see /imagery
width: 1200,
height: 630,
alt: '[Subsidiary name] — CBC emea',
}],
type: 'website',
},
alternates: {
canonical: 'https://cbcemea.com/[subsidiary]', // ← live URL; no trailing slash
},
}
// ── Page component ─────────────────────────────────────────────────────
export default function SubsidiaryPage() {
return (
<main
id="main-content"
style={{ '--subsidiary-accent': SUBSIDIARY_ACCENT } as React.CSSProperties}
>
{/* Hero — shared envelope; accent may tint highlight elements */}
<section aria-labelledby="hero-heading">
<h1 id="hero-heading">[Subsidiary name]</h1>
<p>[Strapline — one direct sentence, plain English, no superlatives]</p>
</section>
{/* Body sections — h2 for sections, h3 for subsections */}
<section aria-labelledby="section-a">
<h2 id="section-a">[Section heading]</h2>
{/* ... */}
</section>
{/* Contact CTA */}
<section aria-labelledby="cta-heading">
<h2 id="cta-heading">Get in touch</h2>
{/* <ContactLauncher /> — from /system */}
</section>
</main>
)
}Change these 5 things
- 1.
SUBSIDIARY_ACCENT
Replace ‘var(--cbc-blue)’ with the subsidiary’s own colour, or leave it as-is until one is defined — an undifferentiated subsidiary just reads as CBC emea.
- 2.
metadata.title + openGraph.title
Real subsidiary name. Pattern: “Name — CBC emea”. Both fields must match.
- 3.
metadata.description + openGraph.description
Unique per page, 120–155 characters. OG description may differ slightly — lean conversion-adjacent.
- 4.
metadata.alternates.canonical
The live URL with no trailing slash. Set before deploying — a placeholder canonical harms indexing from day one.
- 5.
OG image /og/[subsidiary].png
Design it before deploying: 1200×630 px, brand surface (not a screenshot). See Imagery for visual treatment rules.
Partner landing page kit
Structure for a /[subsidiary]/[partner] page — conversion-focused, with partner colour strictly scoped to its own surface. The canonical lives under the subsidiary that holds the partnership, per the Architecture Standards. The OG image is a brand surface, not a screenshot.
Not yet set — flag for review
Title connector — the scaffold uses × (multiplication sign, U+00D7) as the partner connector. Not yet formally set as the pattern — confirm with Marketing before the first partner page ships.
// Partner landing page — reference scaffold
// Route: /[subsidiary]/[partner] (e.g. /surveillance/holowits)
// Lives under the subsidiary that holds the partnership.
//
// This is reference scaffolding — not a deployable page.
// Copy, replace every [...] placeholder, delete this comment block.
import type { Metadata } from 'next'
// ── Partner colour (Layer 3 colour) ───────────────────────────────────
// Belongs to the partner. SCOPED to this surface only.
// Never a global token. Never bleeds into CBC chrome or the parent subsidiary.
// Multiple partners = multiple scoped surfaces; one rule, one surface per partner.
const PARTNER_COLOUR = '#______' // ← partner's primary brand colour (hex)
// ── Page metadata ──────────────────────────────────────────────────────
export const metadata: Metadata = {
title: '[Partner name] × [Subsidiary name] — CBC emea', // ← real names
description: '[Partnership value. 120–155 characters. Conversion-focused.]',
openGraph: {
title: '[Partner name] × [Subsidiary name]',
description: '[OG description — what does the visitor get?]',
images: [{
url: '/og/[subsidiary]-[partner].png', // 1200×630 — treat as brand surface
width: 1200,
height: 630,
alt: '[Partner name] × [Subsidiary name] — CBC emea',
}],
type: 'website',
},
alternates: {
canonical: 'https://cbcemea.com/[subsidiary]/[partner]', // ← no trailing slash
},
}
// ── Page component ─────────────────────────────────────────────────────
export default function PartnerPage() {
// Partner colour scoped to this container only — CBC chrome stays outside.
const partnerScope = { '--partner-colour': PARTNER_COLOUR } as React.CSSProperties
return (
<main id="main-content" style={partnerScope}>
{/* Partner header — uses var(--partner-colour); CBC chrome unchanged outside */}
<section
aria-labelledby="partner-heading"
style={{ borderTop: '4px solid var(--partner-colour)' }}
>
<h1 id="partner-heading">[Partner name] × [Subsidiary name]</h1>
<p>[Partnership value — one sentence, conversion-focused]</p>
</section>
{/* Value proposition */}
<section aria-labelledby="offering-heading">
<h2 id="offering-heading">[What we offer together]</h2>
{/* ... */}
</section>
{/* Contact CTA */}
<section aria-labelledby="cta-heading">
<h2 id="cta-heading">Get in touch</h2>
{/* <ContactLauncher /> — from /system */}
</section>
</main>
)
}Change these 6 things
- 1.
PARTNER_COLOUR
Partner’s primary brand colour as a hex. Never promote this to a global token — it must stay scoped to this surface.
- 2.
metadata.title + openGraph.title
Real names for both partner and subsidiary. The × connector is the working pattern; confirm with Marketing if the partner prefers a different connector.
- 3.
metadata.description + openGraph.description
Unique per page, 120–155 characters. OG description should answer: what does the visitor get from this partnership?
- 4.
metadata.alternates.canonical
Must be /[subsidiary]/[partner] — the page lives under the subsidiary that holds the partnership, not at a standalone URL.
- 5.
OG image /og/[subsidiary]-[partner].png
Design it as a brand surface before deploying: partner logo + CBC mark + subsidiary context. 1200×630 px. See Imagery.
- 6.
Partner colour scope
The style={partnerScope} prop must be on a page-only container — never on the layout, body, or any element that wraps CBC chrome (nav, footer). The partner colour must not leak outside its surface.