/* bespoke.jsx — five-step bespoke funnel */ const Bespoke = ({onConsult, setRoute}) => { const [step, setStep] = React.useState(0); const [data, setData] = React.useState({ category: '', occasion: '', references: [], stoneType: '', stoneShape: '', stoneColor: '', caratBand: '', metal: '', setting: '', budget: '', timing: '', notes: '', }); const set = (k, v) => setData((d) => ({...d, [k]: v})); const toggleRef = (k) => setData((d) => { const has = d.references.includes(k); return {...d, references: has ? d.references.filter(x => x !== k) : [...d.references, k]}; }); const steps = [ 'The Piece', 'The Stone', 'Metal & Setting', 'Brief & Budget', 'Review', ]; return (
{steps.map((s, i) => (
i < step && setStep(i)}> {String(i + 1).padStart(2, '0')} {s}
))}
{step === 0 && } {step === 1 && } {step === 2 && } {step === 3 && } {step === 4 && }
Step {step + 1} of {steps.length}
{step < steps.length - 1 ? ( ) : ( )}
); }; // =========================================================== // Bespoke Hero // =========================================================== const BespokeHero = () => (
Bespoke · Made for you

Begin a one-of-one.

Five short questions, then a consultant. Bring whatever you have — a sketch, a screenshot, an heirloom, a stone — and we'll meet it with a brief, three 3D-CAD renders, and a four-to-six-week atelier window.

); // =========================================================== // Step 1 — The Piece // =========================================================== const StepPiece = ({data, set, toggleRef}) => { const categories = [ {id: 'engagement', name: 'Engagement ring', sub: 'Solitaire, halo, three-stone, cluster'}, {id: 'band', name: 'Wedding band', sub: 'Eternity, half-eternity, plain, mixed'}, {id: 'cocktail', name: 'Cocktail ring', sub: 'Statement, gemstone, novelty'}, {id: 'earrings', name: 'Earrings', sub: 'Studs, drops, hoops, climbers'}, {id: 'necklace', name: 'Necklace / Pendant', sub: 'Solitaire, station, heirloom motif'}, {id: 'bracelet', name: 'Bracelet / Bangle', sub: 'Tennis, link, cuff, eternity'}, {id: 'rework', name: 'Heirloom rework', sub: 'Bring an existing piece to begin'}, {id: 'other', name: 'Something else', sub: 'Brooch, anklet, pinky, charm — anything'}, ]; const occasions = ['Engagement', 'Wedding', 'Anniversary', 'Birthday', 'Push present', 'Self-gift', 'Gift to a friend']; const refs = ['aureveris', 'velantrix', 'magnolia', 'prismara', 'celeste', 'imperial-eagle']; return (

What are we making?

One brief sentence is enough. We'll pull the rest out of you over coffee.

{categories.map((c) => ( ))}
{occasions.map((o) => ( ))}
{refs.map((id) => { const p = byId(id); const selected = data.references.includes(id); return ( ); })}
); }; // =========================================================== // Step 2 — The Stone // =========================================================== const StepStone = ({data, set}) => { const stones = [ {id: 'diamond', name: 'Diamond', sub: 'Brilliant, emerald, oval, pear, marquise, princess'}, {id: 'sapphire', name: 'Sapphire', sub: 'Blue, pink, yellow, multi — most worn at the house'}, {id: 'emerald', name: 'Emerald', sub: 'Colombian & Zambian'}, {id: 'ruby', name: 'Ruby', sub: 'Burmese, pigeon-blood, oval & cushion'}, {id: 'spinel', name: 'Spinel', sub: 'Red, blue, cobalt — collectors\' choice'}, {id: 'mixed', name: 'A mix', sub: 'Halo of one, centre of another'}, {id: 'own', name: 'I have my own stone', sub: 'Bring it — we\'ll certify it'}, {id: 'open', name: 'Advise me', sub: 'Show me three options'}, ]; const shapes = ['Round', 'Oval', 'Cushion', 'Emerald', 'Pear', 'Marquise', 'Princess', 'Heart', 'Asscher']; const colors = ['Colourless / D–F', 'Near colourless / G–J', 'Blue sapphire', 'Pink sapphire', 'Yellow sapphire', 'Emerald green', 'Ruby red', 'Multi / rainbow']; const carats = ['Up to 0.5ct', '0.5 – 1ct', '1 – 2ct', '2 – 3ct', '3 – 5ct', '5ct +', 'Advise me']; return (

