Buttons and tags
Square labels in exhibit black. They turn tomato under the pointer.
Stable Class names and props are not expected to change before 1.0.
In this chapter 14 pages
Buttons
<div class="ply-cluster">
<button class="ply-button" type="button">Read the paper</button>
<button class="ply-button ply-button--secondary" type="button">BibTeX</button>
<button class="ply-button ply-button--ghost" type="button">Cancel</button>
<button class="ply-button ply-button--sm" type="button">Small</button>
<button class="ply-button" type="button" disabled>Disabled</button>
<button class="ply-button" type="button" aria-busy="true"><span class="ply-loading" aria-hidden="true"><i></i></span>Running</button>
</div>- Use one primary button per view, for the action most readers came for. Everything else is secondary or ghost.
- Label buttons with the action: "Read the paper", "Copy BibTeX", "Run again". Not "Click here" or "Submit".
- A link that looks like a button is fine: put the classes on an
<a>. - While an action runs, set
aria-busy="true"and add the small machine as a spinner.
<Button href="/paper.pdf">Read the paper</Button>
<Button variant="secondary">BibTeX</Button>
<Button busy>Running</Button>| Prop | Effect | Default |
|---|---|---|
variant | primary, secondary, or ghost | primary |
size | md or sm | md |
href | Renders an <a> instead of a <button> | |
icon | Square icon-only button. Give it an aria-label. | false |
busy | Shows the loading machine and sets aria-busy | false |
Tags
NeurIPS 2026
Oral
New
<div class="ply-cluster">
<span class="ply-tag">NeurIPS 2026</span>
<span class="ply-tag ply-tag--solid">Oral</span>
<span class="ply-tag ply-tag--note">New</span>
</div>Tags name a venue, a type, or a topic. They are not buttons; if a tag filters something, make it a real button or link.
Status
Idle
Training
Converged
Loss plateau
Diverged
<div class="ply-cluster" style="--ply-cluster-gap: 1.5rem">
<span class="ply-status ply-status--idle">Idle</span>
<span class="ply-status ply-status--running">Training</span>
<span class="ply-status ply-status--done">Converged</span>
<span class="ply-status ply-status--warning">Loss plateau</span>
<span class="ply-status ply-status--error">Diverged</span>
</div>Status always pairs a mark with a word, so it reads without color: an empty ring for idle, a pulsing ball for running, a check, a triangle, and a cross. Use it in demo status lines and experiment tables.
<Status state="running">Training</Status>When a script changes the status, add live so screen readers announce it: <Status state="running" live>. Inside an app shell, leave it off; the status bar is already a live region.