);
}
// Live booking calendar. Acuity for now; when she moves to GlossGenius, swap BOOK_URL.
const BOOK_URL = 'https://app.acuityscheduling.com/schedule/dcd8ff94';
function CPBook() {
// Acuity's embed.js auto-sizes the iframe to its content (no inner scrollbar).
// It only sees iframes that exist when it runs, so load it after mount.
React.useEffect(() => {
const sc = document.createElement('script');
sc.src = 'https://embed.acuityscheduling.com/js/embed.js';
document.body.appendChild(sc);
return () => sc.remove();
}, []);
return (
Book online
Book the chair.
Pick a service, pick a time, done. The whole calendar lives right here.
Please arrive with your hair fully detangled. Quick weaves and services with tracks are Tuesdays only. $25 fee for cancellations within 24 hours. No children, please.
Trouble with the calendar? Open it in a new tab
);
}
// Instagram feed: her videos (assets/feed/ig-XX.mp4 + .jpg photo) rolling inside the phone.
// Shows the photo while scrolling; the whole clip plays on hover (tap on phones).
const IG_POSTS = [
['post-01-done', 'Silk press on a whole lot of hair'],
['post-02', 'Pin curl pixie, flowers and all'],
['post-03', 'Sharp lines, fresh cut'],
['post-04', 'Short in front, length in back'],
['post-05', 'Big curls to a pin curl pixie'],
['post-06', 'From locs to pin curls'],
];
function CPFeedPost({ id, c, dupe }) {
const ref = React.useRef(null);
const [on, setOn] = React.useState(false);
const play = (fromStart) => { const v = ref.current; if (!v) return; if (fromStart) v.currentTime = 0; v.play().catch(() => {}); };
const pause = () => { const v = ref.current; if (v) v.pause(); };
const stop = () => { const v = ref.current; if (v) { v.pause(); v.currentTime = 0; } };
const mouse = e => e.pointerType === 'mouse';
return (
mouse(e) && play(true)} onPointerLeave={e => mouse(e) && stop()}
onPointerUp={e => { if (mouse(e) || e.target.closest('a')) return; const v = ref.current; v && !v.paused ? pause() : play(false); }}>
);
}
// Shop: her Amazon picks (Associate tag chardae85-20).
// Amazon's rules don't allow hosting their product photos, so tiles are designed;
// swap in her own product photos any time via `img`.
function CPShop() {
const prods = [
['https://amzn.to/4B8GB5Z','pink','Style','Pencil flat iron','Skinny plates that get right to the root on short cuts and pixie edges.','Iron'],
['https://amzn.to/4rOEuzD','mint','Protect','Satin pixie wrap','Sleep in it. Keeps your wrap, waves and shine in place overnight.','Wrap'],
['https://amzn.to/3W9HZVy','cream','Set','Wrap foaming lotion','Light hold and shine for wraps and sculpted waves.','Foam'],
['https://amzn.to/4zieIXf','pink','Wrap','Wrap strips','Hold the wrap smooth and flat while it sets.','Strips'],
];
return (
Shop my shelf
What's on my shelf.
The tools and products I actually use, ready to order.