Converts content/gift/index.md to _index.md and extracts the shared
hero/form rendering into a partial (courses-body.html) used by both
single.html and a new list.html, so /gift renders identically but can
now hold real child pages like /gift/<partner>/.
The gift.reground.org vanity redirect already forwards any path
generically (redir https://reground.org/gift{uri}), so no
infrastructure change is needed to support future partnership URLs
like gift.reground.org/cheyenne once a matching page exists here.
Add a hero image (rendered from the redesigned PDF's own cover) so the
opt-in page shows the actual resource instead of pure text, and make
the post-submit message PDF-specific with a working /gift-thanks
fallback link instead of a generic dead-end "check your inbox" line.
Both are opt-in per-page params (hero_image, success_message) so the
real drip-course page's rendering is unchanged.
The gift PDF's closing CTA promises a conversation, so it needs a
landing page to point to. Kept separate from /gift-thanks since the
PDF can be read/forwarded independent of any signup on this site.
Traced from a piece of petrified root wood the user owns, simplified into
a flat currentColor SVG so it matches the header text in both light and
dark mode, plus a bio line explaining the connection.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Replaces the hero_heading/subheading/intro param-driven layout with a
plain markdown body (headshot, Creative Help, Technical Help, bio), so
layouts/index.html just renders .Content. Headshot is served from the
Linode bucket (same convention as the freebie PDF) rather than
committed to git. CSS floats the photo left with the first list
wrapping beside it, matching the site's font/color patterns.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Splits the single hardcoded-feeling course template into hero,
credibility, curriculum, and repeat-CTA sections, each rendering only
when its front matter fields are set. The enroll form (and its
EEC-trigger JS) moves into a reusable partial so it can appear more
than once on a page without id collisions.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Day one no longer sends immediately on signup — a readiness email
goes out first, and day one only sends once that's clicked. Update
the post-submit status text so it matches what actually happens.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Computed actual contrast ratios rather than eyeballing:
- White button text on teal was 3.67:1, fails AA (needs 4.5:1) — darkened
the CTA color to 007f73, now 4.90:1.
- Rose nav-hover text was 2.50:1 on the header, 1.82:1 on the footer —
both far below any AA threshold. Rose now shows as an underline instead
of a text color change, so the accent survives without breaking
legibility.
- Added a skip-to-content link (hidden until focused, standard pattern),
aria-label on both nav landmarks (header nav and footer nav previously
both announced as plain 'navigation' with no way to distinguish them),
and an explicit high-contrast focus-visible ring — including a
header-specific override since the default cta-color ring was only
~1:1 against the slate blue header background.
All values re-verified in both light and dark mode, not just light.
Reconciled two overlapping note sets — kept the intent from both,
resolved contradictions toward the more distinctive option (cream over
plain gray/white background), and fixed a couple of pairings that would
have been genuinely hard to read as written (teal button with taupe
text, rose links on taupe — both too low-contrast) by keeping the color
but swapping in white/higher-contrast text instead.
Slate blue header (firm, confident) with warm cream body (gentle,
breathing room), teal CTAs (clarity/action), dusty rose as the one purely
interactive/decorative touch (hover states), warm taupe grounding the
footer. Headings in slate blue to tie the brand color into the type
hierarchy. Roboto/Open Sans/Source Code Pro per the font pairing brief,
loaded via Google Fonts since that's what was specified.
Minified and fingerprinted in production (cache-busting via content
hash), plain link in dev. Sets up for actual styling work — much easier
to find and edit than a <style> block buried in baseof.html.
The API already returns specific, honest messages (e.g. 'this course
isn't open for signups yet' for an inactive course) — the frontend was
discarding them and always showing a generic 'something went wrong'.
Both forms nested their status message as a child of the <form>, so
form.hidden = true on success hid the confirmation right along with it —
looked like nothing happened. Contact form now resets and stays usable
(you can send another message) instead of disappearing; enroll form still
hides after signup (no reason to sign up twice), but its confirmation is
now a sibling so it actually stays visible.
Also generalized the privacy policy's language from being anchored on
email courses specifically to covering any use of the site.
- baseof.html: proper header/nav/footer, CSS custom properties for
light/dark, button and form component styles — no external theme
dependency, avoiding the submodule/version churn from the earlier
PaperMod attempt.
- Contact page: real form (honeypot spam protection) posting to the eec
service's new /contact endpoint, replacing the plain mailto CTA.
- Privacy Policy and Terms drafts — grounded in what's actually true here
(self-hosted mail/course infra, no third-party trackers), flagged as
drafts pending review.
- courses/ section with a generic single template driven by front matter
(eec_slug, pitch) and the first course, Find Your Right Readers —
landing page only; the actual course content isn't authored in
eec-courses yet, so enrolling will 404 until that's written.
- Fixed hugo.toml baseURL (was www.reground.org, but Caddy's canonical
host is the bare domain — www redirects to it, not the other way).
PaperMod's opengraph.html calls partial with a redundant "partials/"
prefix that the production Hugo version (0.154.5, from the
hugomods/hugo:exts build image) doesn't tolerate, breaking the build.
Rather than patch a vendored theme, replaced it with plain, dependency-
free layouts (baseof/index/single/list) that render the actual homepage
content directly. Verified building successfully against the exact
Hugo image/version the deploy pipeline uses.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sets up the ReGround business site: PaperMod theme (v8.0) as a
submodule, pinned Hugo 0.124.1, and a custom homepage hero
overriding the theme's default blog-first layout with editable
front-matter copy.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>