TakeCard
StableOne generated video take, from the queue to the finished clip, with a charge line that says whether credits were taken.
Also known as video take, generation card
Install with npm install @tattva/ui (setup), or copy the code from the kit in Downloads.
From the queue to a finished take
Take 1
Queued
8 secondsReel 2Ratio 16:9
Prompt: Slow push in on a fishing harbour at sunrise, gulls overhead, calm water
Busy period. About 2 minutes
Estimated 20 credits
Cancel now and the 20 credits come back.
Take 1: queued
<TakeCard
id="t1"
label="Take 1"
status={status} // "queued" | "generating" | "finalising" | "done" | ...
ratio="16:9"
durationSec={8}
model="Reel 2"
prompt="Slow push in on a fishing harbour at sunrise, gulls overhead, calm water"
queuePosition={3}
queueReason="Busy period"
eta="About 2 minutes"
charge={{ amount: 20, state: status === "done" ? "charged" : "estimated" }}
cancelNote="Cancel now and the 20 credits come back."
provenance={{ carries: ["An invisible watermark", "C2PA Content Credentials"], made: "today at 10:42" }}
onCancel={cancelTake}
onOpen={openInPlayer}
/>Step through the life of one take. The lime edge shows only while the model works. Cancel says first that the credits come back, and the card then says so.
When to use it
Shows one video take honestly from the queue to the end: what is happening, what it cost, and what you can do next. It never leaves the person guessing whether a failed or blocked take was charged.
Made of: Media box at the take's ratio · Poster and Play button (done) · Status word and icon (working) · Draft tag · Select control · AI label · Length · Take name · Status line · Length, model, ratio · Prompt · Lineage · Policy or error note · Charge line · Actions or overflow menu · Live region (hidden, standalone only)
Use it for
- A take inside a video studio grid, while it is queued, made and finished.
- A single take in a chat answer, where an agent made a clip.
- Showing a policy block calmly, with the refund and one way to rephrase.
Not for
- A still image or a set of image variants: use MediaGrid.
- Slow work that is not a video, such as a report: use GenerationProgress.
- Many takes at once with one shared announcement: use TakeGrid.
- Playing the video with a scrubber and frame steps.
Do and avoid
Take 2
Blocked by content policy
Ratio 16:9
The finished video was stopped by the safety check
The check looked at what the model made, not at you.
The result showed a real brand logo on the shop sign.
Try: Ask for a plain wooden sign.
Not charged
Take 2: blocked by content policy
Take 2
Failed
Ratio 16:9
Your prompt broke our rules. Request denied.
Take 2: failed
Do
- Put the card where the result will land as soon as the request is sent.
- Pass a charge on every card, and update it to refunded or notCharged when a job ends without a result.
- Say why a queued take waits (Busy period), and give an estimate only when you have a real one.
- Tag drafts as Draft and offer a way to make the final quality.
Avoid
- Do not show a red error for a policy block, or word it as the person's fault when the output was stopped.
- Do not show a percent the service does not report, and never hold it at 99%.
- Do not autoplay or loop takes in the grid.
- Do not use amber for waiting in a queue. Waiting is not something the person must do.
On a phone
- Fills the width of its column. The media box keeps its ratio, so the layout does not jump.
- The whole poster is the Play button, so a tap opens the take.
- Extra actions sit in an overflow menu, which opens as a bottom sheet on a phone.
- Buttons and the select control get a 44px tap area on touch screens.
Seen in products
- Google Flow: a pending card stays where the result will land, and policy or credit failures may need a manual retry or deletion.
- Google Flow: credits are refunded for failed generations.
- Runway API: moderated generations are refunded.
- Luma Ray3: Draft mode makes quick low-cost previews before the final render.
- Kling: user reports of jobs stuck at 99% and long queues.
- Google Flow Help, Create videos in Google Flow (opens in a new tab)
- Google Flow Help, Edit videos & build scenes (opens in a new tab)
- Google Flow Help, Manage your Google Flow credits (opens in a new tab)
- Google Flow Help, Keyboard shortcuts (opens in a new tab)
- Runway API, Content moderation (opens in a new tab)
- Luma AI, Ray3 (opens in a new tab)
Properties
| Prop | Type | Default | Description |
|---|---|---|---|
| idrequired | string | none | Take id. Set as data-take-id on the card. |
| labelrequired | string | none | Name of the take, such as Take 2. It names the card. |
| statusrequired | "queued" | "generating" | "finalising" | "done" | "failed" | "blocked" | "cancelled" | "rateLimited" | none | Where the job is. Set it from the real job state. |
| ratio | "16:9" | "9:16" | "1:1" | "4:3" | "21:9" | "16:9" | The media box keeps this ratio in every state. |
| poster | string | none | Poster image URL, shown when done. |
| scene | "harbour" | "dusk" | "forest" | "city" | "studio" | "harbour" | A drawn stand-in poster from colour tokens, used when there is no image. |
| durationSec | number | none | Length in seconds. Shown as 0:08 and read as 8 seconds. |
| model | string | none | Model that made the take. |
| prompt | string | none | What was asked for. It is not alt text for the result. |
| quality | "draft" | "final" | none | draft adds a Draft tag on the frame and Draft quality in the words. |
| queuePosition | number | none | Place in the queue while queued. |
| queueReason | string | none | Why the person waits, such as Busy period. Never an upgrade pitch. |
| eta | string | none | Plain time estimate, only when the service gives one. |
| percent | number | none | 0 to 100, only if the service reports it. Shows a neutral bar. Never spoken. |
| charge | { amount: number; state: "estimated" | "charged" | "refunded" | "notCharged"; unit?: string } | none | The charge line. Work the amount out in code. |
| blockedReason | { where: "input" | "output"; message: string; suggestion?: string } | none | Why a blocked take was stopped, and one way to rephrase. |
| error | string | none | What went wrong, when failed. |
| retryNote | string | none | When a rate-limited take starts again. |
| cancelNote | string | none | Says whether cancelling returns credits. Shown under Cancel while working. |
| lineage | string | none | Where the take came from, such as Extended from take 2. |
| provenance | { madeWith?: string; made?: string; carries?: string[]; caveat?: string } | none | Fills the AI label's explainer: what the file carries and what can strip it. |
| onOpen | () => void | none | Opens the take in your player. Makes the poster a Play button when done. |
| onCancel | () => void | none | Shows Cancel while queued, generating or finalising. |
| onRetry | () => void | none | Shows Try again on failed, cancelled and rate-limited takes. |
| onEditPrompt | () => void | none | Shows Edit prompt on blocked takes. |
| menu | MenuEntry[] | none | Extra actions for a finished take, in an overflow menu. |
| selectMode | "single" | "multi" | none | Shows the select control: a checkbox for multi, a pressed button for single. |
| selected | boolean | false | Selected. Shown with an ink border and a check mark, and said in words. |
| onSelect | () => void | none | Called by the select control. |
| announce | boolean | true | Speak status changes from this card. TakeGrid turns it off and speaks once for all cards. |
| compact | boolean | false | Hides the prompt and lineage for small tiles. |
| headingLevel | 2 | 3 | 4 | 5 | 6 | 3 | Heading level of the take name. |
| tabIndex | number | none | Makes the card a focus stop. TakeGrid sets it for its roving focus. |
| className | string | none | Classes for the card. |
"Show code under the preview gives the code for the example on the stage."
In Figma
In Figma, one TakeCard switches all of this from its properties panel, across 30 variants. Each property sets the React prop beside it, so design and code use the same names.
| Figma property | React | Values |
|---|---|---|
| Status | status | Queued, Generating, Finalising |
| Ratio | ratio | 16:9, 9:16, 1:1, 4:3, 21:9 |
| Quality | quality | Draft, Final |
| Label | label | Any text |
| Model | model | Any text |
| Ratio | ratio | Any text |
| Prompt | prompt | Any text |
| CancelNote | cancelNote | Any text |
| Eta | eta | Any text |
States
States this part has beyond its default look. Build each one your screen can reach. States set by a property are in the Code tab.
- loading
- status queued, generating or finalising: the lime working edge, aria-busy and the status word.
- error
- status failed: a red status word, the error and Try again.
- blocked
- status blocked: a calm note naming the input or the output, with the charge line.
- cancelled
- status cancelled: says Cancelled and whether credits came back.
- rate limited
- status rateLimited: says the take is paused and when it starts again.
- selected
- selected with selectMode: ink border, check mark and the word selected.
- draft
- quality draft: Draft tag on the frame and Draft quality in the words.
Tokens
Change one of these and every part that uses it follows.
--surface--surface-sunken--border--border-strong--fg--fg-muted--lime--danger-fg--chart-1--chart-2--chart-3--chart-4--chart-5--chart-seq-1--chart-seq-5--dur-base--dur-fast--ease-out--focus-ring--touch-target
Built in
- The card is an article named by the take name and described by its status line and charge line.
- aria-busy is true while queued, generating or finalising.
- Standalone, a polite status region says only status changes, such as Take 1: ready. Never percentages.
- The poster is a real button named Play Take 1, 8 seconds.
- Length is shown as 0:08 and read as 8 seconds.
- Status is always a word with an icon. Selection adds a check mark and the word selected, not only a border.
- The select control is a checkbox in multi mode and a pressed button in single mode, each named after the take.
- Under reduced motion the working edge is still, and the poster and status swap with no fade.
What you need to do
- Give each take a name people can tell apart, such as Take 3, not only an id.
- Write the charge from your billing records. Never let the model write an amount.
- Provide captions and a transcript in your player when the take has speech. The prompt is not alt text.
- When many cards update at once, use TakeGrid, or set announce={false} and speak a summary yourself.
Built toward WCAG 2.2 AA and checked automatically; no independent audit yet. Read the accessibility guide