/* global React */ const { useState, useMemo } = React; // ===== Token data ===== const AXES = { PO: { name: "Physiological Optimization", color: "var(--axis-po)" }, NM: { name: "Neurocognitive Mastery", color: "var(--axis-nm)" }, ER: { name: "Emotional Resilience", color: "var(--axis-er)" }, SC: { name: "Spiritual Coherence", color: "var(--axis-sc)" }, RS: { name: "Relational & Social", color: "var(--axis-rs)" }, ES: { name: "Environmental Symbiosis", color: "var(--axis-es)" }, TA: { name: "Technological Augmentation", color: "var(--axis-ta)" }, PV: { name: "Purposeful Vitality", color: "var(--axis-pv)" }, }; const TOKENS = []; const fmtUsd = (n) => "$" + n.toLocaleString(undefined, { minimumFractionDigits: 4, maximumFractionDigits: 4 }); const fmtVol = (n) => "$" + (n >= 1e6 ? (n/1e6).toFixed(2) + "M" : (n/1e3).toFixed(1) + "K"); const fmtNum = (n, d=4) => n.toLocaleString(undefined, { minimumFractionDigits: d, maximumFractionDigits: d }); // ========================================================= // Sparkline (no animation, deterministic per symbol) // ========================================================= function Sparkline({ symbol, up, w=80, h=22 }) { // deterministic pseudo-random walk const points = useMemo(() => { let seed = 0; for (let i = 0; i < symbol.length; i++) seed = (seed * 31 + symbol.charCodeAt(i)) >>> 0; const rng = () => { seed = (seed * 1664525 + 1013904223) >>> 0; return (seed / 4294967295); }; const N = 24; let v = 0.5; const pts = []; for (let i = 0; i < N; i++) { v += (rng() - 0.5) * 0.18; v = Math.max(0.05, Math.min(0.95, v)); pts.push(v); } if (up) pts.sort((a,b) => a - b); else pts.sort((a,b) => b - a); // re-shuffle slightly so it's not monotonic return pts.map((p, i) => p * 0.7 + 0.15 + (rng()-0.5)*0.05); }, [symbol, up]); const path = points.map((p, i) => { const x = (i / (points.length - 1)) * w; const y = h - p * h; return (i === 0 ? "M" : "L") + x.toFixed(1) + "," + y.toFixed(1); }).join(" "); const stroke = up ? "var(--hcx-bid)" : "var(--hcx-ask)"; return ( ); } // ========================================================= // Token glyph (sym + axis color) // ========================================================= function TokenGlyph({ axis, sym, size }) { const color = AXES[axis]?.color || "var(--accent-guardian)"; const style = { background: `radial-gradient(circle at 30% 30%, ${color}, color-mix(in oklab, ${color} 40%, #000))`, width: size || undefined, height: size || undefined, }; // 2-3 char glyph const label = sym.slice(0, sym.length === 3 ? 3 : 2); return
A health-native commodity exchange. HCR mints when your body earns; HCC mints when your data earns. Both 21B hard cap, both float, both governed by the Master Equation. Trade the part of you that matters most — and quote everything in HCC.
| # | Token | Axis | Price (HCC) | 24h Change | Volume | 24h Range | Trend | ||
|---|---|---|---|---|---|---|---|---|---|
| toggleStar(t.sym)}> {starred.has(t.sym) ? "★" : "☆"} | {t.rank} | window.__hcxOpenDetail && window.__hcxOpenDetail(t.sym)} style={{ cursor: "pointer" }}>
{t.sym}
{t.isNew && NEW}
{t.sym === "HCC" && QUOTE}
{t.kind === "community" && COMMUNITY CHAIN}
{t.kind === "applicant" && APPLIED}
{t.name}
|
⚕{fmtNum(t.price)} | = 0 ? "up" : "down")}> {Math.abs(t.ch).toFixed(2)}% | {fmtVol(t.vol)} | {fmtNum(t.lo)} – {fmtNum(t.hi)} |
Pick an activity, set a duration, see what your habits would mint at current Era 0 pricing.
The doc names three live community chains today — MHC (Mental Health, NM axis), DMC (Diabetes Management, PO), FTC (Fitness, PO). Each is a 1B-cap chain trading USD-only. Listing fee is fixed in commodity terms: 500 HCC. Acquisition price for the originating clinic: 10,000 HCC. Listing application requires CH Score ≥ 70 on the applicant’s primary axis.
| Token | Axis | Quantity | Value | Allocation | |
|---|---|---|---|---|---|
|
{h.sym}
{TOKENS.find(t => t.sym === h.sym)?.name}
|
{h.qty.toLocaleString(undefined, { minimumFractionDigits: 2 })} | ${h.value.toFixed(2)} |
{h.alloc.toFixed(1)}%
|