Emerald Publishing — Rising from the Ashes
Portfolio landing-page project with purchase flow, newsletter signup, and press contact

Portfolio marketing-site project built around a fictional book launch — three purchase editions, Netlify-powered forms, animated reveals, and a fully CSS-rendered book cover.
Problem
Self-imposed brief: build a polished book launch landing page end-to-end on a static stack — one that could plausibly drive purchases, capture email signups, and handle press inquiries without a backend or CMS.
Goal
Design and ship a fast marketing site with a literary, contemplative tone that converts across three purchase editions and runs entirely on static hosting.
What I Built
Built on self-hosted Bootstrap 5.3.3 marketing site with a sticky scroll-aware navbar, IntersectionObserver-driven reveal animations, a branded preloader, floating ember particles in the hero, two Netlify-powered forms (newsletter + press contact) with honeypot spam protection, and a focus-trapped "Read an Excerpt" modal — built with accessibility-first interaction patterns (skip-to-content link, semantic landmarks with `aria-labelledby`, `prefers-reduced-motion` handling) and deployed on Netlify with Cloudinary delivering imagery via `f_auto,q_auto` transforms, width variants, and face-aware avatar cropping.
Key Features
- Three-edition purchase flow (e-book, hardcover, autographed) with Order CTAs and per-edition `aria-label`s for screen-reader disambiguation
- Focus-trapped "Read an Excerpt" modal with `role="dialog"`, custom Tab/Shift-Tab cycling, ESC + backdrop dismissal, and focus restoration to the opener
- Newsletter signup and press/speaking contact forms via Netlify Forms with honeypot protection
- Sticky navbar with scroll-state transitions and mobile menu auto-close
- IntersectionObserver-driven section reveals for performance over scroll listeners
- Skip-to-content link, section landmarks with `aria-labelledby` + `tabindex="-1"` keyboard-anchor targets, and scoped `:focus-visible` outlines that clear the fixed navbar via `scroll-margin-top`
- `prefers-reduced-motion` support — animations capped to 0.01ms, ember particles hidden, anchor scroll behavior switched from smooth to instant
- Self-hosted Bootstrap 5.3.3 (no CDN on the critical path) with explicit width/height on every image for CLS hardening
- Fully CSS-rendered book cover — no image asset required
- Floating ember particles and branded preloader with fade
- Cloudinary imagery with `f_auto,q_auto` optimization, width variants (300-1200), `c_fill,g_face` avatar cropping, and `srcset` on the hero portrait
- Open Graph and Twitter Card metadata for social previews
- Auto-formatted phone input on the press contact form
Challenges
- Matching a literary, contemplative tone without leaning on a heavy framework
- Building a convincing book cover entirely in CSS so the hero stayed crisp at every viewport
- Keeping motion tasteful — IntersectionObserver reveals and ember particles had to feel calm, not busy
- Making Netlify Forms feel first-class (validation, honeypot, success states) without client-side JS frameworks
Outcome
A launch page that does real work with no backend and no build step — form handling, scroll reveals, and a focus-trapped excerpt modal. Lighthouse desktop: 98 / 100 / 100 / 100 (Performance / Accessibility / Best Practices / SEO), CLS 0, LCP 0.9s.