Model card
ProA model details card where switching models rolls every price, limit and score in place, a token slider estimates monthly cost live, and benchmark bars show each model's rank on hover. Compare crossfades to a side-by-side table against any rival with the better values marked, and the card never changes size.
Claude Opus 5.5
Anthropic
- Text, supported
- Image, supported
- PDF, supported
- Audio, not supported
- Video, not supported
- Tools, supported
- Reasoning, supported
- Context window
- 1M tokens
- Max output
- 128K tokens
- Knowledge cutoff
- Mar 2026
- Input per 1M
- $5.00
- Output per 1M
- $25.00
- Cached per 1M
- $0.50
Benchmarks
- The detail pane of a model picker, showing what the highlighted model can do and what it costs before someone selects it.
- Model pages in docs or a marketplace, with limits, prices and a quick benchmark read against close rivals.
- Settings where a team picks a default model and wants a side by side check against an alternative.
- Use model-picker to choose between many models; pair it with this card for the details.
- Use context-window to show how full a live conversation's context is.
- Use a pricing table for plan pricing; this card shows per token API prices.
- Do not use it for official benchmark leaderboards with many models; the bar list shows three models.
Installation
Pro source and install commands unlock with a Pro plan.
import { ModelCard, type ModelCardModel } from "@/components/arc/model-card/model-card";import { ClaudeMark, OpenaiMark } from "@/components/arc/model-card/model-card-marks"; const sonnet: ModelCardModel = { id: "claude-sonnet-5-5", name: "Claude Sonnet 5.5", provider: "Anthropic", mark: <ClaudeMark aria-hidden style={{ color: "#D97757" }} />, summary: "The balanced Claude for everyday coding, agents and analysis at scale.", modalities: ["text", "image", "pdf", "tools", "reasoning"], contextWindow: 1_000_000, maxOutput: 64_000, knowledgeCutoff: "2026-03", pricing: { input: 3, output: 15, cachedInput: 0.3 }, scores: { "swe-bench": 82.1, gpqa: 85.4 },}; export function ModelDetails({ rivals, current, onPick }: { rivals: ModelCardModel[]; current: string; onPick: (id: string) => void }) { return ( <ModelCard model={sonnet} rivals={rivals} benchmarks={[ { id: "swe-bench", name: "SWE-bench Verified", shortName: "SWE-bench", description: "real GitHub issues resolved" }, { id: "gpqa", name: "GPQA Diamond", shortName: "GPQA", description: "graduate level science questions" }, ]} defaultMonthlyTokens={50_000_000} sample={false} selected={current === sonnet.id} onSelect={model => onPick(model.id)} onCopyId={id => console.log("copied", id)} /> );}ModelCard
A model details card for a model picker, docs or a marketplace that keeps one size in every state. The header shows the provider mark, the model name and the provider, with a Compare switch. The details view has a two line summary, all seven modality chips (unsupported ones dashed and muted), context window, max output and knowledge cutoff with a context gauge that reads as pages (1M tokens fits about 1,500 pages), input, output and cached prices per million tokens, a monthly volume slider that rolls the estimated monthly cost live, and benchmark bars against two rivals where hovering or focusing a row shows the exact score, its rank and the gap to the leader. The footer shows the API model id with Copy model id. Compare crossfades to a side by side table against any rival, including the cost at the chosen volume, with a check and the margin (+2.3, −20%, 2x) on the better value and a tally of who leads. Details, compare, loading and error are stacked in one grid cell, so switching models, views or benchmarks never moves the card. Ships with sample data for Claude Opus 5.5 against GPT-6.1 Sol, Gemini 4 Argon and Grok 4.7; prices and scores are labeled as samples.
modelModelCardModelClaude Opus 5.5 (sample)The model the card describes: { id, name, provider, mark?, summary?, modalities?, contextWindow?, maxOutput?, knowledgeCutoff?, pricing?, scores? }. contextWindow and maxOutput are token counts (1_000_000 reads as 1M). knowledgeCutoff is an ISO month such as "2026-03" (shown as Mar 2026); any other string is shown as is. pricing is { input, output, cachedInput? } per million tokens. scores maps benchmark ids to numbers. A missing value reads as Not listed.rivalsModelCardModel[]GPT-6.1 Sol, Gemini 4 Argon, Grok 4.7 (sample)Other models. The first two appear under the model in the benchmark rows, ranks count every rival with a score, and every rival can be picked in the compare view. The model itself is filtered out, so one shared pool works for every model. Pass [] to hide the Compare switch.benchmarksModelCardBenchmark[]SWE-bench Verified, GPQA Diamond, Terminal-Bench 2.0Benchmarks in order: { id, name, shortName?, description?, max?, unit? }. shortName labels the switcher, description follows the name in the caption, max fills a bar (default 100) and unit follows each score (default %). Only benchmarks the model has a score for are offered; with none the section hides.view"details" | "compare"–Controlled view. Pair it with onViewChange.defaultView"details" | "compare""details"Starting view when uncontrolled.onViewChange(view: ModelCardView) => void–Called when the Compare switch changes.compareWithstring–Controlled id of the rival in the compare view. Pair it with onCompareWithChange.defaultCompareWithstringfirst rivalStarting rival when uncontrolled.onCompareWithChange(id: string) => void–Called when a rival is picked from the compare menu.defaultBenchmarkstringfirst scored benchmarkBenchmark shown first.onBenchmarkChange(id: string) => void–Called when the benchmark switcher changes.defaultMonthlyTokensnumber100_000_000Monthly token volume the cost estimator starts at. Snaps to the nearest stop: 1M, 5M, 10M, 25M, 50M, 100M, 250M, 500M or 1B.onMonthlyTokensChange(tokens: number) => void–Called with the new monthly volume as the slider moves.inputSharenumber0.75Share of the monthly volume billed at the input price; the rest is billed at the output price.currencystring"USD"ISO 4217 currency for prices.samplebooleantrueLabels prices and scores as samples in the benchmark caption and the compare footnote. Set it to false once you wire real figures.loadingbooleanfalseShows a skeleton of the card, disables Compare and sets aria-busy.errorstring–Replaces the body with an error message. The header still shows the model.onRetry() => void–Adds a Retry button to the error state.onCopyId(id: string) => void–Called after Copy model id writes the id to the clipboard.onSelect(model: ModelCardModel) => void–Adds a primary Use model button to the footer, for model pickers.selectedbooleanfalseShows the select button as Selected with a check and aria-pressed.selectLabelstring"Use model"Label for the select button.classNamestring–Class on the root article.styleCSSProperties–Inline style on the root article.- Tab
- Moves through the Compare switch, the monthly volume slider, the benchmark switcher, each benchmark row (focus shows its score and rank), or the rival menu in the compare view, then Copy model id and Use model when present. Hidden views are inert, so Tab never lands in them.
- Arrow keysorPage uporHomeorEnd
- On the volume slider, step through the monthly volumes; the estimated cost rolls to the new value.
- SpaceorEnter
- Toggles Compare, copies the model id or selects the model.
- Arrow leftorArrow right
- Moves between benchmarks in the switcher.
- EnterorArrow down
- On the rival menu, opens it; arrows move between rivals and Enter picks one. Escape closes it.
- The card is an article labelled by the model name. Specs and prices are description lists, so each value is read with its label.
- The compare view is a table with column headers for the two models and a row header per spec. The better value carries a check icon and the text "better" for screen readers, so the comparison never relies on color.
- A polite status region says what changed when you switch views, rivals or benchmarks (for example "Comparing Claude Opus 5.5 with Gemini 4 Argon"). Copy model id announces Copied on its own.
- Benchmark bars are hidden from assistive technology; each row is focusable and labelled with the full readout (score, rank and gap to the leader). Marks are decorative and hidden, since the name is always written next to them.
- Modality chips say supported or not supported to screen readers; unsupported chips are dashed as well as muted, so the difference never relies on color.
- While loading, the card is aria-busy, the skeleton is hidden, Compare is disabled and the status region says Loading model details. An error is announced with role alert. Inactive panels are inert and aria-hidden.
- During a text swap the outgoing value is hidden from assistive technology, so names and values are never read twice.
- Pointer focus draws no ring; keyboard focus uses Arc's shared focus outline.
- The card never changes size. Details, compare, loading and error are panels stacked in one grid cell, so the card is always as tall as the tallest panel; switching fades the old panel out in 100ms and the new one in over 160ms. Inside a panel every slot is reserved: two summary lines, all seven chips, every spec and price cell, a fixed number of benchmark rows and a readout that holds its lines.
- Switching models crossfades every text value in place and rolls prices, the estimated cost, page counts and scores to their new values in tabular numerals inside reserved widths. Bars and the context gauge slide on a critically damped spring (visualDuration 0.24, no bounce).
- Dragging the volume slider rolls the estimated cost live; the compare table's cost row follows the same volume.
- Hovering or focusing a benchmark row tints it, fades the other rows to half opacity and crossfades the readout to its score, rank and gap, all within 160ms.
- The bars grow from zero once, the first time the card is mostly in view, 40ms apart.
- Reduced motion keeps every end state and drops travel: views, bars, numbers and values change in place, and the skeleton holds still.
- The card is fluid up to 640px and reads its own width with container queries, so it works in a narrow side pane as well as a page.
- Below a 480px card, specs and prices become rows of label and value under hairlines, the cost estimate drops under the slider, the benchmark switcher drops under its heading and the readout reserves three lines. Below 420px the summary reserves three lines. Below 360px each bar moves under its name.
- From a 520px card the compare table has a label column beside the two model columns and shows margins on the better value; narrower, each label sits above its two values and the mini bars and margins hide.
- The footer wraps the copy and select buttons under the model id when space runs out. It holds at 320px without horizontal scroll.
- Bars animate transform only (scaleX) and numbers are written in place during the roll, so React renders once per change, not per frame.
- No measuring: the stacked grid cell reserves the height in CSS, so there is no ResizeObserver and no height animation.
- Nothing runs while idle: no loops apart from the CSS skeleton pulse while loading. Hidden panels stay mounted (inert) so values are ready the moment a view switches.
Notes for AI
Give your coding assistant the Markdown reference instead of screenshots.
- Use real figures from your model catalog and set sample={false}; leave sample on while the numbers are placeholders. The bundled data is a plausible October 2026 sample, not official pricing or results.
- Keep the summary to one sentence of about 90 characters; the card reserves two lines (three on narrow cards) and clamps anything longer.
- Give scores for the same benchmark ids on the model and its rivals. A row without a score shows None and the compare table shows Not listed, so rows never appear or disappear.
- Pass one shared pool as rivals when the model changes (the card filters out the current model), so the benchmark rows and ranks stay stable while values roll.
- Copy marks from model-card-marks.tsx (Claude, OpenAI, Gemini, Grok) or pass any SVG with aria-hidden. Mono marks follow the text color; set style={{ color }} for a brand color, as the Claude mark does. Brand marks are sample content, never an implied endorsement.
- Price cells read per million tokens. Omit cachedInput to show two price cells.
- For a list of many models, render a compact picker and show one ModelCard for the highlighted model; the card is a detail view, not a row.
The full library index for assistants is at /llms.txt.