Skip to content

Theme Education — Improvement & Growth Plan

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

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 InstallEducationThemeDemoActionThemeDemoPageInstaller::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.

  • 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.
  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.phpM
  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.phpS
  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.phpS
  4. Shipped 2026-06-06: Drive section colours from brand tokens, not arbitrary hextheme-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.cssL
  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.phpM
  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.phpM
  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.phpM
  8. Shipped 2026-06-06: Add a prefers-reduced-motion blocktheme-education.css now disables transforms, transitions, animations, and smooth scrolling inside .education-shell when the visitor requests reduced motion. — resources/css/theme-education.cssS
  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.cssL

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 shippedcourse-detail gives programmes a syllabus/module style section for fit, duration, and outcomes.
  • Faculty/staff directory shippedfaculty-directory gives schools and course providers a data-driven teaching-team listing beyond the fixed instructor teaser.
  • Events/calendar partially coveredevents 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 shippedadmissions-funnel adds a multi-step application pathway section; Form Builder remains the optional capture path for the existing enrolment CTA.
  • News/announcementsresources 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 matrixpathway-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.

  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.jsonDone
  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.mdDone
  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.mdDone
  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.phpDone
  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.

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.

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.

ItemBucketEffortImpactSection ref
Shipped 2026-06-06: Replace generic theme-gallery fixture PNGs with real Education renderer capturesDoneMHigh§4.6, §5
Reconcile extends (default vs foundation) and surfaces (frontend vs +console)DoneSMed§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-installDoneMMed§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, instructorsDoneMHigh§2.1–2.3
Rewrite marketplace summary (+ extend composer keywords/description)DoneSHigh§5
Fix or remove the dead carousel prev/next controlsDoneMMed§4.1
Give ThemeEducationHealthCheck real assertions (theme key, views, assets)DoneMHigh§4.2
Shipped 2026-06-06: Add test iterating includedSections → each view exists & rendersDoneMMed§4.10
Shipped 2026-06-06: Make course-catalog and events data-driven (loops + empty states)DoneMHigh§2.5, §2.6, §3
Shipped 2026-06-06: Drive section colours from --site-theme-* brand tokens, not arbitrary hexDoneLMed§2.4
Shipped 2026-06-06: Resolve navigation/footer orphan views (deleted; Foundation owns them)DoneMMed§2.7
Shipped 2026-06-06: WCAG pass: guarantee an <h1>, audit contrast, fix carousel a11yDoneMHigh§4.9
Shipped 2026-06-06: Add prefers-reduced-motion guard + start CHANGELOG.mdDoneSLow§2.8, §4.11
Shipped 2026-06-06: Add course-detail + faculty-directory + admissions-funnel sectionsDoneLHigh§3
Shipped 2026-06-06: Add dark-mode token set as a marketplace differentiatorDoneLMed§2.9, §3