/* Studio 76 — page sections. Exported to window. */ /* ---------------- NAV ---------------- */ function Nav({ accent, onBegin, light }) { const [open, setOpen] = React.useState(false); const [scrolled, setScrolled] = React.useState(false); React.useEffect(() => { const f = () => setScrolled(window.scrollY > 40); window.addEventListener('scroll', f); f(); return () => window.removeEventListener('scroll', f); }, []); const onLight = light && !scrolled && !open; const links = [['The Spark','#inspiration'],['Imaginarium','#imaginarium'],['Studio Bench','/blueprint.html'],['Luxe & Deluxe','#compare'],['Jewellers','#jewellers']]; return (
{open && (
{links.map(([t,h]) => setOpen(false)}>{t})}
)}
); } /* ---------------- HERO — cinematic campaign ---------------- */ function Hero({ t, onBegin }) { const pick = t.heroImage; const light = pick === 'ivory'; const bg = pick === 'noir-b' ? ASSETS.heroNoirB : (light ? ASSETS.heroIvory : ASSETS.heroNoirA); return (

The original, made real

Make it your own.

The piece you adored, remade in solid gold and genuine stones — made to be handed down.

How it works
Campaign Nº 01 — The Empress Rivière, remade from a saved pin Scroll
); } /* ---------------- MARQUEE ---------------- */ function Marquee() { const items = ['Solid gold','Lab-grown or natural','Hand-set in Mumbai','Made to be handed down','The original, made real']; const run = [...items, ...items]; return (
{run.map((x,i) => ( {x} ))}
); } /* ---------------- INSPIRATION ---------------- */ function Inspiration({ onBegin }) { return (
Where it begins

You only saw it once. Keep it forever.

On a friend you loved. On a star, frozen in a frame of celluloid. In a shop window years ago, or a dream you woke up still reaching for. Wherever you first saw it — describe it, and our AI draws it back to life. Then our Mumbai studio makes it real, in solid gold.

How it works
A piece glimpsed on screen

Paused on frame · 0412

{INSPIRATION.map((it, i) => (
{['I','II','III','IV'][i]}

{it.k}

{it.s}

))}
Our AI turns your words — or a single blurry photo — into a first sketch in seconds. A human stylist refines it from there.
); } /* ---------------- STUDIO BENCH PROMO ---------------- */ function BenchPromo() { return (
Studio Bench

Already have a piece? Photograph it.

Upload any jewellery photo and the bench reads it — a technical blueprint, a full spec sheet, and the piece worn on a model, ready for the grid.

Open the Studio Bench
Photograph your piece ✦ Photo → Blueprint
); } /* ---------------- LATEST SETS ---------------- */ function LatestSets() { const [sets, setSets] = React.useState(null); React.useEffect(() => { fetch('/blueprint.php?action=list_sets') .then(r => r.json()) .then(j => setSets((j.sets || []).filter(s => s.count > 0 && s.cover).slice(0, 8))) .catch(() => setSets([])); }, []); if (!sets || !sets.length) return null; return (
Lately on the bench

Freshly imagined.

Make yours
{sets.map(s => (
{s.title}
{s.title} {s.count} piece{s.count === 1 ? '' : 's'}
))}
); } /* ---------------- HOW IT WORKS ---------------- */ function HowItWorks() { return (
How it works

Three steps from obsession to heirloom.

{HOW.map((h, i) => (
{h.n}

{h.t}

{h.s}

))}
); } /* ---------------- GALLERY ---------------- */ function Gallery({ onBegin }) { return ( ); } /* ---------------- LUXE vs DELUXE ---------------- */ function Compare() { const Side = ({ kind, img, accent, tagline, body, bullets, d }) => (
{kind}

{kind}

{tagline}

{body}

); return (
Two ways to own it

Same solid gold. Your kind of forever.

); } /* ---------------- STORY ---------------- */ function Story() { return (
Our story

Studio76

Not a label — a bench. Studio 76 is the Mumbai workshop where the piece you only ever saw — on a screen, on someone else, in a dream — is remade in solid gold and genuine stone.

Real gold and real stone don’t tarnish, dull, or date. The trend passes. The piece stays.

You’ve carried that one image around for years, half-believing it could ever be yours. Studio 76 exists for exactly that: you bring the obsession, we make it last.

Hand-set in Mumbai. Worn anywhere. Yours to keep.

Studio 76 emerald cascade
); } /* ---------------- PROCESS ---------------- */ function Process() { return (
The process

Made by hand, made to keep.

{PROCESS.map((p, i) => (
0{i+1}

{p.t}

{p.s}

))}
); } /* ---------------- JEWELLERS — THE PRIVATE STUDIO (coming soon) ---------------- */ function Jewellers() { const [email, setEmail] = React.useState(''); const [state, setState] = React.useState('idle'); // idle | busy | done | err const ok = /\S+@\S+\.\S+/.test(email); async function apply(e) { e.preventDefault(); if (!ok || state === 'busy') return; setState('busy'); try { const r = await fetch('imaginarium.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'waitlist', list: 'trade', email }) }); const j = await r.json(); if (!r.ok || j.error) throw new Error(j.error); setState('done'); } catch (err) { setState('err'); } } const rows = [ ['I', 'The Bench, under your mark', 'Photo to blueprint, spec sheet, model shoots and a 3D concept mesh — white-labelled, on your counter.'], ['II', 'Client presentation sets', 'Every reading becomes a private, shareable set. Your client leaves with a link; you keep the commission.'], ['III', 'Drawings your karigar can use','Dimensioned elevations and orthographic plates the workshop can actually start from.'], ['IV', 'A small first circle', 'By application only — trade terms, priority bench hours, and a hand in what we build next.'], ]; return (
For the trade

The Private Studio. For jewellers.

The bench behind Studio 76 — the readings, the blueprints, the shoots, the 3D — is opening as a private studio for working jewellers. Your mark on the door. Our machinery behind it.

{rows.map(([n, t, s]) => (
{n}

{t}

{s}

))}
Coming soon

Private Studio

Studio 76 · for the trade


Member Nº —— By application

First ateliers onboard winter 2026

{state !== 'done' ? ( Keep a place at the bench — we’ll write when the door opens.
setEmail(e.target.value)} type="email" placeholder="you@youratelier.com" aria-label="Your email" />
{state === 'err' && Something slipped — try once more.}
) : (

✓ Noted in the ledger. You’ll hear from us before anyone else.

)}
); } /* ---------------- CTA ---------------- */ function CTA() { const [email, setEmail] = React.useState(''); const [state, setState] = React.useState('idle'); // idle | busy | done const ok = /\S+@\S+\.\S+/.test(email); async function join(e) { e.preventDefault(); if (!ok || state === 'busy') return; setState('busy'); try { const r = await fetch('imaginarium.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'waitlist', list: 'client', email }) }); const j = await r.json(); if (!r.ok || j.error) throw new Error(j.error); setState('done'); } catch (err) { setState('idle'); } } return (

Bring the one you’ve never let go of.

Join early access for a complimentary first consultation — and be first to make your saved piece real.

{state !== 'done' ? (
setEmail(e.target.value)} type="email" placeholder="you@email.com" />
) : (

✓ You’re on the list. We’ll be in touch with your first consultation.

)}
); } /* ---------------- FOOTER ---------------- */ function Footer() { const hrefs = { 'Studio Bench': '/blueprint.html', 'Private Studio — trade': '#jewellers' }; const cols = [ ['Explore', ['Studio Bench','Luxe & Deluxe','Pins, reborn','How it works']], ['Studio', ['Our story','Certification','Care & repair','Book a consultation']], ['More', ['Early access','Private Studio — trade','Gifting','Contact']], ]; return ( ); } /* ---------------- MOBILE STICKY CTA ---------------- */ function MobileBar({ onBegin }) { const [show, setShow] = React.useState(false); React.useEffect(() => { const inView = (el, topFrac, botFrac) => { if (!el) return false; const r = el.getBoundingClientRect(); const vh = window.innerHeight; return r.top < vh * topFrac && r.bottom > vh * botFrac; }; let raf = 0; const f = () => { raf = 0; const studio = document.getElementById('studio'); const cta = document.querySelector('.cta'); const pastHero = window.scrollY > window.innerHeight * 0.65; const busy = inView(studio, 0.7, 0.25) || inView(cta, 0.85, 0.1); setShow(pastHero && !busy); }; const onScroll = () => { if (!raf) raf = requestAnimationFrame(f); }; f(); window.addEventListener('scroll', onScroll, { passive: true }); window.addEventListener('resize', onScroll); return () => { window.removeEventListener('scroll', onScroll); window.removeEventListener('resize', onScroll); if (raf) cancelAnimationFrame(raf); }; }, []); return (
Make it real Luxe or Deluxe · solid gold
); } Object.assign(window, { Nav, Hero, Marquee, Inspiration, BenchPromo, LatestSets, HowItWorks, Gallery, Compare, Story, Process, Jewellers, CTA, Footer, MobileBar });