EP
Own work
Freelance, from design to deployment

AshleyHairstyle

A hair salon in Sofia needed a website. I designed it, built it and shipped it, in Bulgarian and English, so the salon could run it without me.

ClientAshley Hairstyle, Sofia
Stack
Nuxt 4TypeScriptGSAPTailwind 4PrismicWorkers KVZero TrustPlaywright

What the problem was

Ashley Hairstyle wanted a site that reads the way the salon looks: editorial, high contrast, a magazine rather than a booking form. It also had to run without her calling me — her customers are Bulgarian, and prices change with the season.

The site, scrolled

What I did

Designed it first, then built the motion as a system

The art direction is mine. GSAP carries it: smooth scrolling, a pinned stack from the hero into About, scrubbed reveals, a footer that rises while the page scales back. Route changes close two panels over the screen, timed so ScrollTrigger measures the new page correctly.

Dropped SplitText for clip-path

Splitting text character by character costs main-thread time on every reveal, and this page has many. Clip-path does it on the compositor instead, with the window reaching past the text so an italic descender is never clipped.

Modelled the content in Prismic, in two languages

Services, the team and the twelve Kerastase rituals are custom types, each in Bulgarian and English; seed scripts on Prismic's Migration API imported the first 38 rather than anyone typing them in. Responses are cached server-side, so an outage still leaves the Bulgarian site Bulgarian.

Put prices on a phone instead of in the CMS

A small admin panel writes to Cloudflare Workers KV, overriding the CMS prices the moment they are saved. Zero Trust gates it with one-time email codes, and validation knows the business rules: a ritual price has to resolve to one number, because the menu's "from" figure is the cheapest of them.

How it stays fast

  • Bulgarian on unprefixed URLs, English under /en, and the old /bg/* paths 301 so they keep their ranking
  • Canonical and hreflang tags, a sitemap built from the CMS, and LocalBusiness data matching the Google Business Profile
  • WebP through @nuxt/image with reserved aspect ratios, so a late load cannot shift the layout mid-animation
  • Hero and logo served locally, so first paint waits on nothing third-party
  • All 15 Bulgarian routes audited on a production build for English that had leaked through
Outcome

The salon has not needed me since handover: content lives in Prismic, and a price changes from a phone in seconds. Live in Bulgarian and English, ranking for the searches it is looked up by.

ashleyhairstyle.com

Selected media

The page

On desktop
The salon home page: the wordmark over a photograph of the studio, with the address and opening hours along the foot
Home
Home
Scattered photographs of finished hair around a centred script heading reading Our work
The gallery block
The gallery block
Signature Artistry set over an oversized watermark, beside service cards for haircuts and colouring with prices from
The services carousel
The services carousel
Three service cards, balayage, hair therapy and nails, each with a short description and a starting price
Further along the same carousel
Further along the same carousel
The open navigation overlay, the section names set large down the right with contact details on the left
The menu
The menu
The footer: navigation, social links, opening hours and address under a map of the surrounding streets
Footer, hours and location
Footer, hours and location
On a phone
Home
Home
Home
The services carousel on a phone, one card at a time, with a counter reading 01 of 06
Services
Services
The gallery
The gallery
The gallery

The editor

The pricing admin behind a staff sign-in, listing every treatment in a category with an editable price field
Pricing admin, staff only
Pricing admin, staff only
The Prismic dashboard for the salon, listing the team page and one published page per service
Page content in the CMS
Page content in the CMS
Own work, free to shareEyman Pashaliev