Skip to content

🛡️ Guided — Cert Landing Page Template

Created: 2026-04-20
Status: ✅ Guardrailed — all cert pages MUST use PathLayout
Template: src/layouts/PathLayout.astro (~320 lines)
Used by: AB-900, AI-901, AZ-900


🔴 GUARDRAIL: Do NOT Create Custom Landing Pages

Every certification landing page MUST use PathLayout.astro. No exceptions.

Why: Custom pages drifted apart (AB-900 had different sections from AI-901). PathLayout ensures every cert page has identical structure, consistent UX, and is maintainable from one file.


How to Create a New Cert Landing Page

Step 1: Create one file

src/pages/{cert-code}/index.astro

Step 2: Pass data props to PathLayout

---
import PathLayout from '@layouts/PathLayout.astro';

const domains = [
  {
    name: 'Domain Name Here',
    number: 1,
    moduleCount: 10,
    isFree: true,  // set on the free domain
    description: 'What this domain covers.',
    firstModuleSlug: '{cert}/domain-1/first-module',
    modules: ['Module 1', 'Module 2', ...],
  },
  // ... more domains
];
---

<PathLayout
  title="XX-000: Cert Name — Guided"
  description="SEO description for the page."
  cert="XX-000"
  certTitle="First Line"
  certSubtitle="Second Line (accent colour)"
  heroDescription="1-2 sentence description shown in the hero."
  domains={domains}
  questionDomains={[
    { name: 'Domain Name', number: 1, total: 65, easy: 20, medium: 30, hard: 15, weight: '35-40%', free: 7, isFree: true },
    // ... more domains
  ]}
  totalModules={28}
  questionCount={200}
  freeDomain={1}
  freeQuestions={20}
  freeDescription="Domain X (Name — N modules) + 20 practice questions."
  highlights={[
    { icon: '🛡️', title: 'Highlight 1', desc: 'Short description.' },
    { icon: '🤖', title: 'Highlight 2', desc: 'Short description.' },
    { icon: '🔧', title: 'Highlight 3', desc: 'Short description.' },
    { icon: '📊', title: 'Highlight 4', desc: 'Short description.' },
  ]}
  sampleQuestion={{
    question: 'A realistic exam-style question?',
    options: ['A. Wrong answer', 'B. Correct answer', 'C. Wrong answer'],
    correctIndex: 1
  }}
  examDetails={{
    replaces: 'OLD-000 (optional)',
    duration: '45 minutes',
    passingScore: '700 / 1000',
    questionTypes: 'MCQ, multi-select, true/false',
    cost: '$99 USD',
    learnLink: 'https://learn.microsoft.com/en-us/credentials/certifications/exams/{cert}/'
  }}
  faqs={[
    { q: 'Question?', a: 'Answer.' },
    // 5-6 FAQs recommended
  ]}
/>

Step 3: That's it

PathLayout renders ALL 8 sections automatically:

  1. Hero — cert badge, title, description, product chooser cards (Study Guide + Practice Exam), stats
  2. What You'll Learn — 4 feature highlight cards
  3. Full Curriculum — expandable domain cards with numbered module lists
  4. Practice Exam Lab — Study Mode + Exam Mode cards, expandable domain cards with Easy/Medium/Hard difficulty breakdown
  5. Pricing — 3-tier cards (Practice $14, Study Guide $19, Bundle $29)
  6. About the Exam — details table + domain weight bars + Microsoft Learn link
  7. FAQ — expandable Q&A from props
  8. Bottom CTA — "Start Free" + "Try Practice Quiz"

Props Reference

Prop Type Required Description
title string Page title for SEO
description string Meta description
cert string Exam code (e.g. "AB-900")
certTitle string First line of hero heading
certSubtitle string Second line (accent coloured)
heroDescription string 1-2 sentence hero description
domains array Study domains with modules
questionDomains array Practice exam domains with difficulty
totalModules number Total module count
questionCount number Total question count
freeDomain number Which domain number is free
freeQuestions number How many free questions
freeDescription string Free tier description text
highlights array 4 feature cards (icon, title, desc)
sampleQuestion object Hero preview question
examDetails object Exam metadata
faqs array 5-6 FAQ items

Domain Object Shape

interface DomainOverview {
  name: string;        // "M365 Core Features"
  number: number;      // 1, 2, 3...
  moduleCount: number; // 10
  description: string; // What this domain covers
  isFree?: boolean;    // true for the free domain
  firstModuleSlug?: string; // "ab-900/domain-1/welcome-to-m365"
  modules?: string[];  // ["Module 1", "Module 2"]
}

QuestionDomain Object Shape

interface QuestionDomain {
  name: string;    // "M365 Core Features"
  number: number;  // 1
  total: number;   // 65
  easy: number;    // 20
  medium: number;  // 30
  hard: number;    // 15
  weight: string;  // "35-40%"
  free: number;    // 7
  isFree?: boolean; // true for the free domain
}

Current Pages Using This Template

Cert File Modules Questions Free Domain Status
AB-900 src/pages/ab-900/index.astro 28 200 Domain 3 ✅ Live
AI-901 src/pages/ai-901/index.astro 26 200 Domain 1 ✅ Live
AZ-900 src/pages/az-900/index.astro 35 200 Domain 1 🟡 Coming Soon

Checklist for New Cert Page

  • [ ] Create src/pages/{cert}/index.astro
  • [ ] Pass ALL required props (see table above)
  • [ ] Create practice page at src/pages/{cert}/practice.astro
  • [ ] Create question JSON files in src/data/questions/
  • [ ] Create study content in src/content/{cert}/
  • [ ] Build and verify all 8 sections render
  • [ ] Test product chooser cards link correctly
  • [ ] Test free tier modules are accessible
  • [ ] Update this doc with the new cert row