// screens.jsx — Home, Browse, PDP, Cart, Checkout const { useState, useEffect, useRef } = React; // ───────────────────────────────────────────────────────────── // HOME // ───────────────────────────────────────────────────────────── function Home({ go, openInquire, addToCart, heroIntensity }) { const heroRug = RUGS[1]; // Atlas Bloom const featured = RUGS.slice(0, 6); // scroll-tilt for hero const stageRef = useRef(null); useEffect(() => { if (heroIntensity === 'off') return; const onScroll = () => { if (!stageRef.current) return; const y = window.scrollY; stageRef.current.style.setProperty('--scroll-y', y + 'px'); }; window.addEventListener('scroll', onScroll, { passive:true }); return () => window.removeEventListener('scroll', onScroll); }, [heroIntensity]); return (
{/* HERO */}
Atelier No. 7 — Spring MMXXVI

Rugs that
hold a
room together.

Made-to-order, modern-abstract pieces — hand-knotted by a quiet roster of master weavers. Ten weeks from your inquiry to your floor.

12+
Master weavers
10wk
Lead time
1/1
Of a kind
{/* Hero video */}
{ go('pdp'); window.__pdpRug = heroRug; }} style={{ cursor:'pointer' }}> {/* Second floating element — product still */}
go('shop')}> Featured rug — product shot Atlas Bloom · 9×12 ft 120 KPSI · wool + silk
{/* SECTION: Featured */}
The Collection

Quiet pieces, long lives.

{featured.map((r) => (
{ window.__pdpRug = r; go('pdp'); }}>
View piece →
{r.name}{r.italic && <> · {r.italic}}
{r.tag.split('·')[0]}
))}
{/* SECTION: Story */}
Atelier · Bhadohi · 2025
The Atelier

A loom moves
at human speed.

Every rug we make is started after you've decided you want it. Twelve master weavers across three ateliers — Jaipur, Bhadohi, Kashan — keep wool and silk moving through hand-tied knots at a rate that hasn't changed in two centuries.

We don't keep stock. The rug you order is the rug being made.

{/* SECTION: Process strip */}
How it works
{[ ['Inquire', 'Select a piece and tell us about your room.'], ['Confirm', 'We send fibre samples and a quote in 48 hours.'], ['Weave', 'Your rug is knotted by a single weaver, start to finish.'], ['Arrive', 'White-glove delivery in ten to fourteen weeks.'], ].map(([t, d], i) => (
0{i+1}

{t}

{d}

))}
); } // ───────────────────────────────────────────────────────────── // BROWSE // ───────────────────────────────────────────────────────────── function Browse({ go }) { const [filter, setFilter] = useState('all'); const filters = [ ['all', 'All pieces'], ['hand-knot', 'Hand-knotted'], ['tufted', 'Hand-tufted'], ['flat', 'Flat-weave'], ['silk', 'With silk'], ['large', '9×12 ft and up'], ]; const visible = filter === 'all' ? RUGS : filter === 'silk' ? RUGS.filter(r => r.tag.includes('silk')) : filter === 'flat' ? RUGS.filter(r => r.tag.includes('Flat-weave')) : filter === 'tufted' ? RUGS.filter(r => r.tag.includes('tufted')) : filter === 'hand-knot' ? RUGS.filter(r => r.tag.includes('knotted')) : RUGS; return (
Spring MMXXVI · 24 pieces

The Collection.

Each rug is made to order. Inquire on any piece to receive samples and a quote within forty-eight hours.

Filter {filters.map(([k, label]) => ( ))}
Showing {visible.length} of {RUGS.length}
{visible.map((r) => (
{ window.__pdpRug = r; go('pdp'); }}>
Inquire →
{r.name}{r.italic && <> · {r.italic}}
{r.tag.split('·')[0]}
{r.origin.split('·')[1]?.trim()} {r.lead}
))}

Don't see your room? We design custom pieces too.

); } // ───────────────────────────────────────────────────────────── // PDP // ───────────────────────────────────────────────────────────── function PDP({ go, addToCart, openInquire }) { const rug = window.__pdpRug || RUGS[1]; const [size, setSize] = useState(rug.sizes[1] || rug.sizes[0]); const [colorIdx, setColorIdx] = useState(0); const [angle, setAngle] = useState('45'); const stageRef = useRef(null); // mouse-tilt useEffect(() => { const stage = stageRef.current; if (!stage) return; const onMove = (e) => { const r = stage.getBoundingClientRect(); const x = (e.clientX - r.left) / r.width - 0.5; const y = (e.clientY - r.top) / r.height - 0.5; stage.style.setProperty('--mx', x); stage.style.setProperty('--my', y); }; stage.addEventListener('mousemove', onMove); return () => stage.removeEventListener('mousemove', onMove); }, []); const angleMap = { '0': 'rotateX(0deg) rotateZ(0deg)', '45': 'rotateX(50deg) rotateZ(0deg)', '90': 'rotateX(80deg) rotateZ(0deg)', }; return (
go('home')} style={{cursor:'pointer'}}>Atelier go('browse')} style={{cursor:'pointer'}}>Collection {rug.name}{rug.italic ? ` · ${rug.italic}` : ''}
{['0','45','90'].map((a) => ( ))}
◐ Move the cursor — view the pile
{rug.origin.split('·')[0].trim()}

{rug.name}{rug.italic && <>
{rug.italic}}

