/* 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}
{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 (
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.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 });