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.

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

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.
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.
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.
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.
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.
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.
// 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.
Untangle complexity
Need a site that turns a visitor's concern into a booking?
Let's untangle it.
Book a discovery call