View fulldotdev/ui on GitHub

Marker

Displays an inline status, system note, bordered row, or labeled separator in a conversation.

Installation

npx shadcn@latest add @fulldev/marker

Usage

import { Marker, MarkerContent, MarkerIcon } from "@/components/ui/marker"
<Marker>
  <MarkerIcon>
    <CheckIcon />
  </MarkerIcon>
  <MarkerContent>Explored 4 files</MarkerContent>
</Marker>

Composition

Use the following composition to build a marker:

Marker
├── MarkerIcon
└── MarkerContent

Variants

Use variant to switch between an inline marker, bordered row, and labeled separator.

VariantDescription
defaultAn inline marker for status, notes, and actions.
borderA default marker with a bottom border under the row.
separatorA centered label with divider lines on each side.

Status

Set role="status" and include a Spinner for streaming or in-progress markers so updates are announced.

Shimmer

Add the shimmer utility class to MarkerContent for an animated streaming-text effect.

Separator

Use the separator variant for labeled dividers, such as dates or section breaks, in a conversation.

Border

Use the border variant for status rows that should keep the default marker alignment while separating the next row.

With Icon

Use MarkerIcon to render an icon alongside the content.

Turn a marker into a link or button with the render prop on Marker.

import { Marker, MarkerContent } from "@/components/ui/marker"

export function MarkerLinkDemo() {
  return (
    <Marker render={<a href="#" />}>
      <MarkerContent>View the pull request</MarkerContent>
    </Marker>
  )
}

Accessibility

Marker is presentational by default.

Status and Progress

For streaming or progress markers such as “Thinking…” or a running tool, set role="status" so assistive tech announces the update as it appears.

<Marker role="status">
  <MarkerIcon>
    <Spinner />
  </MarkerIcon>
  <MarkerContent>Compacting conversation</MarkerContent>
</Marker>

Labeled Separators

A separator that carries text, such as a date or a section label, needs no role.

<Marker variant="separator">
  <MarkerContent>Today</MarkerContent>
</Marker>

Bordered Markers

A bordered marker keeps the same semantics as the default marker.

<Marker variant="border">
  <MarkerIcon>
    <FileTextIcon />
  </MarkerIcon>
  <MarkerContent>Opened implementation notes</MarkerContent>
</Marker>

Decorative Icons

MarkerIcon is decorative and hidden from assistive tech with aria-hidden, so the adjacent MarkerContent carries the meaning.

<Marker aria-label="Synced">
  <MarkerIcon>
    <CheckIcon />
  </MarkerIcon>
</Marker>

Interactive Markers

When a marker links or triggers an action, render it as a real <button> or <a> with the render prop so it is focusable and exposes the correct role.

<Marker render={<a href="/files" />}>
  <MarkerIcon>
    <FileTextIcon />
  </MarkerIcon>
  <MarkerContent>Explored 4 files</MarkerContent>
</Marker>

API Reference

Source: react/src/components/ui/marker.tsx

Marker

The root marker element.

PropTypeDefaultDescription
variant"default" | "border" | "separator""default"The marker layout.
renderReactElement | function-Render as a different element, such as a link.
classNamestring-Additional classes to apply to the root element.

MarkerIcon

A decorative icon slot.

PropTypeDefaultDescription
classNamestring-Additional classes to apply to the icon slot.

MarkerContent

The marker text content.

PropTypeDefaultDescription
classNamestring-Additional classes to apply to the content slot.