/* ============================================================ PRAVI — SHARED CHROME (Nav · Footer · CTA · marks · Polaroid) Extracted from the Home page so About / Services / future pages share one identical source of truth. Direction: BROADSHEET. ============================================================ */ const { useState: useStateK, useEffect: useEffectK, useRef: useRefK } = React; const P = window.PRAVI; const SECTORS = [ { slug: 'business', title: 'Business', description: 'Strategic support tailored for organizations of all scales, from emerging startups to established enterprises.' }, { slug: 'government', title: 'Government & Public Sector', description: 'We support central and state governments in shaping evidence-based policies, strengthening institutional capacity, and driving high-impact development programs.' }, { slug: 'development', title: 'Development Sector', description: 'Partnering with NGOs and global foundations to amplify impact, optimize delivery, and drive measurable outcomes.' }, ]; /* ---- The distilled >P chevron mark ---- */ function ChevronMark({ size = 16, color = "var(--pravi-orange)", style = {} }) { return ( ); } function ChevronTrails() { return ( ); } /* =================================================================== MEGAMENUS — AWS-style full-width dropdown panels =================================================================== */ function ServicesMegaMenu({ onClose }) { return (
SERVICES
{P.serviceCategories.map(cat => ( { e.currentTarget.style.paddingLeft = '8px'; }} onMouseLeave={e => { e.currentTarget.style.paddingLeft = '0'; }}>
{cat.title}
{cat.blurb}
))}
); } function ResourcesMegaMenu({ onClose }) { return (
BLOGS & INSIGHTS
{P.blogs.slice(0, 3).map(blog => (
{blog.title}
{blog.desc}
{blog.tag} · {blog.read}
))}
{/*
EVENTS
{P.events.map((evt, i) => ( { e.currentTarget.style.color = 'var(--pravi-blue)'; }} onMouseLeave={e => { e.currentTarget.style.color = 'inherit'; }}>
{evt.title}
{evt.date.split(' · ')[0]} · {evt.place}
))}
*/}
); } /* =================================================================== NAV — sticky, megamenus, real page links + active state =================================================================== */ function MobileMenu({ active, navItems, open }) { const [section, setSection] = useStateK(null); const toggle = (key) => setSection(s => (s === key ? null : key)); return (
{navItems.map((item) => (
{item.menu ? ( ) : ( {item.label} )} {item.menu === 'services' && section === 'services' && (
{P.serviceCategories.map(cat => ( {cat.title} ))}
)} {item.menu === 'resources' && section === 'resources' && (
{P.blogs.slice(0, 3).map(b => ( {b.title} ))} {/* All events */}
)}
))} Contact Us
); } function HomeNav({ active = "Home" }) { const [openMenu, setOpenMenu] = useStateK(null); const [mobileOpen, setMobileOpen] = useStateK(false); const [scrolled, setScrolled] = useStateK(false); useEffectK(() => { const onScroll = () => setScrolled(window.scrollY > 12); onScroll(); window.addEventListener('scroll', onScroll, { passive: true }); return () => window.removeEventListener('scroll', onScroll); }, []); const navItems = [ { label: "Home", href: "home.html" }, { label: "At Pravi", href: "at-pravi.html" }, { label: "Pravi Consulting", href: "pravi-consulting.html", menu: "services" }, { label: "Pravi Labs", href: "pravi-labs.html" }, { label: "Pravi Studios", href: "pravi-studios.html" }, { label: "Careers", href: "careers.html" }, ]; return ( ); } /* =================================================================== CTA BAND =================================================================== */ function CtaBand() { return (
{/* */}

Have a problem worth solving?

Let's talk
); } /* =================================================================== FOOTER — identical to Home =================================================================== */ function HomeFooter() { const cols = [ { h: "Pages", l: [["Home", "home.html#top"], ["At Pravi", "at-pravi.html#top"], ["Pravi Consulting", "pravi-consulting.html#practices"], ["Pravi Labs", "pravi-labs.html#top"], ["Pravi Studios", "pravi-studios.html#top"], ["Careers", "careers.html#roles"]] }, { h: "Pravi Consulting", l: P.serviceCategories.map(s => [s.title, `${window.PRAVI_CAT_FILE[s.slug]}#top`]) }, { h: "Pravi Labs", l: [["How We Work", "pravi-labs.html#minds"], /* ["Our Environment", "pravi-labs.html#environment"], */ ["Build for Billion", "pravi-labs.html#build-for-bharat"]] }, { h: "Pravi Studios", l: [["Inside the Studio", "pravi-studios.html#capabilities"], ["How We Work", "pravi-studios.html#approach"], ["Campaign Anatomy", "pravi-studios.html#anatomy"], ["Studio Culture", "pravi-studios.html#culture"]] }, { h: "Connect", l: [["LinkedIn", "https://www.linkedin.com/company/pravi-research"]] }, ]; return ( ); } /* =================================================================== HERO — shared Broadsheet hero (parallax chevron + radial mesh) Pass eyebrow / headline (JSX) / lead / buttons per page. =================================================================== */ function PageHero({ eyebrow, headline, lead, buttons, headlineStyle, padding }) { const heroRef = useRefK(null); useEffectK(() => { 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 (
); } /* =================================================================== POLAROID — borrowed from Field Note, self-contained styles =================================================================== */ function Polaroid({ src, caption, rotate = 0, stamp, alt = "" }) { return (
{ e.currentTarget.style.transform = 'translateY(-6px) rotate(0deg)'; }} onMouseLeave={e => { e.currentTarget.style.transform = `rotate(${rotate}deg)`; }}> {stamp && (
{stamp}
)}
{src && {alt} { e.target.style.display = 'none'; }} />}
{caption}
); } /* =================================================================== REVEAL — IntersectionObserver, same behaviour as Home =================================================================== */ function useRevealObserver(stageRef) { useEffectK(() => { if (!stageRef.current) return; const els = stageRef.current.querySelectorAll('.reveal, .reveal-l, .reveal-r'); const io = new IntersectionObserver((entries) => { entries.forEach(e => { if (e.isIntersecting) e.target.classList.add('in'); }); }, { threshold: 0.12, rootMargin: "0px 0px -60px 0px" }); els.forEach(el => { const r = el.getBoundingClientRect(); if (r.top < window.innerHeight * 0.95) el.classList.add('in'); io.observe(el); }); const safety = setTimeout(() => els.forEach(el => { el.classList.add('in'); el.style.transition = 'none'; el.style.opacity = '1'; el.style.transform = 'none'; }), 1100); return () => { io.disconnect(); clearTimeout(safety); }; }, []); } function useHashScroll() { useEffectK(() => { const handleHash = () => { const hash = window.location.hash; if (hash && hash !== '#top') { const id = decodeURIComponent(hash.slice(1)); let count = 0; const checkAndScroll = () => { const element = document.getElementById(id); if (element) { element.scrollIntoView({ behavior: 'smooth', block: 'start' }); } else if (count < 15) { count++; setTimeout(checkAndScroll, 100); } }; checkAndScroll(); } }; handleHash(); window.addEventListener('hashchange', handleHash); return () => window.removeEventListener('hashchange', handleHash); }, []); } const PRAVI_CAT_FILE = { 'strategy-advisory': 'strategy-and-advisory.html', 'execution-delivery': 'execution-and-delivery.html', 'insight-intelligence': 'insight-and-intelligence.html', 'digital-systems': 'digital-and-systems.html', }; /* =================================================================== LINKEDIN POST CARDS — custom card UI (no iframes) =================================================================== */ const LINKEDIN_POSTS = [ { text: "India's infrastructure development is evolving from building roads to creating integrated connectivity systems. The Ganga Expressway — a 594 km corridor from Meerut to Prayagraj — represents more than just improved mobility. It reflects a broader shift towards developing connected infrastructure ecosystems.", docTitle: "Dashboard to War Rooms: How Infra Projects Scale", docSub: "Infrastructure · Pravi Research", bg: "linear-gradient(135deg, #0f2d6b 0%, #1a4fb9 100%)", postUrl: "https://www.linkedin.com/posts/pravi-research_ganga-expressway-activity-7458153193127108609-c1Ew", reactions: 412, }, { text: "As India's cities expand, fragmented transport systems and vehicle-centric planning are driving congestion, inequality, and rising emissions. Rethinking urban mobility with integrated solutions is no longer optional — it's essential. From seamless connectivity to climate-first design.", docTitle: "Integrated Multimodal Transport Systems for Urban India", docSub: "Urban Mobility · Pravi Research", bg: "linear-gradient(135deg, #0d3b2e 0%, #1b6b5a 100%)", postUrl: "https://www.linkedin.com/company/pravi-research", reactions: 286, }, { text: "India's Open Government Data: Democratising Access, Accelerating Insight. As the world pivots to data-led decision making, India has taken a bold step — making vast repositories of government data open and accessible. It is a catalyst for innovation, accountability, and evidence-based governance.", docTitle: "India's Open Government Data Platform", docSub: "Governance & Data · Pravi Research", bg: "linear-gradient(135deg, #7a1a08 0%, #c04a1a 100%)", postUrl: "https://www.linkedin.com/posts/pravi-research_indias-open-government-data-platform-activity-7335587985469427713-eSQe", reactions: 318, }, { text: "Urban heat islands are intensifying across India's dense cities. Thoughtful urban design — tree canopy strategies, reflective surfaces, wind corridors — can meaningfully reduce temperatures in the most vulnerable neighbourhoods. A look at what works and what doesn't.", docTitle: "Cooling India's Cities: Urban Design for Heat Resilience", docSub: "Urban Policy · Pravi Research", bg: "linear-gradient(135deg, #2d1a5e 0%, #5a2d9e 100%)", postUrl: "https://www.linkedin.com/company/pravi-research", reactions: 240, }, { text: "The government's consideration of allowing joint ventures with Chinese companies marks a significant policy inflection point. The implications span national security, technology transfer, and India's strategic positioning in global value chains — and deserve careful, evidence-based scrutiny.", docTitle: "Implications of Allowing JVs with Chinese Companies", docSub: "Policy & Trade · Pravi Research", bg: "linear-gradient(135deg, #1e3a5f 0%, #1a6ba0 100%)", postUrl: "https://www.linkedin.com/company/pravi-research", reactions: 540, }, { text: "The Panchayati Advancement Index offers a rare glimpse into rural governance metrics. What does it actually measure, and what does it miss? Our analysis unpacks the methodology and its implications for bottom-up governance reform across India's 2.5 lakh gram panchayats.", docTitle: "Panchayati Advancement Index: Lessons on Rural Metrics", docSub: "Rural Governance · Pravi Research", bg: "linear-gradient(135deg, #0d3d1e 0%, #1a6b3a 100%)", postUrl: "https://www.linkedin.com/company/pravi-research", reactions: 195, }, ]; function LinkedInCard({ post }) { const [expanded, setExpanded] = React.useState(false); const SHORT = 155; const isLong = post.text.length > SHORT; const shown = expanded || !isLong ? post.text : post.text.slice(0, SHORT); return (
Pravi e.target.style.display = 'none'} />
Pravi
275 followers
{shown}{isLong && !expanded && setExpanded(true)}>see more}
); } Object.assign(window, { PraviChevronMark: ChevronMark, ChevronTrails, PraviHomeNav: HomeNav, PraviHomeFooter: HomeFooter, PraviCtaBand: CtaBand, PraviPageHero: PageHero, PraviPolaroid: Polaroid, praviUseReveal: useRevealObserver, praviUseHashScroll: useHashScroll, PRAVI_SECTORS: SECTORS, PRAVI_CAT_FILE, PraviLinkedInCard: LinkedInCard, PRAVI_LINKEDIN_POSTS: LINKEDIN_POSTS, });