/* eslint-disable */ // SERVICES PAGE const PB_S = window.PB_DATA; function ServicesNav({ active, onJump }) { return ( ); } function ServiceRow({ s }) { const p = formatPrice(s); return (
{s.dur}
{s.name}
{s.desc}
{p.from && From} {p.consult ? on consultation : p.label}
); } function PageServices() { const [active, setActive] = React.useState('hair-colour'); React.useEffect(() => { function onScroll() { const cats = PB_S.categories; for (let i = cats.length - 1; i >= 0; i--) { const el = document.getElementById('cat-' + cats[i].id); if (!el) continue; const top = el.getBoundingClientRect().top; if (top < 200) { setActive(cats[i].id); break; } } } window.addEventListener('scroll', onScroll, { passive: true }); onScroll(); return () => window.removeEventListener('scroll', onScroll); }, []); const jump = (id) => { const el = document.getElementById('cat-' + id); if (el) window.scrollTo({ top: el.offsetTop - 100, behavior: 'smooth' }); }; return (
Home/Services

Every
service, priced.

Our full menu — colour prices verified verbatim, every other category quoted on consultation by the specialist who will perform it. Complimentary consultation with every booked appointment.

{PB_S.categories.map((c) => (

{c.name}

— {c.num} / 07

{c.blurb}

{c.services.map((s, i) => )}
))}
A note on pricing

Hair colour is published in full. Nail, facial, lash, brow and body prices live in our booking flow — choose your service to see the exact quote.

Open booking
); } Object.assign(window, { PageServices });