# Theme Education — Improvement & Growth Plan

> Package: capell-app/theme-education · Kind: theme · Tier: premium · Product group: Capell Themes · Bundle: themes · Status: Complete

## 1. Snapshot

`theme-education` registers theme key `education` via `EducationThemeServiceProvider::definition()` (a `ThemeDefinitionData` with 19 `includedSections` and one `education` preset) and a `BladeThemeRenderer` whose layout view is `capell-theme-education::page`. Section renderers are built by mapping `includedSections` to `capell-theme-education::sections.<key>` views, skipping `navigation`/`footer` (treated as foundation sections); `events`, `admissions-checklist`, `enrolment-cta`, and `resources` receive optional integration flags for Events / Form Builder / Blog. The demo command is `capell:theme-education-demo {--url=} {--languages=} {--sites=} {--force}`, delegating to `InstallEducationThemeDemoAction` → `ThemeDemoPageInstaller::run($data, 'education', 'Education')`; demo layouts are route-backed pages described in `docs/screenshots.json`. The theme **overrides** 17 section views + a `page.blade.php` shell + `theme-education.css`, and **inherits** navigation, footer, and demo plumbing from `capell-app/foundation-theme`. Marketplace and Composer copy are buyer-facing, `capell.json` promotes the extension card plus real route-backed homepage/enrolment captures, and the screenshot gallery is refreshed through the actual Education theme renderer.

## Completed Improvement Slices

- **2026-06-03:** Added buyer-facing marketplace and Composer copy, replaced the stub Diagnostics health check with real theme registration/view/vendor-asset probes, and limited marketplace screenshots to committed preview assets.
- **2026-06-06:** Captured all 9 `docs/screenshots.json` route-backed targets through the Capell runner, then demoted the gallery after verifying the route renders the generic `theme-gallery` fixture rather than the package theme shell.
- **2026-06-06:** Fixed the screenshot wrapper to seed/capture one theme package at a time, mark frontend theme entries anonymous, and suppress the Insights consent banner during screenshot runs; `/theme-education` now captures the real styled Education shell and the homepage PNG is promoted into marketplace media.
- **2026-06-04:** Moved course catalogue, event, and instructor default card copy into translations, removed the non-functional hidden course carousel controls, replaced the theme-specific carousel selector with a generic public selector, and added tests for translated defaults plus manifest JSON shape handling.
- **2026-06-05:** Verified the post-install asset contract: the theme preview publishes the committed marketplace card to `/vendor/capell/themes/education.jpg`, while CSS resolves through Foundation Theme's generated frontend Tailwind entrypoint fed by `resources/css/theme-education.css`.
- **2026-06-06:** Closed the remaining roadmap rows with tokenized colour handling, data-driven catalogue/event sections, real route-backed screenshots, WCAG/reduced-motion/dark-mode work, orphan-view cleanup, included-section render coverage, and the new `course-detail`, `faculty-directory`, and `admissions-funnel` sections.

## 2. Improvements (existing functionality)

