# Agent plan

> The plan an agent writes before it acts: edit, reorder or add steps while it is a draft, then watch it work through them as a live checklist.

- Type: Component (special)
- Access: Xzero Pro
- Page: https://ui.xzero.co.uk/components/agent-plan
- Markdown: https://ui.xzero.co.uk/components/agent-plan/markdown
- Source file: `registry/components/agent-plan/agent-plan.tsx`
- Dependencies: motion, lucide-react
- Keywords: special, motion, ai, new, agent plan, plan mode, todo list, task plan, checklist, approve plan, coding agent, ai agent, step list, reorder, drag and drop, progress, retry, human in the loop, claude

## When to use

- An agent should show and get approval for its plan before it edits code, runs commands or touches production.
- A person needs to adjust the agent's plan (rename, reorder, remove or add steps) and then watch the same plan execute.
- A side panel or chat message that tracks a multi-step task with a live current step, failures that need a decision, and a final summary.

## When not to use

- Use agent-run for a streaming transcript of everything the agent did, with tool calls and output, rather than a checklist of steps.
- Use agent-approvals when the person approves individual risky actions one at a time instead of a whole plan up front.
- Use agent-tasks for a queue of independent tasks across agents rather than one ordered plan.
- Use research-run for search and reading progress that ends in a cited answer.

## Installation

Register both Xzero UI namespaces in your project's components.json:

```json
{
  "registries": {
    "@xzero-ui": "https://mcp.xzero.co.uk/r/{name}.json",
    "@xzero-ui-pro": "https://mcp.xzero.co.uk/r/pro/{name}.json"
  }
}
```

```bash
npx shadcn@4.23.0 add @xzero-ui-pro/agent-plan
```

Install xzero-foundation once, and import @/components/xzero/foundation.css in your app root. No Xzero token is used by this snapshot. For sample portraits, photos, fonts, or logos, download https://mcp.xzero.co.uk/install-assets.mjs and run node xzero-install-assets.mjs <receiving-project>.

## Usage

```tsx
import { AgentPlan, type AgentPlanStep } from "@/components/xzero/agent-plan/agent-plan";

// With no props it shows a sample plan and simulates the run.
export function PlanDemo() {
  return <AgentPlan />;
}

// Driven by your agent.
export function AgentPlanPanel({ run }) {
  return (
    <AgentPlan
      goal={run.goal}
      steps={run.steps}           // [{ id, title, state, substeps, note, error, duration }]
      status={run.status}         // "draft" | "running" | "paused" | "done"
      summary={run.summary}
      model={{ name: "Claude Sonnet 5.5", mark: <ClaudeMark /> }}
      onChange={steps => run.updateDraft(steps)}
      onKeepPlanning={() => run.suggestStep()}
      onApprove={steps => run.start(steps)}
      onPauseChange={paused => (paused ? run.pause() : run.resume())}
      onStepAction={({ type, step }) => (type === "retry" ? run.retry(step.id) : run.skip(step.id))}
    />
  );
}

// A step the agent is working on, and one it inserted.
const steps: AgentPlanStep[] = [
  { id: "store", title: "Keep request counters in Redis with a 60 second TTL", state: "active", substeps: ["Read lib/redis.ts", "Ran 6 tests"] },
  { id: "fallback", title: "Fall back to in-memory counters when Redis is down", note: "Added by agent" },
];
```

## API reference

### AgentPlan

