StealThis .dev
Pages Medium

Photography — Landing Portrait

A gallery-dark landing page for a portrait photographer built around a full-bleed hero portrait, a studio-versus-on-location toggle that swaps imagery and copy in place, and a pricing teaser with three session tiers. Thin uppercase labels, a Fraunces display serif, animated stat counters, a lightbox-style portfolio grid, and a booking form with inline validation and toast feedback keep the experience cinematic yet genuinely interactive from desktop down to 360px.

Open in Lab
html css vanilla-js
Targets: JS HTML

Code

A dark, image-first landing page for Marceline Vей Studio, a fictional portrait photographer. The hero pairs a full-bleed portrait with an oversized Fraunces headline, thin uppercase eyebrow labels, and a booking CTA that scrolls to the enquiry form. Below it, a segmented Studio vs On-location toggle swaps the featured image, description, and feature chips in place with a soft crossfade so visitors can compare the two shooting experiences without leaving the section.

The portfolio is a masonry-style grid of gradient-and-photo tiles that open in a minimal lightbox with keyboard and overlay dismissal. A pricing teaser lays out three session tiers — Portrait Mini, Signature Session, and Editorial Day — with a highlighted recommended card, hover lift, and a “reserve” button that pre-fills the booking form. Animated stat counters (shoots delivered, years behind the lens, average turnaround) tick up when scrolled into view.

Everything is vanilla: an IntersectionObserver drives the counters and reveal animations, the toggle and lightbox are plain event handlers, and the booking form runs inline validation with a small toast() helper for confirmation. The layout is fully responsive with a dedicated @media (max-width:520px) pass, visible focus rings, and aria attributes on the interactive controls.