// Agora Home — Apple-store-grade dense grid with editorial moments. const Home = ({ setRoute }) => { const data = window.AG_DATA; const items = data.items; const featured = items.slice(0, 4); const hermesPieces = items.filter(i => i.brand === 'Hermès'); const tokyoPieces = items.filter(i => i.city === 'Tokyo'); const newToday = items.filter(i => i.new); return (
{/* ============================================================ HERO — editorial mosaic. Visuals lead, copy is restrained. ============================================================ */}
{/* Cover line — issue header */}
The Agora Issue No. 14 · Spring / Summer 26
{/* Mosaic: three columns. Two large feature pieces · text + two smaller pieces. */}
{/* COVER PIECE 01 — tall */} setRoute({ name:'product', id:'i05' })} height={640} /> {/* COVER PIECE 02 — tall */} setRoute({ name:'product', id:'i08' })} height={640} /> {/* RIGHT COLUMN — restrained editorial copy + two small pieces */}
What's inside this issue
Four hundred & eleven
new pieces this week.

Sourced from private collectors across Tokyo, Paris, Milan & Seoul. Authenticated in Berlin. At your door, customs included.

setRoute({ name:'product', id:'i01' })} /> setRoute({ name:'product', id:'w01' })} />
{/* Stats strip — sits at bottom of hero, before next section */}
{[ { v:'12,840', l:'Active listings' }, { v:'1,284', l:'Sellers worldwide' }, { v:'14', l:'Source countries' }, { v:'48 hrs', l:'Avg auth → ship' }, { v:'4.96', l:'Buyer rating · 26k reviews' }, ].map((s, i, arr) => (
{s.v}
{s.l}
))}
{/* ============================================================ CATEGORY GRID — Apple-store dense ============================================================ */}
01 · Shop the house

Browse by category

setRoute({ name:'browse', cat:'all' })}>View all 12,840 listings
{/* Bento-style category tiles */}
setRoute({ name:'browse', cat:'bags' })}/> setRoute({ name:'browse', cat:'women-clothing' })}/> setRoute({ name:'browse', cat:'watches' })}/> setRoute({ name:'browse', cat:'jewelry' })}/> setRoute({ name:'browse', cat:'vintage' })}/>
{/* ============================================================ NEW THIS WEEK — dense product grid (Apple-store rhythm) ============================================================ */}
02 · New this week

{newToday.length} pieces added · last 7 days

{items.slice(0, 8).map(it => (
setRoute({ name:'product', id: it.id })} style={{ cursor:'pointer' }}>
))}
{/* ============================================================ INTERCONTINENTAL — map / route storytelling ============================================================ */}
03 · The intercontinental lane

Where it
was. Where
it's going.

Every piece on Agora moves through one of three authentication hubs — Tokyo, Milan, or Berlin — before reaching your door. Customs is handled. Duties are paid. You wait once.

{/* ============================================================ MAISON — featured seller storefronts ============================================================ */}
04 · Maison of the week

Trusted private sellers

setRoute({ name:'sellers' })}>All 1,284 sellers
{['par','yoshi','mia','arc'].map(sid => { const s = data.sellers[sid]; const sItems = items.filter(i => i.seller === sid).slice(0, 3); return (
setRoute({ name:'seller', id: sid })} style={{ background:'var(--ag-surface)', padding: 24, cursor:'pointer' }}>
{s.name}
{s.handle}
 Verified
{sItems.map(it => (
))}
{s.rating} · {s.sales.toLocaleString()} sales
); })}
{/* ============================================================ AUTH THEATER — quietly loud ============================================================ */}
05 · How we authenticate

Seven checks.
One verdict.

Every piece is physically inspected at one of our three hubs. We document stitching, hardware, leather grain, date stamps, smell, weight, and provenance. You see the filmstrip before you commit.

