Displays an inline status, system note, bordered row, or labeled separator in a conversation.
❯buridan add markerUse the following to build the Marker component.
from components.ui.marker import markerFor manual installation, copy each of the source codes below in their respective locations.
Use variant to switch between an inline marker, bordered row, and labeled separator.
Set role="status" and include a Spinner for streaming or in-progress markers so updates are announced.
Add the shimmer utility class to marker.content for an animated streaming-text effect. The utility ships with the buridan package — see the shimmer docs for installation.
Use the separator variant for labeled dividers, such as dates or section breaks, in a conversation.
Use the border variant for status rows that should keep the default marker alignment while separating the next row.
Use marker.icon to render an icon alongside the content. Use flex-col to stack the icon above the content.
Turn a marker into a link or button with.
marker.root is presentational by default. The correct semantics depend on how you use it, so choose the role based on intent rather than relying on a single default.
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.root forwards role to the underlying element.
marker.root(
marker.icon(spinner()),
marker.content("Compacting conversation"),
role="status",
)
A separator that carries text, such as a date or a section label, needs no role. The divider lines are decorative CSS pseudo-elements, and the text is announced as ordinary content.
marker.root(
marker.content("Today"),
variant="separator",
)
Note: Do not add
role="separator"to a labeled divider. A separator takes its accessible name fromaria-label, not from its text, and its contents are treated as presentational, so the visible label would not be announced. Reserverole="separator"for a divider with no meaningful text.
A bordered marker keeps the same semantics as the default marker. The bottom border is decorative, so choose role="status" or no role based on the marker's purpose.
marker.root(
marker.icon(rx.icon("file-text", size=14)),
marker.content("Opened implementation notes"),
variant="border",
)
marker.icon is decorative and hidden from assistive tech with aria-hidden, so the adjacent marker.content carries the meaning. For an icon-only marker, provide an aria_label so it is not announced as empty.
marker.root(
marker.icon(rx.icon("check", size=14)),
aria_label="Synced",
)
When a marker links or triggers an action, render it as an rx.link or pass on_click so it is focusable and exposes the correct role.
rx.link(
marker.root(
marker.icon(rx.icon("file-text", size=14)),
marker.content("Explored 4 files"),
),
href="/files",
)
The root marker element.
A decorative icon slot. Hidden from assistive tech with aria-hidden.
The marker text content.