// J Renee Studios — Journal page (blog index) sections + posts data // ---------- GO HIGH LEVEL (GHL) NEWSLETTER CONNECTION ---------- // Paste your GoHighLevel Inbound Webhook URL between the quotes below. // How to get it in GHL: // 1. Automation → Workflows → Create Workflow (blank). // 2. Add Trigger → "Inbound Webhook" → copy the webhook URL it generates. // 3. Add Action → "Create/Update Contact" (map the {{email}} field), then add // the contact to your newsletter list / tag (e.g. "Journal Subscriber"). // 4. Publish the workflow, then paste the copied URL here. // The subscribe form below will POST { email, source } to this URL. The URL is // not a secret, so it's safe to keep here in the static site. const J_GHL_WEBHOOK_URL = ""; // ---------- POSTS DATA ---------- // Each post: slug, title, excerpt, category, city ("Las Vegas" | "Boise" | "General"), // date, image, featured (boolean — exactly one). const J_POSTS = [ { slug: "what-to-wear-las-vegas-boudoir-shoot", title: "What to Wear to a Las Vegas Boudoir Shoot", excerpt: "Bring five to eight fitted pieces you love — and let the studio closet and the posing do the rest. The fitted-not-flowy rule, the bring-three plan, and what's already waiting on the rack.", category: "Prep Guides", city: "Las Vegas", date: "June 5, 2026", image: "/images/what-to-wear-boudoir-hero.jpg", href: "/las-vegas/boudoir/", featured: true, }, { slug: "boise-maternity-session-prep", title: "How to Prepare for a Boise Modern Maternity Session", excerpt: "From skincare in the final weeks to the pieces in your closet that will actually photograph beautifully — a quiet, considered prep guide.", category: "Prep Guides", city: "Boise", date: "April 9, 2026", image: "/images/vm-gallery-10.jpg", href: "/boise/maternity/", }, { slug: "iconic-experience-women-over-40-las-vegas", title: "Why I Built The Iconic Experience for Women Over 40", excerpt: "Most women over 40 have almost no beautiful photos of themselves. Here's why I built The Iconic Experience in Las Vegas — and what volume one looks like.", category: "ICONIC Experience 40+", city: "Las Vegas", date: "June 5, 2026", image: "/images/ic-gallery-05.jpg", href: "/las-vegas/iconic/", }, { slug: "modern-headshots-vegas-what-to-bring", title: "Modern Headshots in Las Vegas: What to Bring on the Day.", excerpt: "Three looks, two pairs of shoes, one consistent palette — the short list that gets you a finished gallery you'll actually use.", category: "Modern Headshots & Branding", city: "Las Vegas", date: "March 14, 2026", image: "/images/vh-gallery-02.jpg", href: "/las-vegas/headshots/", }, { slug: "boise-portraits-quiet-confidence", title: "Quiet Confidence: A Boise Modern Portraits Session.", excerpt: "A walk-through of one recent Modern Portraits session — what we shot, why we kept it tight, and the single image she chose to print.", category: "Modern Portraits", city: "Boise", date: "February 28, 2026", image: "/images/boise-portraits.jpg", href: "/boise/portraits/", }, { slug: "boudoir-session-cost-las-vegas", title: "How Much Does a Boudoir Session Cost in Las Vegas?", excerpt: "A real answer to what a boudoir session costs in Las Vegas — the $490 session fee, what it covers, the range most women invest, and why it's built that way.", category: "Modern Boudoir", city: "Las Vegas", date: "June 5, 2026", image: "/images/vb-gallery-01.jpg", href: "/las-vegas/boudoir/", }, { slug: "iconic-collection-decision", title: "Choosing Your ICONIC Heirloom Album.", excerpt: "Linen folio, leather album, or framed wall portrait — how clients decide between the heirloom collections, and why most choose the album.", category: "ICONIC Experience 40+", city: "Las Vegas", date: "January 24, 2026", image: "/images/ic-heirloom-02.jpg", href: "/las-vegas/iconic/", }, { slug: "behind-the-camera-jennifer", title: "Behind the Camera: Twenty Years, One Subject.", excerpt: "A founder's note on what's changed, what hasn't, and why the studio still photographs only women — across both Boise and Las Vegas.", category: "Behind the Brand", city: "General", date: "January 8, 2026", image: "/images/about-jenn-hero.jpg", href: "/about/", }, { slug: "modern-headshots-boise", title: "Where to Use Modern Headshots in Boise (Beyond LinkedIn)", excerpt: "Modern headshots aren't just for LinkedIn — your website, real estate signage, podcast spots, speaker bios, and press. Plus why they're a write-off and what a session really looks like.", category: "Modern Headshots & Branding", city: "Boise", date: "June 5, 2026", image: "/images/boise-headshots.jpg", href: "/specials/boise-headshot-day/", }, { slug: "vegas-maternity-couples", title: "Why Partners Belong in the Maternity Frame.", excerpt: "Editorial maternity isn't only solo. A short note on the family-moment portraits the Las Vegas studio quietly builds in.", category: "Modern Maternity", city: "Las Vegas", date: "December 4, 2025", image: "/images/vegas-maternity.jpg", href: "/las-vegas/maternity/", }, { slug: "what-to-bring-portrait", title: "Three Things to Bring to a Modern Portraits Session.", excerpt: "A short, honest packing list — including the one item nearly every client forgets — for both Boise and Las Vegas studio sessions.", category: "Prep Guides", city: "General", date: "November 17, 2025", image: "/images/portraits.jpg", href: "/boise/portraits/", }, { slug: "iconic-day-of", title: "The Day of an ICONIC Experience, Hour by Hour.", excerpt: "Hair and makeup at ten, three editorial looks by two, the full reveal before you leave — a walk through the day.", category: "ICONIC Experience 40+", city: "Las Vegas", date: "October 30, 2025", image: "/images/ic-celebration.jpg", href: "/las-vegas/iconic/", }, { slug: "first-boudoir-session-boise", title: "What to Expect at Your First Boudoir Session in Boise", excerpt: "Nervous about your first session? Here's exactly what the day feels like — from the makeup chair to the moment you see yourself and say \"that's me?\"", category: "Modern Boudoir", city: "Boise", date: "June 5, 2026", image: "/images/boudoir-12.jpg", href: "/boise/boudoir/", }, { slug: "studio-tour-vegas", title: "A Quiet Tour of the Las Vegas Studio.", excerpt: "Natural light from the south windows, three painted walls, one ten-foot cyc — a short tour of the room the work is made in.", category: "Behind the Brand", city: "Las Vegas", date: "September 28, 2025", image: "/images/vegas-studio.jpg", href: "/las-vegas/", }, { slug: "modern-portraits-vegas-essay", title: "Modern Portraits in Las Vegas: A Different Brief.", excerpt: "Not a glam session, not a branding shoot — what Modern Portraits actually is, and the women it's built for.", category: "Modern Portraits", city: "Las Vegas", date: "September 9, 2025", image: "/images/vegas-portraits.jpg", href: "/las-vegas/portraits/", }, ]; const J_CATEGORIES = [ "All", "Modern Boudoir", "Modern Headshots & Branding", "Modern Portraits", "Modern Maternity", "ICONIC Experience 40+", "Behind the Brand", "Prep Guides", ]; const J_CITIES = ["All", "Las Vegas", "Boise"]; // A post links to its real article page (/journal//) once it has been // written (i.e. content exists in window.J_POST_CONTENT). Until then it keeps // linking to its related service page so no card ever lands on an empty page. function jPostHref(post) { const written = (typeof window !== "undefined" && window.J_POST_CONTENT) || {}; return written[post.slug] ? `/journal/${post.slug}/` : post.href; } // ---------- 1. HERO ---------- function JHero() { return (
Journal