1. **Course catalogue defaults are translated.** — The fixed course catalogue defaults now come from `capell-theme-education::generic.course_catalog_cards`, so the multi-language demo can localise format, title, and summary copy. Full editor-provided catalogue data is still a separate row. — `resources/views/sections/course-catalog.blade.php`, `resources/lang/en/generic.php`, `tests/Unit/EducationThemeDefinitionTest.php` — **M**
2. **Events defaults are translated.** — Static event card titles, signal labels, and summaries now come from `capell-theme-education::generic.event_cards`; the connected/static availability badge remains package-aware. Real Events package data remains a separate row. — `resources/views/sections/events.blade.php`, `resources/lang/en/generic.php`, `tests/Unit/EducationThemeDefinitionTest.php` — **S**
3. **Instructor role defaults are translated.** — The role list now comes from `capell-theme-education::generic.instructor_roles` instead of an inline Blade array. — `resources/views/sections/instructors.blade.php`, `resources/lang/en/generic.php`, `tests/Unit/EducationThemeDefinitionTest.php` — **S**
4. **Shipped 2026-06-06: Drive section colours from brand tokens, not arbitrary hex** — `theme-education.css` now sources `--site-theme-primary`, `--site-theme-accent`, surface, ink, and border colours from theme tokens and applies scoped overrides for the recurring arbitrary Tailwind colour utilities used by section views. Preset/brand changes now propagate through the Education shell chrome. — `resources/views/sections/*.blade.php`, `resources/css/theme-education.css` — **L**
5. **Shipped 2026-06-06: Make `course-catalog` data-driven** — the catalogue now prefers editor/renderer-provided `$section->items`, supports course URLs, keeps translated defaults as a fallback, and renders a translated empty state for intentionally empty data. — `resources/views/sections/course-catalog.blade.php` — **M**
6. **Shipped 2026-06-06: Make `events` data-driven with an Events integration path** — the section now prefers `$section->items`, supports event URLs/dates, keeps the Events connected/static badge meaningful, falls back to translated defaults, and renders a translated empty state for intentionally empty data. — `resources/views/sections/events.blade.php` — **M**
7. **Shipped 2026-06-06: Remove orphan `navigation` and `footer` views** — the package now relies on Foundation for the two foundation sections and no longer ships dead Education section views or health-check requirements for them. — `src/EducationThemeServiceProvider.php`, `src/Health/ThemeEducationHealthCheck.php` — **M**
8. **Shipped 2026-06-06: Add a `prefers-reduced-motion` block** — `theme-education.css` now disables transforms, transitions, animations, and smooth scrolling inside `.education-shell` when the visitor requests reduced motion. — `resources/css/theme-education.css` — **S**
9. **Shipped 2026-06-06: dark-mode variant** — `.dark .education-shell` / `.education-shell.dark` now define a dark Education token set with dark surfaces, borders, muted text, and card overrides. — `resources/css/theme-education.css` — **L**

## 3. Missing Features (gaps)

Declared `capabilities[]`: `theme-education`, `theme-education-frontend` — coarse, frontend-only. Against what an education/schools site actually needs:

**Table-stakes coverage after this plan:**

- **Course/program detail layout shipped** — `course-detail` gives programmes a syllabus/module style section for fit, duration, and outcomes.
- **Faculty/staff directory shipped** — `faculty-directory` gives schools and course providers a data-driven teaching-team listing beyond the fixed instructor teaser.
- **Events/calendar partially covered** — `events` is now data-driven and can render dated editor-provided items, but full Events-package querying, term calendars, iCal, and structured data remain future product depth.
- **Admissions/enrolment funnel shipped** — `admissions-funnel` adds a multi-step application pathway section; Form Builder remains the optional capture path for the existing enrolment CTA.
- **News/announcements** — `resources` leans on Blog, but there's no school-news or term-bulletin pattern distinct from a generic blog feed.
- **Prospectus / downloads** — no prospectus-download or document-library section (a near-universal schools ask).

**Differentiators (would set it apart):**

- **Programme-comparison matrix** — `pathway-comparison` is a start; a true side-by-side compare table (format / duration / level / price) would be a standout for course providers.
- **Student/parent portal links** — a configurable "log in to portal / VLE / LMS" block.
- **Campus/facilities** — gallery + map section for physical schools.
- **Term/cohort schedule** — intake dates and application deadlines surfaced in the hero.

**Vs siblings / cross-sell:** the package already declares `supports` for `blog`, `events`, `form-builder`, `seo-suite`, `layout-builder`. The admissions funnel and data-driven event cards now make the Events/Form Builder cross-sell more credible, while true first-party Events querying and Form Builder application handoff remain future product depth.

## 4. Issues / Risks

