#124 Pricing page: settle the wording
Now: writing the plan comparison table
One agent's job at a glance: its state in words, how far along it is, and the one thing to do next.A block is copied, not installed: take an example's code and the stylesheet at the foot of the page, and rename the site- prefix to your project's own.
Working: the spinner and the info badge, the meter in the series color, and what the agent does now.
1 h 12·step 214·$29.40
Now: writing the plan comparison table
Waiting on you: the warning edge, the question in a warning box, and one brand button to answer it.
1 h 12·step 214·$29.40
Which wording should the pricing page use: “from $9” or “$9 and up”?
Queued: the gray badge, no meter yet, and its place in line.
waits·0 steps·$0
Starts when a place frees up · 2nd in line
Finished: the meter full in the success color, and what the agent left behind.
48 min·step 96·$11.20
Pull Request #79 opened · 4 checks passed
Failed: why it stopped, in a danger box, and a button to try again.
22 min·step 41·$4.80
Stopped: 3 checks failed
Cards side by side, as many as the room allows; the one that needs you is the only one with an edge.
35 min·step 70·$6.10
Should “Express” promise next-day delivery?
12 min·step 18·$2.40
Now: listing the posts of each year
waits·0 steps·$0
Starts when #31 is done
Shows one agent's job on a board or an overview: which project it works in, the task, how long it has run and what it has cost, how far along it is, and the action that fits its state. Five states: working, waiting on you, queued, finished and failed.
The page sets the state: the badge and its words, the edge, the meter's tone, the note's box and the buttons. The block takes no focus of its own; its buttons do. When the room runs out, the job's words in the footer wrap and the buttons keep their size.
| Key | What it does |
|---|---|
| Tab | Moves focus to each of the card's buttons in turn. The card itself takes no focus. |
| EnterorSpace | Presses the focused button. |
The agent card's own layout, its classes under the site- prefix. The components inside it are drawn by the design system's stylesheet.
/* site-agent-card — Agent card, a block: one agent's job at a glance, its state in words, how far along it is
* and what to do next. Copy it into your project and rename site- to your project's own prefix. The frame is the
* Card component in its compact layout, the waiting state with its warning edge; the badge, spinner, meter and
* buttons are the system's own. The block draws only the lines inside the card's body and the footer's line. */
.site-agent-card__top,
.site-agent-card__meta,
.site-agent-card__footer {
display: flex;
align-items: center;
gap: var(--smbk-space-inline-sm);
}
.site-agent-card__eyebrow {
flex: 1 1 auto;
min-width: 0;
color: var(--smbk-color-text-subtle);
font-family: var(--smbk-typography-code-sm-font-family);
font-size: var(--smbk-typography-code-sm-font-size);
font-weight: var(--smbk-typography-code-sm-font-weight);
line-height: var(--smbk-typography-code-sm-line-height);
letter-spacing: var(--smbk-typography-code-sm-letter-spacing);
}
.site-agent-card__title {
margin: 0;
color: var(--smbk-color-text-default);
font-family: var(--smbk-typography-body-sm-medium-font-family);
font-size: var(--smbk-typography-body-sm-medium-font-size);
font-weight: var(--smbk-typography-body-sm-medium-font-weight);
line-height: var(--smbk-typography-body-sm-medium-line-height);
letter-spacing: var(--smbk-typography-body-sm-medium-letter-spacing);
}
.site-agent-card__meta,
.site-agent-card__note,
.site-agent-card__job {
margin: 0;
color: var(--smbk-color-text-subtle);
font-family: var(--smbk-typography-body-xs-font-family);
font-size: var(--smbk-typography-body-xs-font-size);
font-weight: var(--smbk-typography-body-xs-font-weight);
line-height: var(--smbk-typography-body-xs-line-height);
letter-spacing: var(--smbk-typography-body-xs-letter-spacing);
}
.site-agent-card__meta {
flex-wrap: wrap;
font-variant-numeric: tabular-nums;
}
.site-agent-card__icon {
flex: none;
color: var(--smbk-color-icon-subtle);
}
.site-agent-card__dot {
color: var(--smbk-color-text-subtlest);
}
/* The question or the failure, said in a box of its tone's subtle color. */
.site-agent-card__note--tone-warning,
.site-agent-card__note--tone-danger {
padding: var(--smbk-space-inset-sm);
border-radius: var(--smbk-radius-control-md);
}
.site-agent-card__note--tone-warning {
background: var(--smbk-color-feedback-warning-surface-subtle);
color: var(--smbk-color-feedback-warning-text-on-subtle);
}
.site-agent-card__note--tone-danger {
background: var(--smbk-color-feedback-danger-surface-subtle);
color: var(--smbk-color-feedback-danger-text-on-subtle);
}
/* The footer: a quiet line above it, the same room above and below the line, then the job and its actions. When
the room runs out the job's words wrap; the buttons keep their size. */
.site-agent-card__footer {
padding-block-start: var(--smbk-space-inset-lg);
border-block-start: var(--smbk-border-width-hairline) solid var(--smbk-color-border-subtle);
}
.site-agent-card__job {
flex: 1 1 auto;
min-width: 0;
}
.site-agent-card__footer > :not(.site-agent-card__job) {
flex: none;
}