Marker
Conversation rows for status updates and system notes — bordered rows plus centered labeled separators. Live work via role="status" with spinner and shimmer.
INSTALL
1pnpm dlx @sayagodev/mo add markerOr import the files from the package (no copy):
1import "@sayagodev/mo/css/marker.css";EXAMPLES
Default
Switched to a new branch
Thinking…
Conversation compacted
Explored 4 files
1<div class="vstack gap-8" style="max-width: 24rem">2 <div data-marker>3 <span data-marker-icon aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" x2="6" y1="3" y2="15" /><circle cx="18" cy="6" r="3" /><circle cx="6" cy="18" r="3" /><path d="M18 9a9 9 0 0 1-9 9" /></svg></span>4 <span data-marker-content>Switched to a new branch</span>5 </div>6 <div data-marker role="status">7 <span data-marker-icon aria-hidden="true"><span aria-busy="true" data-spinner="small"></span></span>8 <span data-marker-content class="shimmer">Thinking…</span>9 </div>10 <div data-marker="separator">11 <span data-marker-content>Conversation compacted</span>12 </div>13 <div data-marker>14 <span data-marker-icon aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8" /><path d="m21 21-4.3-4.3" /></svg></span>15 <span data-marker-content>Explored 4 files</span>16 </div>17</div>
Variants
A default marker for inline notes.
A separator marker
A border marker for row boundaries.
1<div class="vstack gap-8" style="max-width: 24rem">2 <div data-marker>3 <span data-marker-content>A default marker for inline notes.</span>4 </div>5 <div data-marker="separator">6 <span data-marker-content>A separator marker</span>7 </div>8 <div data-marker="border">9 <span data-marker-content>A border marker for row boundaries.</span>10 </div>11</div>
Status
Compacting conversation
Running tests
1<div class="vstack gap-8" style="max-width: 24rem">2 <div data-marker role="status">3 <span data-marker-icon aria-hidden="true"><span aria-busy="true" data-spinner="small"></span></span>4 <span data-marker-content>Compacting conversation</span>5 </div>6 <div data-marker="separator" role="status">7 <span data-marker-icon aria-hidden="true"><span aria-busy="true" data-spinner="small"></span></span>8 <span data-marker-content>Running tests</span>9 </div>10</div>
Shimmer
Thinking…
Reading 4 files…
1<div class="vstack gap-8" style="max-width: 24rem">2 <div data-marker role="status">3 <span data-marker-content class="shimmer">Thinking…</span>4 </div>5 <div data-marker="separator" role="status">6 <span data-marker-content class="shimmer">Reading 4 files…</span>7 </div>8</div>
Separator
Today
Worked for 42s
Conversation compacted
1<div class="vstack gap-8" style="max-width: 24rem">2 <div data-marker="separator">3 <span data-marker-content>Today</span>4 </div>5 <div data-marker="separator">6 <span data-marker-content>Worked for 42s</span>7 </div>8 <div data-marker="separator">9 <span data-marker-content>Conversation compacted</span>10 </div>11</div>
Border
Switched to release-candidate
Reviewed 8 related files
Opened implementation notes
1<div class="vstack gap-3" style="max-width: 24rem">2 <div data-marker="border">3 <span data-marker-icon aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" x2="6" y1="3" y2="15" /><circle cx="18" cy="6" r="3" /><circle cx="6" cy="18" r="3" /><path d="M18 9a9 9 0 0 1-9 9" /></svg></span>4 <span data-marker-content>Switched to release-candidate</span>5 </div>6 <div data-marker="border">7 <span data-marker-icon aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8" /><path d="m21 21-4.3-4.3" /></svg></span>8 <span data-marker-content>Reviewed 8 related files</span>9 </div>10 <div data-marker="border">11 <span data-marker-icon aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z" /><path d="M14 2v4a2 2 0 0 0 2 2h4" /><path d="M16 13H8" /><path d="M16 17H8" /><path d="M10 9H8" /></svg></span>12 <span data-marker-content>Opened implementation notes</span>13 </div>14</div>
With icon
Switched to a new branch
Explored 4 files
Syncing completed
1<div class="vstack gap-12" style="max-width: 24rem">2 <div data-marker>3 <span data-marker-icon aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" x2="6" y1="3" y2="15" /><circle cx="18" cy="6" r="3" /><circle cx="6" cy="18" r="3" /><path d="M18 9a9 9 0 0 1-9 9" /></svg></span>4 <span data-marker-content>Switched to a new branch</span>5 </div>6 <div data-marker="separator">7 <span data-marker-icon aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8" /><path d="m21 21-4.3-4.3" /></svg></span>8 <span data-marker-content>Explored 4 files</span>9 </div>10 <div data-marker class="flex-col">11 <span data-marker-icon aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5" /></svg></span>12 <span data-marker-content>Syncing completed</span>13 </div>14</div>
Links & buttons
View the pull request
Read the release notes for details.
1<div class="vstack gap-8" style="max-width: 24rem">2 <a href="#" data-marker>3 <span data-marker-icon aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" x2="6" y1="3" y2="15" /><circle cx="18" cy="6" r="3" /><circle cx="6" cy="18" r="3" /><path d="M18 9a9 9 0 0 1-9 9" /></svg></span>4 <span data-marker-content>View the pull request</span>5 </a>6 <button type="button" data-marker>7 <span data-marker-icon aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" /><path d="M3 3v5h5" /></svg></span>8 <span data-marker-content>Revert this change</span>9 </button>10 <div data-marker>11 <span data-marker-content>Read the <a href="#">release notes</a> for details.</span>12 </div>13</div>
USAGE
1<div data-marker>2 <span data-marker-icon aria-hidden="true"><svg …/></span>3 <span data-marker-content>Switched to a new branch</span>4</div>5 6<div data-marker="separator"><span data-marker-content>Today</span></div>7<div data-marker="border">8 <span data-marker-content>A bordered status row</span>9</div>10 11<!-- live status -->12<div data-marker role="status">13 <span data-marker-icon aria-hidden="true"><span aria-busy="true" data-spinner="small"></span></span>14 <span data-marker-content class="shimmer">Thinking…</span>15</div>16 17<!-- link or button root -->18<a href="#" data-marker>…</a>
API
NAMEKINDDESCRIPTION
[data-marker]elementRoot row: flex, text-sm muted; works on div, a or button
data-marker="border"attributeBottom hairline + pb-2 to separate the next row
data-marker="separator"attributeCentered label with divider lines on both sides
[data-marker-icon]elementDecorative 1rem icon slot; author sets aria-hidden
[data-marker-content]elementText slot; centered and flex-none inside separator
role="status"attributeLive-region announcement for streaming/in-progress markers
.shimmerclassAnimated streaming-text gradient on content; static under reduced motion
aria-busy + data-spinner="small"attributeSpinner in the icon slot for in-progress markers
FILES
src/css/marker.cssInstall:
mo add markerTHEMING · PLAYGROUND
This is the exact component from the examples above, wearing a completely different theme. Edit the tokens and --mo-* hooks in the editor — autocomplete knows them all — and the preview obeys in real time. Your CSS always wins.
Global tokens
--border--foreground--muted-foregroundPreview
Your CSS
Try it: type --mo- for the component hooks, or edit any value — the preview obeys in real time.