@cueplusplus/ui 0.14.0 → 0.15.0
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 +340 -0
- package/dist/agent-runtime/tool-call-card.js +1 -1
- package/dist/chat/message.js +1 -1
- package/dist/chrome/band.js +10 -4
- package/dist/chrome/eyebrow.js +1 -1
- package/dist/chrome/footer.js +1 -1
- package/dist/chrome/section-header.js +1 -1
- package/dist/configurator/configurator.js +1 -1
- package/dist/configurator/export-dialog.js +1 -1
- package/dist/configurator/panel-sections.js +1 -1
- package/dist/configurator/token-editor.js +1 -1
- package/dist/date/calendar.js +2 -2
- package/dist/elements/context-usage.js +3 -3
- package/dist/elements/transcript-rules.js +1 -1
- package/dist/forms/field.js +1 -1
- package/dist/forms/slider.js +1 -1
- package/dist/instruments/code-block.js +1 -1
- package/dist/instruments/ledger.js +1 -1
- package/dist/instruments/progress.js +1 -1
- package/dist/instruments/stat.js +1 -1
- package/dist/instruments/table.js +2 -2
- package/dist/instruments/terminal-frame.js +1 -1
- package/dist/layout/_ground.js +1 -1
- package/dist/layout/collapsible.js +1 -1
- package/dist/layout/description-list.js +1 -1
- package/dist/layout/preview.d.ts +13 -1
- package/dist/layout/preview.js +16 -9
- package/dist/layout/sidebar.js +1 -1
- package/dist/layout/stepper.js +1 -1
- package/dist/overlays/_surface.d.ts +1 -1
- package/dist/overlays/_surface.js +1 -1
- package/dist/overlays/command-palette.js +1 -1
- package/dist/overlays/toast.js +1 -1
- package/dist/primitives/chip.d.ts +1 -1
- package/dist/primitives/chip.js +2 -2
- package/dist/system/density.d.ts +11 -2
- package/dist/system/density.js +29 -9
- package/dist/system/portal.js +8 -2
- package/dist/system/prepaint.d.ts +18 -1
- package/dist/system/prepaint.js +8 -2
- package/dist/system/theme-provider.d.ts +42 -5
- package/dist/system/theme-provider.js +84 -19
- package/dist/system/vocabulary.d.ts +1 -1
- package/dist/system/vocabulary.js +14 -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 +16 -4
- 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 +17 -4
- 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 +15 -5
- package/manifest/components/breadcrumb.json +14 -3
- package/manifest/components/button-group.json +13 -3
- package/manifest/components/calendar.json +18 -5
- 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 +13 -4
- 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 +14 -5
- 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/chip.json +1 -0
- package/manifest/components/clamp.json +12 -3
- package/manifest/components/cli-tool-icon.json +11 -3
- package/manifest/components/code-block.json +2 -1
- package/manifest/components/code-diff.json +14 -3
- package/manifest/components/code-runner.json +13 -3
- package/manifest/components/collapsible.json +15 -4
- 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 +13 -4
- package/manifest/components/combobox.json +17 -5
- package/manifest/components/command-palette.json +2 -1
- 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 +16 -5
- package/manifest/components/context-usage.json +15 -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 +25 -2
- package/manifest/components/description-list.json +17 -5
- package/manifest/components/diagram.json +13 -3
- package/manifest/components/dialog.json +2 -1
- package/manifest/components/disclosure.json +17 -5
- package/manifest/components/dmx-bar.json +14 -4
- package/manifest/components/dmx-strip.json +13 -4
- package/manifest/components/document-reference.json +13 -3
- package/manifest/components/draft-restore.json +13 -3
- package/manifest/components/drawer.json +15 -5
- package/manifest/components/dropdown-menu.json +2 -1
- 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 +12 -3
- package/manifest/components/eyebrow.json +16 -5
- package/manifest/components/feedback-dialog.json +13 -3
- package/manifest/components/field-description.json +17 -5
- package/manifest/components/field-error.json +17 -5
- package/manifest/components/field-label.json +17 -5
- package/manifest/components/field.json +2 -1
- 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/footer.json +1 -0
- package/manifest/components/frac.json +11 -3
- package/manifest/components/frames.json +2 -1
- 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 +16 -5
- 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/ledger.json +2 -1
- 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 +15 -4
- 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 +14 -4
- package/manifest/components/mobile-composer.json +14 -3
- package/manifest/components/model-picker.json +12 -3
- package/manifest/components/multi-select.json +18 -5
- package/manifest/components/musical-time-input.json +11 -3
- package/manifest/components/navigation-menu.json +15 -4
- 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/popover.json +2 -1
- package/manifest/components/preset-section.json +13 -4
- package/manifest/components/preview.json +15 -1
- package/manifest/components/progress.json +16 -4
- 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 +16 -4
- 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 +13 -4
- package/manifest/components/shared-conversation.json +12 -3
- package/manifest/components/sheet.json +16 -5
- package/manifest/components/shimmer-label.json +12 -3
- package/manifest/components/sidebar.json +17 -5
- 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 +16 -4
- 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 +15 -3
- package/manifest/components/status-dot.json +16 -4
- package/manifest/components/stepper.json +17 -5
- 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/table-scroll-region.json +2 -1
- package/manifest/components/table.json +2 -1
- package/manifest/components/tags-input.json +17 -5
- package/manifest/components/tail-status.json +14 -3
- package/manifest/components/terminal-block.json +13 -3
- package/manifest/components/terminal-frame.json +15 -3
- package/manifest/components/textarea.json +15 -4
- package/manifest/components/theme-configurator.json +14 -4
- package/manifest/components/theme-provider.json +14 -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 +15 -4
- 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/toast.json +2 -0
- 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 +14 -4
- package/manifest/components/tool-call-card.json +2 -1
- 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/tooltip.json +2 -1
- 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 +16 -5
- 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 +667 -667
- package/manifest/tokens.json +29 -2
- package/package.json +2 -2
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"--cue-text-title",
|
|
99
99
|
"--cue-text-ui"
|
|
100
100
|
],
|
|
101
|
-
"summary": "Model output, rendered.",
|
|
101
|
+
"summary": "Model output, rendered — the one component in this library that turns a string into markup.",
|
|
102
102
|
"examples": [
|
|
103
103
|
{
|
|
104
104
|
"title": "Usage",
|
|
@@ -106,10 +106,23 @@
|
|
|
106
106
|
"language": "tsx"
|
|
107
107
|
}
|
|
108
108
|
],
|
|
109
|
-
"status": "
|
|
109
|
+
"status": "stable",
|
|
110
110
|
"url": "/docs/components/markdown-text",
|
|
111
111
|
"mdUrl": "/docs/components/markdown-text.md",
|
|
112
112
|
"jsonUrl": "/r/components/markdown-text.json",
|
|
113
|
+
"whenToUse": [
|
|
114
|
+
"An assistant turn that is genuinely markdown. The input is assumed hostile, and the element subset, the attributes and the URL schemes are all enumerated rather than filtered.",
|
|
115
|
+
"The tail of a stream: `streaming` hides the token being typed, so no asterisks flicker through a bold run and no fence opens a code block for one frame."
|
|
116
|
+
],
|
|
117
|
+
"whenNotToUse": [
|
|
118
|
+
"Any other text in the library. `Message`, `AskBox` and every other element place a string in the DOM as characters, because a component that quietly parsed would put every consumer one prompt away from an injection.",
|
|
119
|
+
"A console that renders transcripts without markdown. This lives at `@cueplusplus/ui/elements/markdown` and is deliberately not re-exported from `@cueplusplus/ui/elements`, so neither optional peer has to be installed."
|
|
120
|
+
],
|
|
121
|
+
"commonMistakes": [
|
|
122
|
+
"Expecting tables, task lists or footnotes. No GFM plugin is enabled — an explicit autolink still works, the rest do not.",
|
|
123
|
+
"Reaching for raw HTML, or for control over `rel`. Markup in the source has no parser to reach it, and every link carries `noopener noreferrer nofollow` whatever `target` says.",
|
|
124
|
+
"Dropping a highlighter into `renderCodeBlock` without thinking. It is a second parser over the same untrusted string, usually one that emits HTML, which is why the default is a bare `pre`/`code` and opting in is a line somebody wrote."
|
|
125
|
+
],
|
|
113
126
|
"specimens": [
|
|
114
127
|
{
|
|
115
128
|
"title": "MarkdownText",
|
|
@@ -121,6 +134,5 @@
|
|
|
121
134
|
"note": "The one component in the library that turns a string into markup, and the only one that has to be argued for. No raw HTML reaches the DOM — not filtered out, but never parsed: the img tag on the last line of the settled specimen is a real injection shape and renders as nothing. Links are http/https/mailto only and always carry rel='noopener noreferrer nofollow'; code blocks are plain text until a highlighter is passed. It ships from @cueplusplus/ui/elements/markdown so its parser and sanitizer stay off the elements barrel.",
|
|
122
135
|
"interaction": "none — it is a document, and it stays selectable, copyable text. Headings start at h2 by default so a turn never claims a page's title, and links are keyboard-reachable with the house focus ring."
|
|
123
136
|
}
|
|
124
|
-
]
|
|
125
|
-
"todo": true
|
|
137
|
+
]
|
|
126
138
|
}
|
|
@@ -61,10 +61,21 @@
|
|
|
61
61
|
"language": "tsx"
|
|
62
62
|
}
|
|
63
63
|
],
|
|
64
|
-
"status": "
|
|
64
|
+
"status": "stable",
|
|
65
65
|
"url": "/docs/components/math-block",
|
|
66
66
|
"mdUrl": "/docs/components/math-block.md",
|
|
67
67
|
"jsonUrl": "/r/components/math-block.json",
|
|
68
|
+
"whenToUse": [
|
|
69
|
+
"A derivation an agent produces step by step, where `visibleSteps` says how much has been shown.",
|
|
70
|
+
"Working that needs an eyebrow above it — that is `label`, and it is optional."
|
|
71
|
+
],
|
|
72
|
+
"whenNotToUse": [
|
|
73
|
+
"A string of TeX or any other notation to be parsed. Each step is a node, composed from the exported `Frac`, `Sup` and `Sub` helpers."
|
|
74
|
+
],
|
|
75
|
+
"commonMistakes": [
|
|
76
|
+
"Appending to `steps` as the derivation lands. `steps` is the whole working and `visibleSteps` is the caller's counter over it.",
|
|
77
|
+
"Building exponents and bounds out of raw markup instead of the exported `Sup` and `Sub` helpers the component is designed around."
|
|
78
|
+
],
|
|
68
79
|
"specimens": [
|
|
69
80
|
{
|
|
70
81
|
"title": "MathBlock",
|
|
@@ -79,6 +90,5 @@
|
|
|
79
90
|
"note": "Maths with the working shown, a step at a time. The expressions are nodes rather than a string, so there is no parser and no KaTeX in the bundle — `Frac` stacks a numerator over a rule, `Sup` and `Sub` set an index upright inside the serif italic, and anything else is text.",
|
|
80
91
|
"interaction": "none. Each step's note says what justified it, which is what turns three lines of algebra into an explanation."
|
|
81
92
|
}
|
|
82
|
-
]
|
|
83
|
-
"todo": true
|
|
93
|
+
]
|
|
84
94
|
}
|
|
@@ -17,10 +17,20 @@
|
|
|
17
17
|
"tokensUsed": [],
|
|
18
18
|
"summary": "An MCP server in the registry: a thing an agent connects *to*.",
|
|
19
19
|
"examples": [],
|
|
20
|
-
"status": "
|
|
20
|
+
"status": "stable",
|
|
21
21
|
"url": "/docs/components/mcp-server-icon",
|
|
22
22
|
"mdUrl": "/docs/components/mcp-server-icon.md",
|
|
23
23
|
"jsonUrl": "/r/components/mcp-server-icon.json",
|
|
24
|
+
"whenToUse": [
|
|
25
|
+
"A catalogue row that is a running process somewhere, with an address and a session."
|
|
26
|
+
],
|
|
27
|
+
"whenNotToUse": [
|
|
28
|
+
"Something installed and run locally. Use `CliToolIcon`.",
|
|
29
|
+
"A capability. Use `SkillIcon`."
|
|
30
|
+
],
|
|
31
|
+
"commonMistakes": [
|
|
32
|
+
"Drawing it as a document. It is hardware — two rack units with a status lamp — because a row that looked like a file would hide the only fact about it that matters operationally."
|
|
33
|
+
],
|
|
24
34
|
"specimens": [
|
|
25
35
|
{
|
|
26
36
|
"title": "The container icon set",
|
|
@@ -41,6 +51,5 @@
|
|
|
41
51
|
"note": "One grid and one weight across all ten, at size-icon-md — the size a navigation row draws them at. Each is a plain <svg> that takes every SVG prop.",
|
|
42
52
|
"interaction": "none. They are decorative by default: aria-hidden, announced by nothing, because the row they mark already carries its name."
|
|
43
53
|
}
|
|
44
|
-
]
|
|
45
|
-
"todo": true
|
|
54
|
+
]
|
|
46
55
|
}
|
|
@@ -82,10 +82,21 @@
|
|
|
82
82
|
"language": "tsx"
|
|
83
83
|
}
|
|
84
84
|
],
|
|
85
|
-
"status": "
|
|
85
|
+
"status": "stable",
|
|
86
86
|
"url": "/docs/components/mcp-server-panel",
|
|
87
87
|
"mdUrl": "/docs/components/mcp-server-panel.md",
|
|
88
88
|
"jsonUrl": "/r/components/mcp-server-panel.json",
|
|
89
|
+
"whenToUse": [
|
|
90
|
+
"A status surface listing every configured MCP server, connected or not — the header counts how many are live.",
|
|
91
|
+
"A server stuck on authorisation: `onAuthorize` is what puts the Authorize button on that row, and it is shown only while a server needs auth."
|
|
92
|
+
],
|
|
93
|
+
"whenNotToUse": [
|
|
94
|
+
"A layout where several servers must be open at once. Only one expands at a time — `expandedId` is a single id, not a set."
|
|
95
|
+
],
|
|
96
|
+
"commonMistakes": [
|
|
97
|
+
"Filtering `servers` down to the connected ones. The list is every configured server, and the header's live count is derived from the whole of it.",
|
|
98
|
+
"Holding a set of expanded ids in state. `onToggle` reports one id, and omitting `expandedId` entirely gives an all-collapsed list."
|
|
99
|
+
],
|
|
89
100
|
"specimens": [
|
|
90
101
|
{
|
|
91
102
|
"title": "McpServerPanel",
|
|
@@ -97,6 +108,5 @@
|
|
|
97
108
|
"note": "Which servers are connected, what each one brought, and which is still waiting on you. The header counts the live ones against the configured ones, and the status dot has a `sr-only` word beside it — a colour is not a status for everybody. Authorize only exists on a server that needs it, so the row that wants something from you is the only one offering an action.",
|
|
98
109
|
"interaction": "each server row carries `aria-expanded`; one expands at a time, and `expandedId` undefined is a legitimate all-collapsed state rather than a missing value."
|
|
99
110
|
}
|
|
100
|
-
]
|
|
101
|
-
"todo": true
|
|
111
|
+
]
|
|
102
112
|
}
|
|
@@ -53,10 +53,20 @@
|
|
|
53
53
|
"language": "tsx"
|
|
54
54
|
}
|
|
55
55
|
],
|
|
56
|
-
"status": "
|
|
56
|
+
"status": "stable",
|
|
57
57
|
"url": "/docs/components/memory-chips",
|
|
58
58
|
"mdUrl": "/docs/components/memory-chips.md",
|
|
59
59
|
"jsonUrl": "/r/components/memory-chips.json",
|
|
60
|
+
"whenToUse": [
|
|
61
|
+
"Showing the facts a turn just wrote to memory, with the new ones tinted apart from what was already known."
|
|
62
|
+
],
|
|
63
|
+
"whenNotToUse": [
|
|
64
|
+
"A settings screen for everything stored across all threads. These chips are what the turn wrote, marked new or existing."
|
|
65
|
+
],
|
|
66
|
+
"commonMistakes": [
|
|
67
|
+
"Leaving the existing mark off chips that were already remembered. Anything not marked existing is counted as new this turn and tinted, so a restored list lights up entirely.",
|
|
68
|
+
"Offering removal only for old facts. Every chip is removable through `onForget`, including the ones it just learned."
|
|
69
|
+
],
|
|
60
70
|
"specimens": [
|
|
61
71
|
{
|
|
62
72
|
"title": "MemoryChips",
|
|
@@ -68,6 +78,5 @@
|
|
|
68
78
|
"note": "What it now remembers about you, written during the turn it learned it. The header counts what is new rather than what is stored — `remembered 2` is the fact worth showing — and anything not marked `existing` takes the streaming hue so a new memory is visibly new. Every chip is removable, including the one it just learned, which is the only version of this control that is honest.",
|
|
69
79
|
"interaction": "each chip's remove button is labelled with the fact it would forget — `Forget ESPRITEs run in mode 8` — so the control names its consequence rather than saying 'remove'."
|
|
70
80
|
}
|
|
71
|
-
]
|
|
72
|
-
"todo": true
|
|
81
|
+
]
|
|
73
82
|
}
|
|
@@ -154,7 +154,8 @@
|
|
|
154
154
|
"--cue-surface-2",
|
|
155
155
|
"--cue-text-emphasis",
|
|
156
156
|
"--cue-text-label",
|
|
157
|
-
"--cue-text-ui"
|
|
157
|
+
"--cue-text-ui",
|
|
158
|
+
"--cue-tracking-caps"
|
|
158
159
|
],
|
|
159
160
|
"summary": "The desktop-application menu bar: a row of words, each dropping a menu.",
|
|
160
161
|
"examples": [
|
|
@@ -164,10 +165,21 @@
|
|
|
164
165
|
"language": "tsx"
|
|
165
166
|
}
|
|
166
167
|
],
|
|
167
|
-
"status": "
|
|
168
|
+
"status": "stable",
|
|
168
169
|
"url": "/docs/components/menubar",
|
|
169
170
|
"mdUrl": "/docs/components/menubar.md",
|
|
170
171
|
"jsonUrl": "/r/components/menubar.json",
|
|
172
|
+
"whenToUse": [
|
|
173
|
+
"A desktop-shaped app with more commands than a toolbar can hold.",
|
|
174
|
+
"Anywhere the bar behaviour — hover to switch once one is open, arrow keys across, typeahead inside — should come from the primitive."
|
|
175
|
+
],
|
|
176
|
+
"whenNotToUse": [
|
|
177
|
+
"Site navigation. Use `NavigationMenu`; its rows are links, not commands.",
|
|
178
|
+
"A handful of actions. Use `Toolbar`."
|
|
179
|
+
],
|
|
180
|
+
"commonMistakes": [
|
|
181
|
+
"Building it from separate `DropdownMenu`s, which loses the bar-level behaviour that makes a menubar feel native."
|
|
182
|
+
],
|
|
171
183
|
"specimens": [
|
|
172
184
|
{
|
|
173
185
|
"title": "Menubar",
|
|
@@ -179,6 +191,5 @@
|
|
|
179
191
|
"note": "The desktop bar: once one menu is open, hovering the next one opens it.",
|
|
180
192
|
"interaction": "left and right arrows move between menus, up and down move inside one."
|
|
181
193
|
}
|
|
182
|
-
]
|
|
183
|
-
"todo": true
|
|
194
|
+
]
|
|
184
195
|
}
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"--cue-ok",
|
|
98
98
|
"--cue-surface-2"
|
|
99
99
|
],
|
|
100
|
-
"summary": "Copy, rate
|
|
100
|
+
"summary": "Copy, rate and regenerate, each confirming itself with a small state change.",
|
|
101
101
|
"examples": [
|
|
102
102
|
{
|
|
103
103
|
"title": "Usage",
|
|
@@ -105,10 +105,21 @@
|
|
|
105
105
|
"language": "tsx"
|
|
106
106
|
}
|
|
107
107
|
],
|
|
108
|
-
"status": "
|
|
108
|
+
"status": "stable",
|
|
109
109
|
"url": "/docs/components/message-actions",
|
|
110
110
|
"mdUrl": "/docs/components/message-actions.md",
|
|
111
111
|
"jsonUrl": "/r/components/message-actions.json",
|
|
112
|
+
"whenToUse": [
|
|
113
|
+
"The action row under an assistant turn in a product that has all four: copy, thumbs, regenerate and an overflow menu."
|
|
114
|
+
],
|
|
115
|
+
"whenNotToUse": [
|
|
116
|
+
"A row where only some of the actions apply. Every callback here is required, so a product without rating or regeneration would still draw those controls."
|
|
117
|
+
],
|
|
118
|
+
"commonMistakes": [
|
|
119
|
+
"Setting `copied` on the press and never clearing it. The green check is caller state, so it stays until you reset it.",
|
|
120
|
+
"Treating `reaction` as a boolean. It is the active thumbs reaction or `null`, and `onReactionChange` reports the toggle.",
|
|
121
|
+
"Driving `regenerating` from a timer rather than the run. The icon spins to show work in progress and knows nothing about when it ends."
|
|
122
|
+
],
|
|
112
123
|
"specimens": [
|
|
113
124
|
{
|
|
114
125
|
"title": "MessageActions",
|
|
@@ -120,6 +131,5 @@
|
|
|
120
131
|
"note": "The row under an answer: copy, rate it, run it again, or ask for more. Every action confirms itself in place — copy swaps to a check and turns green, a rating latches, regenerate spins while it is out — so nothing needs a toast to say it worked.",
|
|
121
132
|
"interaction": "all five are named icon buttons; the two ratings carry aria-pressed and toggle off when pressed again. The copy swap is a crossfade between two icons in one cell, not a re-mount."
|
|
122
133
|
}
|
|
123
|
-
]
|
|
124
|
-
"todo": true
|
|
134
|
+
]
|
|
125
135
|
}
|
|
@@ -51,10 +51,20 @@
|
|
|
51
51
|
],
|
|
52
52
|
"summary": "The files a turn carried, as received rather than as staged.",
|
|
53
53
|
"examples": [],
|
|
54
|
-
"status": "
|
|
54
|
+
"status": "stable",
|
|
55
55
|
"url": "/docs/components/message-attachments",
|
|
56
56
|
"mdUrl": "/docs/components/message-attachments.md",
|
|
57
57
|
"jsonUrl": "/r/components/message-attachments.json",
|
|
58
|
+
"whenToUse": [
|
|
59
|
+
"Attachments on a turn that has already been sent: images render as a thumbnail row, everything else as a chip."
|
|
60
|
+
],
|
|
61
|
+
"whenNotToUse": [
|
|
62
|
+
"The staging area in a composer. These are files as received, not files being picked."
|
|
63
|
+
],
|
|
64
|
+
"commonMistakes": [
|
|
65
|
+
"Expecting the size or a document's page count to be computed. The row draws what each attachment item carries.",
|
|
66
|
+
"Omitting `onOpen` and expecting a preview tile to open. Opening an attachment for preview is the caller's."
|
|
67
|
+
],
|
|
58
68
|
"specimens": [
|
|
59
69
|
{
|
|
60
70
|
"title": "MessageAttachments",
|
|
@@ -66,6 +76,5 @@
|
|
|
66
76
|
"note": "Files as received, not as staged: an image gets a preview tile that opens, a document gets its page count, anything else gets its size. Upstream's uploader lives in the composer — this is the read-only other end of it.",
|
|
67
77
|
"interaction": "every row is one button with its name as the label; the image tile grows very slightly under the pointer, and holds still under reduced motion."
|
|
68
78
|
}
|
|
69
|
-
]
|
|
70
|
-
"todo": true
|
|
79
|
+
]
|
|
71
80
|
}
|
|
@@ -63,10 +63,20 @@
|
|
|
63
63
|
"language": "tsx"
|
|
64
64
|
}
|
|
65
65
|
],
|
|
66
|
-
"status": "
|
|
66
|
+
"status": "stable",
|
|
67
67
|
"url": "/docs/components/message-branches",
|
|
68
68
|
"mdUrl": "/docs/components/message-branches.md",
|
|
69
69
|
"jsonUrl": "/r/components/message-branches.json",
|
|
70
|
+
"whenToUse": [
|
|
71
|
+
"A turn that has been regenerated more than once, where the reader should be able to step back to the answer they preferred."
|
|
72
|
+
],
|
|
73
|
+
"whenNotToUse": [
|
|
74
|
+
"Choosing what to re-run the turn with. This steps through answers that already exist; it produces nothing."
|
|
75
|
+
],
|
|
76
|
+
"commonMistakes": [
|
|
77
|
+
"Keeping only the current answer in state. `variants` is the whole set of alternates — dropping the earlier ones is exactly the losing-your-place this row exists to prevent.",
|
|
78
|
+
"Letting `index` run past the end of `variants`. The component is controlled: `onIndexChange` only reports which control was pressed."
|
|
79
|
+
],
|
|
70
80
|
"specimens": [
|
|
71
81
|
{
|
|
72
82
|
"title": "MessageBranches",
|
|
@@ -78,6 +88,5 @@
|
|
|
78
88
|
"note": "Two answers to the same question, and a way through them that does not lose your place. The counter is the whole affordance — `2 / 2` is what tells you a second version exists at all — and it wraps at both ends rather than dead-ending.",
|
|
79
89
|
"interaction": "both arrows are named and go disabled when there is only one version, which is the honest state for a turn nobody has regenerated."
|
|
80
90
|
}
|
|
81
|
-
]
|
|
82
|
-
"todo": true
|
|
91
|
+
]
|
|
83
92
|
}
|
|
@@ -101,10 +101,20 @@
|
|
|
101
101
|
"language": "tsx"
|
|
102
102
|
}
|
|
103
103
|
],
|
|
104
|
-
"status": "
|
|
104
|
+
"status": "stable",
|
|
105
105
|
"url": "/docs/components/message-list",
|
|
106
106
|
"mdUrl": "/docs/components/message-list.md",
|
|
107
107
|
"jsonUrl": "/r/components/message-list.json",
|
|
108
|
+
"whenToUse": [
|
|
109
|
+
"Any streaming transcript.",
|
|
110
|
+
"Anywhere the reader must be able to scroll back mid-stream without being yanked forward."
|
|
111
|
+
],
|
|
112
|
+
"whenNotToUse": [
|
|
113
|
+
"A static conversation. A `Stack` of `Message`s is enough."
|
|
114
|
+
],
|
|
115
|
+
"commonMistakes": [
|
|
116
|
+
"Treating following as a scroll position rather than a mode. It is a mode: pinned to the bottom it follows, and scrolling up hands control back and offers a 'jump to latest' pill — because a stream that yanks the viewport mid-sentence is the single most common reason people stop reading a chat."
|
|
117
|
+
],
|
|
108
118
|
"specimens": [
|
|
109
119
|
{
|
|
110
120
|
"title": "MessageList",
|
|
@@ -116,6 +126,5 @@
|
|
|
116
126
|
"note": "A stick-to-bottom scroller. Scroll away and it offers to jump back to the latest rather than yanking you there.",
|
|
117
127
|
"interaction": "the jump control is a button, and it appears only once you have actually scrolled off the tail."
|
|
118
128
|
}
|
|
119
|
-
]
|
|
120
|
-
"todo": true
|
|
129
|
+
]
|
|
121
130
|
}
|
|
@@ -87,10 +87,20 @@
|
|
|
87
87
|
"language": "tsx"
|
|
88
88
|
}
|
|
89
89
|
],
|
|
90
|
-
"status": "
|
|
90
|
+
"status": "stable",
|
|
91
91
|
"url": "/docs/components/message-pair",
|
|
92
92
|
"mdUrl": "/docs/components/message-pair.md",
|
|
93
93
|
"jsonUrl": "/r/components/message-pair.json",
|
|
94
|
+
"whenToUse": [
|
|
95
|
+
"A single exchange rendered as one unit — a preview tile, a demo, a bench frame — where the reply arrives word by word."
|
|
96
|
+
],
|
|
97
|
+
"whenNotToUse": [
|
|
98
|
+
"A transcript of many turns. This is one pair, and the assistant side is a `words` array with a `visibleWords` counter rather than children you compose."
|
|
99
|
+
],
|
|
100
|
+
"commonMistakes": [
|
|
101
|
+
"Leaving `streaming` true once `visibleWords` reaches the end, so a settled reply keeps its newest words tinted blue.",
|
|
102
|
+
"Restyling the user bubble away with classes instead of `variant=\"flat\"`, which renders it as plain right-aligned text."
|
|
103
|
+
],
|
|
94
104
|
"specimens": [
|
|
95
105
|
{
|
|
96
106
|
"title": "MessagePair",
|
|
@@ -102,6 +112,5 @@
|
|
|
102
112
|
"note": "A whole turn in one element: what was asked, and the answer streaming under it with its actions waiting on hover. The two variants are the two house styles for a user turn — a bubble, or right-aligned text with no chrome at all.",
|
|
103
113
|
"interaction": "the action row is invisible until the turn is hovered *or* focused, which is what keeps a keyboard from losing it. Both buttons are named."
|
|
104
114
|
}
|
|
105
|
-
]
|
|
106
|
-
"todo": true
|
|
115
|
+
]
|
|
107
116
|
}
|
|
@@ -65,10 +65,21 @@
|
|
|
65
65
|
"language": "tsx"
|
|
66
66
|
}
|
|
67
67
|
],
|
|
68
|
-
"status": "
|
|
68
|
+
"status": "stable",
|
|
69
69
|
"url": "/docs/components/message-queue",
|
|
70
70
|
"mdUrl": "/docs/components/message-queue.md",
|
|
71
71
|
"jsonUrl": "/r/components/message-queue.json",
|
|
72
|
+
"whenToUse": [
|
|
73
|
+
"Showing what will send once the current run finishes, with the in-flight turn above the queue."
|
|
74
|
+
],
|
|
75
|
+
"whenNotToUse": [
|
|
76
|
+
"A queue with nothing running. `running` is required, and the component is built around a turn in flight.",
|
|
77
|
+
"A queue whose entries should be rewritten or jumped before they send. The only thing this offers is `onCancel`."
|
|
78
|
+
],
|
|
79
|
+
"commonMistakes": [
|
|
80
|
+
"Re-sorting `queued` before passing it. The order is the order the turns will drain in.",
|
|
81
|
+
"Wiring `onCancel` to stop the run. It removes a queued turn before it ever sends; the turn shown above is not cancellable from here."
|
|
82
|
+
],
|
|
72
83
|
"specimens": [
|
|
73
84
|
{
|
|
74
85
|
"title": "MessageQueue",
|
|
@@ -80,6 +91,5 @@
|
|
|
80
91
|
"note": "What you typed while the last run was still out. The turn in flight pings at the top; everything behind it is numbered, cancellable and explicitly told when it will go. A queue that did not say 'sends when this finishes' would look like a list of failures.",
|
|
81
92
|
"interaction": "each row's × is a named button — the message text is in the label, so five rows do not all read as 'Remove'."
|
|
82
93
|
}
|
|
83
|
-
]
|
|
84
|
-
"todo": true
|
|
94
|
+
]
|
|
85
95
|
}
|
|
@@ -49,10 +49,21 @@
|
|
|
49
49
|
"language": "tsx"
|
|
50
50
|
}
|
|
51
51
|
],
|
|
52
|
-
"status": "
|
|
52
|
+
"status": "stable",
|
|
53
53
|
"url": "/docs/components/message-timing",
|
|
54
54
|
"mdUrl": "/docs/components/message-timing.md",
|
|
55
55
|
"jsonUrl": "/r/components/message-timing.json",
|
|
56
|
+
"whenToUse": [
|
|
57
|
+
"Under a finished turn, where the reader should be able to see what it cost.",
|
|
58
|
+
"During a stream: show fewer stats and set `streaming`, which tints the values while they are still moving."
|
|
59
|
+
],
|
|
60
|
+
"whenNotToUse": [
|
|
61
|
+
"Raw numbers. `stats` are label and value pairs, pre-formatted — there is no rounding, no unit and no currency here."
|
|
62
|
+
],
|
|
63
|
+
"commonMistakes": [
|
|
64
|
+
"Passing the full set of stats while the turn is still streaming. The intended shape is fewer during, the full set once it settles.",
|
|
65
|
+
"Leaving `streaming` on after the turn lands, so settled values stay tinted as if they were still moving."
|
|
66
|
+
],
|
|
56
67
|
"specimens": [
|
|
57
68
|
{
|
|
58
69
|
"title": "MessageTiming",
|
|
@@ -64,6 +75,5 @@
|
|
|
64
75
|
"note": "What the turn cost, in the footer where a reader can ignore it. The values are strings the caller already formatted; while the turn is still streaming they sit in the live hue and settle into ink when it lands, so the row doubles as a state.",
|
|
65
76
|
"interaction": "none. It is four label/value pairs in mono, tabular so the numbers do not jitter as they update."
|
|
66
77
|
}
|
|
67
|
-
]
|
|
68
|
-
"todo": true
|
|
78
|
+
]
|
|
69
79
|
}
|
|
@@ -119,7 +119,8 @@
|
|
|
119
119
|
"--cue-space-4",
|
|
120
120
|
"--cue-surface-1",
|
|
121
121
|
"--cue-text-body",
|
|
122
|
-
"--cue-text-micro"
|
|
122
|
+
"--cue-text-micro",
|
|
123
|
+
"--cue-tracking-caps"
|
|
123
124
|
],
|
|
124
125
|
"summary": "One turn in a conversation.",
|
|
125
126
|
"examples": [
|
|
@@ -129,10 +130,20 @@
|
|
|
129
130
|
"language": "tsx"
|
|
130
131
|
}
|
|
131
132
|
],
|
|
132
|
-
"status": "
|
|
133
|
+
"status": "stable",
|
|
133
134
|
"url": "/docs/components/message",
|
|
134
135
|
"mdUrl": "/docs/components/message.md",
|
|
135
136
|
"jsonUrl": "/r/components/message.json",
|
|
137
|
+
"whenToUse": [
|
|
138
|
+
"Any transcript turn — a user's, an agent's, a tool's.",
|
|
139
|
+
"Anywhere authorship, timestamp and pending state should be drawn consistently."
|
|
140
|
+
],
|
|
141
|
+
"whenNotToUse": [
|
|
142
|
+
"A delegated sub-run. Use `DelegationCard`, which folds it."
|
|
143
|
+
],
|
|
144
|
+
"commonMistakes": [
|
|
145
|
+
"Expecting it to render markdown. Content is React nodes, verbatim, on purpose: model output is untrusted text, and a component that quietly parsed it would make every consumer one prompt away from an injection. Pass your own renderer and own that decision."
|
|
146
|
+
],
|
|
136
147
|
"specimens": [
|
|
137
148
|
{
|
|
138
149
|
"title": "Message",
|
|
@@ -144,6 +155,5 @@
|
|
|
144
155
|
"note": "Three roles. The bubble radii are asymmetric and mirrored by role, and the author line is mono micro. Nothing here parses markdown: model output is an untrusted string, and a component that rendered it as markup would make every consumer one prompt away from an injection.",
|
|
145
156
|
"interaction": "none. A message is a record."
|
|
146
157
|
}
|
|
147
|
-
]
|
|
148
|
-
"todo": true
|
|
158
|
+
]
|
|
149
159
|
}
|
|
@@ -143,10 +143,22 @@
|
|
|
143
143
|
"language": "tsx"
|
|
144
144
|
}
|
|
145
145
|
],
|
|
146
|
-
"status": "
|
|
146
|
+
"status": "stable",
|
|
147
147
|
"url": "/docs/components/mobile-composer",
|
|
148
148
|
"mdUrl": "/docs/components/mobile-composer.md",
|
|
149
149
|
"jsonUrl": "/r/components/mobile-composer.json",
|
|
150
|
+
"whenToUse": [
|
|
151
|
+
"A composer on a phone — the field is 16px so iOS does not zoom on focus, and the quick actions scroll horizontally above it.",
|
|
152
|
+
"A run in flight: `running` swaps send for stop and suppresses Return-to-send."
|
|
153
|
+
],
|
|
154
|
+
"whenNotToUse": [
|
|
155
|
+
"A desktop composer. The layout carries a home-indicator inset and collapses its quick actions when the keyboard is up."
|
|
156
|
+
],
|
|
157
|
+
"commonMistakes": [
|
|
158
|
+
"Passing `actions` without `onAction`. The chips render disabled, because `actions` is required and the row would otherwise be inert — the same is true of `onAttach` and its control.",
|
|
159
|
+
"Guessing at the keyboard from the viewport instead of driving `keyboardOpen` from `onFocus`, which is the callback given for exactly that.",
|
|
160
|
+
"Leaving `running` false during a run, so Return still sends and the stop control never appears."
|
|
161
|
+
],
|
|
150
162
|
"specimens": [
|
|
151
163
|
{
|
|
152
164
|
"title": "MobileComposer",
|
|
@@ -158,6 +170,5 @@
|
|
|
158
170
|
"note": "The same composer on a phone: a bottom sheet with thumb-sized targets, quick actions scrolling above the field, and a 16px input so iOS does not zoom when it takes focus. `keyboardOpen` is the whole layout switch — the quick actions and the home-indicator inset both belong to the state where the keyboard is down.",
|
|
159
171
|
"interaction": "send becomes stop while a run is in flight, and Return stops sending — a second send during a stream is almost always a mistake, so the element refuses it rather than queueing it."
|
|
160
172
|
}
|
|
161
|
-
]
|
|
162
|
-
"todo": true
|
|
173
|
+
]
|
|
163
174
|
}
|
|
@@ -67,10 +67,20 @@
|
|
|
67
67
|
"language": "tsx"
|
|
68
68
|
}
|
|
69
69
|
],
|
|
70
|
-
"status": "
|
|
70
|
+
"status": "stable",
|
|
71
71
|
"url": "/docs/components/model-picker",
|
|
72
72
|
"mdUrl": "/docs/components/model-picker.md",
|
|
73
73
|
"jsonUrl": "/r/components/model-picker.json",
|
|
74
|
+
"whenToUse": [
|
|
75
|
+
"A picker over every model on offer, where price and capability are part of the choice."
|
|
76
|
+
],
|
|
77
|
+
"whenNotToUse": [
|
|
78
|
+
"Two or three models in a settings row. This is the full list, and a family of one is a heading over a single row."
|
|
79
|
+
],
|
|
80
|
+
"commonMistakes": [
|
|
81
|
+
"Grouping or sorting `models` by family before passing them. Families are derived from the entries and keep their first-seen order, so the order you pass is the order you get.",
|
|
82
|
+
"Passing `selectedId` without `onSelect` on a picker meant to change the model — the id alone only marks which one is active."
|
|
83
|
+
],
|
|
74
84
|
"specimens": [
|
|
75
85
|
{
|
|
76
86
|
"title": "ModelPicker",
|
|
@@ -82,6 +92,5 @@
|
|
|
82
92
|
"note": "The full list rather than the rail: grouped by family, priced, and carrying what each one can actually do. This is the screen `ComposerModelTrigger` is a shortcut to, and the split is the point — the toolbar menu is for switching between models you already chose between, and this is where that choosing happens.",
|
|
83
93
|
"interaction": "each row is `aria-pressed`, which is the honest role for a control that stays chosen rather than performing an action once."
|
|
84
94
|
}
|
|
85
|
-
]
|
|
86
|
-
"todo": true
|
|
95
|
+
]
|
|
87
96
|
}
|
|
@@ -225,9 +225,10 @@
|
|
|
225
225
|
"--cue-text-body",
|
|
226
226
|
"--cue-text-emphasis",
|
|
227
227
|
"--cue-text-label",
|
|
228
|
-
"--cue-text-ui"
|
|
228
|
+
"--cue-text-ui",
|
|
229
|
+
"--cue-tracking-caps"
|
|
229
230
|
],
|
|
230
|
-
"summary": "Several values out of a known set, each shown as a removable chip.",
|
|
231
|
+
"summary": "Several values out of a known set, each shown as a removable chip inside the field.",
|
|
231
232
|
"examples": [
|
|
232
233
|
{
|
|
233
234
|
"title": "Usage",
|
|
@@ -235,10 +236,23 @@
|
|
|
235
236
|
"language": "tsx"
|
|
236
237
|
}
|
|
237
238
|
],
|
|
238
|
-
"status": "
|
|
239
|
+
"status": "stable",
|
|
239
240
|
"url": "/docs/components/multi-select",
|
|
240
241
|
"mdUrl": "/docs/components/multi-select.md",
|
|
241
242
|
"jsonUrl": "/r/components/multi-select.json",
|
|
243
|
+
"whenToUse": [
|
|
244
|
+
"A selection the user needs to see in full: assignees, fixtures, channels.",
|
|
245
|
+
"Anywhere the size of the selection is information. Nine trusses render nine chips tall, so the field is honest about how much has been chosen."
|
|
246
|
+
],
|
|
247
|
+
"whenNotToUse": [
|
|
248
|
+
"Values the product cannot enumerate. Use `TagsInput`, which commits whatever is typed.",
|
|
249
|
+
"Exactly one value. Use `Select` or `Combobox`.",
|
|
250
|
+
"A set small enough to show at once. A `CheckboxGroup` shows every option without an open-close cycle."
|
|
251
|
+
],
|
|
252
|
+
"commonMistakes": [
|
|
253
|
+
"Giving the field a fixed height. It takes `min-h-control-*` on purpose; a fixed height reintroduces the hidden overflow the chips exist to avoid.",
|
|
254
|
+
"Collapsing the chips behind a `+6 more`. That hides the selection the user came to check."
|
|
255
|
+
],
|
|
242
256
|
"specimens": [
|
|
243
257
|
{
|
|
244
258
|
"title": "MultiSelect",
|
|
@@ -250,6 +264,5 @@
|
|
|
250
264
|
"note": "Several values in one control, rendered as removable chips.",
|
|
251
265
|
"interaction": "each chip's remove button has its own accessible name; Backspace removes the last one."
|
|
252
266
|
}
|
|
253
|
-
]
|
|
254
|
-
"todo": true
|
|
267
|
+
]
|
|
255
268
|
}
|
|
@@ -121,10 +121,19 @@
|
|
|
121
121
|
"language": "tsx"
|
|
122
122
|
}
|
|
123
123
|
],
|
|
124
|
-
"status": "
|
|
124
|
+
"status": "stable",
|
|
125
125
|
"url": "/docs/components/musical-time-input",
|
|
126
126
|
"mdUrl": "/docs/components/musical-time-input.md",
|
|
127
127
|
"jsonUrl": "/r/components/musical-time-input.json",
|
|
128
|
+
"whenToUse": [
|
|
129
|
+
"Any position or length in musical time."
|
|
130
|
+
],
|
|
131
|
+
"whenNotToUse": [
|
|
132
|
+
"Wall-clock time. Use a time field."
|
|
133
|
+
],
|
|
134
|
+
"commonMistakes": [
|
|
135
|
+
"Using a `NumberField` instead. That asks for 4.25 and means 'bar 2, beat 1, one sixteenth in' — a conversion the musician has to do in their head every time. Three segments, each stepping in its own musical unit, does it instead."
|
|
136
|
+
],
|
|
128
137
|
"specimens": [
|
|
129
138
|
{
|
|
130
139
|
"title": "MusicalTimeInput",
|
|
@@ -136,6 +145,5 @@
|
|
|
136
145
|
"note": "`bars.beats.sixteenths` as three segments, time-signature aware, with the total-beats readout beside it.",
|
|
137
146
|
"interaction": "arrow keys and the scroll wheel step the segment under the caret; Tab moves between segments and overflow carries into the next one."
|
|
138
147
|
}
|
|
139
|
-
]
|
|
140
|
-
"todo": true
|
|
148
|
+
]
|
|
141
149
|
}
|