The plan an agent writes before it acts, then works through as a live checklist. A header shows the model mark, "Plan · 6 steps" and the goal. While the plan is a draft every step can be renamed in place, dragged or moved with Alt and the arrow keys, removed, or added to, and Keep planning streams one more suggested step in before the last one. Approve plan locks it: the grips become status rings, the header counts "3 of 6" over a thin progress line, the current step shimmers beside a small spinner with its activity lines underneath, and a finished step draws its check and settles to secondary text with its time on the right. The agent can insert a step mid-run (it slides in with an "Added by agent" note), a failed step offers Retry and Skip, the run can be paused and resumed, and the footer ends with a one line summary and the total time. Without `status` it runs a simulated agent so the whole journey can be tried in place.

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `steps` | `AgentPlanStep[]` | `sampleSteps` | The plan. Each step has an id and a title, and optionally a state ("pending", "active", "done", "failed" or "skipped"), substeps (short activity lines; the first word, such as Read, Edited, Created, Searched or Ran, picks the icon), a note ("Added by agent"), an error for a failed step, and a duration in seconds for a done step. A new array replaces the plan on screen. |
| `status` | `"draft" \| "running" \| "paused" \| "done"` | – | Where the plan stands. Pass it to drive the plan from your agent: the component then never changes status or steps on its own and reports every action through the callbacks. Leave it out to run the built-in simulation. |
| `goal` | `string` | `"Add rate limiting to the public API"` | What the plan is for, shown under the header and used in the plan's accessible name. |
| `model` | `{ name: string; mark?: ReactNode }` | `{ name: "Claude Opus 5.5", mark: <ClaudeBrandMark /> }` | The model that wrote the plan. The 16px mark sits in the header and before agent notes; the name shows in the header while the plan is a draft. |
| `summary` | `string` | – | One line shown after "Done in 4m 35s." when the plan finishes. It streams in. The total time is the sum of the done steps' durations. |
| `onApprove` | `(steps: AgentPlanStep[]) => void` | – | Called by Approve plan with the steps in their final order, titles trimmed and empty steps removed. Start your agent here and set status to "running". |
| `onChange` | `(steps: AgentPlanStep[]) => void` | – | Called after each draft edit: a rename (on Enter or blur), a reorder (on drop or key press), a removal, an added step, or a suggested step that finished streaming. |
| `onStepAction` | `(action: { type: "retry" \| "skip"; step: AgentPlanStep }) => void` | – | Called when someone retries or skips a failed step. Focus is handled for you; update the step's state in `steps`. |
| `onKeepPlanning` | `() => void` | – | Called by Keep planning. Ask the agent for one more step and add it to `steps`. |
| `onPauseChange` | `(paused: boolean) => void` | – | Called by Pause (true) and Resume (false). Pause your agent and set status to "paused", or back to "running". |
| `className` | `string` | – | Class on the root element. |

## Keyboard interactions

| Keys | Action |
| --- | --- |
| Tab | In a draft, moves through each step's grip, title and remove button, then Add step, Keep planning and Approve plan. While running, reaches Retry and Skip on a failed step and Pause or Resume. |
| Alt + Arrow up / Arrow down | In a step title, moves that step up or down and keeps the caret in place. |
| Arrow up / Arrow down | On a step's grip, moves that step up or down. |
| Enter | In a step title, saves the rename without leaving the field. |
| Escape | In a step title, undoes the rename since the field was focused. |
| Backspace | In an empty step title, removes the step and moves focus to the step above. |

## Accessibility

- The plan is a section named after the model and the goal; the steps are an ordered list, so a screen reader announces the count and each position.
- Every step announces its state in words (Pending, In progress, Done, Failed, Skipped) before its title. Each state also has its own shape, a ring, a spinning arc, two bars, a disc with a check, a disc with an exclamation mark or a dashed ring, so it never rests on color.
- A failed step shows the word Failed with its reason and two labelled buttons. Skipped steps say Skipped beside the title.
- Titles are labelled text areas described by a hidden hint that explains Alt plus the arrow keys and Escape. Grips and remove buttons are named after their step and position.
- Edits, approval, each finished step, an inserted step, a failure, pause and the final summary are announced through one polite status region, including that the preview is a simulation.
- Focus follows the action: a moved step keeps focus, a removed step hands it to its neighbour, Approve plan hands it to Pause, and Retry or Skip hand it back to Pause.
- The progress line is a progressbar with a text value ("2 of 6 steps finished"), hidden while the plan is a draft.
- Pointer focus draws no ring; keyboard focus shows Xzero's shared focus ring, inset on controls inside clipped rows.

## Motion

- Reorders, inserts, removals and activity lines move on a critically damped spring (about 260ms, no bounce), so rows slide and grow without overshoot.
- Completing a step draws its check as a stroke over about 220ms while the disc fades up beneath it, and the title color settles from primary to secondary.
- The current step's title shimmers with Xzero's text shimmer beside a spinning arc; pausing stops both and swaps the arc for a pause glyph.
- A suggested step streams its title in chunks of a few words every 34ms, each chunk only fading in. A step the agent inserts arrives with a faint accent wash that fades out over about 1.8s.
- Counts roll with tabular digits in a reserved width. The header label, footer actions and status icons swap with one short crossfade, and the footer's height follows on the same spring.
- Reduced motion keeps every state, label, focus move and announcement but drops travel, the spinner, the stroke draw, the wash and the chunk fades.

## Responsive behavior

