Overview
SynthesisNVDA held above the 50-day after the earnings beat; bulls cite data-center demand, bears flag a stretched forward multiple.
The shared visual language behind trd.fun. Token-driven, theme-safe, and built to compose into the surfaces you see on /coach#signals, the research workspace, and the Cmd+K palette. Read the guide in docs/DESIGN.md.
trd.fun ships two themes (dark default + warm-sandy light) over a single CSS-custom-property layer. Always reference tokens by name — never hard-coded hex — so theme switching is automatic.
Two stacks: IBM Plex Sans for UI copy, and the mono stack via var(--font-mono) for every numeric or symbol-anchored value (prices, P/E, change %). Numeric content always uses tabular-nums so columns line up.
A small, consistent motion vocabulary. Everything respects prefers-reduced-motion: reduce via the global override in app/globals.css. Hit replay to re-trigger.
.og-anim-fade350ms ease-outHero blocks.og-anim-scale320ms ease-outPop-in elements.og-anim-pulse2.4s infiniteLive indicators.og-anim-bob2.6s infiniteIdle visualsWrap N children in .og-stagger to slide them in with escalating animation-delay (0ms → 420ms in 60ms steps).
Primitive components that compose into every screen. All tone-aware, all theme-safe, all importable from @/app/components/ui.
overviewThe same primitive used by the onboarding stock picker. Click to toggle selection — the whole card is the hit target.
How the primitives compose into the recurring shapes you'll see across trd.fun. These are the canonical recipes — copy them, don't re-roll them.
Glass shell · commandk-enter motion · 2-px left-edge accent on the active row · group labels in tracked-out tertiary mono · ↑ ↓ to navigate · ↵ to select · ESC to close.
Two complementary treatments for entry-point screens. Rich (live at /login) is the design system at its most expressive. Flat (live at /onboarding) is the calm, in-product feel. The hand-off from rich → flat after sign-in is intentional — it signals “you're in the product now”.
Two-column hero: gradient headline + sub-line + chip strip on the left, glass sign-in (or primary CTA) card on the right. The card shares its shell with the Cmd+K palette and Modal so the motion + chrome read as one family across the app.
Real-time prices · multi-source synthesis · IBKR-aware research.
app/login/page.tsx + app/login/styles.tsxThe hero ships a faked-but-realistic KPI strip whose numbers jitter every 2.4s so the surface reads as “live” without becoming distracting. Use it on public surfaces where you want to hint at the real product's motion without exposing live user data.
app/login/components/LiveDataPeek.tsxSix (or fewer) raised cards in a 3-col responsive grid. Each row opens with an IconTile, ends with a dotted-divider meta footer in mono. Wrap the grid in og-stagger to slide cards in with escalating delays on first paint.
Three solid-surface cards with floating gradient number pills. Use sparingly — the cards work best as the “and now what?” beat between the hero and the bottom CTA.
The closer for marketing pages. Gradient backdrop, large headline + sub-line, primary action paired with a ghost alternative. Stretches full-width inside the page shell.
The public /stock/<symbol> page — cached and SEO-crawlable. An editorial, magazine-style layout: a big mono symbol, an at-a-glance stats band, an AI-research brief with four cache states, and a discovery rail. Blue accent throughout. Mocks below are flat re-renders using global tokens only.
What it is: the page masthead — identity, live quote, actions, and a cached one-line TLDR. Used on: /stock/<symbol>.
Datacenter demand stays red-hot as Blackwell ramps; Street eyes margin durability and China headwinds into the next print.
— cached tldrWhat it is: a slim figure strip under the hero. Tiles are omitted (not dashed) when a value is missing. Momentum chips colour by sign.
What it is: the cache-shared AI brief. Its header badge encodes one of four states. Stale shows the SAME content (never hidden) with an amber badge; only none swaps in a teaser / generating notice.
What it is: the right-hand rail — valuation + momentum key/value cards and blue theme chips. Each card hides entirely when its data is empty.
The condensed editorial one-pager at /theme/<slug>. A theme is a basket of tickers framed by a generated brief, laid out top→bottom as a big editorial header, a 7-stat bar, a "The take" lead block, a 3-card thesis row, and a dense roster of tradeable cards with private / pre-IPO names folded in as badged tiles. Below are flat re-renders of each pattern — global tokens only, no scoped theme-page CSS.
Mono eyebrow (EyebrowLabel) → oversized title (clamp(40px,6vw,62px), weight 800, letter-spacing -.03em) → bold sub-headline (the AI headline) → an intro overview paragraph as prose (not bullets) → a N stocks · curated/AI theme meta line. Used on: /theme/<slug>.
AI's power hunger is reviving an industry left for dead — and the re-rating has only just begun.
Hyperscaler datacenter demand is reopening shuttered plants and underwriting new small-modular-reactor builds, while uranium spot has tripled off its lows as utilities scramble to re-contract supply. Government de-risking — loan guarantees and streamlined licensing — has shortened the runway to revenue.
A full-width strip of seven KPI tiles: 1D basket move, real 1-yr growth, aggregate cap, company count, median P/E, and 30D / 90D basket moves. Momentum / valuation figures are computed client-side from the loaded fundamentals. Signed values colour via var(--green) / var(--red). Composes the shared StatTile primitive. Used on: /theme/<slug>.
A full-width synthesis of the brief's whyItMatters / overview: a mono section label, a bold lead line, and a bulleted body. The editorial anchor of the page. Used on: /theme/<slug>.
Power — not chips — is now the binding constraint on AI scale, and the nuclear fuel cycle is structurally under-supplied through the decade.
Three raised cards (Card variant="raised"): the bull case (green, TrendingUp), the catch (amber, AlertTriangle), and outlook · 12mo (blue, Compass). Each = a tinted IconTilewith a monochrome lucide line icon → heading → bullets → a dashed-divider mono keyword footer tinted to the card's tone. One tone per card (DS §5). Used on: /theme/<slug>.
Selectable cards (toggle into the watchlist). The big-player card is dense — symbol, live price, 1D chip, 1D/30D/90D momentum strip, market cap + sector role chip, and a USP tagline. The rising-star card is a compact two-momentum-cell variant. Selection affordance is BLUE (DS §5), never green. Used on: /theme/<slug>.
The "More in this theme" roster folds two card kinds into one dense grid. Public names render as selectable, solid-border roster cards (left). Private / pre-IPO names are info-only — a gold status badge flags the stage and the figure is a last-round valuation (dotted underline), not a live price. Used on: /theme/<slug>.
The single shared, presentational research deck — <ResearchView> in app/components/research/ResearchView.tsx. One component composes the whole research library: header · provider chip strip · RUN/MODEL/SOURCES meta line · accent-left-border synthesis sections with type chips · sources drawer · follow-up chips · ask box. The public stock page renders the same component, so this is the look it must match. The accent is --rv-accent (default gold), overridable per variant. This block is a flat re-render using global tokens only.
Header (ticker + company + live price + refresh/expand/close icons) → provider chips → meta line → synthesis rows → sources drawer → follow-up chips → ask box. Live: ResearchView (variant="panel").
The synthesis bar, type chip, send button, and follow-up borders all read from --rv-accent, which defaults to the gold --rp-accent (#d8b765). A call site can re-tint an entire instance — e.g. an embedded variant — by setting --rv-accent once on the wrapper, with no component fork.
The whole-universe Live Signals board — <SignalsBoard> in app/components/signals/board/, the canonical /signals. Composites: BoardHero (live status + verdict tallies) · FilterBar (scope toggle + theme menu) · SignalTape / SignalRow (the tape) · SignalRowDetail (the expanded drill-down) · ThemesStrip (heating-up momentum chips). Every selector is namespaced under .sb-board via <SignalsBoardStyles/>, so these are the LIVE components rendered on deterministic fixture data (SAMPLE_BOARD_ROWS).
The pulsing market pill (phase-aware), the recompute / updated / universe meta line, the H1 headline, the AI subhead, and the four verdict tally tiles (Long / Exit / Short / Wait).
A realtime green / amber / red verdict computed live on our own engine — then the AI reads Reddit, X and the news to tell you whether the crowd buys it. Live, not delayed.
The “Ready to buy” title + “N firing now” bull chip, the [Watched | All universe] segmented control with the theme dropdown, and the tape itself. Click a row to expand its drill-down; the theme menu and scope toggle are live.
| SYM | PRICE | CALL | CONF | BB | RSI | STOCH | QUADRANT | AGE · SRC |
|---|---|---|---|---|---|---|---|---|
| 142.18 | LONG | 88 | Oversold + Bullish | 3s ago · worker | ||||
LONGconf 88/100 Bullish RSI ↑Bearish RSI ↓ Oversold + Bullish Overbought + Bullish Oversold + Bearish Overbought + Bearish OversoldOverbought Oversold + Bullish — highest-conviction long. Cheap on the band, regime still bullish. Buy shares, a bull call spread, or sell a CSP at the lower-band strike. Why — engine verdict
| ||||||||
| 28.74 | LONG | 81 | Oversold + Bullish | 2s ago · worker | ||||
| 911.40 | LONG | 74 | Oversold + Bullish | 5s ago · worker | ||||
| 118.05 | LONG | 66 | Oversold + Bullish | 8s ago · worker | ||||
| 41.92 | EXIT | 71 | Overbought + Bullish | 4s ago · worker | ||||
| 241.30 | EXIT | 63 | Overbought + Bullish | 11s ago · worker | ||||
| 187.62 | SHORT | 69 | Overbought + Bearish | 6s ago · worker | ||||
| 213.55 | WAIT | 22 | Neutral | 19s ago · yahoo | ||||
| 428.90 | WAIT | 18 | Neutral | 7s ago · worker | ||||
The expanded accordion: large VerdictPill + confidence, the three traffic lights, the LABELED 2×2 quadrant matrix with its guidance line, the two link-out buttons, and the left-aligned “Why — engine verdict” reasons list (leading › marker).
The reusable atoms the row and drill-down compose from. The quadrant matrix labels its axes (Oversold→Overbought, Bullish→Bearish) and fills the active named cell in its tone color.
“Heating up · 30D momentum” — ranked theme chips (name + signed % + arrow), each a link to its /theme/<slug> AI deck.
Each opens an AI deck: bull case · the catch · 12-mo outlook · catalysts.
The multi-source AI research deck. Used on /research/<symbol> (owner only) — a three-column cockpit: session rail · synthesis · pricing rail, with a sticky chat dock at the bottom. The live surface is scoped behind .research-root with --rp-* tokens; these blocks are flat re-renders using global tokens only.
The five research sources — news · x · reddit · fundamentals · portfolio — in canonical order. Each chip carries a colored provider icon, an uppercase label, an age figure (tabular-nums), and a status dot: fresh · stale · tertiary empty · failed · pulsing gold loading. Live: ProviderChipStrip.
One row per provider section: a 2-px left-edge gradient bar in that provider's accent fades from solid to transparent, a heading + a tinted tag, and a body paragraph (sans prose, not mono). The first row is always the cross-source Synthesis · Overview, tagged gold. Live: SynthesisBlock.
NVDA held above the 50-day after the earnings beat; bulls cite data-center demand, bears flag a stretched forward multiple.
Two analyst upgrades and a supply-chain note dominate the last 24h of coverage.
You hold 40 shares at $612 avg — current spot is +6.4% on cost.
Left rail of past runs grouped by recency (Today / Yesterday / This week). Each card: a status dot (complete / partial / failed), a when · cost meta row (mono figures), a 2-line query, and a sources count. The active card gets a gold-tinted fill + ring. Live: SessionRail.
A compact run-metadata strip — run age · model · sources loaded · cost · tokens as label/value cells (mono) — with export actions pushed right. Below it, the sticky input dock: a row of quick-prompt pills over a composer with a gold send button. Live: BundleMetaStrip + QuickPrompts.
The flat system reserves var(--blue) for primary accents. The research workspace is the one documented exception: it scopes a warm gold accent (--rp-accent: #d8b765) behind .research-root for the active session ring, synthesis tag, send button, and quick-prompt borders. It never leaks out of the route. Light-theme darkens it to #806000 for WCAG AA.