const { useState, useEffect, useRef, useMemo } = React;
// Stored under this key in localStorage; the app checks for it on load.
const TOKEN_KEY = "lattice_token";
// ===== Brand mark =====
function BrandMark() {
return (
);
}
// ===== Nav =====
function Nav({ onSignIn, stats }) {
return (
);
}
// ===== Hero =====
function Hero({ stats }) {
return (
Private beta
Real-time semiconductor intelligence.
Lattice agents surface the non-traditional signal — podcasts, forums,
academic papers — and tie each finding back to the names you cover.
We do the collection. You make the call.
Entities
{stats.entities.toLocaleString()}
across the global semiconductor supply chain
Relationships
{stats.relationships.toLocaleString()}
supplier · customer edges, with citations
Documents
{stats.documents.toLocaleString()}
filings, transcripts, and trade press
Read-throughs
{stats.calls.toLocaleString()}
bullish · bearish · flat, sourced to the article
{/* How conviction is calculated — a short, plain explainer that
sits under the live counts so first-time readers understand
where the numbers come from. */}
How conviction is calculated
Every claim in the graph carries a citation. A read-through aggregates
the underlying claims for one name, weighting each by the source's
historical reliability, the recency of the claim, and how directly the
edge connects the source document to the named entity. The conviction
score (0–1) reflects how much agreement the underlying evidence shows;
the direction (bullish · bearish · flat) reflects the net sign of the
weighted edges. Click any number to see the contributing claims and
jump straight to the source article.
);
}
// ===== Demo player =====
// Embeds the standalone Lattice product video at /static/lattice-video.html.
// The iframe handles its own play/pause/scrubber/animation — keeping it
// self-contained means we can iterate on the video without touching the
// React shell. Aspect ratio locked to 16:9.
function DemoPlayer() {
return (
Read-throughs from this morning's news.
// 1:40 — one DigiTimes scoop, six sourced read-throughs
);
}
// ===== Mini visuals =====
function MiniGraph() {
const pts = useMemo(() => Array.from({ length: 18 }, () => ({ x: 10 + Math.random() * 80, y: 10 + Math.random() * 80 })), []);
const lines = useMemo(() => {
const arr = [];
for (let i = 0; i < 22; i++) {
const a = Math.floor(Math.random() * pts.length);
const b = Math.floor(Math.random() * pts.length);
if (a !== b) arr.push([a, b]);
}
return arr;
}, [pts]);
return (
);
}
function ViewsPreview() {
const items = [
{
num: "01", label: "Graph Engine", href: "/app#graph",
desc: "View the plumbing behind the filtering engine. See how a single name connects to its suppliers, customers, and second-order exposures. Click any edge to the source document.",
visual: ,
},
{
num: "02", label: "Feed", href: "/app#articles",
desc: "Every filing, transcript, and trade-press article from the last 24 hours, ranked by how much it should change your view. Read the top ten in fifteen minutes.",
visual: ,
},
{
num: "03", label: "Portfolio", href: "/app#readthroughs",
desc: "For every name on your watchlist: the read-through from this week's filings, earnings, and trade press, with sourced edges and conviction.",
visual: ,
},
];
return (