/* ============================================================ PRAVI — HOME PAGE Nav, footer, CtaBand come from common.jsx (shared source of truth). Only home-specific sections live here. ============================================================ */ const { useState, useEffect, useRef } = React; const P = window.PRAVI; const ChevronMark = window.PraviChevronMark; const ChevronTrails = window.ChevronTrails; const HomeNav = window.PraviHomeNav; const HomeFooter = window.PraviHomeFooter; const CtaBand = window.PraviCtaBand; const useReveal = window.praviUseReveal; const useScrollFX = window.praviUseScrollFX; const SplitText = window.PraviSplitText; const Head = window.PraviHead; const ProgressBar = window.PraviProgressBar; const Blob = window.PraviBlob; const CAT_PAGES = window.PRAVI_CAT_FILE; const SECTORS = window.PRAVI_SECTORS; /* Custom section signature — orange bar + blue bar. Used by About-derived sections. */ function Mark({ style = {} }) { return ( ); } /* Abstract single-line illustration — continuous self-drawing stroke. Fills the column gap. */ function LineArt() { return (
); } /* =================================================================== HERO — Forward-style: clean headline, mesh bg, parallax chevron =================================================================== */ function Hero() { const heroRef = useRef(null); useEffect(() => { const onScroll = () => { if (!heroRef.current) return; heroRef.current.style.setProperty("--scrollY", `${window.scrollY}px`); }; window.addEventListener("scroll", onScroll, { passive: true }); return () => window.removeEventListener("scroll", onScroll); }, []); return (
); } /* =================================================================== WHO WE ARE =================================================================== */ function WhoWeAre() { /* ───────────────────────────────────────────────────────────── COMPASS IMAGE CONTROLS — tweak these to test sizing & tilt. compassWidthPx : base width in px (320 ≈ original size) compassScale : size multiplier (2.5 = 2.5× bigger) compassTiltDeg : tilt in degrees. NEGATIVE leans the top toward the WEST (left); positive leans EAST (right); 0 = perfectly upright. ───────────────────────────────────────────────────────────── */ const compassWidthPx = 290; // base width in px const compassScale = 2.5; // size multiplier (final width = base × scale) const compassTiltDeg = -15; // -15 = tilted 15° to the west const compassShiftX = -70; // horizontal nudge in px: NEGATIVE = left (toward divider), positive = right return (
Who we are.

We build solutions that create lasting impact.

We are a team of highly motivated, intellectually curious, and impact-oriented professionals working with governments, businesses, development partners, and multilateral institutions to solve complex challenges at scale.

Pravi is more than a consulting firm. We are a collective of strategists, researchers, technologists, and implementation specialists committed to turning ambitious ideas into measurable outcomes. We combine analytical rigour with practical execution to help institutions navigate complexity, improve performance, and create sustainable impact.

Our work spans the entire transformation journey—from identifying the right problem and designing evidence-based strategies to building systems, strengthening capabilities, and driving execution on the ground.

{/*

We don't just deliver reports. We design policies that get implemented, programmes that achieve outcomes, and institutions that become stronger.

What sets us apart is our ability to bridge the gap between vision and execution. We operate where strategy meets implementation, where policy meets practice, and where intent translates into measurable change.

*/}

Whether supporting governments in delivering public services, enabling businesses to scale sustainably, or partnering with development organisations to maximise impact, we work as an extension of our clients' teams by bringing deep domain expertise, structured problem-solving, and relentless ownership to every engagement.

{/*

At Pravi, success is not measured by presentations delivered or recommendations made. It is measured by the outcomes our clients achieve and the impact that endures long after the engagement concludes.

*/}
{/*
True north compass e.target.style.display = 'none'} />
*/}
The Pravi team e.target.style.display = 'none'} />
{/*
Meet the team
*/}
); } /* =================================================================== FOUR PRACTICE AREAS =================================================================== */ function FourPracticeAreas() { return (
{/* */} {/*
Four practice areas. All services
*/} {/*
{P.serviceCategories.map((cat, i) => { const bg = i % 2 === 0 ? 'var(--paper)' : 'var(--paper-deep)'; const catPage = CAT_PAGES[cat.slug] || 'pravi-consulting.html'; return ( ); })}
*/}
); } /* =================================================================== AFFILIATED WITH =================================================================== */ function Affiliated() { return (
Who we work with.
{SECTORS.map((sector, i) => { const bg = i % 2 === 0 ? 'var(--paper)' : 'var(--paper-deep)'; const sectorImgs = ['assets/boardroom.webp', 'assets/pmo.webp', 'assets/devsector.webp']; return (
{sector.title} e.target.style.display = 'none'} />
{/*
0{i + 1} / {sector.slug.toUpperCase()}
*/}

{sector.title}

{sector.description}

); })}
); } /* =================================================================== THE PRAVI WAY =================================================================== */ function PraviWay() { return (
THE PRAVI WAY
How we move
from brief to built.
); } /* =================================================================== PRAVI BLOGS =================================================================== */ function Resources() { const b0 = P.blogs[0], b1 = P.blogs[1], b2 = P.blogs[2], b3 = P.blogs[3], b4 = P.blogs[4], b5 = P.blogs[5]; /* Set to true to show events in the grid */ const SHOW_EVENTS = false; return (
Ideas at Pravi.
All blogs
{/* featured blog */}
e.target.style.display = 'none'} />
FEATURED · {b0.tag} · {b0.read}

{b0.title}

{b0.desc}

READ ARTICLE
{/* blog 3 */}
e.target.style.display = 'none'} />
BLOG · {b2.tag}

{b2.title}

{b2.read} read READ ARTICLE
{/* blog 4 */} {b3 &&
e.target.style.display = 'none'} />
BLOG · {b3.tag}

{b3.title}

READ ARTICLE
} {/* blog 2 */}
e.target.style.display = 'none'} />
BLOG · {b1.tag}

{b1.title}

{b1.desc}

READ ARTICLE
{/* blog 5 */} {b4 &&
e.target.style.display = 'none'} />
BLOG · {b4.tag}

{b4.title}

READ ARTICLE
} {/* blog 6 */} {b5 &&
e.target.style.display = 'none'} />
BLOG · {b5.tag}

{b5.title}

READ ARTICLE
} {/* Events — hidden, set SHOW_EVENTS = true to restore */} {SHOW_EVENTS && ( <>
e.target.style.display = 'none'} />
EVENT · {P.events[0].date.split(' · ')[0]}

{P.events[0].title}

{P.events[0].place}
e.target.style.display = 'none'} />
EVENT · {P.events[1].date.split(' · ')[0]}

{P.events[1].title}

{P.events[1].place}
)}
{/* ── LinkedIn Posts sub-section ── */}
#FollowUs.
Follow us
{/* 2×2 equal grid */}
{[ { url: '7458153193127108609', title: 'Pravi LinkedIn post 1', d: '0ms' }, { url: '7469746039751696384', title: 'Pravi LinkedIn post 2', d: '110ms' }, { url: '7454801646989066240', title: 'Pravi LinkedIn post 3', d: '220ms' }, { url: '7468962831292518400', title: 'Pravi LinkedIn post 4', d: '330ms' }, ].map(p => (