1. **Dead carousel controls removed.** `course-catalog.blade.php` keeps native horizontal scroll-snap on mobile, removes the hidden/unwired prev/next buttons, and uses `data-carousel="course-catalog"` instead of the theme-specific `education-course-catalog` selector. — `resources/views/sections/course-catalog.blade.php`, `tests/Unit/EducationThemeDefinitionTest.php`
2. **Health check shipped.** `ThemeEducationHealthCheck` now probes Theme Studio registration, required views, and vendor asset registration; tests cover passing diagnostics and an unregistered theme failure. — `src/Health/ThemeEducationHealthCheck.php`, `tests/Unit/ThemeEducationHealthCheckTest.php`
3. **Manifest contribution accepted.** `ThemeManagementPageContribution` is intentionally a compatibility marker for the shared Theme Extension page; the theme key is supplied through `capell.json` page parameters. — `src/Manifest/ThemeManagementPageContribution.php`, `capell.json` — **Done**
4. **Dual `extends` meaning documented.** `definition()` sets runtime inheritance to `default`, while `capell.json` records the installable Foundation Theme package dependency as `capell-app/foundation-theme`; README/overview now document that split. — `src/EducationThemeServiceProvider.php`, `capell.json`, `README.md` — **Done**
5. **Surfaces aligned for renderer scope.** `capell.json`, README, and overview now treat Education as a frontend renderer package with a demo command rather than a package-owned console surface. — `capell.json`, `README.md`, `docs/overview.md` — **Done**
6. **Shipped 2026-06-06: Screenshot contract refreshed with real renderer captures.** `docs/screenshots.json` declares route-backed frontend entries and every path exists under `packages/theme-education/docs/screenshots/`. The screenshot wrapper reaches the real Education renderer, the seven frontend PNGs have been recaptured after the CSS/accessibility work, and `capell.json` promotes the homepage plus enrolment CTA captures. Some directory/resource/event entries still share generic seeded content, so future demo-content work should differentiate those pages before promotion. — `docs/screenshots.json`, `capell.json`, `docs/screenshots/` — **Done**
7. **`previewImage`/`assets` paths verified.** `definition()` now publishes the committed marketplace card to `/vendor/capell/themes/education.jpg`, and `assets['css']` points at Foundation Theme's generated frontend CSS entrypoint (`resources/css/capell/frontend.css`). The package-owned stylesheet remains `resources/css/theme-education.css` and is registered as a `VendorAssetData::tailwindImport`, so Tailwind generation, not a per-theme static CSS publish, is the source contract. — `src/EducationThemeServiceProvider.php`, `tests/Unit/EducationThemeDefinitionTest.php` — **Done**
8. **Performance budget documented as residual risk.** `capell.json` sets `frontendRenderBudgetMs: 20`, `adminQueryBudget: 0`, and `cacheSafety.cacheable: false`. Pure-Blade sections with no DB access make `adminQueryBudget: 0` correct; cacheability can be revisited in a future platform-wide theme caching pass. — `capell.json` performance block — **Future**
9. **Shipped 2026-06-06: WCAG pass for heading hierarchy, contrast, and carousel a11y** — the hero heading now renders as the page `<h1>`, muted/accent text routes through darker token-derived colours, and the earlier course-carousel cleanup leaves no visible dead controls when JavaScript is absent. Decorative blueprint blocks still use `aria-hidden="true"`, and skip-link/focus-visible support remains in CSS. — section views + `resources/css/theme-education.css` — **(M)**
10. **Included-section coverage shipped.** `tests/` covers theme definition contract, translated default education layouts, manifest requirements, package-aware rendering (events connected/static), public-output safety, health diagnostics, demo-command delegation/idempotency, and now iterates `definition()->includedSections` so every non-foundation key resolves to an existing renderable view. Full content-listing/resources variant matrices, real Events data, and automated accessibility scanning remain future depth. — `tests/Unit/` — **Done**
11. **Changelog started.** Release notes exist for the marketplace/health-check and translated default-copy slices; future package waves should continue adding entries. — `CHANGELOG.md`

Public-output safety is otherwise well-handled: `page.blade.php` emits only brand tokens + `{!! $content !!}`, no DB queries in Blade, and `PublicOutputSafetyTest` asserts the absence of `capell-app/theme-education`, `data-theme-key`, `wire:`, `signed`, `DB::`, `loadMissing(`, `model_id`, `permission`, etc. Keep that test green for any new section.

## 5. Marketplace & Selling

Marketplace and Composer copy now use the improved buyer-facing positioning below, and composer keywords include education, courses, enrolment, academy, bootcamp, curriculum, instructors, admissions, and learning-pathway terms.

**Improved 1-sentence summary:**

> A polished, course-first theme for schools, academies, and training providers — turning programme discovery, faculty trust, open days, and enrolment into one coherent learner journey.

**Improved 3–4 sentence description:**

> Theme Education gives schools, course providers, and training teams a complete learning-pathway frontend without commissioning a custom build. Purpose-shaped sections cover course catalogues, instructor and mentor profiles, learning outcomes, open days, resources, FAQs, and a guided enrolment call-to-action. It integrates optionally with Capell Events for open-day calendars, Form Builder for applications and enquiries, and Blog for learning resources — degrading gracefully when those aren't installed. Built on Foundation Theme with brand-token theming, an accessible skip link and focus states, and zero database impact, so editors compose education pages through the normal Layout Builder workflow.

