// Vegas Boudoir — Sections 5 (Gallery), 6 (What's Included), 7 (Before/After) // ---------- 5. THE WORK (mosaic gallery) ---------- function VbGallery() { // 12 images, alt texts for SEO const imgs = [ { src: "/images/boudoir-01.jpg?v=3", alt: "Las Vegas boudoir — emerald lace bodysuit on crisp white linens, relaxed smile in soft daylight", span: "h" }, { src: "/images/boudoir-02.jpg?v=3", alt: "Las Vegas boudoir — dramatic black-and-white frame draped from the bed, legs raised against a sunlit window", span: "h" }, { src: "/images/boudoir-03.jpg?v=3", alt: "Las Vegas boudoir — monochrome reclining portrait on white sheets, strappy lingerie and long flowing hair", span: "v" }, { src: "/images/boudoir-04.jpg?v=3", alt: "Las Vegas boudoir — black-and-white of a brunette in delicate white lace, laughing softly against the bed", span: "h" }, { src: "/images/boudoir-05.jpg?v=3", alt: "Las Vegas boudoir — moody monochrome on a tufted bed, oversized white shirt and direct, confident gaze", span: "h" }, { src: "/images/boudoir-06.jpg?v=3", alt: "Las Vegas boudoir — striped window light across the floor, black lingerie and an arched, head-back pose", span: "v" }, { src: "/images/boudoir-07.jpg?v=3", alt: "Las Vegas boudoir — backlit full-length pose against a glowing window, black lace and graceful lines", span: "h" }, { src: "/images/boudoir-08.jpg?v=3", alt: "Las Vegas boudoir — monochrome rear view across rumpled sheets, relaxed grey cotton set in window light", span: "h" }, { src: "/images/boudoir-09.jpg?v=3", alt: "Las Vegas boudoir — clean monochrome study, legs raised against a dark corner in white lingerie", span: "v" }, { src: "/images/boudoir-10.jpg?v=3", alt: "Las Vegas boudoir — relaxed grey cotton set on white linens, soft smile bathed in daylight", span: "h" }, { src: "/images/boudoir-11.jpg?v=3", alt: "Las Vegas boudoir — top-down frame on a tan leather couch, black lace and a calm, confident look", span: "h" }, { src: "/images/boudoir-12.jpg?v=3", alt: "Las Vegas boudoir — intimate monochrome, knees drawn in beneath a loose white shirt, gaze cast down", span: "v" }, { src: "/images/boudoir-13.jpg?v=3", alt: "Las Vegas boudoir — backlit fine-art figure against flowing sheers, graceful lifted legs", span: "h" }, { src: "/images/boudoir-14.jpg?v=3", alt: "Las Vegas boudoir — monochrome of a brunette on white sheets, lace lingerie and a smoldering look", span: "h" }, { src: "/images/boudoir-15.jpg?v=3", alt: "Las Vegas boudoir — bare-back study in a draped white shirt on black, tousled blonde hair", span: "v" }, { src: "/images/boudoir-16.jpg?v=3", alt: "Las Vegas boudoir — elegant silver-haired figure easing a sheer shirt down, backlit by curtains", span: "h" }, { src: "/images/boudoir-17.jpg?v=3", alt: "Las Vegas boudoir — long reclining silhouette against window light, relaxed cotton lingerie", span: "h" }, { src: "/images/boudoir-18.jpg?v=3", alt: "Las Vegas boudoir — floor-seated pose beside the bed, intricate black lace in soft window light", span: "v" }, { src: "/images/boudoir-19.jpg?v=3", alt: "Las Vegas boudoir — candid laughter on crisp white linens, white shirt slipping off the shoulder", span: "h" }, { src: "/images/boudoir-20.jpg?v=3", alt: "Las Vegas boudoir — dreamy monochrome contour wrapped in flowing white sheets", span: "h" }, { src: "/images/boudoir-21.jpg?v=3", alt: "Las Vegas boudoir — top-down monochrome on white bedding, tattoo art and a playful reversed gaze", span: "v" }, { src: "/images/boudoir-22.jpg?v=3", alt: "Las Vegas boudoir — bright airy frame on white bedding, draped sheet and delicate gold jewelry", span: "h" }, { src: "/images/boudoir-23.jpg?v=3", alt: "Las Vegas boudoir — monochrome leaning on a leather sofa, lace lingerie glowing against window light", span: "h" }, { src: "/images/boudoir-24.jpg?v=3", alt: "Las Vegas boudoir — sculptural bare-back portrait, loose blonde curls and softly draped white silk", span: "v" }, { src: "/images/boudoir-25.jpg?v=3", alt: "Las Vegas boudoir — luminous high-key frame, joyful laughter on white linens in a silk slip", span: "h" }, { src: "/images/boudoir-26.jpg?v=3", alt: "Las Vegas boudoir — moody monochrome on white bedding, black lace and a relaxed head-back pose", span: "h" }, { src: "/images/boudoir-27.jpg?v=3", alt: "Las Vegas boudoir — dramatic low-key contour study, the figure carved out of darkness", span: "v" }, { src: "/images/boudoir-28.jpg?v=3", alt: "Las Vegas boudoir — backlit floor pose against flowing sheers, black lace and confident lines", span: "h" }, { src: "/images/boudoir-29.jpg?v=3", alt: "Las Vegas boudoir — dramatic side-lit kneeling pose in black lace, arms framing the face", span: "v" }, { src: "/images/boudoir-30.jpg?v=3", alt: "Las Vegas boudoir — top-down frame in an emerald lace bodysuit on white linens, relaxed and serene", span: "v" }, { src: "/images/boudoir-31.jpg?v=3", alt: "Las Vegas boudoir — relaxed black-and-white silhouette lounging on a bed in a black bodysuit against bright sheer drapes", span: "h" }, { src: "/images/boudoir-32.jpg?v=3", alt: "Las Vegas boudoir — top-down editorial frame in black lace bra and panties bathed in dramatic window-light shadows", span: "h" }, ]; const INITIAL = 12; const [visible, setVisible] = React.useState(INITIAL); const [lb, setLb] = React.useState(null); const shown = imgs.slice(0, visible); const allShown = visible >= imgs.length; const closeLb = () => setLb(null); const prev = () => setLb((n) => (n === null ? n : (n - 1 + imgs.length) % imgs.length)); const next = () => setLb((n) => (n === null ? n : (n + 1) % imgs.length)); React.useEffect(() => { if (lb === null) return; document.body.style.overflow = "hidden"; const onKey = (e) => { if (e.key === "Escape") closeLb(); else if (e.key === "ArrowLeft") prev(); else if (e.key === "ArrowRight") next(); }; window.addEventListener("keydown", onKey); return () => { window.removeEventListener("keydown", onKey); document.body.style.overflow = ""; }; }, [lb]); const cellStyle = { border: `1px solid ${VB_GOLD}`, overflow: "hidden", background: VB_INK, cursor: "pointer", }; const cellFor = (c) => c.span === "h" ? { ...cellStyle, gridColumn: "span 2", aspectRatio: "5/3" } : { ...cellStyle, aspectRatio: "4/5" }; return ( ); } // ---------- 6. WHAT'S INCLUDED ---------- function VbIncluded() { const items = [ { num: "01", title: "Professional hair and makeup", body: "With my in-studio team. Editorial-grade glam, designed for camera." }, { num: "02", title: "Full access to the client closet", body: "Lingerie, white shirts, sweaters, blazers, sheets. Sizes XS–6X. Everything washed between sessions." }, { num: "03", title: "Fully guided posing", body: "I walk you through every pose, every angle, every expression — start to finish. You're never wondering what to do." }, { num: "04", title: "Preparation emails", body: "Sent in the weeks before your session, so you arrive confident and ready." }, { num: "05", title: "Every image fully retouched", body: "Color and black-and-white delivered together. Editorial standard, every frame." }, { num: "06", title: "Next-day private gallery reveal", body: "We hop on a Zoom together, walk through your gallery, and narrow to your favorites. You only purchase what you love." }, { num: "07", title: "An all-female team", body: "Every person you'll meet on the day of your session is a woman — myself, my hair and makeup artist, every member of the team. The photographer behind the camera is always me. The environment is always private, always held by women who do this work for women." }, ]; return (
Every Session Includes

What you walk in with. What you walk out with.

{items.map(it => (
{it.num}

{it.title}

{it.body}

))}
); } // ---------- 7. REAL WOMEN. REAL LIVES. ---------- function VbBeforeAfter() { const pairs = [ { before: "/images/vb-ba-1-before.jpg", after: "/images/vb-ba-1-after.jpg", name: "RACHEL", context: "Mother of three. Marketing director. First boudoir session at 42." }, { before: "/images/vb-ba-2-before.jpg", after: "/images/vb-ba-2-after.jpg", name: "DANIELLE", context: "Recently divorced. Anniversary gift to herself." }, { before: "/images/vb-ba-3-before.jpg", after: "/images/vb-ba-3-after.jpg", name: "MEREDITH", context: "Thirty-fifth birthday. Hadn't had a professional photo of herself since her wedding." }, ]; return (
Real Women. Real Lives.

Not models. Mothers, founders, friends.

Every woman on this page walked in nervous. Every woman walked out seeing herself for the first time.

{pairs.map((p, i) => (
Before
{`Las
After
{`Las
{p.name} {p.context}
))}

This is what showing up looks like.

); } Object.assign(window, { VbGallery, VbIncluded, VbBeforeAfter });