{[ { l:'Stitching', n:'01' }, { l:'Hardware', n:'02' }, { l:'Stamp', n:'03' }, { l:'Grain', n:'04' }, { l:'Weight', n:'05' }, { l:'Provenance', n:'06' }, { l:'Receipt', n:'07' }, ].map((c, idx) => (
{c.n}
{c.l}
))}
RESULT
Authenticated
{/* ============================================================ EDITORIAL — magazine moment ============================================================ */}
06 · Editorial

Reading list

setRoute({ name:'editorial' })}>All articles
{/* ============================================================ DREAM FINDER prompt ============================================================ */}
07 · Dream Finder

Can't find it?

Tell us the piece. Year, color, condition, your number. We'll hunt it across our private network and message you when it surfaces — usually within 11 days.

); }; // ---------- Editorial cover pieces (used in hero mosaic) ---------- const CoverPiece = ({ n, item, label, onClick, height = 640 }) => { const [hover, setHover] = useState(false); return (
setHover(true)} onMouseLeave={()=>setHover(false)} style={{ position:'relative', height, cursor:'pointer', overflow:'hidden', background:'var(--ag-bone)' }}> {/* gradient veil for legibility */}
{/* Top — n. + folio label */}
No. {n}
{label}
{/* Hardware hover hint */} {hover && (
 Authenticated · {item.city}
)} {/* Bottom — caption */}
{item.brand}
{item.title.split('·')[0].trim()}
{item.cond} · {item.year}
€{item.eur.toLocaleString()}
); }; const CoverPieceSmall = ({ n, item, onClick }) => { return (
No. {n}
{item.brand}
{item.title.split('·')[0].trim()}
€{item.eur.toLocaleString()}
); }; // ---------- Category tile (large editorial) ---------- const CategoryTile = ({ item, label, count, eyebrow, featured = false, onClick, row = 1 }) => { return (
{eyebrow &&
{eyebrow}
}
{label}
{count}
); }; // ---------- Simple card (used in dense row) ---------- const SimpleCard = ({ item }) => { const [hover, setHover] = useState(false); return (
setHover(true)} onMouseLeave={()=>setHover(false)} style={{ position:'relative' }}>
{item.new && New}
 Auth
{hover && (
{item.acceptOffers && }
)}
{item.brand}
€{item.eur.toLocaleString()}
{item.title}
{item.cond}
); }; // ---------- Editorial card ---------- const EditorialCard = ({ eyebrow, title, body, meta, palette, large = false }) => (
{eyebrow}
{title}

{body}

{meta}
); // ---------- ROUTE MAP ---------- const RouteMap = ({ items }) => { // Simple SVG world (very abstract — labeled dots, arcing routes to Berlin) // Coordinate system: 0..100 longitude band, 0..50 latitude band const HUBS = [ { id:'BER', name:'Berlin · Hub', x: 52, y: 19, hub:true }, { id:'TYO', name:'Tokyo', x: 86, y: 26 }, { id:'OSA', name:'Osaka', x: 84, y: 28 }, { id:'SEL', name:'Seoul', x: 82, y: 25 }, { id:'HKG', name:'Hong Kong', x: 80, y: 32 }, { id:'PAR', name:'Paris', x: 49, y: 21 }, { id:'MIL', name:'Milan', x: 51, y: 24 }, { id:'NYC', name:'New York', x: 24, y: 22 }, ]; const ber = HUBS[0]; return (
{/* Map header */}
Live · 12 listings in transit
Hub open
{/* faint world graticule */} {[10,20,30,40].map(y=> )} {[10,20,30,40,50,60,70,80,90].map(x=> )} {/* equator-ish */} {/* Routes: arcs from each origin to Berlin */} {HUBS.filter(h=>!h.hub).map((h, i) => { const mx = (h.x + ber.x) / 2; const my = Math.min(h.y, ber.y) - 8 - i*0.3; return ( ); })} {/* Hubs */} {HUBS.map(h => ( {h.hub && } {h.id} ))} {/* Legend rows */}
{items.slice(0, 6).map(it => (
{it.brand}
€{it.eur.toLocaleString()}
))}
); }; window.Home = Home;