{rug.tag}

{rug.desc}

Palette
{rug.palette.map((c, i) => (
Size
{rug.sizes.map((s) => ( ))}

Price on inquiry · Lead time {rug.lead}

Origin
{rug.origin.split('·')[1]?.trim()}
Weave
{rug.weave}
Pile
{rug.pile}
Lead time
{rug.lead}
The Process

How a {rug.name} comes to your floor.

    {[ ['Concierge', 'A specialist sends material samples and confirms specs.'], ['Weaving', 'One weaver, start to finish, at our partner atelier.'], ['Finishing', 'Washing, clipping, and binding — three weeks of finishing.'], ['Delivery', 'White-glove freight, carbon-neutral, to your room.'], ].map(([t, d], i) => (
  1. 0{i+1}
    {t}
    {d}
  2. ))}
{/* You might also like */}
Continue browsing

Pieces that sit nearby.

{RUGS.filter(r => r.id !== rug.id).slice(0, 3).map((r) => (
{ window.__pdpRug = r; go('pdp'); window.scrollTo(0,0); }}>
{r.name}{r.italic && <> · {r.italic}}
{r.tag.split('·')[0]}
))}
); } // ───────────────────────────────────────────────────────────── // CART // ───────────────────────────────────────────────────────────── function Cart({ go, cart, setCart }) { const update = (key, q) => { setCart(cart .map(i => i.key === key ? { ...i, qty: Math.max(1, i.qty + q) } : i) ); }; const remove = (key) => setCart(cart.filter(i => i.key !== key)); if (cart.length === 0) { return (
Your selection

Empty.

Begin by reserving a piece. Your selection holds for seven days while we prepare samples and your quote.

); } return (
Your selection

Reserved pieces.

{cart.map((item) => (

{item.name}{item.italic && <> · {item.italic}}

{item.size} · {item.weave.split(',')[0]}
Price on inquiry · {item.lead} lead
{item.qty}
))}
); } // ───────────────────────────────────────────────────────────── // CHECKOUT // ───────────────────────────────────────────────────────────── function Checkout({ go, cart, setCart }) { const [step, setStep] = useState(1); const [ship, setShip] = useState('whiteglove'); const [submitted, setSubmitted] = useState(false); if (submitted) { return (
Inquiry received

Thank you.

A concierge will write within forty-eight hours with material samples, a final quote, and a weaving slot. Your reference is{' '} #MPP-{Math.floor(Math.random()*9000+1000)} .

); } return (
Inquiry

Almost yours.

{/* Stepper */}
{['Details', 'Delivery', 'Confirm'].map((s, i) => { const idx = i + 1; return (
{idx < step ? '✓' : '0' + idx}
{s}
); })}
{step === 1 && ( <>
Step 1 of 3

Tell us where this rug is going.

)} {step === 2 && ( <>
Step 2 of 3

How shall we deliver?

{[ ['whiteglove', 'White-glove · room placement', 'Two-person team, scheduled delivery.', 'Included'], ['standard', 'Standard freight', 'Door-to-door, signature required.', 'Included'], ['expedited', 'Expedited air freight', 'Available on select pieces.', 'On request'], ].map(([id, t, d, p]) => (
setShip(id)}>
{t}
{d}
{p}
))}
Samples

Send fibre samples first.

We'll cut and mail 4-inch swatches of the proposed yarns before any weaving begins. Free, no commitment.

)} {step === 3 && ( <>
Step 3 of 3

One last look.

Submit your inquiry — a concierge will reply within forty-eight hours with samples and your quote. No charge is taken now.

{cart.map((i) => (
{i.name}{i.italic && <> · {i.italic}}
{i.size} · qty {i.qty}
{i.lead}
))}
)}
); } // ─── Inquire modal ────────────────────────────────────────── function InquireModal({ rug, onClose }) { return (
e.stopPropagation()} style={{ position:'relative' }}>
Inquiry · {rug.name}{rug.italic ? ` · ${rug.italic}` : ''}

Begin an inquiry.

Tell us a little about the room. A specialist will write within forty-eight hours with material samples and a quote.

); } // ───────────────────────────────────────────────────────────── // SHOP — live Ecwid storefront (id 136169752) // ───────────────────────────────────────────────────────────── function Shop() { const mountId = 'my-store-136169752'; useEffect(() => { // If Ecwid is already loaded, just open the browser into our div. const init = () => { if (window.xProductBrowser) { try { window.xProductBrowser( 'categoriesPerRow=3', 'views=grid(20,3) list(60) table(60)', 'categoryView=grid', 'searchView=list', 'id=' + mountId ); } catch (e) { console.warn('Ecwid init', e); } } }; if (window.xProductBrowser) { init(); return; } // Otherwise inject the loader. const s = document.createElement('script'); s.setAttribute('data-cfasync', 'false'); s.type = 'text/javascript'; s.charset = 'utf-8'; s.src = 'https://app.ecwid.com/script.js?136169752&data_platform=code&data_date=2026-05-15'; s.onload = init; document.body.appendChild(s); }, []); return (
Live storefront · Ecwid #136169752

The Shop.

Single-order pieces ready to ship — sourced through our verified atelier partners.


{/* Ecwid mount point */}

Fulfilment handled directly by My Plush Palace · secure checkout via Ecwid

); } Object.assign(window, { Home, Browse, PDP, Cart, Checkout, InquireModal, Shop });