// 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:'browse', cat:'all' })}>Shop everything
setRoute({ name:'dream' })}>Dream Finder
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) => (
))}
{/* ============================================================
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
All categories
Handbags
Clothing
Watches
Under €1,000
{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.
setRoute({ name:'editorial' })}>How shipping works
{/* ============================================================
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.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.
The authentication promise
Read 4,820 buyer notes
{[
{ 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) => (
))}
{/* ============================================================
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.
setRoute({ name:'dream' })}>Open Dream Finder
);
};
// ---------- 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 */}
{/* 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' }}>
{hover && (
Buy now
{item.acceptOffers && Offer }
)}
{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.eur.toLocaleString()}
))}
);
};
window.Home = Home;