ComponentsUpdated Sep 9, 2026
Loading State
A spinner with cycling status messages. The text crossfades between messages so a long wait still feels alive.
Source: packages/ui/src/components/loading-state
import { LoadingState } from '@highlight/ui'Change the props; the preview and the snippet update together.
Checking for actions…
Props
2000
Shimmer
Spinner
<LoadingState> <LoadingState.Spinner /> <LoadingState.Text messages={['Checking for actions…', 'Reviewing your tasks…', 'Almost there…']} /></LoadingState>Checking for actions…
import { LoadingState } from '@highlight/ui' export default function LoadingStateBasic() { return ( <LoadingState> <LoadingState.Spinner /> <LoadingState.Text messages={['Checking for actions…', 'Reviewing your tasks…', 'Almost there…']} /> </LoadingState> )}Spinner and Text work standalone. interval sets the cycle; shimmer toggles the sheen.
Thinking…
Summarizing
import { LoadingState } from '@highlight/ui' export default function LoadingStateParts() { return ( <div className="flex flex-col items-start gap-4"> <LoadingState.Spinner className="size-6" /> <LoadingState.Text messages={['Thinking…']} shimmer={false} /> <LoadingState className="gap-3"> <LoadingState.Spinner className="size-5" /> <LoadingState.Text messages={['Summarizing', 'Extracting decisions', 'Drafting follow-ups']} interval={1200} className="text-md" /> </LoadingState> </div> )}The root, then any compound sub-components. Every part accepts className and forwards the rest of its props to the element or Base UI part beneath it.
LoadingState- A row with the spinner and its label.
LoadingState.Spinner- Ring spinner; size with className.
LoadingState.Text- Cycles through messages every interval ms (default 2000). shimmer defaults to true.