Starters

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

    metadata.title + openGraph.title

    Real subsidiary name. Pattern: “Name — CBC emea”. Both fields must match.

  3. 3.

    metadata.description + openGraph.description

    Unique per page, 120–155 characters. OG description may differ slightly — lean conversion-adjacent.

  4. 4.

    metadata.alternates.canonical

    The live URL with no trailing slash. Set before deploying — a placeholder canonical harms indexing from day one.

  5. 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. 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. 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. 3.

    metadata.description + openGraph.description

    Unique per page, 120–155 characters. OG description should answer: what does the visitor get from this partnership?

  4. 4.

    metadata.alternates.canonical

    Must be /[subsidiary]/[partner] — the page lives under the subsidiary that holds the partnership, not at a standalone URL.

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