Namaste Salesforce — a Ghost theme for a Salesforce learning site

Back to project

An open-source Ghost theme (forked from Casper) built into an LMS for Salesforce learners — courses, training tracks, a docs help center, dark mode, all on Tailwind CSS v4.

Build log 20 Jul 2026 1 min read

Part 6 — Docs help center, training-as-content, and a mobile pass

A run of sessions turning two remaining rough edges — docs and training — into real content-driven sections, then a pass to make the whole site behave on mobile.

What I did

  • Rebuilt documentation as an actual help center: 9 sections, 47 articles, nested at /docs/{section}/{article}/.
  • Reworked training so a "section" is a real Ghost post (not a route-only construct) — a trail hero, a roadmap of sections, a section player, and JSON-LD, all driven by #training/#training-content tags.
  • Wired the homepage, docs, and training templates onto the section-based content model consistently.
  • Mobile pass: scaled typography and touch targets down for small screens, lazy-loaded offscreen images while keeping above-fold images eager, and fixed a malformed DOM in home.hbs that was causing ad overflow on mobile.

What broke / what was tricky

Two training bugs slipped through after the section-as-post rework:

  1. The training roadmap came up empty because section-item wasn't receiving a view param it needed to render.
  2. Training sections were being detected by looking at their lessons instead of the section's own post — which meant an empty section (no lessons yet) simply didn't show up at all. Fixed by detecting sections by their post directly, independent of whether they had content under them yet.

How I fixed it

Both were one-line-of-logic fixes once diagnosed, but diagnosing them meant tracing the query chain from route → section lookup → template partial to find where the assumption ("a section always has lessons") had leaked in.

When a list is driven by a join through child content, decide up front whether the parent is allowed to exist without children — and detect/query for the parent directly if so. Deriving existence from children breaks the moment the first empty parent shows up.

Advertisement