A single-file landing page for Srila Prabhupada's edition of the Bhagavad-gita: calm editorial tone, hand-built video and lotus interactions, three ways to get the book — zero dependencies.
A landing page for Bhagavad-gita As It Is — the edition translated and commented by Srila Prabhupada. The page had to introduce the book to someone who has never heard of it, defuse the distrust people feel toward "religious literature," and lead to one of three actions: order the printed book, download the e-book, or listen to the audiobook.
"The text is ancient and serious, but the page must not look like a temple website or an esoteric forum."
The core challenge was tone. It needed a calm, editorial, book-like voice that holds attention without pressure.

The page is built as the sequence of questions a first-time reader asks. Each block resolves one objection and hands off to the next.

A dark palette with warm gold accents, serif faces Cormorant Garamond and Playfair Display — a nod to the printed book rather than a web UI. Generous whitespace, large headings, minimal decoration. One focal point per screen.

Both video treatments are hand-written on the native <video> element, no libraries.
The background video plays once and freezes on its final frame. Hovering restarts it. The visitor isn't stuck watching an endless loop, but can "wake" the scene at will.
heroRight.addEventListener('mouseenter', () => {
heroVid.currentTime = 0;
heroVid.play();
});
Two stacked <video> layers with the same clip. 0.35 s before the active layer ends, the standby layer starts from zero and the two cross-fade on requestAnimationFrame with an ease-in-out curve. The loop closes without a jump.
function xfade(from, to) {
to.currentTime = 0; to.play();
const t0 = performance.now();
(function tick(now) {
const t = Math.min((now - t0) / XFADE_MS, 1);
const ease = t < .5 ? 2*t*t : 1 - Math.pow(-2*t + 2, 2) / 2;
from.style.opacity = String(1 - ease);
to.style.opacity = String(ease);
if (t < 1) requestAnimationFrame(tick);
else { from.pause(); watch(to, from); }
})(t0);
}
The book's symbol became an interactive element. Eight petals in pure CSS; on desktop the scene follows the cursor with 3D parallax, and petals on the side facing the mouse brighten via a dot product of petal angle and tilt vector. On mobile — a spring animation on tap.

function animateLotus() {
currentRX += (targetRX - currentRX) * 0.09;
currentRY += (targetRY - currentRY) * 0.09;
scene.style.transform = `rotateX(${currentRX}deg) rotateY(${currentRY}deg)`;
petals.forEach((p, i) => {
const a = i * 45 * Math.PI / 180;
const dot = Math.sin(a) * targetRY / 22 + Math.cos(a) * -targetRX / 14;
p.style.filter = `brightness(${1 + Math.max(0, dot) * 0.6})`;
});
}
Three equal paths to the book — print on Ozon, EPUB/FB2 downloaded straight from the site, audiobook on YouTube. Plus a "Write to us" form for those not ready to buy.

index.html, ~100 KB, zero dependencies — loads instantly, hosts anywhereIntersectionObserver, animations on requestAnimationFrameA page that reads like a well-set book rather than a sales landing: calm, atmospheric, one accent per screen. And still — all three ways to get the book one click away, in lightweight, self-contained code with no dependencies.