// ============== primitives ==============
function Eyebrow({ children, dot = false }) {
return (
{dot && }
{children}
);
}
// SVG network field for hero ambient background
function NetworkField() {
// deterministic layout (no randomness across renders)
const nodes = React.useMemo(() => {
const seed = [
[12, 18], [22, 65], [34, 28], [40, 80], [52, 50],
[61, 22], [68, 72], [78, 38], [88, 60], [16, 42],
[46, 12], [58, 88], [73, 12], [83, 84], [28, 92],
];
return seed.map(([x, y], i) => ({ x, y, r: i % 3 === 0 ? 3 : 2 }));
}, []);
const edges = [
[0,9],[9,2],[2,4],[4,3],[3,11],[11,7],[7,8],[8,5],[5,1],[1,9],
[4,6],[6,7],[10,2],[10,5],[12,7],[13,8],[14,3],[0,2],[6,5],[12,5],
];
return (
);
}
// Mug + sparkle SVG motif drawn from logo
function MugMark({ size = 64 }) {
return (
);
}
// Big serif wordmark hero, styled after the logo
function HeroDisplay() {
return (
Web3 talent,
placed quietly.
);
}
function Btn({ kind = "primary", href, onClick, children, arrow = true, target }) {
const cls = `btn btn--${kind}`;
const inner = (
<>
{children}
{arrow && }
>
);
if (href) return {inner};
return ;
}
function StatRow({ stats }) {
return (
{stats.map((s, i) => (
{s.num}{s.unit}
{s.label}
))}
);
}
function Ticker({ items }) {
if (!items || items.length === 0) return null;
// duplicate so the scroll loop is seamless
const repeated = [...items, ...items];
return (
{repeated.map((it, i) => (
{it.title}
/
{it.chain}
/
{it.comp}
))}
);
}
window.Eyebrow = Eyebrow;
window.NetworkField = NetworkField;
window.HeroDisplay = HeroDisplay;
window.MugMark = MugMark;
window.Btn = Btn;
window.StatRow = StatRow;
window.Ticker = Ticker;