Ksenia Hairs
The stylist wanted a site that shows real work and leads to an enquiry, without the look of a salon chain. We built a first version on her own photographs; services and prices wait for her data and are marked as placeholders.

The brief
The brief put the goal plainly: get enquiries and show the portfolio. The client described the mood as authentic yet clear at first glance. There was no site and no logo before, so the name is set in type with no invented mark.
What we built
The first screen is dark, with a portrait, the name and two buttons: discuss a booking and see the works. Below it the page turns to a warm light background with large Cormorant headings and Onest for body text. The works section shows one large frame with a list of thumbnails; on a phone the thumbnails run in a strip under the frame. The price list is laid out as a printed sheet with dotted leaders to the price, and the contacts lead to Telegram and WhatsApp and offer an enquiry form with a topic: services or training.
Every photograph belongs to the stylist. Smooth scrolling and transitions between blocks switch off when the system asks for reduced motion.
Waiting for data
The service list, the prices and the stylist’s own story are still placeholders. We did not invent prices, years of experience or certificates; the fields fill in when the client sends the details.
Screens
Under the hood
- React 19, TypeScript and Vite; the Cormorant, Prata and Onest fonts are bundled locally.
- Smooth scrolling with Lenis and View Transitions; both switch off under reduced motion.
- The enquiry form posts to the address in the VITE_LEAD_ENDPOINT environment variable; Telegram and WhatsApp open by direct link.
- The build is about 3.5 MB including 17 photographs.
React · TypeScript · Vite · Lenis