Best Wedding Photographer in Bhopal, Ujjain & Indore | How to Choose the Right One{ "@context": "https://schema.org", "@graph": [ { "@type": "Article", "headline": "Best Wedding Photographer in Bhopal, Ujjain & Indore: How to Choose the Right One", "description": "Compare wedding photographers across Bhopal, Ujjain, and Indore with tips for choosing the right team.", "author": { "@type": "Organization", "name": "Wedding Photographer in Indore - WPI", "url": "https://weddingphotographerinindore.com/", "logo": "https://weddingphotographerinindore.com/wp-content/uploads/2025/12/Black-Brown-Simple-Minimalist-Fashion-New-Post-Instagram-Story.png" }, "mainEntityOfPage": "https://weddingphotographerinindore.com/best-wedding-photographer-indore/" }, { "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "How do I compare photographers across Bhopal, Ujjain, and Indore?", "acceptedAnswer": { "@type": "Answer", "text": "Compare full-length portfolios from real weddings in each city, ask about their experience with local venues and rituals, check turnaround times, and get itemised quotes so pricing, travel, and deliverables are easy to compare side by side." } }, { "@type": "Question", "name": "What questions should I ask before booking?", "acceptedAnswer": { "@type": "Answer", "text": "Ask who will actually shoot your wedding, how many full weddings they've covered in your city, what's included in the package, backup equipment and second-shooter plans, delivery timelines, and travel or stay costs for outstation venues." } }, { "@type": "Question", "name": "How far in advance should I book my wedding photographer?", "acceptedAnswer": { "@type": "Answer", "text": "Book 6 to 9 months ahead for peak wedding season dates in Bhopal, Ujjain, or Indore, especially around auspicious dates in November to February, since experienced local teams get reserved quickly." } } ] } ] }:root{ --ivory: #FBF6EC; --ivory-dim: #F3ECDE; --wine: #5A1A2B; --wine-deep: #3E0F1D; --gold: #B4863A; --gold-soft: #DCC08A; --ink: #2A211D; --rose: #C67B87; --line: rgba(42,33,29,0.14); --shadow: 0 24px 60px -30px rgba(58,15,29,0.45); --serif: 'Cormorant Garamond', serif; --sans: 'Karla', sans-serif; }*{ box-sizing:border-box; } html{ scroll-behavior:smooth; } body{ margin:0; background:var(--ivory); color:var(--ink); font-family:var(--sans); line-height:1.7; -webkit-font-smoothing:antialiased; } img{ max-width:100%; display:block; } a{ color:inherit; }@media (prefers-reduced-motion: reduce){ *{ animation-duration:0.001ms !important; animation-iteration-count:1 !important; transition-duration:0.001ms !important; scroll-behavior:auto !important; } }/* ---------- progress bar ---------- */ #progress{ position:fixed; top:0; left:0; height:3px; width:0%; background:linear-gradient(90deg, var(--gold), var(--rose)); z-index:9999; transition:width 0.1s linear; }/* ---------- top ribbon nav ---------- */ .topbar{ position:sticky; top:0; z-index:100; background:rgba(251,246,236,0.92); backdrop-filter:blur(8px); border-bottom:1px solid var(--line); padding:14px 24px; display:flex; align-items:center; justify-content:space-between; gap:16px; } .brand{ font-family:var(--serif); font-weight:600; font-size:1.25rem; color:var(--wine); letter-spacing:0.02em; } .topbar nav{ display:flex; gap:22px; font-size:0.82rem; letter-spacing:0.06em; text-transform:uppercase; } .topbar nav a{ text-decoration:none; color:var(--ink); opacity:0.72; border-bottom:1px solid transparent; padding-bottom:3px; transition:opacity .2s, border-color .2s; } .topbar nav a:hover, .topbar nav a:focus-visible{ opacity:1; border-color:var(--gold); } .topbar nav{ display:none; } @media (min-width:860px){ .topbar nav{ display:flex; } }/* ---------- hero ---------- */ .hero{ position:relative; padding:96px 24px 72px; text-align:center; overflow:hidden; background: radial-gradient(circle at 15% 20%, rgba(180,134,58,0.14), transparent 45%), radial-gradient(circle at 85% 80%, rgba(198,123,135,0.16), transparent 50%), var(--ivory); } .hero .eyebrow{ font-size:0.78rem; letter-spacing:0.22em; text-transform:uppercase; color:var(--wine); font-weight:600; margin-bottom:18px; } .hero h1{ font-family:var(--serif); font-weight:700; font-size:clamp(2.2rem, 5vw, 4rem); line-height:1.08; margin:0 auto 22px; max-width:920px; color:var(--wine-deep); } .hero h1 em{ font-style:italic; color:var(--gold); } .hero p.lede{ max-width:620px; margin:0 auto 34px; font-size:1.08rem; color:#4b3c34; opacity:0.9; } .city-ribbon{ display:inline-flex; gap:0; border:1px solid var(--gold-soft); border-radius:999px; padding:5px; background:rgba(255,255,255,0.55); box-shadow:var(--shadow); margin-bottom:36px; } .city-ribbon span{ font-family:var(--serif); font-size:1.05rem; font-weight:600; padding:9px 22px; border-radius:999px; color:var(--wine); } .city-ribbon span.divider{ padding:9px 4px; opacity:0.4; font-weight:400; } .hero-cta{ display:flex; gap:14px; justify-content:center; flex-wrap:wrap; }.btn{ display:inline-flex; align-items:center; gap:8px; font-family:var(--sans); font-weight:600; font-size:0.92rem; padding:14px 30px; border-radius:8px; text-decoration:none; letter-spacing:0.01em; transition:transform .2s ease, box-shadow .2s ease; border:1px solid transparent; } .btn:focus-visible{ outline:3px solid var(--gold); outline-offset:2px; } .btn-primary{ background:var(--wine); color:var(--ivory); box-shadow:0 14px 30px -12px rgba(90,26,43,0.55); } .btn-primary:hover{ transform:translateY(-2px); box-shadow:0 18px 36px -12px rgba(90,26,43,0.6); } .btn-ghost{ background:transparent; border-color:var(--line); color:var(--ink); } .btn-ghost:hover{ border-color:var(--wine); }.meta-row{ display:flex; justify-content:center; gap:22px; margin-top:28px; font-size:0.8rem; color:#6b5c53; letter-spacing:0.03em; } .meta-row span{ display:flex; align-items:center; gap:6px; } .dot{ width:4px; height:4px; border-radius:50%; background:var(--gold); }/* ---------- layout shell ---------- */ .wrap{ max-width:960px; margin:0 auto; padding:0 24px; } .shell{ display:grid; grid-template-columns:1fr; gap:56px; padding:64px 0; } @media (min-width:980px){ .shell{ grid-template-columns:220px 1fr; gap:64px; } }/* ---------- TOC ---------- */ .toc{ position:relative; } .toc-inner{ position:sticky; top:90px; } .toc-title{ font-size:0.72rem; text-transform:uppercase; letter-spacing:0.16em; color:var(--wine); font-weight:700; margin-bottom:14px; } .toc ol{ list-style:none; margin:0; padding:0; border-left:1px solid var(--line); } .toc li{ margin:0; } .toc a{ display:block; padding:8px 0 8px 16px; text-decoration:none; font-size:0.88rem; color:#6b5c53; border-left:2px solid transparent; margin-left:-1px; transition:color .2s, border-color .2s; } .toc a:hover, .toc a:focus-visible, .toc a.active{ color:var(--wine); border-color:var(--gold); font-weight:600; }/* ---------- article ---------- */ article > p.intro{ font-size:1.08rem; } article > p.intro::first-letter{ font-family:var(--serif); font-size:3.6rem; float:left; line-height:0.8; padding:8px 10px 0 0; color:var(--wine); font-weight:700; } h2{ font-family:var(--serif); font-size:clamp(1.6rem, 3vw, 2.1rem); color:var(--wine-deep); margin:0 0 6px; font-weight:600; scroll-margin-top:100px; } .h2-index{ font-size:0.72rem; letter-spacing:0.18em; color:var(--gold); text-transform:uppercase; font-weight:700; display:block; margin-bottom:8px; } section.block{ margin-bottom:58px; } p{ color:#3a2f28; } .lead-in{ color:#5c4c42; font-size:0.98rem; margin-top:-2px; margin-bottom:20px; }ul.check{ list-style:none; margin:20px 0; padding:0; display:grid; gap:12px; } ul.check li{ display:flex; gap:12px; align-items:flex-start; font-size:0.98rem; } ul.check li::before{ content:"✓"; flex:0 0 auto; width:22px; height:22px; border-radius:50%; background:var(--wine); color:var(--ivory); font-size:0.72rem; font-weight:700; display:flex; align-items:center; justify-content:center; margin-top:2px; }blockquote.pull{ font-family:var(--serif); font-style:italic; font-size:1.5rem; color:var(--wine); border-left:3px solid var(--gold); padding:6px 0 6px 24px; margin:32px 0; } blockquote.pull cite{ display:block; font-family:var(--sans); font-style:normal; font-size:0.78rem; letter-spacing:0.08em; text-transform:uppercase; color:#6b5c53; margin-top:10px; }/* ---------- city comparator (signature element) ---------- */ .comparator{ background:linear-gradient(160deg, var(--wine-deep), var(--wine)); border-radius:20px; padding:8px; box-shadow:var(--shadow); margin:36px 0 48px; } .tabs{ display:flex; gap:6px; padding:10px 10px 0; } .tab{ flex:1; text-align:center; padding:12px 8px; border-radius:12px 12px 0 0; font-family:var(--serif); font-size:1.05rem; font-weight:600; color:var(--ivory); background:transparent; border:none; cursor:pointer; opacity:0.55; transition:opacity .2s, background .2s; } .tab[aria-selected="true"]{ opacity:1; background:var(--ivory); color:var(--wine-deep); } .tab:focus-visible{ outline:2px solid var(--gold-soft); outline-offset:-2px; } .panels{ background:var(--ivory); border-radius:0 0 14px 14px; padding:28px 26px; } .panel{ display:none; } .panel[data-active="true"]{ display:grid; gap:18px; grid-template-columns:1fr; } @media (min-width:640px){ .panel[data-active="true"]{ grid-template-columns:repeat(3,1fr); } } .stat-card{ border:1px solid var(--line); border-radius:12px; padding:16px 18px; background:#fff; } .stat-card .label{ font-size:0.7rem; letter-spacing:0.1em; text-transform:uppercase; color:var(--gold); font-weight:700; margin-bottom:6px; } .stat-card .value{ font-family:var(--serif); font-size:1.3rem; color:var(--wine-deep); font-weight:600; margin-bottom:4px; } .stat-card .sub{ font-size:0.84rem; color:#6b5c53; }/* ---------- pricing table ---------- */ .price-table{ width:100%; border-collapse:collapse; margin:28px 0; font-size:0.94rem; } .price-table th, .price-table td{ padding:14px 16px; border-bottom:1px solid var(--line); text-align:left; } .price-table thead th{ font-family:var(--serif); font-size:1.05rem; color:var(--wine-deep); background:var(--ivory-dim); } .price-table tbody tr:hover{ background:rgba(180,134,58,0.06); } .price-table td:first-child, .price-table th:first-child{ font-weight:600; }/* ---------- reviews ---------- */ .reviews{ display:grid; gap:20px; grid-template-columns:1fr; margin:24px 0; } @media (min-width:720px){ .reviews{ grid-template-columns:repeat(3,1fr); } } .review-card{ background:#fff; border:1px solid var(--line); border-radius:14px; padding:22px; display:flex; flex-direction:column; gap:12px; } .stars{ color:var(--gold); letter-spacing:2px; font-size:0.95rem; } .review-card p{ font-size:0.92rem; margin:0; color:#4a3d35; } .reviewer{ display:flex; align-items:center; gap:10px; margin-top:auto; } .avatar{ width:34px; height:34px; border-radius:50%; background:var(--wine); color:var(--ivory); font-family:var(--serif); font-weight:700; font-size:0.9rem; display:flex; align-items:center; justify-content:center; } .reviewer .who{ font-size:0.82rem; font-weight:600; color:var(--ink); } .reviewer .where{ font-size:0.74rem; color:#8a7b71; }/* ---------- timeline ---------- */ .timeline{ position:relative; margin:28px 0; padding-left:28px; border-left:2px solid var(--gold-soft); } .t-item{ position:relative; padding-bottom:28px; } .t-item:last-child{ padding-bottom:0; } .t-item::before{ content:""; position:absolute; left:-34px; top:2px; width:12px; height:12px; border-radius:50%; background:var(--wine); border:3px solid var(--gold-soft); } .t-item .when{ font-family:var(--serif); font-weight:700; color:var(--wine); font-size:1.05rem; } .t-item p{ margin:4px 0 0; font-size:0.92rem; }/* ---------- FAQ ---------- */ .faq-item{ border-bottom:1px solid var(--line); } .faq-q{ width:100%; text-align:left; background:none; border:none; cursor:pointer; padding:20px 0; display:flex; justify-content:space-between; align-items:center; font-family:var(--serif); font-size:1.15rem; color:var(--wine-deep); font-weight:600; gap:16px; } .faq-q:focus-visible{ outline:2px solid var(--gold); outline-offset:4px; } .faq-q .plus{ flex:0 0 auto; width:26px; height:26px; border-radius:50%; border:1px solid var(--gold); color:var(--wine); display:flex; align-items:center; justify-content:center; font-size:1rem; transition:transform .25s ease; } .faq-item[data-open="true"] .plus{ transform:rotate(45deg); } .faq-a{ max-height:0; overflow:hidden; transition:max-height .3s ease; } .faq-item[data-open="true"] .faq-a{ max-height:240px; } .faq-a p{ padding-bottom:20px; margin:0; font-size:0.96rem; }/* ---------- internal links ---------- */ .related{ display:grid; gap:14px; grid-template-columns:1fr; margin:24px 0 0; } @media (min-width:640px){ .related{ grid-template-columns:repeat(3,1fr); } } .related a{ display:block; text-decoration:none; border:1px solid var(--line); border-radius:12px; padding:18px; background:#fff; transition:border-color .2s, transform .2s; } .related a:hover, .related a:focus-visible{ border-color:var(--gold); transform:translateY(-2px); } .related .tag{ font-size:0.68rem; letter-spacing:0.1em; text-transform:uppercase; color:var(--gold); font-weight:700; } .related .name{ font-family:var(--serif); font-size:1.05rem; color:var(--wine-deep); margin-top:6px; font-weight:600; }/* ---------- final CTA ---------- */ .final-cta{ margin:80px 0 0; padding:64px 32px; text-align:center; border-radius:24px; background:linear-gradient(150deg, var(--wine-deep), var(--wine) 60%, var(--rose)); color:var(--ivory); } .final-cta h2{ color:var(--ivory); } .final-cta p{ color:rgba(251,246,236,0.85); max-width:520px; margin:0 auto 28px; } .final-cta .btn-primary{ background:var(--ivory); color:var(--wine-deep); } .final-cta .btn-primary:hover{ box-shadow:0 18px 36px -12px rgba(0,0,0,0.35); }footer{ text-align:center; padding:48px 24px 64px; font-size:0.8rem; color:#8a7b71; } footer a{ color:var(--wine); text-decoration:none; border-bottom:1px solid var(--gold-soft); }.visually-hidden{ position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); } .brand{display:flex;align-items:center;gap:10px;text-decoration:none;line-height:1.2}.brand img{width:64px;height:42px;object-fit:contain;flex-shrink:0}.brand small{display:block;font-family:var(--sans);font-size:11px;letter-spacing:0;margin-top:5px}.article-byline{font-size:0.88rem;color:var(--ink);margin:0 0 20px}.price-table{display:block;overflow-x:auto}.topbar{gap:14px;flex-wrap:wrap}@media(max-width:600px){.topbar{padding:12px 16px}.brand{font-size:18px}.brand img{width:52px;height:34px}.topbar>.btn{font-size:12px!important;padding:8px 12px!important}.topbar nav{display:none}.hero{padding-top:64px}.price-table th,.price-table td{min-width:125px}} body.postid-8468 .elementor-element-8612829,body.postid-8468 .elementor-element-ff781da{display:none!important}body.postid-8468 .elementor-element-9ec044a{--container-max-width:100%;padding:0!important}body.postid-8468 .elementor-element-9ec044a>.e-con-inner{max-width:none;width:100%;padding:0}body.postid-8468 .elementor-widget-wp-widget-custom_html{width:100%;max-width:none} .shell>*{min-width:0;max-width:100%}.shell article{overflow-wrap:break-word}.price-table{max-width:100%;width:100%;overflow-x:auto}.price-table th,.price-table td{min-width:0}.shell{grid-template-columns:minmax(0,1fr)}@media(min-width:980px){.shell{grid-template-columns:220px minmax(0,1fr)}}

Madhya Pradesh Wedding Photography Guide

The Best Wedding Photographer in Bhopal, Ujjain & Indore

A clear-eyed guide to choosing a candid wedding photography team anywhere across Central India — what to compare, what to ask, and what things actually cost.

10 min read Updated 9 October 2026 Bhopal · Ujjain · Indore

Three cities, three very different wedding personalities. Bhopal's lakeside estates and heritage havelis, Ujjain's temple-town rituals along the Kshipra, and Indore's palace lawns and rooftop receptions each call for a photographer who already understands the light, the venues, and the pace of a Madhya Pradesh wedding. This guide walks through exactly how to compare candid wedding photographers across all three cities, so you can book with confidence instead of guesswork.

01

Why Local Experience Matters

A photographer who has actually shot at your venue is worth more than one with a bigger city name attached.

Every city here has its own rhythm. The light at a lake-facing lawn depends on the date, venue orientation and event schedule. A baraat winding through Ujjain's older lanes near Mahakaleshwar needs a photographer comfortable working in tight crowds and low light, often on foot. Indore's palace and resort venues, meanwhile, tend to have strict drone and vendor-entry rules that only a locally networked team will know in advance.

  • They've shot real weddings at your specific venue or a comparable one nearby.
  • They know the local vendor network — decorators, MUAs, venues — and can anticipate timing clashes.
  • They understand regional rituals (Malwa customs, temple-town protocols, community-specific ceremonies) well enough to be in the right place before the moment happens, not after.
The best wedding photos aren't staged — they're anticipated. That only happens when a photographer has stood in that exact courtyard before. Portfolio evaluation tip: ask to see complete galleries from comparable venues.
02

City Snapshot: Bhopal vs Ujjain vs Indore

Tap a city to see how style, pricing, and popular venues typically compare.

Signature Style
Lakeside & Heritage
Golden-hour lake shots, colonial-era havelis, misty morning ceremonies.
Typical Package
Request a quote
Full-day candid coverage with one or two photographers.
Popular Venues
Lake-view Lawns
Upper Lake resorts, heritage lawns, farmhouse properties.
Signature Style
Ritual-First & Documentary
Temple-adjacent ceremonies, dense processions, strong storytelling frames.
Typical Package
Request a quote
Confirm coverage, team size and date availability.
Popular Venues
Community Halls & Ghats
Riverside ceremonies, dharamshalas, family haveli courtyards.
Signature Style
Palace & Rooftop
Grand receptions, cinematic lighting setups, drone-heavy coverage.
Typical Package
Request a quote
Confirm costs for multi-day coverage and additional teams.
Popular Venues
Palace Lawns & Resorts
Heritage palaces, five-star lawns, rooftop banquet venues.

A current written quote is needed for each city. The original article's city price ranges were not sourced and are not confirmed studio rates.

03

Questions to Ask Before Booking

A good photographer will welcome every one of these questions.

  • Who shoots the wedding? Studios often subcontract — confirm the lead photographer by name and ask to see their personal recent work.
  • How many full weddings have you shot in this city? Portfolio polish matters less than repeated, real experience with local logistics.
  • What exactly is included? Number of photographers, shooting hours, edited photo count, albums, and raw file access should all be written into the quote.
  • What's the backup plan? Ask about backup cameras, backup power for indoor lighting setups, and a second shooter in case of illness.
  • What's the delivery timeline? Teaser images, full gallery, and printed album dates should be specific, not "a few weeks."
04

Portfolio Evaluation Tips

Look past the highlight reel — full-wedding galleries reveal the truth.

Any studio can show you fifteen beautiful frames. What separates a dependable photographer is consistency across an entire eight-hour wedding day: the getting-ready shots in a cramped hotel room, the chaotic five minutes before the baraat, the dimly lit reception stage. Ask for two or three complete, unedited-order galleries rather than a curated reel.

  • Check focus and exposure consistency in low light — receptions and evening rituals are the real test.
  • Look for genuine candid reactions, not repeated posed set-ups across every wedding.
  • Notice how they handle large group shots — family photos are notoriously easy to get wrong.
  • Read the editing style: does it look natural a year from now, or trend-heavy and dated?
05

Pricing Differences by City

Compare itemised quotes for the same dates, hours, team size and deliverables. City alone does not determine the price.

CityHalf-Day CoverageFull-Day CoverageAdd-on Cinematography
BhopalRequest a quoteRequest a quoteQuote separately
UjjainRequest a quoteRequest a quoteQuote separately
IndoreRequest a quoteRequest a quoteQuote separately

Prices depend on dates, team size, coverage hours, travel, and whether drone coverage or a same-day edit is included. Always ask for an itemised quote so you're comparing like for like across cities.

06

Travel & Accommodation

Outstation bookings are common across these three cities — factor logistics in early.

For weddings with events across Bhopal, Ujjain, and Indore, some couples book a single team to cover events split across cities — a haldi in Indore, a temple ceremony in Ujjain, and a reception in Bhopal, for instance. When booking across cities, confirm upfront whether travel and stay are billed separately or bundled into the package, and whether the same lead photographer covers every leg or a local associate takes over partway.

  • Ask for a written travel and accommodation clause, not a verbal estimate.
  • Confirm arrival time relative to your first event — same-day arrivals leave no buffer for delays.
  • For multi-city weddings, get it in writing whether it's one consistent team throughout.
07

Reviews & Testimonials

Use recent, traceable reviews to check a studio's work. Ask for the original review link and a matching wedding gallery.

Venue experience
Look for specific comments about timing, light and how the team worked at a venue like yours.

Communication
Check whether couples describe clear booking terms, coordination and a dependable team on the day.

Delivery
Read recent feedback about gallery quality and delivery, then confirm your own deliverables in writing.

08

Booking Timeline

When to lock in your photographer, city by city.

9–12 months before

Start shortlisting studios and requesting full-wedding portfolios, especially for November–February dates when demand peaks across all three cities.

6–9 months before

Confirm your shortlist, get itemised quotes, and lock in your lead photographer with a signed agreement and advance.

2–3 months before

Share the full event schedule, venue details, and any multi-city travel plans so logistics are settled well ahead of time.

2 weeks before

Final walkthrough call — shot list priorities, family photo groupings, and a confirmed arrival schedule.

Related Reading

09

Frequently Asked Questions

Compare full-length portfolios from real weddings in each city, ask about their experience with local venues and rituals, check turnaround times, and get itemised quotes so pricing, travel, and deliverables are easy to line up side by side.

Ask who will actually shoot your wedding, how many full weddings they've covered in your city, what's included in the package, their backup equipment and second-shooter plan, delivery timelines, and travel or stay costs for outstation venues.

Book 6 to 9 months ahead for peak-season dates in Bhopal, Ujjain, or Indore, particularly around auspicious dates from November to February, since experienced local teams fill up quickly.

Planning a Wedding Anywhere in Madhya Pradesh?

Book a consultation for weddings in Bhopal, Ujjain, Indore, or anywhere across the region — one team, one consistent story, wherever your celebration takes you.

Book a Consultation
// reading progress bar const progress = document.getElementById('progress'); function updateProgress(){ const h = document.documentElement; const scrolled = (h.scrollTop) / (h.scrollHeight - h.clientHeight) * 100; progress.style.width = scrolled + '%'; } document.addEventListener('scroll', updateProgress, { passive:true });// TOC active state const tocLinks = Array.from(document.querySelectorAll('#tocList a')); const sections = tocLinks.map(l => document.querySelector(l.getAttribute('href'))); function updateToc(){ let current = sections[0]; sections.forEach(s => { if(s && s.getBoundingClientRect().top - 140 l.classList.toggle('active', current && l.getAttribute('href') === '#' + current.id)); } document.addEventListener('scroll', updateToc, { passive:true }); updateToc();// city comparator tabs const tabs = document.querySelectorAll('.tab'); tabs.forEach(tab => { tab.addEventListener('click', () => { tabs.forEach(t => t.setAttribute('aria-selected','false')); tab.setAttribute('aria-selected','true'); document.querySelectorAll('.panel').forEach(p => p.setAttribute('data-active','false')); document.getElementById(tab.getAttribute('aria-controls')).setAttribute('data-active','true'); }); });// FAQ accordion document.querySelectorAll('.faq-item').forEach(item => { const btn = item.querySelector('.faq-q'); btn.addEventListener('click', () => { const isOpen = item.getAttribute('data-open') === 'true'; item.setAttribute('data-open', String(!isOpen)); btn.setAttribute('aria-expanded', String(!isOpen)); }); });