@cueplusplus/ui 0.14.0 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +183 -0
- package/dist/primitives/chip.d.ts +1 -1
- package/dist/system/theme-provider.d.ts +25 -3
- package/dist/system/theme-provider.js +27 -2
- package/manifest/components/accordion.json +16 -4
- package/manifest/components/activity-graph.json +15 -3
- package/manifest/components/agent-card.json +15 -3
- package/manifest/components/agent-handoff.json +14 -3
- package/manifest/components/agent-mode-badge.json +12 -3
- package/manifest/components/agent-pile.json +13 -3
- package/manifest/components/agent-plan.json +13 -3
- package/manifest/components/agent-status.json +14 -3
- package/manifest/components/agent-surface.json +12 -3
- package/manifest/components/alert-dialog.json +14 -3
- package/manifest/components/animated-number.json +12 -3
- package/manifest/components/app-window-frame.json +13 -3
- package/manifest/components/approval-card.json +14 -3
- package/manifest/components/artifact-card.json +14 -3
- package/manifest/components/ask-box.json +13 -3
- package/manifest/components/audience-icon.json +11 -3
- package/manifest/components/autocomplete.json +15 -3
- package/manifest/components/avatar-group.json +15 -4
- package/manifest/components/avatar.json +16 -4
- package/manifest/components/background-inbox.json +14 -3
- package/manifest/components/band.json +14 -4
- package/manifest/components/breadcrumb.json +14 -3
- package/manifest/components/button-group.json +13 -3
- package/manifest/components/calendar.json +15 -4
- package/manifest/components/canvas-split-body.json +13 -3
- package/manifest/components/canvas-split-document.json +11 -3
- package/manifest/components/canvas-split-header.json +13 -3
- package/manifest/components/canvas-split-line.json +13 -3
- package/manifest/components/canvas-split-message.json +13 -3
- package/manifest/components/canvas-split-thread.json +11 -3
- package/manifest/components/canvas-split.json +13 -3
- package/manifest/components/card.json +14 -3
- package/manifest/components/carousel.json +12 -3
- package/manifest/components/catalogue-icon.json +11 -3
- package/manifest/components/channel-beta-icon.json +11 -3
- package/manifest/components/channel-matrix.json +11 -3
- package/manifest/components/channel-released-icon.json +11 -3
- package/manifest/components/chart-container.json +11 -3
- package/manifest/components/chart-ramp.json +12 -3
- package/manifest/components/chart-swatch.json +11 -3
- package/manifest/components/chart-tooltip-content.json +12 -4
- package/manifest/components/chart.json +14 -3
- package/manifest/components/chat-empty-state.json +13 -3
- package/manifest/components/chat-panel-assistant-message.json +11 -3
- package/manifest/components/chat-panel-composer.json +11 -3
- package/manifest/components/chat-panel-messages.json +11 -3
- package/manifest/components/chat-panel-typing.json +11 -3
- package/manifest/components/chat-panel-user-message.json +11 -3
- package/manifest/components/chat-panel.json +13 -3
- package/manifest/components/checkbox-group.json +15 -4
- package/manifest/components/checkpoint-history.json +13 -3
- package/manifest/components/clamp.json +12 -3
- package/manifest/components/cli-tool-icon.json +11 -3
- package/manifest/components/code-diff.json +14 -3
- package/manifest/components/code-runner.json +13 -3
- package/manifest/components/collapsible.json +13 -3
- package/manifest/components/color-area.json +12 -4
- package/manifest/components/color-field.json +12 -3
- package/manifest/components/color-picker.json +14 -4
- package/manifest/components/color-slider.json +12 -3
- package/manifest/components/color-swatch.json +13 -3
- package/manifest/components/colors-section.json +11 -3
- package/manifest/components/combobox.json +15 -4
- package/manifest/components/compaction-row.json +12 -3
- package/manifest/components/comparison-card.json +12 -3
- package/manifest/components/composer-actions.json +11 -3
- package/manifest/components/composer-attach-button.json +11 -3
- package/manifest/components/composer-attachment-chip.json +13 -3
- package/manifest/components/composer-attachments.json +11 -3
- package/manifest/components/composer-bar.json +12 -3
- package/manifest/components/composer-command-item.json +13 -3
- package/manifest/components/composer-context.json +13 -3
- package/manifest/components/composer-input.json +11 -3
- package/manifest/components/composer-menu-item.json +12 -3
- package/manifest/components/composer-menu.json +13 -3
- package/manifest/components/composer-model-item.json +13 -3
- package/manifest/components/composer-model-trigger.json +13 -3
- package/manifest/components/composer-person-item.json +13 -3
- package/manifest/components/composer-send.json +13 -3
- package/manifest/components/composer-toolbar.json +11 -3
- package/manifest/components/composer-voice-button.json +11 -3
- package/manifest/components/composer-voice.json +13 -3
- package/manifest/components/composer.json +14 -4
- package/manifest/components/computer-use.json +13 -3
- package/manifest/components/confidence-marker.json +11 -3
- package/manifest/components/connection-state.json +12 -3
- package/manifest/components/container.json +12 -3
- package/manifest/components/context-breakdown.json +12 -4
- package/manifest/components/context-menu.json +14 -4
- package/manifest/components/context-usage.json +14 -4
- package/manifest/components/conversation-search.json +13 -3
- package/manifest/components/copy-button.json +14 -3
- package/manifest/components/cost-meter.json +12 -3
- package/manifest/components/cue-portal-frame.json +12 -3
- package/manifest/components/data-table-pagination.json +13 -3
- package/manifest/components/data-table-toolbar.json +12 -3
- package/manifest/components/date-field.json +12 -3
- package/manifest/components/date-picker.json +13 -3
- package/manifest/components/date-range-picker.json +11 -3
- package/manifest/components/day-separator.json +12 -3
- package/manifest/components/delegation-card.json +14 -4
- package/manifest/components/density.json +12 -2
- package/manifest/components/description-list.json +15 -4
- package/manifest/components/diagram.json +13 -3
- package/manifest/components/disclosure.json +15 -4
- package/manifest/components/dmx-bar.json +12 -3
- package/manifest/components/dmx-strip.json +11 -3
- package/manifest/components/document-reference.json +13 -3
- package/manifest/components/draft-restore.json +13 -3
- package/manifest/components/drawer.json +13 -4
- package/manifest/components/edit-message.json +13 -3
- package/manifest/components/elements-command-palette.json +13 -3
- package/manifest/components/elements-composer.json +13 -3
- package/manifest/components/elements-data-table.json +11 -3
- package/manifest/components/elements-timeline.json +13 -3
- package/manifest/components/elicitation-form.json +13 -3
- package/manifest/components/empty-state-composer.json +11 -3
- package/manifest/components/empty-state-greeting.json +11 -3
- package/manifest/components/empty-state-suggestion.json +11 -3
- package/manifest/components/empty-state-suggestions.json +11 -3
- package/manifest/components/empty-state.json +15 -4
- package/manifest/components/end-of-turn-summary.json +14 -3
- package/manifest/components/env-var-input.json +15 -4
- package/manifest/components/error-state.json +13 -3
- package/manifest/components/export-dialog.json +10 -2
- package/manifest/components/eyebrow.json +14 -4
- package/manifest/components/feedback-dialog.json +13 -3
- package/manifest/components/field-description.json +15 -4
- package/manifest/components/field-error.json +15 -4
- package/manifest/components/field-label.json +15 -4
- package/manifest/components/file-tree.json +13 -3
- package/manifest/components/file-upload.json +14 -4
- package/manifest/components/flow-background.json +11 -3
- package/manifest/components/flow-controls.json +11 -3
- package/manifest/components/flow-graph.json +13 -3
- package/manifest/components/folder-icon.json +12 -3
- package/manifest/components/frac.json +11 -3
- package/manifest/components/generation-loader.json +13 -3
- package/manifest/components/generative-ui.json +16 -4
- package/manifest/components/grid.json +14 -3
- package/manifest/components/group-bar.json +13 -3
- package/manifest/components/guardrail-notice.json +13 -3
- package/manifest/components/hover-card.json +14 -4
- package/manifest/components/icon-button.json +15 -3
- package/manifest/components/image-generation.json +13 -3
- package/manifest/components/info-tip.json +15 -4
- package/manifest/components/inline-citation.json +13 -3
- package/manifest/components/input-group.json +15 -4
- package/manifest/components/item.json +15 -4
- package/manifest/components/job-progress.json +14 -3
- package/manifest/components/kbd.json +14 -3
- package/manifest/components/launcher-bubble.json +14 -3
- package/manifest/components/link.json +13 -3
- package/manifest/components/live-region-announcer.json +16 -4
- package/manifest/components/log-viewer.json +15 -3
- package/manifest/components/map-answer.json +13 -3
- package/manifest/components/markdown-text.json +16 -4
- package/manifest/components/math-block.json +13 -3
- package/manifest/components/mcp-server-icon.json +12 -3
- package/manifest/components/mcp-server-panel.json +13 -3
- package/manifest/components/memory-chips.json +12 -3
- package/manifest/components/menubar.json +13 -3
- package/manifest/components/message-actions.json +14 -4
- package/manifest/components/message-attachments.json +12 -3
- package/manifest/components/message-branches.json +12 -3
- package/manifest/components/message-list.json +12 -3
- package/manifest/components/message-pair.json +12 -3
- package/manifest/components/message-queue.json +13 -3
- package/manifest/components/message-timing.json +13 -3
- package/manifest/components/message.json +12 -3
- package/manifest/components/mobile-composer.json +14 -3
- package/manifest/components/model-picker.json +12 -3
- package/manifest/components/multi-select.json +16 -4
- package/manifest/components/musical-time-input.json +11 -3
- package/manifest/components/navigation-menu.json +13 -3
- package/manifest/components/node-card.json +11 -3
- package/manifest/components/node-handle.json +11 -3
- package/manifest/components/number-field.json +15 -3
- package/manifest/components/number-ticker.json +12 -3
- package/manifest/components/onboarding.json +12 -3
- package/manifest/components/otp-field.json +14 -3
- package/manifest/components/page-shell.json +14 -4
- package/manifest/components/pagination.json +14 -3
- package/manifest/components/panel-header.json +14 -4
- package/manifest/components/password-input.json +15 -4
- package/manifest/components/permission-grant.json +13 -3
- package/manifest/components/permission-scopes.json +14 -3
- package/manifest/components/piano-keyboard.json +11 -3
- package/manifest/components/preset-section.json +11 -3
- package/manifest/components/progress.json +14 -3
- package/manifest/components/prompt-library.json +12 -3
- package/manifest/components/queue-dock.json +14 -3
- package/manifest/components/quota-banner.json +12 -3
- package/manifest/components/quote-reply.json +12 -3
- package/manifest/components/radio-group.json +15 -4
- package/manifest/components/radio.json +15 -4
- package/manifest/components/rating.json +15 -4
- package/manifest/components/read-aloud.json +13 -3
- package/manifest/components/reasoning-effort.json +12 -3
- package/manifest/components/reasoning-panel.json +13 -3
- package/manifest/components/recommendation-card.json +12 -3
- package/manifest/components/regenerate-menu.json +12 -3
- package/manifest/components/replay-player.json +14 -3
- package/manifest/components/research-report.json +12 -3
- package/manifest/components/resizable.json +13 -3
- package/manifest/components/retrieval-chunks.json +13 -3
- package/manifest/components/revert-dock.json +14 -3
- package/manifest/components/reviewable-diff.json +12 -3
- package/manifest/components/risk-badge.json +14 -3
- package/manifest/components/schedule-card.json +12 -3
- package/manifest/components/score-breakdown.json +13 -3
- package/manifest/components/scroll-anchor.json +12 -3
- package/manifest/components/scroll-area.json +13 -3
- package/manifest/components/scrollable-tabs-list.json +14 -4
- package/manifest/components/seam-cell.json +13 -4
- package/manifest/components/seam-grid.json +14 -3
- package/manifest/components/seam-list.json +13 -3
- package/manifest/components/search-input.json +15 -4
- package/manifest/components/section-header.json +14 -3
- package/manifest/components/segmented-control.json +15 -3
- package/manifest/components/separator.json +14 -3
- package/manifest/components/settings-panel.json +13 -3
- package/manifest/components/shape-section.json +11 -3
- package/manifest/components/shared-conversation.json +12 -3
- package/manifest/components/sheet.json +14 -4
- package/manifest/components/shimmer-label.json +12 -3
- package/manifest/components/sidebar.json +15 -4
- package/manifest/components/signal-edge.json +13 -4
- package/manifest/components/skeleton.json +16 -4
- package/manifest/components/skill-icon.json +12 -3
- package/manifest/components/slider.json +14 -3
- package/manifest/components/sources.json +12 -3
- package/manifest/components/sparkline.json +14 -4
- package/manifest/components/speaker-identity.json +11 -3
- package/manifest/components/spec-sheet.json +13 -4
- package/manifest/components/spectrum-visualizer.json +11 -3
- package/manifest/components/spinner.json +16 -4
- package/manifest/components/stack-icon.json +12 -3
- package/manifest/components/stack.json +14 -3
- package/manifest/components/stacks-matrix-icon.json +11 -3
- package/manifest/components/stat.json +14 -3
- package/manifest/components/status-dot.json +16 -4
- package/manifest/components/stepper.json +15 -4
- package/manifest/components/stopped-run.json +13 -4
- package/manifest/components/streaming-text.json +12 -3
- package/manifest/components/sub.json +11 -3
- package/manifest/components/subagent-list.json +13 -3
- package/manifest/components/suggestions.json +12 -3
- package/manifest/components/sup.json +11 -3
- package/manifest/components/swap-label.json +12 -3
- package/manifest/components/tags-input.json +15 -4
- package/manifest/components/tail-status.json +14 -3
- package/manifest/components/terminal-block.json +13 -3
- package/manifest/components/terminal-frame.json +14 -3
- package/manifest/components/textarea.json +15 -4
- package/manifest/components/theme-configurator.json +12 -3
- package/manifest/components/theme-provider.json +1 -1
- package/manifest/components/thinking-indicator.json +12 -3
- package/manifest/components/thread-list.json +12 -3
- package/manifest/components/thread-search.json +12 -3
- package/manifest/components/threshold-rail.json +13 -3
- package/manifest/components/time-boundary.json +13 -3
- package/manifest/components/time-field.json +15 -4
- package/manifest/components/timeline-ruler.json +13 -3
- package/manifest/components/timeline.json +13 -3
- package/manifest/components/title-bar.json +13 -3
- package/manifest/components/todo-list.json +12 -3
- package/manifest/components/toggle-group.json +15 -4
- package/manifest/components/toggle.json +15 -4
- package/manifest/components/token-editor.json +12 -3
- package/manifest/components/tool-call.json +13 -3
- package/manifest/components/tool-error.json +14 -4
- package/manifest/components/tool-group.json +12 -3
- package/manifest/components/tool-timeline.json +14 -4
- package/manifest/components/toolbar.json +14 -4
- package/manifest/components/trace-waterfall.json +12 -3
- package/manifest/components/tree-visibility-toggle.json +13 -3
- package/manifest/components/tree.json +14 -3
- package/manifest/components/turn-footer.json +14 -3
- package/manifest/components/two-step-button.json +14 -3
- package/manifest/components/typing-indicator.json +12 -3
- package/manifest/components/universe-grid.json +14 -4
- package/manifest/components/unread-divider.json +14 -4
- package/manifest/components/usage-chart.json +14 -3
- package/manifest/components/verdict-row.json +14 -3
- package/manifest/components/voice-conversation.json +13 -3
- package/manifest/components/web-preview.json +13 -3
- package/manifest/components/web-search.json +13 -3
- package/manifest/components/work-collapse.json +15 -4
- package/manifest/manifest.json +649 -649
- package/manifest/tokens.json +1 -1
- package/package.json +4 -4
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
"--cue-text-label",
|
|
144
144
|
"--cue-text-ui"
|
|
145
145
|
],
|
|
146
|
-
"summary": "A masked text field with a reveal control.",
|
|
146
|
+
"summary": "A masked text field with a reveal control that says what it does and which way it is.",
|
|
147
147
|
"examples": [
|
|
148
148
|
{
|
|
149
149
|
"title": "Usage",
|
|
@@ -151,10 +151,22 @@
|
|
|
151
151
|
"language": "tsx"
|
|
152
152
|
}
|
|
153
153
|
],
|
|
154
|
-
"status": "
|
|
154
|
+
"status": "stable",
|
|
155
155
|
"url": "/docs/components/password-input",
|
|
156
156
|
"mdUrl": "/docs/components/password-input.md",
|
|
157
157
|
"jsonUrl": "/r/components/password-input.json",
|
|
158
|
+
"whenToUse": [
|
|
159
|
+
"Any secret the user types and may need to check: a password, a token, a passphrase.",
|
|
160
|
+
"Anywhere a reveal is a genuine kindness — long generated secrets typed by hand."
|
|
161
|
+
],
|
|
162
|
+
"whenNotToUse": [
|
|
163
|
+
"A secret that should never be shown. Pass `showReveal={false}`, or do not render one at all.",
|
|
164
|
+
"A config value that may reference an environment variable. Use `EnvVarInput`."
|
|
165
|
+
],
|
|
166
|
+
"commonMistakes": [
|
|
167
|
+
"Replacing the reveal with a bare icon or a checkbox. It is a toggle button carrying `aria-pressed`, which is the one attribute that announces both what it does and its current state.",
|
|
168
|
+
"Painting the characters out with CSS instead of switching `type`. A password manager and the browser both key off the real type."
|
|
169
|
+
],
|
|
158
170
|
"specimens": [
|
|
159
171
|
{
|
|
160
172
|
"title": "PasswordInput",
|
|
@@ -166,6 +178,5 @@
|
|
|
166
178
|
"note": "Input plus a reveal toggle carrying `aria-pressed`, so the state is spoken rather than implied by an icon swap.",
|
|
167
179
|
"interaction": "the toggle is in the tab order after the field."
|
|
168
180
|
}
|
|
169
|
-
]
|
|
170
|
-
"todo": true
|
|
181
|
+
]
|
|
171
182
|
}
|
|
@@ -95,10 +95,21 @@
|
|
|
95
95
|
"language": "tsx"
|
|
96
96
|
}
|
|
97
97
|
],
|
|
98
|
-
"status": "
|
|
98
|
+
"status": "stable",
|
|
99
99
|
"url": "/docs/components/permission-grant",
|
|
100
100
|
"mdUrl": "/docs/components/permission-grant.md",
|
|
101
101
|
"jsonUrl": "/r/components/permission-grant.json",
|
|
102
|
+
"whenToUse": [
|
|
103
|
+
"A capability request from a named requester — filesystem access, network reach — where the answer outlives this one call.",
|
|
104
|
+
"The settled outcome: `scope` takes `session`, `always` or `denied` and the card shows what was decided rather than disappearing."
|
|
105
|
+
],
|
|
106
|
+
"whenNotToUse": [
|
|
107
|
+
"A grant whose limits you cannot state. `reach` is required, and it is meant to carry what the grant does not cover as well as what it does."
|
|
108
|
+
],
|
|
109
|
+
"commonMistakes": [
|
|
110
|
+
"Writing `reach` as a list of what is allowed only. Write the limits in too — that is what makes it a reach rather than a feature list.",
|
|
111
|
+
"Naming `capability` after the action rather than the capability. The point of this card, against a per-call approval, is that it grants a capability."
|
|
112
|
+
],
|
|
102
113
|
"specimens": [
|
|
103
114
|
{
|
|
104
115
|
"title": "PermissionGrant",
|
|
@@ -110,6 +121,5 @@
|
|
|
110
121
|
"note": "The other half of the loop: granting a capability rather than approving one action. The reach is a list the caller writes, and the limits belong in it, because a grant a reader cannot bound is a grant they cannot give.",
|
|
111
122
|
"interaction": "the three answers are Deny, this session and Always. Answer any card and it settles into the scope you chose."
|
|
112
123
|
}
|
|
113
|
-
]
|
|
114
|
-
"todo": true
|
|
124
|
+
]
|
|
115
125
|
}
|
|
@@ -164,10 +164,22 @@
|
|
|
164
164
|
"language": "tsx"
|
|
165
165
|
}
|
|
166
166
|
],
|
|
167
|
-
"status": "
|
|
167
|
+
"status": "stable",
|
|
168
168
|
"url": "/docs/components/permission-scopes",
|
|
169
169
|
"mdUrl": "/docs/components/permission-scopes.md",
|
|
170
170
|
"jsonUrl": "/r/components/permission-scopes.json",
|
|
171
|
+
"whenToUse": [
|
|
172
|
+
"The approval card for one tool call, where a standing grant would write a rule and the reader deserves to be told which file it lands in.",
|
|
173
|
+
"A product with nowhere to persist a grant: omit `scopes` and the card asks, offering only once and no."
|
|
174
|
+
],
|
|
175
|
+
"whenNotToUse": [
|
|
176
|
+
"As an overlay. There is no settled state — an answered permission is not a card any more, and every product that modelled approval as an overlay got the bug where the next message hides the answer."
|
|
177
|
+
],
|
|
178
|
+
"commonMistakes": [
|
|
179
|
+
"Passing `onAlwaysAllow` without `scopes`. No scopes means no always-allow answer: a permanent grant that cannot say where it is saved is not one this element will offer.",
|
|
180
|
+
"Shortening or eliding a long rule before passing it. The label wraps instead, because a cut lands on the part that says how much is being granted — and `and 3 more` is a count, not an account.",
|
|
181
|
+
"Expecting `1`, `2` and `3` to answer from anywhere. The handler is the card's own `onKeyDown`, nothing is bound to the document, and the card never takes focus itself — a card that arrives mid-sentence and starts answering keystrokes is the bug the reference's 500ms delay exists to prevent."
|
|
182
|
+
],
|
|
171
183
|
"specimens": [
|
|
172
184
|
{
|
|
173
185
|
"title": "PermissionScopes",
|
|
@@ -179,6 +191,5 @@
|
|
|
179
191
|
"note": "The one control in an agent UI whose label has to be computed, because what it grants is different every time it appears. `Yes, allow Bash(cue patch:*) for this project (just you)` is written from the rules it would add and the reach it would add them to, and the sentence under it names the file — permanently, not on hover. Nothing is shortened: the reference elides a long rule and strips the `:*` off a prefix rule, and both cuts land on the part that says how far the grant reaches, so this one wraps instead. When there are more rules than the sentence can name, every one of them is listed underneath, because `and 3 more` is a count and a count is not an account. The last card is what that costs: one directory of seventy-seven characters that a line breaker reads as a single word — it would take a hyphen if the name had one, and an underscored path has none — so the sentence breaks mid-path rather than running out of the card. It is also the card where the sentence is the whole account, since a grant naming one directory draws no rule list under it. The card after it moves the long word to the other two caller strings that can carry one — the subject beside the question, and the destination naming the file the grant is written into — and draws the destination both ways: the top card cycles it, so it is a button sized to its own text, and the bottom card has one destination and draws a span. Cycle the top one onto the project and the sentence breaks mid-path instead of leaving the card, which is the whole point of drawing where a permission is saved rather than hiding it behind a hover.",
|
|
180
192
|
"interaction": "tab into the card and the numbers work — 1, 2, 3 fire whichever answers are rendered, built from the same list that drew them, and Escape denies. They are the card's own keys, not the document's: nothing here answers a digit typed into a composer somewhere above it, and a console that wants them to answer from anywhere routes them there itself. Press the dotted line to move the grant to another destination and watch the answer above it change with it: there is one resolved scope behind the label, the sentence and the callback, so they cannot disagree about what is being granted."
|
|
181
193
|
}
|
|
182
|
-
]
|
|
183
|
-
"todo": true
|
|
194
|
+
]
|
|
184
195
|
}
|
|
@@ -129,10 +129,19 @@
|
|
|
129
129
|
"language": "tsx"
|
|
130
130
|
}
|
|
131
131
|
],
|
|
132
|
-
"status": "
|
|
132
|
+
"status": "stable",
|
|
133
133
|
"url": "/docs/components/piano-keyboard",
|
|
134
134
|
"mdUrl": "/docs/components/piano-keyboard.md",
|
|
135
135
|
"jsonUrl": "/r/components/piano-keyboard.json",
|
|
136
|
+
"whenToUse": [
|
|
137
|
+
"Choosing a note range, where the keyboard itself is the clearest scale."
|
|
138
|
+
],
|
|
139
|
+
"whenNotToUse": [
|
|
140
|
+
"A numeric range with no musical meaning. Use `Slider`."
|
|
141
|
+
],
|
|
142
|
+
"commonMistakes": [
|
|
143
|
+
"Treating it as a display. It is a range control — the markers are draggable and the edges are arrow-key operable."
|
|
144
|
+
],
|
|
136
145
|
"specimens": [
|
|
137
146
|
{
|
|
138
147
|
"title": "PianoKeyboard",
|
|
@@ -144,6 +153,5 @@
|
|
|
144
153
|
"note": "Exact key geometry from the shared layout module, in-range tinting, and draggable start and end markers.",
|
|
145
154
|
"interaction": "each marker is a `role=slider` that announces the note it sits on, so the drag is a fast path rather than the only path."
|
|
146
155
|
}
|
|
147
|
-
]
|
|
148
|
-
"todo": true
|
|
156
|
+
]
|
|
149
157
|
}
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"--cue-text-micro",
|
|
65
65
|
"--cue-text-ui"
|
|
66
66
|
],
|
|
67
|
-
"summary": "Section 1 — the four choices that are not token edits at all.",
|
|
67
|
+
"summary": "Section 1 of the configurator — the four choices that are not token edits at all.",
|
|
68
68
|
"examples": [
|
|
69
69
|
{
|
|
70
70
|
"title": "Usage",
|
|
@@ -72,9 +72,17 @@
|
|
|
72
72
|
"language": "tsx"
|
|
73
73
|
}
|
|
74
74
|
],
|
|
75
|
-
"status": "
|
|
75
|
+
"status": "stable",
|
|
76
76
|
"url": "/docs/components/preset-section",
|
|
77
77
|
"mdUrl": "/docs/components/preset-section.md",
|
|
78
78
|
"jsonUrl": "/r/components/preset-section.json",
|
|
79
|
-
"
|
|
79
|
+
"whenToUse": [
|
|
80
|
+
"Inside `ThemeConfigurator`. Preset, mode and density are *provider* state: picking one restamps the document and every portal under it."
|
|
81
|
+
],
|
|
82
|
+
"whenNotToUse": [
|
|
83
|
+
"On its own. It edits the configurator's model, not yours."
|
|
84
|
+
],
|
|
85
|
+
"commonMistakes": [
|
|
86
|
+
"Filing these with the colours. They are not token edits, which is why they live in their own section."
|
|
87
|
+
]
|
|
80
88
|
}
|
|
@@ -94,10 +94,22 @@
|
|
|
94
94
|
"language": "tsx"
|
|
95
95
|
}
|
|
96
96
|
],
|
|
97
|
-
"status": "
|
|
97
|
+
"status": "stable",
|
|
98
98
|
"url": "/docs/components/progress",
|
|
99
99
|
"mdUrl": "/docs/components/progress.md",
|
|
100
100
|
"jsonUrl": "/r/components/progress.json",
|
|
101
|
+
"whenToUse": [
|
|
102
|
+
"Work whose completion you can actually measure.",
|
|
103
|
+
"Work whose length you cannot: pass `value={null}` and the fill collapses to an indeterminate state."
|
|
104
|
+
],
|
|
105
|
+
"whenNotToUse": [
|
|
106
|
+
"A short wait with no structure. Use `Spinner`.",
|
|
107
|
+
"Content arriving whose shape you know. Use `Skeleton`, which holds the layout too."
|
|
108
|
+
],
|
|
109
|
+
"commonMistakes": [
|
|
110
|
+
"Easing the width transition. It is 120ms linear on purpose — a progress bar that eases is lying about its rate.",
|
|
111
|
+
"Faking determinate progress by animating to 90% and waiting. That is an indeterminate state wearing a number."
|
|
112
|
+
],
|
|
101
113
|
"specimens": [
|
|
102
114
|
{
|
|
103
115
|
"title": "Progress",
|
|
@@ -109,6 +121,5 @@
|
|
|
109
121
|
"note": "Determinate and indeterminate, with an optional printed value.",
|
|
110
122
|
"interaction": "the indeterminate track stills under prefers-reduced-motion."
|
|
111
123
|
}
|
|
112
|
-
]
|
|
113
|
-
"todo": true
|
|
124
|
+
]
|
|
114
125
|
}
|
|
@@ -102,10 +102,20 @@
|
|
|
102
102
|
"language": "tsx"
|
|
103
103
|
}
|
|
104
104
|
],
|
|
105
|
-
"status": "
|
|
105
|
+
"status": "stable",
|
|
106
106
|
"url": "/docs/components/prompt-library",
|
|
107
107
|
"mdUrl": "/docs/components/prompt-library.md",
|
|
108
108
|
"jsonUrl": "/r/components/prompt-library.json",
|
|
109
|
+
"whenToUse": [
|
|
110
|
+
"A saved-prompt drawer where the reader should see a prompt's variables before it lands in the composer."
|
|
111
|
+
],
|
|
112
|
+
"whenNotToUse": [
|
|
113
|
+
"A picker that inserts on a single click. Insertion is `onInsert`, called on double click; a single click only highlights."
|
|
114
|
+
],
|
|
115
|
+
"commonMistakes": [
|
|
116
|
+
"Filtering `prompts` yourself against `query`. Filtering happens inside, against the name — pass everything saved.",
|
|
117
|
+
"Wiring `onSelect` to insert. Selecting previews the prompt below the list; inserting is the separate callback."
|
|
118
|
+
],
|
|
109
119
|
"specimens": [
|
|
110
120
|
{
|
|
111
121
|
"title": "PromptLibrary",
|
|
@@ -117,6 +127,5 @@
|
|
|
117
127
|
"note": "Prompts somebody saved, searchable, with the holes in them counted before you insert one — `3 vars` is the difference between a prompt you can send and a template you still have to fill. The preview underneath is the whole body, because a prompt library that hides the prompt is a list of file names.",
|
|
118
128
|
"interaction": "arrows walk the list and Enter inserts; a row also inserts on double-click, so the mouse has the same two gestures the keyboard does. An empty result says what it found nothing for rather than showing an empty box."
|
|
119
129
|
}
|
|
120
|
-
]
|
|
121
|
-
"todo": true
|
|
130
|
+
]
|
|
122
131
|
}
|
|
@@ -119,10 +119,22 @@
|
|
|
119
119
|
"language": "tsx"
|
|
120
120
|
}
|
|
121
121
|
],
|
|
122
|
-
"status": "
|
|
122
|
+
"status": "stable",
|
|
123
123
|
"url": "/docs/components/queue-dock",
|
|
124
124
|
"mdUrl": "/docs/components/queue-dock.md",
|
|
125
125
|
"jsonUrl": "/r/components/queue-dock.json",
|
|
126
|
+
"whenToUse": [
|
|
127
|
+
"A dock over the composer where a queued turn can still be rewritten, jumped to the front, or dropped before it sends — a queue you can only watch is one you will let send something you no longer mean.",
|
|
128
|
+
"A shared transcript, read-only: pass `messages` and `open` with no handlers and the dock draws the entries with nothing to press."
|
|
129
|
+
],
|
|
130
|
+
"whenNotToUse": [
|
|
131
|
+
"An empty queue. It draws nothing — no line, no empty state, no rule — because a dock that announces it has nothing in it is a permanent strip of chrome apologising for itself."
|
|
132
|
+
],
|
|
133
|
+
"commonMistakes": [
|
|
134
|
+
"Sorting `messages` into the order you think they should drain. Ordering is the caller's, because a component that sorted the array it was given could not be dragged.",
|
|
135
|
+
"Expecting edit, send-now and remove to be there by default. Each control exists only when its handler is given.",
|
|
136
|
+
"Owning `open` internally. It is a prop, so a scripted replay of the dock is arithmetic rather than a component with a mind of its own."
|
|
137
|
+
],
|
|
126
138
|
"specimens": [
|
|
127
139
|
{
|
|
128
140
|
"title": "QueueDock",
|
|
@@ -134,6 +146,5 @@
|
|
|
134
146
|
"note": "What you typed while it was still working — and the three things you can still do about it. Cursor, opencode, Cline, Roo and Zed all ship this dock and assistant-ui's catalogue has nothing like it; the vendored MessageQueue two files along is the strip without the verbs. It folds to one line, because four queued turns above a composer is a wall, and an empty queue draws nothing at all rather than a strip of chrome apologising for itself.",
|
|
135
147
|
"interaction": "the summary line is the trigger and carries its own aria-expanded; each entry's three controls are named after the turn they belong to (`Send now: Then export the whole show to the desk`), so a screen reader hears which one it is about to jump. Press any of them here and the entry drains — the bench refills when the last one goes."
|
|
136
148
|
}
|
|
137
|
-
]
|
|
138
|
-
"todo": true
|
|
149
|
+
]
|
|
139
150
|
}
|
|
@@ -93,10 +93,20 @@
|
|
|
93
93
|
"language": "tsx"
|
|
94
94
|
}
|
|
95
95
|
],
|
|
96
|
-
"status": "
|
|
96
|
+
"status": "stable",
|
|
97
97
|
"url": "/docs/components/quota-banner",
|
|
98
98
|
"mdUrl": "/docs/components/quota-banner.md",
|
|
99
99
|
"jsonUrl": "/r/components/quota-banner.json",
|
|
100
|
+
"whenToUse": [
|
|
101
|
+
"An allowance the reader is close to spending — the banner turns amber at 90 per cent of `limit`."
|
|
102
|
+
],
|
|
103
|
+
"whenNotToUse": [
|
|
104
|
+
"A window whose reset you cannot state. `resetsIn` is required and pre-formatted; this does no time arithmetic."
|
|
105
|
+
],
|
|
106
|
+
"commonMistakes": [
|
|
107
|
+
"Passing a percentage as `used`. `used` and `limit` are both counts in `unit`, and the amber threshold is derived from them.",
|
|
108
|
+
"Passing a Date or a duration to `resetsIn`. It is pre-formatted text — `3h 12m`."
|
|
109
|
+
],
|
|
100
110
|
"specimens": [
|
|
101
111
|
{
|
|
102
112
|
"title": "QuotaBanner",
|
|
@@ -108,6 +118,5 @@
|
|
|
108
118
|
"note": "How much is left, when it comes back, and the way to get more — in that order, which is the order the question is actually asked in. It turns warn at nine tenths rather than at the wall, so the warning arrives while there is still something to do about it.",
|
|
109
119
|
"interaction": "the upgrade action is an ink button with the label the caller passes; nothing here is a link, so the destination is entirely the host app's business."
|
|
110
120
|
}
|
|
111
|
-
]
|
|
112
|
-
"todo": true
|
|
121
|
+
]
|
|
113
122
|
}
|
|
@@ -109,10 +109,20 @@
|
|
|
109
109
|
"language": "tsx"
|
|
110
110
|
}
|
|
111
111
|
],
|
|
112
|
-
"status": "
|
|
112
|
+
"status": "stable",
|
|
113
113
|
"url": "/docs/components/quote-reply",
|
|
114
114
|
"mdUrl": "/docs/components/quote-reply.md",
|
|
115
115
|
"jsonUrl": "/r/components/quote-reply.json",
|
|
116
|
+
"whenToUse": [
|
|
117
|
+
"Acting on part of an answer rather than the whole turn, with the chosen run carried into the composer."
|
|
118
|
+
],
|
|
119
|
+
"whenNotToUse": [
|
|
120
|
+
"A toolbar with an open-ended action set. Each entry in `actions` names one of the three built-in icons."
|
|
121
|
+
],
|
|
122
|
+
"commonMistakes": [
|
|
123
|
+
"Expecting the component to detect the selection. `before`, `selection` and `after` are three strings you split, and `toolbarVisible` comes from your own selection handler.",
|
|
124
|
+
"Confusing `quoted` with `selection`. `quoted` is the text carried into the composer after the quote action, shown under a rule."
|
|
125
|
+
],
|
|
116
126
|
"specimens": [
|
|
117
127
|
{
|
|
118
128
|
"title": "QuoteReply",
|
|
@@ -124,6 +134,5 @@
|
|
|
124
134
|
"note": "Select a phrase in an answer and act on that phrase rather than the whole turn. The selection stays lit in the streaming hue while the toolbar is up, and what you quoted is repeated under the composer so the next turn's subject is never in doubt.",
|
|
125
135
|
"interaction": "the toolbar's row is reserved whether or not it is showing, so nothing below it jumps when a selection appears. Each action is a labelled button."
|
|
126
136
|
}
|
|
127
|
-
]
|
|
128
|
-
"todo": true
|
|
137
|
+
]
|
|
129
138
|
}
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"--cue-sunken",
|
|
55
55
|
"--cue-text-ui"
|
|
56
56
|
],
|
|
57
|
-
"summary": "One-of-many selection: a roving-tabindex group of
|
|
57
|
+
"summary": "One-of-many selection: a roving-tabindex group of radios sharing a single value.",
|
|
58
58
|
"examples": [
|
|
59
59
|
{
|
|
60
60
|
"title": "Usage",
|
|
@@ -62,10 +62,22 @@
|
|
|
62
62
|
"language": "tsx"
|
|
63
63
|
}
|
|
64
64
|
],
|
|
65
|
-
"status": "
|
|
65
|
+
"status": "stable",
|
|
66
66
|
"url": "/docs/components/radio-group",
|
|
67
67
|
"mdUrl": "/docs/components/radio-group.md",
|
|
68
68
|
"jsonUrl": "/r/components/radio-group.json",
|
|
69
|
+
"whenToUse": [
|
|
70
|
+
"Two to about seven mutually exclusive options that should all be visible.",
|
|
71
|
+
"Dense settings panels — the whole group is one tab stop, which is what keeps them navigable."
|
|
72
|
+
],
|
|
73
|
+
"whenNotToUse": [
|
|
74
|
+
"Several answers. Use `CheckboxGroup`.",
|
|
75
|
+
"A long list. Use `Select` or `Combobox` once the options stop fitting."
|
|
76
|
+
],
|
|
77
|
+
"commonMistakes": [
|
|
78
|
+
"Leaving the group unnamed. Give it an `aria-label`, or a `FieldLabel` inside a `Field`; without one a screen reader hears unrelated options.",
|
|
79
|
+
"Expecting arrow keys only to move focus. Per the WAI-ARIA pattern Base UI implements, they move *and* select."
|
|
80
|
+
],
|
|
69
81
|
"specimens": [
|
|
70
82
|
{
|
|
71
83
|
"title": "RadioGroup",
|
|
@@ -78,6 +90,5 @@
|
|
|
78
90
|
"note": "One choice out of a short set, in either orientation.",
|
|
79
91
|
"interaction": "arrow keys move the selection, and the group is one tab stop."
|
|
80
92
|
}
|
|
81
|
-
]
|
|
82
|
-
"todo": true
|
|
93
|
+
]
|
|
83
94
|
}
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"--cue-sunken",
|
|
66
66
|
"--cue-text-ui"
|
|
67
67
|
],
|
|
68
|
-
"summary": "One option inside a
|
|
68
|
+
"summary": "One option inside a `RadioGroup`. Round, to say 'exactly one'.",
|
|
69
69
|
"examples": [
|
|
70
70
|
{
|
|
71
71
|
"title": "Usage",
|
|
@@ -73,10 +73,22 @@
|
|
|
73
73
|
"language": "tsx"
|
|
74
74
|
}
|
|
75
75
|
],
|
|
76
|
-
"status": "
|
|
76
|
+
"status": "stable",
|
|
77
77
|
"url": "/docs/components/radio",
|
|
78
78
|
"mdUrl": "/docs/components/radio.md",
|
|
79
79
|
"jsonUrl": "/r/components/radio.json",
|
|
80
|
+
"whenToUse": [
|
|
81
|
+
"An option in a set where precisely one answer is legal.",
|
|
82
|
+
"Anywhere the options should all stay visible — a `Select` hides them behind a click."
|
|
83
|
+
],
|
|
84
|
+
"whenNotToUse": [
|
|
85
|
+
"Any number of answers, including none. Use `Checkbox`, whose square says so.",
|
|
86
|
+
"On its own. A lone radio cannot be unselected and has no group to belong to."
|
|
87
|
+
],
|
|
88
|
+
"commonMistakes": [
|
|
89
|
+
"Rendering one outside a `RadioGroup`, which leaves it with no shared value and no roving focus.",
|
|
90
|
+
"Overriding the checked fill. It draws an accent rim with an accent core rather than a solid fill so the selected option stays legible on the sunken field colour in every theme."
|
|
91
|
+
],
|
|
80
92
|
"specimens": [
|
|
81
93
|
{
|
|
82
94
|
"title": "RadioGroup",
|
|
@@ -89,6 +101,5 @@
|
|
|
89
101
|
"note": "One choice out of a short set, in either orientation.",
|
|
90
102
|
"interaction": "arrow keys move the selection, and the group is one tab stop."
|
|
91
103
|
}
|
|
92
|
-
]
|
|
93
|
-
"todo": true
|
|
104
|
+
]
|
|
94
105
|
}
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
"--cue-icon-sm",
|
|
161
161
|
"--cue-space-1"
|
|
162
162
|
],
|
|
163
|
-
"summary": "A 0–N rating, drawn as marks.",
|
|
163
|
+
"summary": "A 0–N rating, drawn as marks and built as a radio group.",
|
|
164
164
|
"examples": [
|
|
165
165
|
{
|
|
166
166
|
"title": "Usage",
|
|
@@ -168,10 +168,22 @@
|
|
|
168
168
|
"language": "tsx"
|
|
169
169
|
}
|
|
170
170
|
],
|
|
171
|
-
"status": "
|
|
171
|
+
"status": "stable",
|
|
172
172
|
"url": "/docs/components/rating",
|
|
173
173
|
"mdUrl": "/docs/components/rating.md",
|
|
174
174
|
"jsonUrl": "/r/components/rating.json",
|
|
175
|
+
"whenToUse": [
|
|
176
|
+
"A single score out of a small fixed count.",
|
|
177
|
+
"Read-only display of a score: it renders as one `img` with the value in its name."
|
|
178
|
+
],
|
|
179
|
+
"whenNotToUse": [
|
|
180
|
+
"A continuous value. Use `Slider`.",
|
|
181
|
+
"Several independent flags. Marks imply one ordered scale."
|
|
182
|
+
],
|
|
183
|
+
"commonMistakes": [
|
|
184
|
+
"Rebuilding it from toggle buttons, which puts five stops in the tab order and announces five unrelated controls where one covers the widget.",
|
|
185
|
+
"Using `disabled` to show a score. Use `readOnly` — an un-interactive control that still takes focus is a trap, and five disabled radios announce five things where one sentence will do."
|
|
186
|
+
],
|
|
175
187
|
"specimens": [
|
|
176
188
|
{
|
|
177
189
|
"title": "Rating",
|
|
@@ -183,6 +195,5 @@
|
|
|
183
195
|
"note": "A radio group of marks, with the value spoken rather than implied by how many glyphs are filled.",
|
|
184
196
|
"interaction": "arrow keys move; clicking the current mark clears it when `allowClear` is on."
|
|
185
197
|
}
|
|
186
|
-
]
|
|
187
|
-
"todo": true
|
|
198
|
+
]
|
|
188
199
|
}
|
|
@@ -119,10 +119,21 @@
|
|
|
119
119
|
"language": "tsx"
|
|
120
120
|
}
|
|
121
121
|
],
|
|
122
|
-
"status": "
|
|
122
|
+
"status": "stable",
|
|
123
123
|
"url": "/docs/components/read-aloud",
|
|
124
124
|
"mdUrl": "/docs/components/read-aloud.md",
|
|
125
125
|
"jsonUrl": "/r/components/read-aloud.json",
|
|
126
|
+
"whenToUse": [
|
|
127
|
+
"Playback of a finished answer where the reader should be able to follow along word by word."
|
|
128
|
+
],
|
|
129
|
+
"whenNotToUse": [
|
|
130
|
+
"Text still arriving. The whole answer is split into `words` up front so the spoken one can be lit without re-parsing the text."
|
|
131
|
+
],
|
|
132
|
+
"commonMistakes": [
|
|
133
|
+
"Expecting `onRateChange` to change the rate. It reports the tap on the rate control; cycling `rate` is yours.",
|
|
134
|
+
"Computing elapsed and duration inside. Both are pre-formatted strings — `0:04`, `0:11`.",
|
|
135
|
+
"Guarding `spokenIndex` against the ends. An index outside the text simply speaks none of it."
|
|
136
|
+
],
|
|
126
137
|
"specimens": [
|
|
127
138
|
{
|
|
128
139
|
"title": "ReadAloud",
|
|
@@ -134,6 +145,5 @@
|
|
|
134
145
|
"note": "An answer played back with the spoken word lit as it goes. Position is a word index the caller advances, not an audio element, so the same component drives a real voice, a replay, or this bench. Speed is one tap away because that is the control people actually reach for.",
|
|
135
146
|
"interaction": "play/pause and the speed chip are both named buttons, and the label says the current rate rather than just the glyph. The progress bar animates linearly, and not at all under reduced motion."
|
|
136
147
|
}
|
|
137
|
-
]
|
|
138
|
-
"todo": true
|
|
148
|
+
]
|
|
139
149
|
}
|
|
@@ -75,10 +75,20 @@
|
|
|
75
75
|
"language": "tsx"
|
|
76
76
|
}
|
|
77
77
|
],
|
|
78
|
-
"status": "
|
|
78
|
+
"status": "stable",
|
|
79
79
|
"url": "/docs/components/reasoning-effort",
|
|
80
80
|
"mdUrl": "/docs/components/reasoning-effort.md",
|
|
81
81
|
"jsonUrl": "/r/components/reasoning-effort.json",
|
|
82
|
+
"whenToUse": [
|
|
83
|
+
"A tier control where the choice has a price: each level carries its own token budget, and the selected one becomes the denominator of the bar."
|
|
84
|
+
],
|
|
85
|
+
"whenNotToUse": [
|
|
86
|
+
"Spend with no tier to measure it against. `selectedKey` picks the budget `spent` fills."
|
|
87
|
+
],
|
|
88
|
+
"commonMistakes": [
|
|
89
|
+
"Passing a percentage or a fraction as `spent`. It is thinking tokens used so far, filled against the selected level's budget.",
|
|
90
|
+
"Changing tier and leaving `spent` alone. The denominator moves with the tier, so the same number reads as a different fraction."
|
|
91
|
+
],
|
|
82
92
|
"specimens": [
|
|
83
93
|
{
|
|
84
94
|
"title": "ReasoningEffort",
|
|
@@ -90,6 +100,5 @@
|
|
|
90
100
|
"note": "How hard to think, and how much of that budget the run actually spent. The segmented control is the choice; the hairline under it is the consequence, and it moves when you change rungs because a bigger budget makes the same spend a smaller fraction.",
|
|
91
101
|
"interaction": "each segment is a button carrying aria-pressed. The meter animates its width rather than jumping, and holds still for a reader who asked for less motion."
|
|
92
102
|
}
|
|
93
|
-
]
|
|
94
|
-
"todo": true
|
|
103
|
+
]
|
|
95
104
|
}
|
|
@@ -115,10 +115,21 @@
|
|
|
115
115
|
"language": "tsx"
|
|
116
116
|
}
|
|
117
117
|
],
|
|
118
|
-
"status": "
|
|
118
|
+
"status": "stable",
|
|
119
119
|
"url": "/docs/components/reasoning-panel",
|
|
120
120
|
"mdUrl": "/docs/components/reasoning-panel.md",
|
|
121
121
|
"jsonUrl": "/r/components/reasoning-panel.json",
|
|
122
|
+
"whenToUse": [
|
|
123
|
+
"Extended thinking that should be available without being in the way: a trigger that shimmers while it runs, expanding into the steps."
|
|
124
|
+
],
|
|
125
|
+
"whenNotToUse": [
|
|
126
|
+
"A trace with no settled state to fall back to. `restingLabel` is required — it is what the trigger says once streaming finishes."
|
|
127
|
+
],
|
|
128
|
+
"commonMistakes": [
|
|
129
|
+
"Appending to `steps` as they land. `steps` is the full list available to reveal and `visibleSteps` is how many of them are shown.",
|
|
130
|
+
"Leaving `streaming` true after the run, so the trigger keeps its shimmering Thinking label and the active step keeps pulsing.",
|
|
131
|
+
"Passing `elapsed` on a settled panel. It is the timer beside Thinking while streaming, and omitting it hides it."
|
|
132
|
+
],
|
|
122
133
|
"specimens": [
|
|
123
134
|
{
|
|
124
135
|
"title": "ReasoningPanel",
|
|
@@ -130,6 +141,5 @@
|
|
|
130
141
|
"note": "The model's own account of how it got there, revealed a beat at a time and then folded away. While it streams, the trigger shimmers and carries a running clock; when it settles, the label swaps for a summary and the timer goes. `visibleSteps` is what makes it a replay — the caller advances it, the panel never counts.",
|
|
131
142
|
"interaction": "the whole trigger row is the toggle and it takes focus; the chevron turns with the panel. The newest step's dot pulses while streaming and stops when it does."
|
|
132
143
|
}
|
|
133
|
-
]
|
|
134
|
-
"todo": true
|
|
144
|
+
]
|
|
135
145
|
}
|
|
@@ -113,10 +113,20 @@
|
|
|
113
113
|
"language": "tsx"
|
|
114
114
|
}
|
|
115
115
|
],
|
|
116
|
-
"status": "
|
|
116
|
+
"status": "stable",
|
|
117
117
|
"url": "/docs/components/recommendation-card",
|
|
118
118
|
"mdUrl": "/docs/components/recommendation-card.md",
|
|
119
119
|
"jsonUrl": "/r/components/recommendation-card.json",
|
|
120
|
+
"whenToUse": [
|
|
121
|
+
"A proposal the agent wants accepted, with the supporting reasoning as `children` and the confidence beside the bar meter."
|
|
122
|
+
],
|
|
123
|
+
"whenNotToUse": [
|
|
124
|
+
"A decision with more than two outcomes. `state` is `idle` or `accepted`; there is no declined state, and `onAlternatives` is the other way out."
|
|
125
|
+
],
|
|
126
|
+
"commonMistakes": [
|
|
127
|
+
"Passing a number as `confidenceLabel`. It is copy — `high confidence` — shown next to the meter while idle.",
|
|
128
|
+
"Forgetting `acceptedLabel`. It is required, and it is the whole of what the card says once `state` flips to `accepted`."
|
|
129
|
+
],
|
|
120
130
|
"specimens": [
|
|
121
131
|
{
|
|
122
132
|
"title": "RecommendationCard",
|
|
@@ -128,6 +138,5 @@
|
|
|
128
138
|
"note": "The proposal itself, with how sure the agent is and a yes waiting on it. Accepting swaps the entire action row for a settled line rather than disabling the buttons, because a greyed-out Accept beside a green tick reads as an error state.",
|
|
129
139
|
"interaction": "Accept leads in ink and Alternatives is a ghost. The confidence bars are decorative and hidden from assistive tech — the label beside them carries the meaning."
|
|
130
140
|
}
|
|
131
|
-
]
|
|
132
|
-
"todo": true
|
|
141
|
+
]
|
|
133
142
|
}
|
|
@@ -87,10 +87,20 @@
|
|
|
87
87
|
"language": "tsx"
|
|
88
88
|
}
|
|
89
89
|
],
|
|
90
|
-
"status": "
|
|
90
|
+
"status": "stable",
|
|
91
91
|
"url": "/docs/components/regenerate-menu",
|
|
92
92
|
"mdUrl": "/docs/components/regenerate-menu.md",
|
|
93
93
|
"jsonUrl": "/r/components/regenerate-menu.json",
|
|
94
|
+
"whenToUse": [
|
|
95
|
+
"Re-running a turn where the interesting choice is what to run it with."
|
|
96
|
+
],
|
|
97
|
+
"whenNotToUse": [
|
|
98
|
+
"A plain retry on the same model. The menu exists for the alternatives."
|
|
99
|
+
],
|
|
100
|
+
"commonMistakes": [
|
|
101
|
+
"Removing the current model from `options`. Pass it and name it in `currentId` — the menu labels it current instead of showing its detail.",
|
|
102
|
+
"Owning `open` inside. It is a required prop, with `onOpenChange` reporting the trigger."
|
|
103
|
+
],
|
|
94
104
|
"specimens": [
|
|
95
105
|
{
|
|
96
106
|
"title": "RegenerateMenu",
|
|
@@ -102,6 +112,5 @@
|
|
|
102
112
|
"note": "Fork the same turn to a different model instead of rolling the same dice again. The row matching `currentId` says `current` where the others say what distinguishes them, which is what keeps the menu from offering you what you already have.",
|
|
103
113
|
"interaction": "the trigger carries aria-expanded and latches while the menu is up. The menu itself is a plain popover in flow — the elements family draws its own, so nothing here portals."
|
|
104
114
|
}
|
|
105
|
-
]
|
|
106
|
-
"todo": true
|
|
115
|
+
]
|
|
107
116
|
}
|
|
@@ -103,10 +103,22 @@
|
|
|
103
103
|
"language": "tsx"
|
|
104
104
|
}
|
|
105
105
|
],
|
|
106
|
-
"status": "
|
|
106
|
+
"status": "stable",
|
|
107
107
|
"url": "/docs/components/replay-player",
|
|
108
108
|
"mdUrl": "/docs/components/replay-player.md",
|
|
109
109
|
"jsonUrl": "/r/components/replay-player.json",
|
|
110
|
+
"whenToUse": [
|
|
111
|
+
"Playing an authored run back — a demo, a docs tile, a screenshot harness — where frame 12 must be the same DOM however the reader got there.",
|
|
112
|
+
"Deep-linking into a run: `startAt` is the seat, and `data-replay-frame`, `data-replay-state` and `data-replay-playing` let a stylesheet or a test find a frame without reaching into React."
|
|
113
|
+
],
|
|
114
|
+
"whenNotToUse": [
|
|
115
|
+
"A live run. Every frame of a `ReplayScript` carries the whole scene, so this is a controller over a filmstrip rather than an animation of its own."
|
|
116
|
+
],
|
|
117
|
+
"commonMistakes": [
|
|
118
|
+
"Accumulating state between frames. The entire rendering rule is `frames[index].scene`, which is what makes scrubbing and watching agree.",
|
|
119
|
+
"Assuming reduced motion switches the component off. It opens on the resting frame and schedules nothing, but step and scrub keep working — play and rate are the only two affordances that go away.",
|
|
120
|
+
"Restyling the transport to match the scene. The chrome belongs to the console showing the run, not to the run, which is why it is assembled from shipped cue components."
|
|
121
|
+
],
|
|
110
122
|
"specimens": [
|
|
111
123
|
{
|
|
112
124
|
"title": "ReplayPlayer",
|
|
@@ -119,6 +131,5 @@
|
|
|
119
131
|
"note": "The run above, playing. The player is a controller over a filmstrip rather than an animation: every frame carries the whole scene, so frame 5 reached by scrubbing is the same DOM as frame 5 reached by watching. One monotonic clock underneath it means pause keeps the unspent part of a hold instead of starting it again, and the rate control is exact rather than approximate. The root publishes data-replay-state, data-replay-playing and data-replay-frame, the way TerminalFrame publishes data-simulating. Under prefers-reduced-motion nothing is ever scheduled: the player opens on the resting frame and every control except play and rate keeps working, so a reader who asked for stillness can still step through all seven states.",
|
|
120
132
|
"interaction": "the transport is five controls and a scrubber, all keyboard-reachable: the slider steps a frame per arrow key. Stepping stops the clock, because a step is a position rather than a speed. The scenes stay live while they are on screen — open the tool call's disclosure, answer the approval — and what a reader touched outlives the frame it was touched on for exactly as long as the row does: a scene keeps its state while the element in a position holds its type, and starts over when the run puts something else there. The player accumulates nothing either way, which is why a deep link, which is a fresh mount, always draws the frame it names."
|
|
121
133
|
}
|
|
122
|
-
]
|
|
123
|
-
"todo": true
|
|
134
|
+
]
|
|
124
135
|
}
|