Thought steps

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

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

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