**Screenshot/media status:** frontend captures are route-backed through the real Education renderer. Marketplace media promotes the homepage plus enrolment CTA captures; catalogue/resource/event/instructor files remain committed evidence but should wait for stronger differentiated seeded content before promotion.

**Differentiation / target buyer:** sits among 10 sibling themes; closest neighbours are `theme-knowledge` and `theme-corporate`. Differentiate on the **enrolment funnel** (catalogue → instructors → outcomes → admissions checklist → enrolment CTA) and the **Events + Form Builder cross-sell** — no other theme is shaped end-to-end around converting a learner from discovery to application. **Target buyer:** independent course providers, bootcamps/academies, training departments, tutoring businesses, and small private schools running Capell.

**Keywords/tags (8–12):** Composer keywords now include `education`, `courses`, `school`, `e-learning`, `training`, `enrolment`, `academy`, `bootcamp`, `curriculum`, `instructors`, `admissions`, and `learning-pathway`; `definition()` tags `['Education','Courses','Enrolment']` are good but thin.

## Completion Review

Completed 2026-06-06. Every prioritized roadmap row is closed, the plan text has been reconciled to shipped behavior, and the remaining notes are future product-depth opportunities rather than active improvement-plan scope. Verification for the final slice used PHP lint, screenshot manifest validation, whitespace checks, and the Capell screenshot runner build; Pest/composer tests were intentionally skipped per instruction.

## 6. Prioritized Roadmap

| Item                                                                                                   | Bucket | Effort | Impact | Section ref                                                                                                                                                                                                     |
| ------------------------------------------------------------------------------------------------------ | ------ | ------ | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Shipped 2026-06-06: Replace generic `theme-gallery` fixture PNGs with real Education renderer captures | Done   | M      | High   | §4.6, §5                                                                                                                                                                                                        |
| Reconcile `extends` (`default` vs foundation) and `surfaces` (frontend vs +console)                    | Done   | S      | Med    | §4.4, §4.5 — closed 2026-06-05: manifest surfaces now include `console`, while tests keep runtime `extends: default` distinct from the package-level Foundation dependency.                                     |
| Verify `previewImage` / `assets` css paths resolve post-install                                        | Done   | M      | Med    | §4.7 — closed 2026-06-05: preview image now has a package-owned publish mapping; CSS resolves through the generated Foundation frontend Tailwind entrypoint with `theme-education.css` registered as an import. |
| Translate hard-coded copy in `course-catalog`, `events`, `instructors`                                 | Done   | M      | High   | §2.1–2.3                                                                                                                                                                                                        |
| Rewrite marketplace `summary` (+ extend composer keywords/description)                                 | Done   | S      | High   | §5                                                                                                                                                                                                              |
| Fix or remove the dead carousel prev/next controls                                                     | Done   | M      | Med    | §4.1                                                                                                                                                                                                            |
| Give `ThemeEducationHealthCheck` real assertions (theme key, views, assets)                            | Done   | M      | High   | §4.2                                                                                                                                                                                                            |
| Shipped 2026-06-06: Add test iterating `includedSections` → each view exists & renders                 | Done   | M      | Med    | §4.10                                                                                                                                                                                                           |
| Shipped 2026-06-06: Make `course-catalog` and `events` data-driven (loops + empty states)              | Done   | M      | High   | §2.5, §2.6, §3                                                                                                                                                                                                  |
| Shipped 2026-06-06: Drive section colours from `--site-theme-*` brand tokens, not arbitrary hex        | Done   | L      | Med    | §2.4                                                                                                                                                                                                            |
| Shipped 2026-06-06: Resolve `navigation`/`footer` orphan views (deleted; Foundation owns them)         | Done   | M      | Med    | §2.7                                                                                                                                                                                                            |
| Shipped 2026-06-06: WCAG pass: guarantee an `<h1>`, audit contrast, fix carousel a11y                  | Done   | M      | High   | §4.9                                                                                                                                                                                                            |
| Shipped 2026-06-06: Add `prefers-reduced-motion` guard + start `CHANGELOG.md`                          | Done   | S      | Low    | §2.8, §4.11                                                                                                                                                                                                     |
| Shipped 2026-06-06: Add course-detail + faculty-directory + admissions-funnel sections                 | Done   | L      | High   | §3                                                                                                                                                                                                              |
| Shipped 2026-06-06: Add dark-mode token set as a marketplace differentiator                            | Done   | L      | Med    | §2.9, §3                                                                                                                                                                                                        |