The stone, first.

The piece is drawn around it.

{stones.map((s) => ( ))}
{shapes.map((s) => ( ))}
{colors.map((c) => ( ))}
{carats.map((c) => ( ))}
); }; // =========================================================== // Step 3 — Metal & Setting // =========================================================== const StepMetal = ({data, set}) => { const metals = [ {id: 'yellow', name: '18k Yellow Gold', sub: 'Warm, traditional, holds colour in stones'}, {id: 'rose', name: '18k Rose Gold', sub: 'Pink-warm, complements diamond & morganite'}, {id: 'white', name: '18k White Gold', sub: 'Cool-grey, mainstream bridal'}, {id: 'platinum', name: 'Platinum 950', sub: 'Heaviest, hypoallergenic, lifetime'}, {id: 'mixed', name: 'Two-tone', sub: 'White centre, rose or yellow shank'}, ]; const settings = [ {id: 'solitaire', name: 'Solitaire', d: 'Single stone, prong or bezel.'}, {id: 'halo', name: 'Halo', d: 'Pavé around centre stone.'}, {id: 'three', name: 'Three-stone', d: 'Centre flanked by accents.'}, {id: 'cluster', name: 'Cluster', d: 'Stones grouped as a single jewel.'}, {id: 'eternity', name: 'Eternity', d: 'Full circle of stones.'}, {id: 'bezel', name: 'Bezel / Tension', d: 'Modern, low-profile.'}, ]; return (

Metal & setting.

If you're unsure, leave it to the bench.

{metals.map((m) => ( ))}
{settings.map((s) => ( ))}
); }; const metalSwatch = (id) => ({ yellow: 'linear-gradient(135deg, #E8C56E, #B8923A)', rose: 'linear-gradient(135deg, #E5B5A1, #BF8870)', white: 'linear-gradient(135deg, #E8E8EE, #B8B8C2)', platinum: 'linear-gradient(135deg, #DFE2E6, #9CA3AA)', mixed: 'linear-gradient(90deg, #E8C56E 0% 33%, #E8E8EE 33% 66%, #E5B5A1 66% 100%)', })[id]; const SettingDiagram = ({type, selected}) => { const c = selected ? 'var(--palace-gold)' : 'var(--ink-40)'; return ( {type === 'solitaire' && ( )} {type === 'halo' && ( )} {type === 'three' && ( )} {type === 'cluster' && ( {[[18,10],[26,10],[22,16],[18,22],[26,22]].map(([x,y], i) => )} )} {type === 'eternity' && ( {[6, 12, 18, 22, 26, 32, 38].map((x, i) => )} )} {type === 'bezel' && ( )} ); }; // =========================================================== // Step 4 — Brief & Budget // =========================================================== const StepBrief = ({data, set}) => { const budgets = [ {id: '9-20', name: 'AED 9k – 20k', sub: 'A polished, considered first piece'}, {id: '20-50', name: 'AED 20k – 50k', sub: 'Signature & most bridal'}, {id: '50-100', name: 'AED 50k – 100k', sub: 'Centre stone, statement work'}, {id: '100+', name: 'AED 100k +', sub: 'Couture and high-jewellery'}, {id: 'open', name: 'Open / advise me', sub: 'Three options across bands'}, ]; const timings = ['4–6 weeks (standard)', '6–10 weeks (more intricate)', 'I have a deadline', 'No rush']; return (

The brief.

Budget bands and timing — both flexible, both worth saying out loud.

{budgets.map((b) => ( ))}
{timings.map((t) => ( ))}