Theme Nonprofit — Improvement & Growth Plan
Package: capell-app/theme-nonprofit · Kind: theme · Tier: premium · Product group: Capell Themes · Bundle: themes · Status: Complete
1. Snapshot
Section titled “1. Snapshot”theme-nonprofit registers theme key nonprofit via NonprofitThemeServiceProvider::definition() (a ThemeDefinitionData with runtime: FrontendRuntime::Blade), wiring a BladeThemeRenderer to layout view capell-theme-nonprofit::page plus one preset (nonprofit). It declares 17 includedSections (navigation, hero, features, proof, content-listing, impact, donation-impact, campaigns, volunteer-donate, volunteer-shifts, annual-report-proof, events, stories, contact, newsletter, cta, footer); navigation and footer are delegated back to Foundation Theme (isFoundationSection()), and seven sections receive optional-package flags (Campaign Studio → campaigns/donation-impact, Form Builder → volunteer-donate/volunteer-shifts, Events → volunteer-shifts/events, Newsletter → newsletter, Blog → stories, Payments → donation-impact/volunteer-donate). The demo command capell:theme-nonprofit-demo {--url=} {--languages=} {--sites=} {--force} delegates to InstallNonprofitThemeDemoAction → ThemeDemoPageInstaller::run(..., 'nonprofit', 'Nonprofit') (Foundation-owned installer; this package contributes no per-layout demo builder of its own). The marketplace summary/Composer description now use buyer-facing charity, NGO, and civic supporter-journey positioning. Health checks now verify provider, package file, manifest, and screenshot boundaries. Screenshots: docs/screenshots.json declares 9 required PNG captures, all committed under docs/screenshots/; capell.json references 6 marketplace assets, with the extension-card and hero JPG previews plus 3 route-backed PNG captures for homepage, volunteer/donate, and impact workflows.
Completed Improvement Slices
Section titled “Completed Improvement Slices”- 2026-06-03: Rewrote marketplace/Composer copy, replaced the critical health-check stub with real diagnostics, and documented the intentional split between runtime
extends: defaultand manifest dependencyextends: capell-app/foundation-theme. - 2026-06-04: Added the missing
main-contenttarget for the skip link, moved the events section eyebrow into translations, removed public Blade package introspection from campaigns, and added tests for those boundaries. - 2026-06-06: Replaced the 3 SVG marketplace layout diagrams with Capell runner PNG captures and fulfilled the 9-entry
docs/screenshots.jsoncontract. - 2026-06-07: Migrated public section palette classes to semantic Nonprofit token classes backed by
--nonprofit-*/--theme-*variables, with focused tests guarding brand-token emission and section palette literals. - 2026-06-07: Made campaigns, stories, and contact cards consume hydrated
$section->itemsfirst, with translated fallback cards for empty demo states. - 2026-06-07: Added hero LCP image attributes, meaningful fallback alt text, and a data-driven campaign progress bar with ARIA value metadata.
- 2026-06-07: Added per-section render coverage for every Nonprofit-owned section and connected/static branch coverage for all optional integrations.
2. Improvements (existing functionality)
Section titled “2. Improvements (existing functionality)”Prioritized. Real templates only.
- Shipped 2026-06-07: Brand tokens drive section palette colours —
S→M.page.blade.phpwrites the preset palette into CSS custom properties via$brand->tokens(), andtheme-nonprofit.cssnow maps section surfaces, dark panels, accent text, borders, and on-dark text through semantic Nonprofit classes backed by--nonprofit-*/--theme-*tokens. Focused public-output tests guard against section Blade reintroducing key literal palette hex values. - No
tw:prefix on any utility class —M. The frontend-tailwind guideline mandates atw:prefix to avoid Bootstrap collisions on store frontends. Every class in every section is bare (mx-auto,grid,font-black, …). Confirm whether Capell theme output is exempt (it may compile its own isolated Tailwind via the registeredtailwindImport/tailwindSourcevendor assets); if not exempt, this is a systemic prefix bug across all 16 views. Files: all ofresources/views/sections/*.blade.php+page.blade.php. Resolve the exemption question before mass-editing. - Shipped 2026-06-07:
campaigns,stories, andcontactconsume section items first —M. These sections now render hydrated$section->itemsbefore falling back to translated demo cards, so editors and package integrations can provide real campaign, story, and supporter-routing content without Blade changes. Focused registry coverage proves supplied items replace the old static placeholders. - Shipped 2026-06-07: Hero campaign progress and media are data-driven —
S. The hero now derives campaign title, display value, and clamped progress width from section data with translated fallbacks. The progress bar exposesrole="progressbar"and value metadata, and hero media now has meaningful fallback alt text plus width, height, loading, decoding, and fetch-priority attributes. navigation/footersection views are dead code —S.navigation.blade.phpandfooter.blade.phpexist and render an<h2>, butisFoundationSection()makes the provider returnnullfor both, so Foundation Theme renders nav/footer instead and these files are never used by the renderer. Either delete them (reduce confusion) or document why they ship. Files:resources/views/sections/navigation.blade.php,footer.blade.php, cross-refsrc/NonprofitThemeServiceProvider.php.features.blade.phpreads$section->features ?? $section->items—S. Inconsistent with the rest of the suite which standardises onitems. Confirm the coreFeatureSectionDatashape (the definition test importsFeatureSectionData) and pick one accessor. File:resources/views/sections/features.blade.php.- Responsive type is heavy on mobile —
S. CSS setsh1toclamp(3rem, 6vw, 5.75rem)and hero<h2>totext-5xlwith nosm:step-down;font-weight: 850/820plusmax-width: 12chproduces very large, cramped headings on small screens. Add mobile-first size steps. Files:resources/css/theme-nonprofit.css,resources/views/sections/hero.blade.php.
3. Missing Features (gaps)
Section titled “3. Missing Features (gaps)”capabilities[] is only ["theme-nonprofit", "theme-nonprofit-frontend"] — pure presentation, no functional capability, which is correct for a theme but means every interactive nonprofit need is a cross-sell, and the theme must visibly invite those installs.
Table-stakes nonprofit renderer surfaces are now present at the theme boundary:
- Donation CTA/flow shipped. Payments availability now drives a translated giving branch with hydrated primary/secondary donation actions while preserving static fallback CTAs.
- Volunteer signup shipped for theme scope. Form Builder and Events availability drive connected/static volunteer and shift messaging, with hydrated action data and branch coverage.
- Campaigns/causes deepened. Campaign Studio connected cards now render hydrated appeal progress, goal, summary, and action data rather than only copy swaps.
- Impact stats remain a differentiator.
impactanddonation-impactrender hydrated proof/progress data and support the giving branch. - Events deepened. Events connected branches render hydrated event cards with date, location, type, and action links.
- Stories/testimonials data-driven. Stories render supplied items before translated fallback cards, avoiding duplicate placeholder-only output.
- Transparency / annual reports shipped.
annual-report-proofcovers transparency proof as a nonprofit differentiator. - Newsletter signup shipped.
newsletterrenders static, hydrated custom-action, and Newsletter-route connected supporter capture states. - Future fundraising depth. Gift Aid, donor walls, recurring-giving models, and fully model-backed fundraising thermometers remain optional product-package depth beyond the renderer.
4. Issues / Risks
Section titled “4. Issues / Risks”- Dual
extendsmeaning is documented, but should stay tested — capell.json declares the package dependency ("extends": "capell-app/foundation-theme") whiledefinition()uses the Theme Studio runtime inheritance key (extends: 'default'). The provider now documents the distinction; keep tests around both boundaries so this does not regress. File:capell.json,src/NonprofitThemeServiceProvider.php. - Shipped 2026-06-04: Hard-coded untranslated copy in
events.blade.php— theCampaigns Calendareyebrow now usescapell-theme-nonprofit::generic.events_label, and render tests assert the translated label is used. File:resources/views/sections/events.blade.php. - Shipped 2026-06-06: screenshot/media debt closed — 9 declared PNG capture paths now exist under
docs/screenshots/, each with runner fixture URL metadata. The 3 marketplace SVG layout diagrams have been removed and replaced with real Capell runner PNG captures for homepage, volunteer/donate, and impact workflows. Files:docs/screenshots.json,capell.json,docs/screenshots/*. - Shipped 2026-06-07: Dark mode —
theme-nonprofit.cssdefines scoped.dark .nonprofit-shell,.nonprofit-shell.dark, andprefers-color-scheme: darktoken layers with text, surface, border, and on-dark normalization. File:resources/css/theme-nonprofit.css. - WCAG concerns closed for current roadmap. Default token pairings have focused contrast coverage, the page path has a single hero-owned
<h1>after themain-contentskip-link target, following sections keep<h2>headings, and the data-driven hero progress bar exposesrole="progressbar"plus value attributes. Files:events.blade.php,cta.blade.php,annual-report-proof.blade.php,hero.blade.php,page.blade.php. - Shipped 2026-06-07: Hero LCP image and progress metadata.
hero.blade.phpnow renders non-empty fallback alt text for hero media, intrinsic dimensions, eager/high-priority loading, async decoding, and a data-driven progress bar withrole="progressbar"andaria-valuenow. Remaining visual follow-up: verify the third-party demo image crop in route-backed screenshots. - Performance budget covered.
capell.jsonsetsfrontendRenderBudgetMs: 20andadminQueryBudget: 0; scoped render-budget coverage now renders every owned section under the budget with zero select queries. File:capell.json. - Shipped 2026-06-04: Optional-package detection duplicated in Blade —
campaigns.blade.phpnow relies on the provider-injectedcampaignStudioAvailableflag, andPublicOutputSafetyTestguards against futureCapellCore::isPackageInstalledcalls in public Blade. File:resources/views/sections/campaigns.blade.php. - Test gaps closed for current roadmap. Per-section render coverage asserts every Nonprofit-owned section compiles with empty/partial
$sectiondata,PackageAwareRendererTestcovers connected/static branches for optional sections, and focused tests cover WCAG contrast plus render-budget/no-query behavior. - Shipped 2026-06-05: Version/PHP drift —
composer.jsonnow requiresphp: ^8.4,CHANGELOG.mdincludes the recent package improvement slices, and manifest tests guard the package Composer PHP constraint.capell.jsonremainsmanifest-version: 3pending sibling parity review. Files:composer.json,CHANGELOG.md,tests/Unit/ManifestRequirementsTest.php.
5. Marketplace & Selling
Section titled “5. Marketplace & Selling”The manifest and Composer description now use this buyer-facing 1-sentence summary:
A premium charity, NGO, and civic theme that moves visitors from your mission to a clear support action — donate, volunteer, or follow — with impact proof, live campaign progress, and transparent annual-report sections built in.
The manifest marketplace description now uses this buyer-facing product story:
Theme Nonprofit gives charities, NGOs, and civic organisations a calm, trust-building front end engineered around the supporter journey: a campaign-led hero, impact evidence, donation and volunteer paths, events, community stories, and transparency/annual-report sections. It ships as a Capell theme with accessible defaults (skip link, focus-visible outlines, semantic sections) and a route-backed demo you can install in one command to preview a complete cause site. Sections light up automatically when you add Capell Payments (donations), Campaign Studio (live appeals), Events, Blog, and Form Builder — no template surgery required. Premium, first-party, and priority-supported for teams who need a public site that converts interest into sustained giving.
Media status: the 3 layout SVG placeholders have been replaced with route-backed PNG captures, and the 9-entry docs/screenshots.json capture plan is fulfilled. Remaining media depth is optional polish: add connected-state shots for live donations/campaigns/events and a dark-mode view once those product branches are built.
Differentiation / target buyer: vs the other Capell themes (theme-healthcare is the closest sibling in structure), Nonprofit’s unique sections are donation-impact, campaigns, volunteer-donate/shifts, and especially annual-report-proof (transparency proof is a real nonprofit differentiator most generic themes lack). Target buyer: small-to-mid charities, foundations, NGOs, advocacy/campaign groups, and civic/community organisations who want a donation- and trust-oriented site without bespoke design. Lead the listing on trust + a clear support path, not on section count.
Completed 2026-06-07. Every prioritized roadmap row is closed. Theme Nonprofit now has route-backed captures, PHP/changelog alignment, tokenized/dark styling, WCAG and render-budget guards, LCP/progress metadata, Payments/Campaign Studio/Events/Newsletter/Form Builder connected branches, per-section render coverage, data-driven supporter journey sections, and a documented Tailwind-prefix exemption.
Keywords/tags (8–12): nonprofit theme, charity website, NGO, donation, fundraising, campaigns, volunteer, civic, impact reporting, annual report, community, Capell theme.
6. Prioritized Roadmap
Section titled “6. Prioritized Roadmap”| Item | Bucket | Effort | Impact | Section ref |
|---|---|---|---|---|
Add <h1>/heading-order review after the skip-link target fix | Done | S | High | §4 WCAG — closed 2026-06-05: hero now owns the single public <h1> in the page path after the main-content skip-link target, and focused tests assert following sections keep <h2> headings. |
Generate the 9 declared docs/screenshots/*.png; replace 3 SVG placeholders with real captures; verify demo routes resolve | Done | M | High | §1, §4, §5 — closed 2026-06-06: 9 route-backed PNG captures are committed and marketplace SVG diagrams were replaced with real workflow screenshots. |
Bump composer.json PHP to ^8.4; populate CHANGELOG.md | Done | S | Low | §4 — closed 2026-06-05: package Composer now requires ^8.4, the changelog has dated recent entries, and manifest tests assert the PHP constraint. |
| Drive section colours from brand tokens instead of literal hex | Done | M | High | §2.1 — closed 2026-06-07: public section Blade now uses semantic Nonprofit token classes, and focused tests guard brand-token emission plus section palette literals. |
Make campaigns/stories/contact iterate $section->items (kill duplicate placeholder cards) | Done | M | High | §2.3 — closed 2026-06-07: hydrated section items now render before translated fallback cards, with focused registry coverage. |
| Add WCAG contrast pass on dark/emerald section text + amber-on-dark | Done | M | High | §4 WCAG — closed 2026-06-07: default preset pairings now have focused luminance-ratio coverage, and giving surfaces use semantic muted/on-dark/accent token classes. |
Hero image: real alt, width/height/loading/fetchpriority; data-driven progress bar with role="progressbar" | Done | S | Med | §2.4, §4 — closed 2026-06-07: hero media includes LCP attributes and campaign progress is clamped, data-driven, and exposed through progressbar ARIA. |
Add Payments (donations) optional integration + a real donate/giving section | Done | M | High | §3 — closed 2026-06-07: capell-app/payments availability now drives a translated giving branch with hydrated primary/secondary donation actions and connected/static branch coverage. |
| Per-section render tests (empty/partial data) + connected/static branch tests for all 6 optional sections | Done | M | Med | §4 tests — closed 2026-06-07: all owned sections compile with partial data, and optional integration branches are covered across all six sections. |
Add Newsletter supporter-capture section with capell-app/newsletter detection | Done | M | Med | §3 — closed 2026-06-07: newsletter now renders static, hydrated custom-action, and Newsletter-route connected supporter capture states with public-output coverage. |
Add dark-mode palette + dark: variants; render-budget guard test (20ms) | Done | M | Med | §4 — closed 2026-06-07: scoped .dark/prefers-color-scheme Nonprofit token layers now ship, with every owned section covered by a zero-query 20ms render-budget guard. |
| Deepen Campaign Studio / Events connected branches into real appeal cards + event lists (fundraising thermometer) | Done | L | High | §3 — closed 2026-06-07: connected campaign cards render hydrated progress/goal/action data, and events render hydrated event cards with date, location, type, and action links. |
Resolve/justify tw: prefix exemption; apply prefix if not exempt | Done | M | Med | §2.2 — closed 2026-06-07: package theme Blade remains unprefixed because it is compiled through isolated tailwindImport/tailwindSource assets; a source guard pins the exemption. |