- A container query tightens padding below 420px; the step grid keeps a fixed lead and trail column so titles wrap the same way in draft and while running and never shift on approve.
- Draft footer buttons share the row equally on narrow containers, and the done summary wraps above Start over.
- With a mouse the remove button appears on hover or focus; on touch it stays visible. Grips accept touch drags without scrolling the page.
- Reads well from 320px to about 760px wide; the demo caps it at 560px.

## Performance

- The simulation schedules exactly one timer per state change, so pausing simply drops it and nothing runs while the plan is idle.
- Streaming uses one requestAnimationFrame clock with catch-up and appends spans; settled chunks never re-render or re-mount.
- Only transform and opacity animate on rows, except the brief height spring when a row or activity line enters or leaves.
- The shimmer runs only on the active step and only while it is on screen and the page is visible.

## Notes for AI

- Use it for the plan step of a coding or operations agent: the agent proposes steps, a person edits and approves, then the same card tracks execution. It is not an onboarding checklist and not a run log.
- Write step titles as instructions ("Add a sliding window limiter to the API middleware"). Keep substeps to short past-tense activity starting with a verb such as Read, Edited, Created, Searched, Found, Ran or Measured; the verb picks the icon.
- Pass `status` when wiring a real agent. Then the component is fully controlled by `steps` and `status`: set one step to "active" at a time, append substeps as the agent reports them, set "done" with a duration in seconds, and set "failed" with an error to show Retry and Skip.
- Insert steps the agent adds mid-run with `note: "Added by agent"`; they slide in where you place them in the array.
- Keep planning calls onKeepPlanning; add the agent's suggestion to `steps` yourself. In the simulation it streams one of three sample suggestions in before the last step.
- The default model is Claude Opus 5.5 with its brand mark. Pass `model` with your own name and a 16px mark for another model.

## Related