The Journal.

Thoughts on women's portraiture, prep guides for sessions, and stories from behind the camera — written from the studios in Boise and Las Vegas.

); } // ---------- 2. FEATURED POST ---------- function JFeatured({ post }) { if (!post) return null; return (
Featured
{`${post.category}
{post.category} {post.city}

{post.title}

{post.excerpt}

{post.date}
Read the post
); } // ---------- 3. FILTER BAR ---------- function JFilterBar({ category, city, setCategory, setCity }) { const Row = ({ label, options, active, onPick }) => (
{label}
{options.map(opt => { const isActive = active === opt; return ( ); })}
); return (
); } // ---------- 4. POST GRID ---------- function JPostCard({ post }) { const [hover, setHover] = jUseState(false); return ( setHover(true)} onMouseLeave={() => setHover(false)} style={{ textDecoration: "none", color: "inherit", display: "block" }} >
{`${post.category}
{post.category} {post.city}

{post.title}

{post.excerpt}

{post.date}
); } function JPostGrid({ posts, visible, onLoadMore }) { const shown = posts.slice(0, visible); const hasMore = visible < posts.length; return (
{shown.length === 0 ? (
No posts match this filter — try a different category or city.
) : (
{shown.map(p => )}
)} {/* 5. LOAD MORE */} {hasMore && (
Load more posts
Showing {shown.length} of {posts.length}
)}
); } // ---------- 6. SUBSCRIBE ---------- function JSubscribe() { const [email, setEmail] = jUseState(""); const [submitted, setSubmitted] = jUseState(false); const [error, setError] = jUseState(""); const [sending, setSending] = jUseState(false); const onSubmit = async (e) => { e.preventDefault(); if (!email || sending) return; setError(""); // No webhook configured yet — confirm visually so the form still works in preview. if (!J_GHL_WEBHOOK_URL) { setSubmitted(true); return; } setSending(true); try { await fetch(J_GHL_WEBHOOK_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email, source: "Journal subscribe form" }), }); setSubmitted(true); } catch (err) { setError("Something went wrong. Please try again in a moment."); } finally { setSending(false); } }; return (
Subscribe

New posts in your inbox.

Get new journal posts delivered when they're published. No spam — just stories, prep guides, and thoughts on women's portraiture.

{submitted ? (
Thank you — you're on the list. A confirmation is on its way to {email}.
) : (
setEmail(e.target.value)} placeholder="your@email.com" aria-label="Email address" style={{ appearance: "none", border: "none", outline: "none", background: "transparent", padding: "20px 24px", fontFamily: "Poppins, sans-serif", fontWeight: 300, fontSize: 14, color: J_INK, letterSpacing: "0.02em", }} />
)} {error ? (
{error}
) : null}
No spam, unsubscribe anytime.
); } // ---------- 7. FINAL CTA ---------- function JFinalCTA() { return (
Inquire

Have a session question?

Reach out — every inquiry comes to me directly.

Inquire
); } Object.assign(window, { J_POSTS, J_CATEGORIES, J_CITIES, JHero, JFeatured, JFilterBar, JPostCard, JPostGrid, JSubscribe, JFinalCTA, });