/* ============================================================
CHAINUS — Market Intelligence (native data-viz) + Marketplace
============================================================ */
function MarketOrbit({ t, pair }) {
const labels = t.dir === 'zh'
? ['价格', '情绪', '流动性', '新闻', '预测', '社区热度']
: ['Price', 'Mood', 'Liquidity', 'News', 'Forecast', 'Community heat'];
return (
{pair.sym}
{pair.px}
= 0 ? 'pos' : 'neg'}>{pair.c >= 0 ? '+' : ''}{pair.c}%
{labels.map((l, i) => {l})}
);
}
function MarketIntel({ t }) {
const m = t.market;
const [tab, setTab] = useState(0);
const [range, setRange] = useState(1);
const seed = (tab + 1) * 13 + (range + 1) * 7;
const pair = m.pairs[tab];
const news = m.news.concat(m.news);
return (
{m.title[0]} {m.title[1]}
{m.sub}
{/* top stat strip */}
{m.stats.map((s, i) => (
{s.k}
{s.v}
= 0 ? 'pos' : 'neg'}`}>{s.c >= 0 ? '+' : ''}{s.c}%
))}
{/* main chart */}
{pair.sym}
{pair.name}
{pair.px} = 0 ? 'pos' : 'neg'}`}>{pair.c >= 0 ? '+' : ''}{pair.c}%
{m.pairs.map((p, i) => )}
{m.ranges.map((r, i) => )}
{m.modules.liquidity}
{/* side modules */}
{m.modules.sentiment}
{m.sentiment.note}
{m.modules.alloc}
{m.alloc.segments.map((s, i) => (
- {s.n}{s.v}%
))}
{/* lower row: rates + RWA/NFT + events */}
{m.modules.rates}
{m.rates.map((r, i) => (
-
{r.n}
= 0 ? 'var(--up)' : 'var(--down)'} w={70} h={22} fill={false} strokeW={1.8} id={'rs' + i} />
{r.v}
= 0 ? 'pos' : 'neg'}`}>{r.c >= 0 ? '+' : ''}{r.c}%
))}
{m.modules.news}
{news.map((n, i) => (
{n.tag}
{n.text}
))}
);
}
/* ---- Marketplace ---- */
function marketKindFor(item) {
const slot = (item.slot || '').toLowerCase();
if (slot.includes('rwa')) return 'rwa';
if (slot.includes('member')) return 'member';
return 'nft';
}
function marketShotFor(item) {
const kind = marketKindFor(item);
if (kind === 'rwa') return 'assets/v3/metals-page-desktop.png';
return '';
}
function MarketArt({ item, index }) {
const kind = marketKindFor(item);
const shot = marketShotFor(item);
const positions = ['46% 74%', '50% 48%', '48% 38%', '50% 42%', '44% 70%'];
const pos = positions[index % positions.length];
return (
{shot &&

}
{kind === 'member' && (
)}
{kind === 'nft' && (
{Array.from({ length: 12 }).map((_, i) => )}
)}
);
}
function Marketplace({ t }) {
const mp = t.marketplace;
const main = mp.items[0];
const supporting = mp.items.slice(1, 4);
return (
{mp.eyebrow}
{mp.title[0]} {mp.title[1]}
{mp.sub}
{mp.cta}
{mp.steps.map((step, i) => (
{String(i + 1).padStart(2, '0')}
{step}
))}
{main.price}
{mp.stepLabel}
{main.name}
{mp.steps.map((step, i) => (
{String(i + 1).padStart(2, '0')}
{step}
))}
{supporting.map((it) => (
{it.price}
{it.name}
{mp.stepLabel}
))}
);
}
Object.assign(window, { MarketIntel, MarketOrbit, MarketArt, marketKindFor, marketShotFor, Marketplace });