- [Agent run](https://ui.xzero.co.uk/components/blocks/agent-run/markdown): A single card that follows one AI coding agent through a task: steps stream in with the live one shimmering, tool calls open in place, and the agent stops on a two-file diff for you to approve or send back before it writes. When the run ends, the steps fold into one line and a result shows the files changed, the checks that passed and a pull request button.
- [Agent tasks](https://ui.xzero.co.uk/components/blocks/agent-tasks/markdown): A home for background coding agents: start a task on a repository and branch, watch each card move from queued to running to ready for review, and open a pull request from the result.
- [Agent approvals](https://ui.xzero.co.uk/components/blocks/agent-approvals/markdown): One approval card for agents: the waiting tool call reads like a permission prompt with the tool's mark, the agent's reason and its arguments, and you approve, deny or allow it from now on.
- [Agent loop](https://ui.xzero.co.uk/components/agent-loop/markdown): An illustration of the agent loop: gather context, take action, verify, repeat, with a bright head circling three stations around the model.
- [AI chat](https://ui.xzero.co.uk/components/blocks/ai-chat/markdown): A full-screen AI chat where answers stream in as markdown with folding reasoning, tool chips and cited sources. People can switch chats and models, edit or retry a message into versions, rate replies and stop a reply mid-stream.
- [Text shimmer](https://ui.xzero.co.uk/components/text-shimmer/markdown): Show ongoing work with a calm light across the words.

## Also in ai

- [Agent status](https://ui.xzero.co.uk/components/agent-status/markdown): A compact live status pill for a running AI agent: the agent's mark in a live ring, the current activity and an elapsed timer, opening into the steps so far.
- [Tool call](https://ui.xzero.co.uk/components/tool-call/markdown): A tool call row for agent transcripts: the tool's mark and the call in plain words, a live state while it runs, and the input and output a click away, with approval and retry when needed.
- [Agent timeline](https://ui.xzero.co.uk/components/agent-timeline/markdown): A compact timeline of one orchestrated agent run: the orchestrator and its subagents share a time axis, handoffs draw in between rows, and a playhead replays thinking, tool calls and waiting while the header counts time, tokens and cost. Hover a span for what it did, or click it to trace its handoff path.
- [Context window](https://ui.xzero.co.uk/components/context-window/markdown): An AI context window as a grid of 200 cells: the system prompt, tools, files, summary and messages fill it in order, a threshold row marks where compaction starts, and sending a message, attaching a file or compacting shows exactly how much still fits.
- [Reasoning block](https://ui.xzero.co.uk/components/reasoning-block/markdown): The collapsible thinking block of an AI reply. While the model thinks, a shimmering label counts the seconds and the latest reasoning streams underneath. When it finishes, it folds to "Thought for 7s" and opens to show the full reasoning as calm steps with headings.
- [Source cards](https://ui.xzero.co.uk/components/source-cards/markdown): A row of cited sources under an AI answer where cards stream in with real site marks while the model searches, the overflow collapses into a stack of favicons, hovering lifts a preview with the passage, and an inline [n] citation highlights its card.
- [Model card](https://ui.xzero.co.uk/components/model-card/markdown): A model details card where switching models rolls every price, limit and score in place, a token slider estimates monthly cost live, and benchmark bars show each model's rank on hover. Compare crossfades to a side-by-side table against any rival with the better values marked, and the card never changes size.
- [AI workflow](https://ui.xzero.co.uk/components/ai-workflow/markdown): A Linear-style AI workflow card where a Gmail trigger, a Claude step, a branch and Slack and Linear actions sit on one hairline rail, and a test run glides down it, opening each step's output inline. Steps are added from a compact command menu with real app marks.
- [Code suggestion](https://ui.xzero.co.uk/components/code-suggestion/markdown): An AI code edit suggestion where the model's proposed changes stream into a small editor panel as inline diff hunks, and you accept or reject each one, or all at once with Cmd+Enter. Accepted hunks fold into the file with a smooth height change.
- [Ghost text](https://ui.xzero.co.uk/components/ghost-text/markdown): An inline AI autocomplete where muted ghost text continues your sentence exactly at the caret and Tab turns it solid in place. Cmd+Right takes it one word at a time, Escape fades it away, and a calm chip shows the model behind it.
- [Image generation](https://ui.xzero.co.uk/components/image-generation/markdown): An image generation card where four images resolve as a pixel mosaic, from coarse colour blocks to full detail under a soft shimmer, each with its own progress ring. Pick one to upscale with a sweeping pixel band, vary or download it, with real provider marks and a built-in simulation.
- [Dictation button](https://ui.xzero.co.uk/components/dictation-button/markdown): A chat composer with voice input, where the mic springs into a recording pill with a smooth live waveform, a timer, and cancel and insert buttons. Words stream into the field as you speak, muted until the recognizer settles them.
- [Speech player](https://ui.xzero.co.uk/components/speech-player/markdown): A read-aloud player for AI replies. The Read aloud button in the message's action row turns into a compact player with play, a scrubbable progress bar, speed and a voice picker, and a highlight follows the spoken word through the reply, karaoke style.
- [Meeting summary](https://ui.xzero.co.uk/components/meeting-summary/markdown): An AI meeting notes card: the header shows the Google Meet or Zoom mark, the attendees and the duration. Summary, Decisions and Action items stream in after a short summarizing pass. Hover any line to see the transcript quote it came from, then check off action items or send them to Linear or Notion.
- [Reply draft](https://ui.xzero.co.uk/components/reply-draft/markdown): An AI email reply drafter where Claude streams a reply under a received Gmail message. Quick replies steer a fresh draft, tone and length rewrite it with a single crossfade, and you can edit the finished draft before you insert it.
- [Agent handoff](https://ui.xzero.co.uk/components/agent-handoff/markdown): A support conversation where an AI assistant hands off to a person. When it transfers, a card shows the summary it passes to the team and the typical wait. The person then joins and takes over, and a thin timeline on the left marks each step.
- [PII redaction](https://ui.xzero.co.uk/components/pii-redaction/markdown): A guardrail card where personal data is redacted before the prompt reaches the model. Scan marks each name, email, phone number and card with its type and swaps it for a placeholder like [EMAIL_1]. The safe prompt travels to Claude, and the reply comes back with the original values put back for the person.
- [Response feedback](https://ui.xzero.co.uk/components/response-feedback/markdown): A feedback control for AI replies where thumbs down opens an inline panel with reason chips and an optional note, thumbs up fills and asks what was good, and a submit shows a short thank-you before folding back into the row.
- [LLM cost calculator](https://ui.xzero.co.uk/components/llm-cost-calculator/markdown): A pricing calculator for LLM workloads. Set tokens per request, requests per day and prompt caching, and eight current models re-rank by monthly cost. Bars glide and prices roll as you drag.
- [Provider keys](https://ui.xzero.co.uk/components/provider-keys/markdown): A settings card for bring-your-own-key AI products. Each provider row shows its real mark, the masked key, a status and when the key was last used. You can reveal a key for five seconds, copy, rotate or remove it with undo. Adding or rotating a key opens an inline form that checks the format as you type, then tests the connection before saving.
- [Generation stats](https://ui.xzero.co.uk/components/generation-stats/markdown): A live stats strip for a streaming LLM response where time to first token, speed with a sparkline, output tokens and cost count up in tabular numerals beside the model's real mark, then settle and open into a latency and token cost breakdown.
- [AI translate](https://ui.xzero.co.uk/components/ai-translate/markdown): A message card where picking a language streams the AI translation in place, sentence by sentence over the dimmed original, with a detected-language chip, a Show original toggle and a status line credited to the model's mark.
- [TL;DR toggle](https://ui.xzero.co.uk/components/tldr-toggle/markdown): An article card with a Full, Summary and Key points switch and a length slider. Switching streams an AI summary in place of the article as the card's height springs to fit, and each key point links back to the paragraph it came from, which gets scrolled to and highlighted.
- [Connector setup](https://ui.xzero.co.uk/components/connector-setup/markdown): A "Connect your tools" card for an AI assistant. Each app connects inline: it redirects, authorizes and runs a first sync with a progress hairline, then lists the scopes it was granted and offers Disconnect with an inline confirm.
- [Smart form fill](https://ui.xzero.co.uk/components/smart-form-fill/markdown): A paste-to-fill form card where AI reads an email signature or messy notes and fills a contact field by field. Each value flashes in with a confidence dot, its source lights up in the pasted text, low-confidence guesses ask for review, and Undo puts the old values back.
- [Enrich column](https://ui.xzero.co.uk/components/enrich-column/markdown): An AI enrichment column for a data table, where one prompt runs down every row and each cell shimmers while it works, then settles into a value with its source or a failure you can retry.
- [Ticket router](https://ui.xzero.co.uk/components/ticket-router/markdown): A support ticket router where messages from Gmail, Intercom, Slack and Zendesk come in one at a time. An AI classifier labels each one with intent, sentiment and confidence, and the ticket moves into a team lane with an assignee. Low confidence tickets wait in a review lane, and one click there routes them to the suggested team.
- [Ask your data](https://ui.xzero.co.uk/components/ask-your-data/markdown): A natural language to chart card: you ask a question, PostgreSQL streams into a collapsible, syntax highlighted panel, the query runs with a rolling row count, and the answer builds as stacked bars, lines or a table, with a one line insight streamed in underneath.
- [Agent cursor](https://ui.xzero.co.uk/components/agent-cursor/markdown): A live document where Claude edits like a collaborator. Its labeled cursor comes out of its avatar, selects a paragraph and streams in a rewrite, adds a heading and fixes a typo, while a teammate's cursor reads along. Changes stay tinted until someone accepts or undoes them from a floating review bar.
- [Provider status](https://ui.xzero.co.uk/components/provider-status/markdown): A status card for the AI providers your product depends on. Each row shows the provider's real mark, its health as an icon and label, p50 latency and a 30-day uptime bar with a tooltip for each day. An incident row expands into its timeline of updates, and the card checks again on a visible countdown.
- [Training run](https://ui.xzero.co.uk/components/training-run/markdown): A fine-tuning job card where a live train and validation loss curve draws across a fixed step axis that doubles as the epoch progress bar. It shows the learning rate, elapsed time, ETA and the latest evals and checkpoints, has Pause and Cancel while it runs, and ends in results with a Deploy button.
- [AI command](https://ui.xzero.co.uk/components/ai-command/markdown): A Cmd+K command palette with an AI mode. Search pages and actions, or press Tab to ask a question: the answer streams inside the palette with numbered sources, and the next steps it suggests, like filing a Linear issue or opening a Notion doc, run straight from the list.
- [Starter prompts](https://ui.xzero.co.uk/components/starter-prompts/markdown): A greeting and a grid of starter cards for the empty state of an AI app. The cards are grouped into Write, Code, Analyze and Plan tabs, and a shuffle swaps them with a short staggered crossfade. Picking a card fills the composer, and cards that use a connected app show its mark (Gmail, GitHub, Notion, Linear, Google Calendar).
- [AI mascot](https://ui.xzero.co.uk/components/ai-mascot/markdown): A small assistant character, a soft pebble with pill eyes and a companion dot, that shows what the AI is doing. It breathes and glances when idle, leans in to listen, looks up while the dot orbits its head, reads along the line it writes, squints with a sparkle when done and shakes once with worried brows on an error.
- [Image reveal](https://ui.xzero.co.uk/components/image-reveal/markdown): An image generation canvas where a soft, blurred preview made from the image's own colors sharpens top to bottom behind a soft-edged band. It works the way ChatGPT, Midjourney and Gemini show images forming, with fine film grain, a translucent progress pill and calm queued and error states.
- [AI spark](https://ui.xzero.co.uk/components/ai-spark/markdown): A brand-quality animated spark mark. Four tapered rays and four lighter diagonals breathe at rest, ripple while thinking, pulse like a heartbeat while writing, then gather and settle when done. Every status change blends from the pose the mark is already in.
- [Pixel mascot](https://ui.xzero.co.uk/components/pixel-mascot/markdown): A pixel-art robot that shows what an AI assistant is doing. It idles, thinks, types, celebrates and errors in frame-stepped sprite animations, and stays crisp at every integer size from 24px to 192px.
- [Ghost mascot](https://ui.xzero.co.uk/components/ghost-mascot/markdown): A floating ghost mascot whose soft sheet ripples at the hem while it hovers. It blinks when idle, turns toward you to listen, fades a little translucent while thinking, draws a tiny pen line while writing, smiles with a sparkle when done and wobbles once on an error.
- [Cube mascot](https://ui.xzero.co.uk/components/cube-mascot/markdown): An isometric cube mascot where three shaded faces and a painted-on face show what the assistant is doing. It turns a quarter turn in eased steps while thinking, prints lines onto the floor while writing, settles with a sparkle when done, and shakes once on error.
- [Tone tuner](https://ui.xzero.co.uk/components/tone-tuner/markdown): A brand voice card where two sliders (formality and detail) and Friendly, Confident and Empathetic chips rewrite a customer reply. Each changed sentence crossfades in place, new words can be highlighted against the original, and Copy takes the current version.
- [Upgrade prompt](https://ui.xzero.co.uk/components/upgrade-prompt/markdown): An upgrade nudge for the moment someone hits a limit. It shows a usage meter at 50 of 50 AI credits, a rolling price with a monthly and yearly toggle, three concrete unlocks with real model marks, and Upgrade or Maybe later. Upgrading leads into a success state with the new limits, and the card never changes size between states.
- [Referral card](https://ui.xzero.co.uk/components/referral-card/markdown): A give-and-get referral card where people copy or share their invite link, invite friends by email as chips, and watch invites move from invited to signed up to earned, with the credit total counting up and a milestone reward unlocking.
- [Trial banner](https://ui.xzero.co.uk/components/trial-banner/markdown): A trial status banner where a ring counts down the days left, the copy names what the workspace loses, and the upgrade path is one click away. It comes as a slim banner, a sidebar card or a header pill. It shifts to a warning tone in the last days, has expired and upgraded states, and folds into the pill when dismissed or snoozed.
- [Team switcher](https://ui.xzero.co.uk/components/team-switcher/markdown): A workspace switcher like Linear, Vercel or Slack. The trigger shows the current workspace's logo and plan. The menu has search, your role in each workspace and a Cmd+1 to 9 shortcut for each, and lets you create or join a workspace inline. A highlight glides between rows, and switching crossfades the trigger through a short loading state.
- [Live visitors](https://ui.xzero.co.uk/components/live-visitors/markdown): A realtime visitors card where the live count rolls digit by digit, new arrivals ping in on a dotted world map, the top pages reorder with bars, and signups and upgrades tick in with country flags.
- [Social proof toast](https://ui.xzero.co.uk/components/social-proof-toast/markdown): A stack of social proof notifications for landing and pricing pages, where recent trials, upgrades and verified purchases from people and companies arrive every few seconds. The stack pauses and fans out on hover, and visitors can dismiss any toast.
- [Install snippet](https://ui.xzero.co.uk/components/install-snippet/markdown): A "get started in 30 seconds" card where framework tabs, three numbered steps and highlighted snippets take a developer from install to first event. Generate key wipes a fresh API key into the placeholder in place.

## Guidance for AI tools

Agent plan: The plan an agent writes before it acts: edit, reorder or add steps while it is a draft, then watch it work through them as a live checklist. Follow the declared prop types and do not invent props. Keep keyboard access, reduced motion support, and both light and dark themes intact when adapting it.

Full library index: https://ui.xzero.co.uk/llms.txt
