Thought steps

A collapsible sequence of work summaries, with step states, source badges, images, and captions.

Review summary
  1. Checked the supplied source

Inspect the supplied evidence

Review summaryIn progress
  1. ✓
    Read the supplied brief
    Found the proposed scope and three responsibilities.
  2. ◉
    Compare responsibilities
    Checking the owner of each decision.

Use it for

  • Present application-supplied work summaries and the evidence supporting each step.
  • Use sources, content, image, caption, and icon slots for richer evidence; images need meaningful alt text.

Avoid

  • Exposing private model reasoning or inventing an explanation of hidden model internals.

React package

npm install @noorddev/vlak-react

Load the stylesheet once at your app root, then import the components you use.

import "@noorddev/vlak-react/css";
import { ThoughtSteps } from "@noorddev/vlak-react";

Per-component imports are available at @noorddev/vlak-react/components/thought-steps.

Copy the source

npx @noorddev/vlak-cli add thought-steps

Adds the component and its dependencies to components/vlak/. Follow the StyleX setup to compile the source in your application.

shadcn registry

npx shadcn add https://vlak.dev/r/thought-steps.json

Installs the same source through the shadcn CLI.

import { ThoughtSteps } from "@noorddev/vlak-react";

<ThoughtSteps title="Review summary" defaultOpen steps={[{ id: "source", title: "Read the brief", state: "complete", description: "Checked the supplied scope and owners." }, { id: "review", title: "Compare responsibilities", state: "active" }]} />

See the integration example to compose these components with your application's model and data.

ThoughtSteps

Application-supplied work summaries, with per-step state and supporting evidence.

PropTypeDefaultDescription
titleReactNode
statusReasoningStatusDescribes application-supplied progress, without generating a thinking trace.
statusLabelstring
defaultOpenboolean
onOpenChange(open: boolean) => void
variant"inline" | "panel"An inline disclosure for message activity, or a framed panel.
durationMsnumberOptional elapsed time supplied by the application, in milliseconds.
measureDurationbooleanMeasure this component's streaming interval. Off by default.
autoExpandbooleanOpen when a new streaming interval begins. Manual disclosure remains the default.
autoCollapseDelaynumber | falseClose once after completion unless the reader manually changed the disclosure.
stepsrequiredreadonly ThoughtStep[]

Also accepts Omit<DetailsHTMLAttributes<HTMLDetailsElement>, "title">.

The ref reaches HTMLDetailsElement.

KeysDoes
TabMoves through the supplied native controls in reading order
Enter, SpaceActivates focused buttons and disclosure summaries
  • Native attributes, className, style, and the forwarded ref reach the outer element.
  • Interactive content requires accessible names; progress text is not announced for every streamed token.

The same styles are available as CSS. Native HTML provides the static presentation; React or application code supplies state updates and actions.

npm install @noorddev/vlak
import "@noorddev/vlak/css";
<details class="rs-thought-steps"><summary>Review summary</summary><ol class="rs-thought-steps-list"><li class="rs-thought-steps-step">Checked the supplied source</li></ol></details>

Classes

.rs-thought-steps.rs-thought-steps-list.rs-thought-steps-step.rs-thought-steps-detail.rs-thought-steps-title.rs-thought-steps-active.rs-thought-steps-sources.rs-thought-steps-figure.rs-thought-steps-caption