Station content structure
Description
Complete station HTML structure template for HAP Learning Labs. Validates that all 6 required sections are present with correct HAP components, heading hierarchy, and accessibility features. Prevents structural inconsistencies found across stations in the Colors project.
When to use this Skill
ALWAYS use this Skill:
- •When creating a new station page
- •When editing existing station structure
- •Before committing station HTML
- •When reviewing station completeness
Progressive validation steps
Step 1: Station structure validation (6 required sections)
Every station MUST have these 6 sections in order:
- •Header with HAP avatar and title
- •Top navigation (back to hub + position indicator)
- •"What You'll Learn" section (EXACTLY 3 insight cards)
- •Main content sections (2-4 topic sections)
- •Bottom navigation (previous/hub/next links)
- •Footer (copyright and legal notices)
Validation checklist:
- • All 6 sections present in correct order
- • No missing sections
- • No extra/custom sections outside this structure
Step 1.5: Content section ordering validation (CRITICAL)
All stations MUST follow identical section ordering for consistency across the learning lab. Section order was inconsistent in Station 2 initial implementation and had to be corrected.
Required section order pattern:
- •What You'll Learn (3 insight cards)
- •Main Teaching Sections (2-6 sections explaining core concepts)
- •Try It Yourself Challenge (interactive practice section)
- •Quick Reference (tips/summary cards)
- •Additional Sections (HAP's Mistake Museum, Learning Objectives Checklist, etc.)
Example from Station 1:
Section 1: What You'll Learn Section 2: SVG vs. Raster Images Section 3: The ViewBox Coordinate System Section 4: Resolution Independence Section 5: Try It Yourself Challenge Section 6: Quick Reference (unnumbered): Common Mistakes Checklist
Example from Station 2:
Section 1: What You'll Learn Section 2: Opening Up an SVG File Section 3: Recognizing Basic Shapes Section 4: Recognizing Paths and Text Section 5: Attributes and Safe Modifications Section 6: Try It Yourself Challenge Section 7: Quick Reference (unnumbered): HAP's Mistake Museum (unnumbered): Learning Objectives Checklist
Key ordering rules:
- •"What You'll Learn" is ALWAYS first
- •Main teaching content comes BEFORE "Try It Yourself"
- •"Try It Yourself" comes BEFORE "Quick Reference"
- •"Quick Reference" comes BEFORE additional sections (Mistake Museum, Checklists)
- •Learning objectives/checklists are ALWAYS the final section
Validation command (compare new station to Station 1):
grep -n "SECTION [0-9]" stations/station1.html stations/station[N].html
Compare the output to ensure section ordering matches the pattern.
Validation checklist:
- • "What You'll Learn" is Section 1
- • Main teaching sections are Sections 2 through N
- • "Try It Yourself" comes after all teaching sections
- • "Quick Reference" comes after "Try It Yourself"
- • Additional sections (Mistake Museum, Checklist) come after "Quick Reference"
- • Used grep to compare against Station 1 ordering
Step 2: Component usage validation
Check each section uses correct HAP components from style.css.
Section 1: Header with HAP avatar and title
Required HTML structure:
<body>
<!-- Skip link MUST be first -->
<a href="#main-content" class="skip-link">Skip to main content</a>
<header class="header">
<div class="header-content">
<!-- HAP avatar and title -->
<div class="hybit-welcome">
<div class="hybit-avatar">
<img src="[CLOUDINARY_URL]/hap-laptop_xiewar.jpg"
alt="Illustration of HAP (HyBit A. ProtoBot) studying on his laptop"
width="200"
height="200"
decoding="async"
fetchpriority="high">
</div>
<div>
<h1>HAP's Learning Lab: [STATION_TITLE]</h1>
<p class="subtitle">[Subtitle describing station focus]</p>
</div>
</div>
<!-- HAP's introduction (SINGLE <p> tag only!) -->
<div class="intro-box">
<p><strong>Welcome to Station [N]!</strong> [HAP's personal story about learning this topic from Prof. Teeters...] 🟠</p>
</div>
</div>
</header>
</body>
Validation checklist:
- • Skip link is FIRST element in
<body> - • HAP avatar uses
fetchpriority="high"(LCP image) - • Title follows pattern: "HAP's Learning Lab: [Topic]"
- • Intro box contains EXACTLY one
<p>tag - • Introduction uses HAP's apprentice voice
- • Introduction ends with 🟠 emoji
Section 2: Top navigation
Required HTML structure:
<nav aria-label="Page navigation" class="page-navigation top-nav">
<a href="../index.html" class="nav-link hub-link">🏠 Back to Hub</a>
<div class="page-position" data-page="[N]">Station [N] of 6</div>
</nav>
Validation checklist:
- •
aria-label="Page navigation"present - • Link to hub (
../index.html) - • Station number shown (N of 6)
- • Uses
page-navigationandtop-navclasses
Section 3: "What You'll Learn" section
Required HTML structure (EXACTLY 3 insight cards):
<main id="main-content" class="content-container">
<section class="content-section">
<h2 class="section-heading-centered">What You'll Learn at This Station</h2>
<div class="overview-grid mt-2">
<!-- Insight Card 1 -->
<div class="insight-card">
<h3><span class="insight-icon">[EMOJI]</span> [Learning Point 1]</h3>
<p class="stat-large">[Key Metric/Statistic]</p>
<p><strong>[Emphasis Statement]</strong></p>
<p>[HAP's first-person explanation of what he learned...]</p>
</div>
<!-- Insight Card 2 -->
<div class="insight-card">
<h3><span class="insight-icon">[EMOJI]</span> [Learning Point 2]</h3>
<p class="stat-large stat-teal">[Key Metric/Statistic]</p>
<p><strong>[Emphasis Statement]</strong></p>
<p>[HAP's first-person explanation...]</p>
</div>
<!-- Insight Card 3 -->
<div class="insight-card">
<h3><span class="insight-icon">[EMOJI]</span> [Learning Point 3]</h3>
<p class="stat-large stat-brown">[Key Metric/Statistic]</p>
<p><strong>[Emphasis Statement]</strong></p>
<p>[HAP's first-person explanation...]</p>
</div>
</div>
</section>
</main>
Validation checklist:
- •
<main id="main-content">present (for skip link) - • Section heading: "What You'll Learn at This Station"
- • EXACTLY 3 insight cards (no more, no less)
- • Each card has: icon emoji, heading, stat, emphasis, explanation
- • Stat variations:
stat-large,stat-teal,stat-brown - • All explanations use HAP's first-person voice
Section 4: Main content sections
Common content patterns:
Pattern A: Topic section with code example:
<section class="content-section">
<div class="topic-section">
<h2>[Topic Heading]</h2>
<p class="mb-2">[HAP's introduction to the topic...]</p>
<div class="warning-box mt-2">
<h3>🟠 HAP's Old Way vs. What I Learned</h3>
<p><strong class="text-error">❌ WRONG: [What HAP did initially]</strong></p>
<pre><code class="language-[css/html/javascript]">[Bad code example]</code></pre>
<p class="mt-1"><strong class="text-success">✅ RIGHT: What I Learned</strong></p>
<pre><code class="language-[css/html/javascript]">[Good code example]</code></pre>
<p class="mt-1">[HAP's explanation why second is better]</p>
</div>
</div>
</section>
Pattern B: HAP note callout:
<div class="hap-note-callout">
<img src="[CLOUDINARY_URL]/hap-[expression].jpg"
alt="Illustration of HAP [emotional state/activity]"
width="150"
height="150"
class="hap-note-image"
decoding="async"
loading="lazy">
<div class="hap-note-content">
<h3>[HAP's Discovery/Tip/Mistake]:</h3>
<p>[First-person narrative about specific experience with Prof. Teeters...]</p>
</div>
</div>
Pattern C: Code example with prompt box:
<div class="prompt-box">
<div class="prompt-label">[Description of code]:</div>
<pre><code class="language-[css/html/javascript]">[Code example]</code></pre>
<p class="code-comment mt-1">[HAP's explanation of what the code does]</p>
</div>
IMPORTANT: Copy button JavaScript requirement
All stations with code blocks in .prompt-box or .solution-content MUST include the copy button JavaScript at the end of the page (before </body>).
Reference implementation: See stations/station1.html lines 724-752
Required script pattern:
<!-- Copy button functionality (optional - only if showing code) -->
<script>
document.addEventListener('DOMContentLoaded', () => {
// Add copy buttons to all code blocks in .prompt-box
document.querySelectorAll('.prompt-box pre').forEach(pre => {
const button = document.createElement('button');
button.className = 'copy-button';
button.textContent = 'Copy';
button.setAttribute('aria-label', 'Copy code to clipboard');
button.addEventListener('click', async () => {
const code = pre.querySelector('code').textContent;
try {
await navigator.clipboard.writeText(code);
button.classList.add('copied');
button.textContent = 'Copied';
setTimeout(() => {
button.classList.remove('copied');
button.textContent = 'Copy';
}, 2000);
} catch (err) {
console.error('Failed to copy:', err);
}
});
pre.appendChild(button);
});
});
</script>
For dynamically revealed content (like solution buttons in challenges):
- •Add copy button when content is revealed
- •Check station1.html for complete pattern
- •Ensure copy button is added AFTER Prism.highlightAll() completes
Pattern D: Quick reference tips:
<section class="content-section">
<h2 class="section-heading-centered">Quick Reference</h2>
<div class="tips-grid mt-2">
<div class="tip-card">
<div class="tip-number">1</div>
<div>
<h3>[Tip Title]</h3>
<p>[Concise tip description]</p>
</div>
</div>
<!-- Repeat for 6-8 tips -->
</div>
</section>
Validation checklist:
- • 2-4 main content sections (not more than 4)
- • Each section uses
content-sectionclass - • Headings follow hierarchy: h2 → h3 (no skipped levels)
- • Code examples use Prism.js syntax highlighting
- • Copy button JavaScript is present (check station1.html for reference implementation)
- • HAP note callouts use first-person voice
- • Images below fold have
loading="lazy"
Section 5: Bottom navigation
Required HTML structure:
<nav aria-label="Station pagination" class="page-navigation bottom-nav">
<a href="station[N-1].html" class="nav-link prev-link">← Previous: Station [N-1] - [Title]</a>
<a href="../index.html" class="nav-link hub-link">🏠 Hub</a>
<a href="station[N+1].html" class="nav-link next-link">Next: Station [N+1] - [Title] →</a>
</nav>
Special cases:
- •Station 1: No previous link (only hub + next)
- •Station 6: No next link (only previous + hub)
Validation checklist:
- •
aria-label="Station pagination"present - • Three links: previous, hub, next (or appropriate for station 1/6)
- • Descriptive link text (includes station number and title)
- • Uses
page-navigationandbottom-navclasses
Section 6: Footer
Required HTML structure:
<footer class="footer">
<p><strong>HAP's Learning Lab</strong> | An AI-Enhanced Educational Experience by Prof. Cynthia Teeters</p>
<p class="footer-reminder">
[HAP's one-sentence reminder about this station's key lesson] 🟠 — HAP
</p>
<div class="footer-copyright">
<img src="[CLOUDINARY_URL]/HAP-learner_dvehmt.jpg"
alt="Illustration of HAP the apprentice learner with his study book and tools"
class="footer-hybit"
width="80"
height="80"
decoding="async"
loading="lazy">
<div>
<p>HAP™ Educational Content © 2025 Cynthia Teeters. All rights reserved.</p>
<p>HyBit A. ProtoBot™ (HAP™) character and the apprentice learning methodology are proprietary educational innovations.</p>
<p>Character concept, teaching methodology, and all written content created by Prof. Cynthia Teeters. Visual elements created with AI assistance.</p>
</div>
</div>
</footer>
Validation checklist:
- • HAP's reminder customized to station topic
- • Trademark symbols (™) present for HAP and HyBit A. ProtoBot
- • Copyright year correct (2025)
- • Footer HAP image has
loading="lazy"
Step 3: Content length validation
Check content is appropriate length (not too sparse, not overwhelming).
Guidelines per station:
- •Total HTML: 400-600 lines (station3.html = 514 lines is ideal)
- •Main content sections: 2-4 sections
- •Code examples: 3-5 per station
- •HAP note callouts: 2-4 per station
- •Quick reference tips: 6-8 tips (if included)
Too short (< 400 lines):
- •Likely missing content
- •May not cover topic adequately
- •Check for missing sections
Too long (> 600 lines):
- •May be overwhelming for students
- •Consider splitting into multiple stations
- •Remove redundant examples
Step 4: Heading hierarchy validation
Check heading levels follow semantic structure.
Required hierarchy:
h1 (page title) - EXACTLY ONE per page
└── h2 (main sections) - "What You'll Learn", topic headings
└── h3 (subsections) - Insight cards, HAP notes, code examples
Validation:
- • ONE
<h1>tag (station title) - •
<h2>for main sections (3-6 h2 tags typical) - •
<h3>for subsections and components - • NO skipped levels (no h1 → h3 without h2)
- • NO empty headings (
<h3></h3>)
Step 5: HAP component library reference
Available HAP components (from style.css):
| Component | Class | Use case |
|---|---|---|
| Insight cards | .insight-card | "What You'll Learn" section (3 cards) |
| HAP note callout | .hap-note-callout | HAP's personal insights/tips |
| Warning box | .warning-box | Wrong vs. Right code examples |
| Prompt box | .prompt-box | Code examples with explanation |
| Tip cards | .tip-card | Quick reference tips (numbered) |
| Topic section | .topic-section | Main content wrapper |
| Interactive demo | .interactive-demo | Links to demo files |
When to use each:
- •Insight cards: ONLY in "What You'll Learn" section (EXACTLY 3)
- •HAP note callout: For personal stories, Prof. Teeters insights, mistakes shared
- •Warning box: For code comparisons (wrong vs. right)
- •Prompt box: For correct code examples with explanation
- •Tip cards: For quick reference lists (6-8 tips)
- •Interactive demo: When station has associated demo file
Step 6: Review checklist
Before committing station HTML, verify:
Structure:
- • All 6 required sections present in order
- • Skip link is first element in body
- • Main has
id="main-content" - • Navigation has correct
aria-label
Content:
- • HAP's voice in all narrative sections
- • Code examples use Prism.js syntax highlighting
- • 2-4 main content sections (appropriate length)
- • Quick reference section (if topic warrants it)
Images:
- • HAP avatar has
fetchpriority="high" - • All other images have
loading="lazy" - • All images have
widthandheight - • All images have descriptive
alttext
Accessibility:
- • Skip link present
- • Heading hierarchy correct (no skipped levels)
- • Navigation landmarks have
aria-label - • No empty headings
Footer:
- • HAP's reminder customized to station
- • Trademark symbols present
- • Copyright year correct
Common mistakes
From Colors project station analysis:
- •
Wrong number of insight cards
- •Issue: 2 cards or 4 cards instead of exactly 3
- •Fix: Always use exactly 3 insight cards in "What You'll Learn"
- •
Multiple paragraphs in intro box
- •Issue: Using multiple
<p>tags in intro box - •Fix: Use EXACTLY one
<p>tag (combine content if needed)
- •Issue: Using multiple
- •
Missing bottom navigation
- •Issue: Stations without prev/next links
- •Fix: Always include bottom navigation (except special cases for station 1/6)
- •
Inconsistent section ordering
- •Issue: Sections in different order than Station 1 (e.g., Quick Reference before Try It Yourself)
- •Fix: Use grep to compare against Station 1 pattern:
grep -n "SECTION [0-9]" stations/station1.html stations/station[N].html - •Pattern: What You'll Learn → Main Content → Try It Yourself → Quick Reference → Additional Sections
- •
Inconsistent HAP voice
- •Issue: Switching from first-person to instructional mid-station
- •Fix: Use hap-voice Skill to validate all content
- •
Wrong Prism language
- •Issue:
<code class="language-markup">instead oflanguage-html - •Fix: Use correct language:
language-css,language-html,language-javascript
- •Issue:
- •
Missing aria-labels
- •Issue: Navigation without descriptive labels
- •Fix: Top nav = "Page navigation", Bottom nav = "Station pagination"
- •
Empty headings
- •Issue:
<h3></h3>tags with no content - •Fix: Remove empty headings or add content
- •Issue:
Example station structure
Minimal complete station (400 lines):
<!DOCTYPE html>
<html lang="en">
<head>
[Standard meta tags, CSS links, favicons]
</head>
<body>
<a href="#main-content" class="skip-link">Skip to main content</a>
<header class="header">
[HAP avatar + title + intro box]
</header>
<nav aria-label="Page navigation" class="page-navigation top-nav">
[Back to Hub + Station N of 6]
</nav>
<main id="main-content" class="content-container">
<section class="content-section">
<h2 class="section-heading-centered">What You'll Learn at This Station</h2>
<div class="overview-grid mt-2">
[3 insight cards]
</div>
</section>
<section class="content-section">
[Main topic 1 with code examples]
</section>
<section class="content-section">
[Main topic 2 with HAP notes]
</section>
<section class="content-section">
[Quick reference tips]
</section>
</main>
<nav aria-label="Station pagination" class="page-navigation bottom-nav">
[Previous + Hub + Next]
</nav>
<footer class="footer">
[HAP reminder + copyright]
</footer>
<script src="../js/easter-egg.js"></script>
[Prism.js scripts if code examples present]
</body>
</html>
Notes
- •Station structure is non-negotiable — all 6 sections required
- •EXACTLY 3 insight cards (established pattern across all HAP labs)
- •ONE paragraph in intro box (keeps it concise and focused)
- •HAP's voice must be consistent throughout
- •Code examples should be copy-paste ready (tested and working)
- •Quick reference section is optional but recommended
Skill version: 1.0 Last updated: October 2025 Source: station3.html complete structure analysis + style guide component library