Enodre

Case study · Beauty & cosmetology website · Poland

Biały Lotos

A content-driven salon site that turns a client's concern into the right treatment, price, and booking link.

A five-treatment beauty and cosmetology salon in Ciechanów, Poland — permanent makeup, laser hair removal, brow and lash styling, and piercing, all under one roof. A gold lotus brand identity and a content system generated from six structured data modules, designed and built solo by Enodre, with every booking routed straight to the salon's existing Booksy profile.

Biały Lotos homepage — 'Piękno, które podkreśla Ciebie' headline beside a close-up beauty portrait, with a cookie-consent banner for the Google Maps embed.

The brief

A five-treatment business, one coherent site.

Biały Lotos runs permanent makeup, premium cosmetology, laser hair removal, brow and lash styling, and piercing under one roof — five practices with different price structures, aftercare rules, and photographic proof of results.

What we were asked for

Not a landing page — a way for a client who already knows her concern (fading brows, sun damage, unwanted hair, a botched old PMU job) to find the right treatment, its price, its aftercare, and a Booksy booking link, without ever feeling like generic salon boilerplate.

Designed and built solo by Enodre

The brand

A lotus in gold foil.

The mark had to read as premium — gold, not pastel — draw on the salon's name directly, and still hold up small, at 32px, in a mobile nav bar.

Logo

Biały Lotos logo — a gold foil lotus mark above a hand-lettered script wordmark reading 'Biały lotos'.

Primary

Cool neutral canvas, page backgrounds

Ink

Body copy, near-black

Brown

Warm accent, sits near skin tones

Gold

The brand's signature, lifted from the mark

Lime

One loud accent, reserved for the rare interrupt

Piękno, które podkreśla Ciebie

Poppins — UI & body

Piękno, które podkreśla Ciebie

DM Serif Display — homepage headlines

Biały lotos

Bochan — the signature script

Information architecture

Pages that build themselves from data.

Every treatment and every client “problem” is a dynamic route rendered from a single structured dataset — not a hand-built page per service.

Routes

  • Strona główna/
  • Zabiegi/zabiegi
  • Problemy/problemy/[slug]
  • Cennik/cennik
  • Sklep/sklep
  • Galeria/galeria
  • O nas/o-nas
  • Blog/blog
  • Kontakt/kontakt

Data modules

  • services.js15 treatment pages
  • problems.js6 concern-led pages
  • cennik.jsfull price list
  • effects.js + effectImages.jsbefore/after gallery
  • products.js9 vouchers & add-ons

71

Commits

15

Dynamic treatment pages

6

Problem-led pages

1,144

Lines of structured data

The site in use

Live captures from the running build.

Desktop and mobile, catalog and detail. Click any screen to expand it.

Engineering

The parts that don't show up in a screenshot.

01

Consent-gated map embed

The homepage's Google Maps embed doesn't load until a visitor accepts it. Consent is written to localStorage under a single key and broadcast via a CustomEvent, so every component reacting to privacy state — banner, map, footer link — stays in sync without a shared store.

02

Search & expand on the price list

Cennik covers PMU, cosmetology, laser, brows, lashes, makeup, and piercing — 24 laser variants alone. A live search filters services by name; each category collapses by default so the page stays scannable instead of becoming a wall of numbers.

03

Problem-first navigation

A parallel route tree (/problemy/[slug]) lets a visitor start from a concern — discoloration, loss of firmness, acne scars — and land on the treatments that address it, cross-linked back into the main catalog.

04

Booking without a booking system

No cart, no calendar to maintain — every treatment and voucher card resolves to the salon's existing Booksy profile, keeping scheduling logic entirely off this codebase.

05

Tested where it counts

Jest and React Testing Library cover the homepage hero render, catching the one regression that would actually hurt: a broken first impression.

Stack & deployment

Shipped on Vercel, from a git push.

Next.js page routing, Tailwind for the design system's utility layer, and a build pipeline that needs nothing more than a push to main.

Next.jsReact 18Tailwind CSSJestReact Testing LibraryVercel

// vercel.json

"builds": [{ "src": "package.json", "use": "@vercel/next" }]

installCommand

npm install

buildCommand

npm run build

runtime

Node 24.x

Outcome

Built and shipped solo.

Delivered a live, content-driven salon site: 15 dynamic treatment pages and 6 problem-led pages generated from structured data, a searchable price list spanning PMU, cosmetology, laser, and piercing, and a booking path from discovery to Booksy — designed, built, and shipped solo.

Gold lotus identity15 dynamic pagesProblem-first navigationShipped solo on Vercel

Untangle complexity

Need a site that turns a visitor's concern into a booking?

Let's untangle it.

Book a discovery call