Chat text-base (14px) · lh 1.75
Your portfolio is up 12.4% YTD, outperforming the S&P 500 by 3.2 percentage points. Duration-sensitive names benefited from the softer-than-expected CPI print, with rate-cut odds now at 68%.
Earnings season playbook:
The market can stay irrational longer than you can stay solvent.
Here's the API call to fetch positions:
fetch('/api/portfolio/positions', {
headers: { 'Authorization': 'Bearer ' + token }
})
.then(res => res.json())
.then(data => console.log(data))Returns an array of Position objects with ticker, shares, and avgCost fields.
Next catalyst: FOMC meeting on April 2. Expect elevated volatility.
Project text-lg (16px) · lh relaxed
Your portfolio is up 12.4% YTD, outperforming the S&P 500 by 3.2 percentage points. Duration-sensitive names benefited from the softer-than-expected CPI print, with rate-cut odds now at 68%.
Earnings season playbook:
The market can stay irrational longer than you can stay solvent.
Here's the API call to fetch positions:
fetch('/api/portfolio/positions', {
headers: { 'Authorization': 'Bearer ' + token }
})
.then(res => res.json())
.then(data => console.log(data))Returns an array of Position objects with ticker, shares, and avgCost fields.
Next catalyst: FOMC meeting on April 2. Expect elevated volatility.
Article text-lg→xl (16→18px) · lh 2→2.25
Your portfolio is up 12.4% YTD, outperforming the S&P 500 by 3.2 percentage points. Duration-sensitive names benefited from the softer-than-expected CPI print, with rate-cut odds now at 68%.
Earnings season playbook:
The market can stay irrational longer than you can stay solvent.
Here's the API call to fetch positions:
fetch('/api/portfolio/positions', {
headers: { 'Authorization': 'Bearer ' + token }
})
.then(res => res.json())
.then(data => console.log(data))Returns an array of Position objects with ticker, shares, and avgCost fields.
Next catalyst: FOMC meeting on April 2. Expect elevated volatility.
sm
Small variant with bold, code, and nested list:
default
Default variant with bold, code, and nested list:
lg
Large variant with bold, code, and nested list:
F1 Carbon is a dark-first design system built for data-heavy financial interfaces. It ships as a private npm package with 123 UI components, 15 chart wrappers, and a full token system.
Dark mode is required — components look broken without className="dark" on the html element.
import { Button, Card, BarChart } from '@f1carbon/ui'Markers: disc → circle → square · All green (color-pos)
Types: decimal → lower-alpha → lower-roman · Indent matches bullets
Text with bold emphasis for key data points, italic for asides, and linked text for references. Inline code for tickers or API fields like avgCost.
Body text after h3.
Body text after h4.
Blockquote with left accent border. Always uses prim color.
// Code block — mono font, base-weak bg
const portfolio = await fetch('/api/positions')
const data = await portfolio.json()Content above hr.
Content below hr.
f1-rich is a single CSS class in utilities.css that owns structural prose styling — list markers, nesting, indent, headings, inline formatting, code blocks, blockquotes, and horizontal rules. It contains no font-size, line-height, or body text color — those are set by the consuming component via Tailwind token utilities.
chat-rich-text.tsxf1-rich text-scnd [&_p]:text-primtext-xs leading-normal · default: text-base leading-[1.75] · lg: text-lg leading-relaxedarticle.tsxf1-rich text-scnd text-base leading-relaxed [&_h3]:text-lg [&_h4]:text-baseproject-page.tsxf1-rich + inline leading overrides for p/liNative list-style is disabled. Each li gets position: relative + padding-left: 1.25em (marker space). A ::before pseudo-element sits at left: 0 with the marker character. Wrapped text stays indented because padding applies to the whole content box.
var(--color-pos) (green)0 (ul/ol padding-left: 0)1.25em (li padding-left, relative to font-size)0 (nested ul/ol padding-left: 0)1.25rem (gap on root ul/ol)0.375rem (gap on nested lists)0.375rem (margin-top)0.375rem (p + ul/ol margin-top)chat-rich-style → f1-rich text-scnd [&_p]:text-prim + size classes on wrappernote-style → f1-rich text-scnd + scale/leading classes on wrapperf1-list → f1-rich (drop-in replacement, f1-rich is a superset)text-2xs 10px · text-xs 11px · text-sm 13px · text-base 14pxtext-lg 16px · text-xl 18px · text-2xl 20pxFull documentation: RICHTEXT.md in repo root. CSS source: packages/ui/src/styles/utilities.css (search for f1-rich).