Files
2026-09-04 12:57:43 -07:00

8.0 KiB

title, description, component, links
title description component links
Marker Displays an inline status, system note, bordered row, or labeled separator in a conversation. true
source
https://github.com/huntabyte/shadcn-svelte/tree/next/sites/docs/src/lib/registry/ui/marker
<script> import Callout from "$lib/components/callout.svelte"; import ComponentPreview from "$lib/components/component-preview.svelte"; import ComponentSource from "$lib/components/component-source.svelte"; import PMAddComp from "$lib/components/pm-add-comp.svelte"; import Steps from "$lib/components/steps.svelte"; import InstallTabs from "$lib/components/install-tabs.svelte"; let { viewerData } = $props(); import Step from "$lib/components/step.svelte"; </script>

The Marker component displays inline conversation markers such as status updates, system notes, bordered rows, and labeled separators. Compose it with Message in a conversation thread.

Installation

{#snippet cli()} {/snippet} {#snippet manual()}

Copy and paste the following code into your project.

{#if viewerData} {/if} {/snippet}

Usage

<script lang="ts">
  import * as Marker from "$lib/components/ui/marker/index.js";
</script>
<Marker.Root>
  <Marker.Icon>
    <CheckIcon />
  </Marker.Icon>
  <Marker.Content>Explored 4 files</Marker.Content>
</Marker.Root>

Composition

Use the following composition to build a marker:

Marker.Root
├── Marker.Icon
└── Marker.Content

Features

  • Inline marker, bordered row, and labeled separator variants
  • Decorative icon slot that is hidden from assistive tech
  • Polymorphic root via the child snippet for link and button markers
  • Pairs with the shimmer utility for streaming status text
  • Customizable styling through the class prop on every part

Variants

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

Variant Description
default An inline marker for status, notes, and actions.
border A default marker with a bottom border under the row.
separator A 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 Marker.Content for an animated streaming-text effect. The utility ships with the shadcn-svelte package. See the shimmer docs for installation.

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 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 the child snippet on Marker.Root.

<script lang="ts">
  import * as Marker from "$lib/components/ui/marker/index.js";
</script>

<Marker.Root>
  {#snippet child({ props })}
    <a href="#/" {...props}>
      <Marker.Content>View the pull request</Marker.Content>
    </a>
  {/snippet}
</Marker.Root>

Accessibility

Marker 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.

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 forwards role to the underlying element.

<Marker.Root role="status">
  <Marker.Icon>
    <Spinner />
  </Marker.Icon>
  <Marker.Content>Compacting conversation</Marker.Content>
</Marker.Root>

Labeled Separators

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 variant="separator">
  <Marker.Content>Today</Marker.Content>
</Marker.Root>

Note: Do not add role="separator" to a labeled divider. A separator takes its accessible name from aria-label, not from its text, and its contents are treated as presentational, so the visible label would not be announced. Reserve role="separator" for a divider with no meaningful text.

Bordered Markers

A bordered marker keeps the same semantics as the default marker. The bottom border is decorative, so choose role="status", the child snippet, or no role based on the marker's purpose.

<Marker.Root variant="border">
  <Marker.Icon>
    <FileTextIcon />
  </Marker.Icon>
  <Marker.Content>Opened implementation notes</Marker.Content>
</Marker.Root>

Decorative Icons

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 or visible text so it is not announced as empty.

<Marker.Root aria-label="Synced">
  <Marker.Icon>
    <CheckIcon />
  </Marker.Icon>
</Marker.Root>

Interactive Markers

When a marker links or triggers an action, render it as a real <button> or <a> with the child snippet so it is focusable and exposes the correct role. The accessible name comes from the marker text.

<Marker.Root>
  {#snippet child({ props })}
    <a href="/files" {...props}>
      <Marker.Icon>
        <FileTextIcon />
      </Marker.Icon>
      <Marker.Content>Explored 4 files</Marker.Content>
    </a>
  {/snippet}
</Marker.Root>

API Reference

Marker

The root marker element. The file also exports markerVariants for composing the marker styles into custom components.

Prop Type Default Description
variant "default" | "border" | "separator" "default" The marker layout.
child snippet - Render as the child element, such as a link.
class string - Additional classes to apply to the root element.

Marker.Icon

A decorative icon slot. Hidden from assistive tech with aria-hidden.

Prop Type Default Description
class string - Additional classes to apply to the icon slot.

Marker.Content

The marker text content.

Prop Type Default Description
class string - Additional classes to apply to the content slot.