@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
|
@@ -67,10 +67,20 @@
|
|
|
67
67
|
"language": "tsx"
|
|
68
68
|
}
|
|
69
69
|
],
|
|
70
|
-
"status": "
|
|
70
|
+
"status": "stable",
|
|
71
71
|
"url": "/docs/components/research-report",
|
|
72
72
|
"mdUrl": "/docs/components/research-report.md",
|
|
73
73
|
"jsonUrl": "/r/components/research-report.json",
|
|
74
|
+
"whenToUse": [
|
|
75
|
+
"A long research answer where the shape should be legible before the prose lands."
|
|
76
|
+
],
|
|
77
|
+
"whenNotToUse": [
|
|
78
|
+
"An answer with no outline to state first. The sections existing from the start is the point of the component."
|
|
79
|
+
],
|
|
80
|
+
"commonMistakes": [
|
|
81
|
+
"Appending sections as they complete. Pass the whole outline up front and let it fill in.",
|
|
82
|
+
"Deriving `sourcesRead` from the sections. It is a running count of sources consumed, passed in."
|
|
83
|
+
],
|
|
74
84
|
"specimens": [
|
|
75
85
|
{
|
|
76
86
|
"title": "ResearchReport",
|
|
@@ -82,6 +92,5 @@
|
|
|
82
92
|
"note": "An outline that fills in rather than a spinner that spins: every heading is present from the first frame, and each one carries the number of sources behind it. The section being written spins in the streaming hue, the finished ones take a check, the ones still queued are a dot — three states, one row.",
|
|
83
93
|
"interaction": "none. The counter above is derived from the sections, so `2/4 sections` cannot disagree with what is drawn under it."
|
|
84
94
|
}
|
|
85
|
-
]
|
|
86
|
-
"todo": true
|
|
95
|
+
]
|
|
87
96
|
}
|
|
@@ -71,10 +71,21 @@
|
|
|
71
71
|
"language": "tsx"
|
|
72
72
|
}
|
|
73
73
|
],
|
|
74
|
-
"status": "
|
|
74
|
+
"status": "stable",
|
|
75
75
|
"url": "/docs/components/resizable",
|
|
76
76
|
"mdUrl": "/docs/components/resizable.md",
|
|
77
77
|
"jsonUrl": "/r/components/resizable.json",
|
|
78
|
+
"whenToUse": [
|
|
79
|
+
"A two-or-more pane view whose balance is the user's to choose: a tree beside a canvas, a list beside a detail.",
|
|
80
|
+
"Anywhere the right split differs per user or per task."
|
|
81
|
+
],
|
|
82
|
+
"whenNotToUse": [
|
|
83
|
+
"A layout with one correct proportion. Use `Grid` or `Stack` and decide it.",
|
|
84
|
+
"Panes that must not collapse. A draggable split invites dragging to zero."
|
|
85
|
+
],
|
|
86
|
+
"commonMistakes": [
|
|
87
|
+
"Importing it from the core barrel. `react-resizable-panels` is an **optional peer** — import from `@cueplusplus/ui/layout/resizable` so an app with no split view never installs one."
|
|
88
|
+
],
|
|
78
89
|
"specimens": [
|
|
79
90
|
{
|
|
80
91
|
"title": "Resizable",
|
|
@@ -86,6 +97,5 @@
|
|
|
86
97
|
"note": "react-resizable-panels with a 4px handle that goes accent on hover. Also an optional peer, from @cueplusplus/ui/layout/resizable.",
|
|
87
98
|
"interaction": "the handle is a `separator` with a value: arrow keys resize, Home and End collapse either way."
|
|
88
99
|
}
|
|
89
|
-
]
|
|
90
|
-
"todo": true
|
|
100
|
+
]
|
|
91
101
|
}
|
|
@@ -78,10 +78,21 @@
|
|
|
78
78
|
"language": "tsx"
|
|
79
79
|
}
|
|
80
80
|
],
|
|
81
|
-
"status": "
|
|
81
|
+
"status": "stable",
|
|
82
82
|
"url": "/docs/components/retrieval-chunks",
|
|
83
83
|
"mdUrl": "/docs/components/retrieval-chunks.md",
|
|
84
84
|
"jsonUrl": "/r/components/retrieval-chunks.json",
|
|
85
|
+
"whenToUse": [
|
|
86
|
+
"Showing what a retrieval answer is standing on while the index is still being queried — `searching` shimmers the status line."
|
|
87
|
+
],
|
|
88
|
+
"whenNotToUse": [
|
|
89
|
+
"Raw index output. `chunks` are the passages already above the threshold and already sorted by score."
|
|
90
|
+
],
|
|
91
|
+
"commonMistakes": [
|
|
92
|
+
"Sorting or thresholding in the render. Both happen before the prop.",
|
|
93
|
+
"Slicing `chunks` to what has landed. `visibleCount` is that number, and `chunks` is the whole result.",
|
|
94
|
+
"Leaving `searching` true once the passages have arrived, so a settled panel keeps shimmering."
|
|
95
|
+
],
|
|
85
96
|
"specimens": [
|
|
86
97
|
{
|
|
87
98
|
"title": "RetrievalChunks",
|
|
@@ -93,6 +104,5 @@
|
|
|
93
104
|
"note": "What a retrieval actually returned, before the answer built on it: the passage, where it came from, and the score — with a bar under each so a 0.62 reads as weaker than a 0.91 without arithmetic. Scores at or above 0.8 go green; that threshold is the element's one opinion.",
|
|
94
105
|
"interaction": "none, and that is right: these are evidence, not controls. While `searching` the header shimmers; when it settles it says how many passages cleared the threshold."
|
|
95
106
|
}
|
|
96
|
-
]
|
|
97
|
-
"todo": true
|
|
107
|
+
]
|
|
98
108
|
}
|
|
@@ -177,10 +177,22 @@
|
|
|
177
177
|
"language": "tsx"
|
|
178
178
|
}
|
|
179
179
|
],
|
|
180
|
-
"status": "
|
|
180
|
+
"status": "stable",
|
|
181
181
|
"url": "/docs/components/revert-dock",
|
|
182
182
|
"mdUrl": "/docs/components/revert-dock.md",
|
|
183
183
|
"jsonUrl": "/r/components/revert-dock.json",
|
|
184
|
+
"whenToUse": [
|
|
185
|
+
"A checkpoint a run can be restored to, where files and the conversation are separate axes and the copy says which is which.",
|
|
186
|
+
"A runtime with only one axis to put back: `scopes={[\"conversation\"]}` offers that alone."
|
|
187
|
+
],
|
|
188
|
+
"whenNotToUse": [
|
|
189
|
+
"Anything that is not destructive. This is the family's only destructive control, and `This action cannot be undone.` is on screen the whole time the dock is open — the sentence it refuses to render without."
|
|
190
|
+
],
|
|
191
|
+
"commonMistakes": [
|
|
192
|
+
"Treating a scope press as the restore. Picking a scope only arms the dock; `onRestore` fires from one control alone, the one that answers \"Discard all changes up to this checkpoint?\", and at most once per arm.",
|
|
193
|
+
"Moving or replacing the scope list when the dock arms. It stays exactly where it was, dimmed and disabled, with the question appended under it — because the old layout put `Discard and restore` (x13-170, y131-161) inside `Restore conversation` (x13-435, y121-175) at 448px, so a double click on a scope destroyed the work with its second press.",
|
|
194
|
+
"Owning `open` and `confirming` internally. Both are the caller's, which is what lets the armed state be benched, tested and replayed instead of existing only between two clicks."
|
|
195
|
+
],
|
|
184
196
|
"specimens": [
|
|
185
197
|
{
|
|
186
198
|
"title": "RevertDock",
|
|
@@ -192,6 +204,5 @@
|
|
|
192
204
|
"note": "The one destructive control in this family, and the three things that make it one rather than a button called Restore. The axis: a run changes the files and the conversation about them, and putting one back is not putting the other back — Roo writes it as `Restore Files` against `Restore Files & Task`, Cline as `Reset Code` against `Reset Chat`. The gate: picking a scope only arms the dock, and `onRestore` fires from the second press alone. And the geometry, which is the half a gate cannot do on its own: the confirm is appended under the scope list rather than drawn over it, because a destructive control that inherits the coordinates of the control that armed it is one a double click reaches unread. `This action cannot be undone.` is on the screen the whole time the dock is open, above every step, because an irreversibility that lives in a props table is one somebody meets for the first time afterwards.",
|
|
193
205
|
"interaction": "each scope names what it costs in a second line under its label; pressing one tints that scope, disables the whole list where it stands and appends Cursor's question beneath it, so nothing above the confirm moves a pixel. Focus lands on `Keep everything`, which also comes first in the DOM; Escape backs out, folding the dock disarms it, and the destructive half refuses presses for 400 ms after it arrives. Restoring here folds the dock and says which scope it was."
|
|
194
206
|
}
|
|
195
|
-
]
|
|
196
|
-
"todo": true
|
|
207
|
+
]
|
|
197
208
|
}
|
|
@@ -93,10 +93,20 @@
|
|
|
93
93
|
"language": "tsx"
|
|
94
94
|
}
|
|
95
95
|
],
|
|
96
|
-
"status": "
|
|
96
|
+
"status": "stable",
|
|
97
97
|
"url": "/docs/components/reviewable-diff",
|
|
98
98
|
"mdUrl": "/docs/components/reviewable-diff.md",
|
|
99
99
|
"jsonUrl": "/r/components/reviewable-diff.json",
|
|
100
|
+
"whenToUse": [
|
|
101
|
+
"A patch a person should be able to take in parts rather than all or nothing."
|
|
102
|
+
],
|
|
103
|
+
"whenNotToUse": [
|
|
104
|
+
"A diff nobody is deciding about. Apply stays disabled until no hunk is pending, so a read-only view sits permanently unapplyable."
|
|
105
|
+
],
|
|
106
|
+
"commonMistakes": [
|
|
107
|
+
"Writing every hunk on `onApply`. Only the kept ones should be written — the discards are the whole point of the review.",
|
|
108
|
+
"Removing a discarded hunk from `hunks`. Each hunk carries its own decision, and it is the pending ones that gate Apply."
|
|
109
|
+
],
|
|
100
110
|
"specimens": [
|
|
101
111
|
{
|
|
102
112
|
"title": "ReviewableDiff",
|
|
@@ -108,6 +118,5 @@
|
|
|
108
118
|
"note": "The same diff, except every hunk is a decision. A discarded hunk stays visible at reduced opacity rather than vanishing, so what the reviewer turned down is still part of what they reviewed, and Apply stays disabled until nothing is pending.",
|
|
109
119
|
"interaction": "Keep and Discard are per hunk and named by range for a screen reader. Apply here puts every hunk back to pending, so the bench can be run again."
|
|
110
120
|
}
|
|
111
|
-
]
|
|
112
|
-
"todo": true
|
|
121
|
+
]
|
|
113
122
|
}
|
|
@@ -69,10 +69,22 @@
|
|
|
69
69
|
"language": "tsx"
|
|
70
70
|
}
|
|
71
71
|
],
|
|
72
|
-
"status": "
|
|
72
|
+
"status": "stable",
|
|
73
73
|
"url": "/docs/components/risk-badge",
|
|
74
74
|
"mdUrl": "/docs/components/risk-badge.md",
|
|
75
75
|
"jsonUrl": "/r/components/risk-badge.json",
|
|
76
|
+
"whenToUse": [
|
|
77
|
+
"Beside a tool call from a runtime that scores its own actions, so a `curl` to an arbitrary host does not look like a `cat` of a local file.",
|
|
78
|
+
"A runtime with no scorer at all: `unknown` is a first-class value and the honest answer."
|
|
79
|
+
],
|
|
80
|
+
"whenNotToUse": [
|
|
81
|
+
"As a silent stand-in for safety. Omitting the badge, or falling back to `low` when nothing scored the call, is how a UI ends up implying that unscored means safe."
|
|
82
|
+
],
|
|
83
|
+
"commonMistakes": [
|
|
84
|
+
"Restyling the row from a prop. The badge stamps `data-risk` and `data-color` for exactly that.",
|
|
85
|
+
"Overriding `label` with a bare adjective like `HIGH`. It sits inline beside a duration and a diff stat, where a bare adjective reads as a number about something — hence the `High risk` default.",
|
|
86
|
+
"Leaning on the colour. Each risk carries its own glyph and its own words so the badge survives a colour-blind reader, a monochrome screenshot, and a theme whose danger hue is somebody's brand red."
|
|
87
|
+
],
|
|
76
88
|
"specimens": [
|
|
77
89
|
{
|
|
78
90
|
"title": "RiskBadge",
|
|
@@ -84,6 +96,5 @@
|
|
|
84
96
|
"note": "How dangerous the runtime says this call is, said out loud instead of implied. Six of the seven open-source agent UIs in the study encode risk through which approval bucket a tool happens to fall into, so a fetch to an arbitrary host and a read of a local file look alike until you read them. One runtime scores the action itself, and one badge then renders it for every tool that will ever exist. `unknown` is a first-class value: a runtime with no scorer must not be made to look like one that scored everything safe.",
|
|
85
97
|
"interaction": "none. The qualifier beside the label is the half the implicit products were right about — `High risk` on its own is a temperature, `High risk · arbitrary network access` is a fact — and it truncates before the label does."
|
|
86
98
|
}
|
|
87
|
-
]
|
|
88
|
-
"todo": true
|
|
99
|
+
]
|
|
89
100
|
}
|
|
@@ -101,10 +101,20 @@
|
|
|
101
101
|
"language": "tsx"
|
|
102
102
|
}
|
|
103
103
|
],
|
|
104
|
-
"status": "
|
|
104
|
+
"status": "stable",
|
|
105
105
|
"url": "/docs/components/schedule-card",
|
|
106
106
|
"mdUrl": "/docs/components/schedule-card.md",
|
|
107
107
|
"jsonUrl": "/r/components/schedule-card.json",
|
|
108
|
+
"whenToUse": [
|
|
109
|
+
"A recurring run whose recent history matters — `history` is there so a silently failing schedule is visible."
|
|
110
|
+
],
|
|
111
|
+
"whenNotToUse": [
|
|
112
|
+
"A cron editor. `cadence` is human-readable recurrence, not a cron string."
|
|
113
|
+
],
|
|
114
|
+
"commonMistakes": [
|
|
115
|
+
"Formatting `nextRun` for a paused schedule. When `enabled` is false it is replaced by paused.",
|
|
116
|
+
"Passing an empty `history`. It is required, and a schedule with no visible runs is precisely the failure this card exists to catch."
|
|
117
|
+
],
|
|
108
118
|
"specimens": [
|
|
109
119
|
{
|
|
110
120
|
"title": "ScheduleCard",
|
|
@@ -116,6 +126,5 @@
|
|
|
116
126
|
"note": "A job that repeats on its own: what it is called, how often it goes, when it next goes, and how the last three went. Paused, the next-run row dims and says `paused` rather than showing a time that will not happen.",
|
|
117
127
|
"interaction": "the toggle is a real switch — role, `aria-checked` and a label naming the schedule — so three of these on a page do not all read as 'Toggle'."
|
|
118
128
|
}
|
|
119
|
-
]
|
|
120
|
-
"todo": true
|
|
129
|
+
]
|
|
121
130
|
}
|
|
@@ -88,10 +88,21 @@
|
|
|
88
88
|
"language": "tsx"
|
|
89
89
|
}
|
|
90
90
|
],
|
|
91
|
-
"status": "
|
|
91
|
+
"status": "stable",
|
|
92
92
|
"url": "/docs/components/score-breakdown",
|
|
93
93
|
"mdUrl": "/docs/components/score-breakdown.md",
|
|
94
94
|
"jsonUrl": "/r/components/score-breakdown.json",
|
|
95
|
+
"whenToUse": [
|
|
96
|
+
"A judged result where the reader should be able to argue with the number, because the criteria that produced it are on screen."
|
|
97
|
+
],
|
|
98
|
+
"whenNotToUse": [
|
|
99
|
+
"A bare score. Without criteria there is no arithmetic to show, which is the whole of this component."
|
|
100
|
+
],
|
|
101
|
+
"commonMistakes": [
|
|
102
|
+
"Scaling each criterion to its own maximum. `outOf` is the maximum for the headline and for every criterion bar.",
|
|
103
|
+
"Tinting the verdict yourself. Its tint follows `total` over `outOf`.",
|
|
104
|
+
"Slicing `criteria` to those scored so far. `visibleCount` is that, and `criteria` is the full set."
|
|
105
|
+
],
|
|
95
106
|
"specimens": [
|
|
96
107
|
{
|
|
97
108
|
"title": "ScoreBreakdown",
|
|
@@ -103,6 +114,5 @@
|
|
|
103
114
|
"note": "A verdict with its working shown. The number leads, the badge names it in words, and every criterion carries its weight and the note that explains a low mark — which is what makes a 7.8 arguable instead of oracular. The badge's three bands are the element's own thresholds at three quarters and a half.",
|
|
104
115
|
"interaction": "none. The bars animate their width, and hold still for a reader who asked for less motion."
|
|
105
116
|
}
|
|
106
|
-
]
|
|
107
|
-
"todo": true
|
|
117
|
+
]
|
|
108
118
|
}
|
|
@@ -64,10 +64,20 @@
|
|
|
64
64
|
"language": "tsx"
|
|
65
65
|
}
|
|
66
66
|
],
|
|
67
|
-
"status": "
|
|
67
|
+
"status": "stable",
|
|
68
68
|
"url": "/docs/components/scroll-anchor",
|
|
69
69
|
"mdUrl": "/docs/components/scroll-anchor.md",
|
|
70
70
|
"jsonUrl": "/r/components/scroll-anchor.json",
|
|
71
|
+
"whenToUse": [
|
|
72
|
+
"A transcript viewport where messages arrive while the reader may have scrolled up — it pins only when they are already at the bottom."
|
|
73
|
+
],
|
|
74
|
+
"whenNotToUse": [
|
|
75
|
+
"A scene you need to rewind through a prop. Replay happens by remounting; `paused` only freezes it where it is."
|
|
76
|
+
],
|
|
77
|
+
"commonMistakes": [
|
|
78
|
+
"Expecting `paused` to restart the scene. It freezes; the way back to the start is a remount.",
|
|
79
|
+
"Wiring `onSettled` as a per-message callback. It fires once every message has landed and the viewport is pinned."
|
|
80
|
+
],
|
|
71
81
|
"specimens": [
|
|
72
82
|
{
|
|
73
83
|
"title": "ScrollAnchor",
|
|
@@ -79,6 +89,5 @@
|
|
|
79
89
|
"note": "The rule every transcript needs and few get: streaming may only move the viewport if you were already at the bottom of it. Scroll up to read something and the answer keeps arriving behind you; a pill counts what landed and takes you back down. It is the family's one element that runs a clock of its own — the turns append on a timer so the behaviour can be seen standing still.",
|
|
80
90
|
"interaction": "the pill is a button. Both scrolls are CSS `scroll-smooth`, not `scrollTo({ behavior })`, because only the declarative one can be withdrawn: `motion-reduce:scroll-auto` makes them instant, and the timer stops outright, painting the finished transcript in one go."
|
|
81
91
|
}
|
|
82
|
-
]
|
|
83
|
-
"todo": true
|
|
92
|
+
]
|
|
84
93
|
}
|
|
@@ -94,10 +94,21 @@
|
|
|
94
94
|
"language": "tsx"
|
|
95
95
|
}
|
|
96
96
|
],
|
|
97
|
-
"status": "
|
|
97
|
+
"status": "stable",
|
|
98
98
|
"url": "/docs/components/scroll-area",
|
|
99
99
|
"mdUrl": "/docs/components/scroll-area.md",
|
|
100
100
|
"jsonUrl": "/r/components/scroll-area.json",
|
|
101
|
+
"whenToUse": [
|
|
102
|
+
"A pane whose scrollbar should match the console rather than the OS.",
|
|
103
|
+
"Anywhere native scrolling must be kept — it re-skins the bar only, so momentum, keyboard and trackpad behaviour stay the browser's."
|
|
104
|
+
],
|
|
105
|
+
"whenNotToUse": [
|
|
106
|
+
"The document itself. The page's own scroller is not this component's job."
|
|
107
|
+
],
|
|
108
|
+
"commonMistakes": [
|
|
109
|
+
"Forgetting to bound its height. The frame needs `h-full` inside a flex parent or an explicit height — without one there is nothing to scroll and the component looks broken.",
|
|
110
|
+
"Reimplementing scrolling with transforms, which throws away exactly the native behaviour this keeps."
|
|
111
|
+
],
|
|
101
112
|
"specimens": [
|
|
102
113
|
{
|
|
103
114
|
"title": "ScrollArea",
|
|
@@ -109,6 +120,5 @@
|
|
|
109
120
|
"note": "A themed scroller in either axis, so an overflowing panel does not fall back to the platform bar.",
|
|
110
121
|
"interaction": "the thumb fades in on hover over the area and stays while dragging."
|
|
111
122
|
}
|
|
112
|
-
]
|
|
113
|
-
"todo": true
|
|
123
|
+
]
|
|
114
124
|
}
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"--cue-surface-2",
|
|
64
64
|
"--cue-text-ui"
|
|
65
65
|
],
|
|
66
|
-
"summary": "A
|
|
66
|
+
"summary": "A tabs list that scrolls when its tabs do not fit, and says so.",
|
|
67
67
|
"examples": [
|
|
68
68
|
{
|
|
69
69
|
"title": "Usage",
|
|
@@ -71,10 +71,21 @@
|
|
|
71
71
|
"language": "tsx"
|
|
72
72
|
}
|
|
73
73
|
],
|
|
74
|
-
"status": "
|
|
74
|
+
"status": "stable",
|
|
75
75
|
"url": "/docs/components/scrollable-tabs-list",
|
|
76
76
|
"mdUrl": "/docs/components/scrollable-tabs-list.md",
|
|
77
77
|
"jsonUrl": "/r/components/scrollable-tabs-list.json",
|
|
78
|
+
"whenToUse": [
|
|
79
|
+
"Any tab strip whose count can outgrow its container.",
|
|
80
|
+
"Anywhere clipping would read as a layout bug: a plain flex row renders \"SETTINGS\" as \"INGS\"."
|
|
81
|
+
],
|
|
82
|
+
"whenNotToUse": [
|
|
83
|
+
"A fixed, small set of tabs that always fits. `Tabs.List` is simpler."
|
|
84
|
+
],
|
|
85
|
+
"commonMistakes": [
|
|
86
|
+
"Keeping `Tabs.List` because it looks fine today. The failure only appears at the tab count or the viewport you did not test.",
|
|
87
|
+
"Dropping the chevrons and keeping only the mask. The affordance is both halves — the mask says there is more, the buttons are how a pointer user gets there."
|
|
88
|
+
],
|
|
78
89
|
"specimens": [
|
|
79
90
|
{
|
|
80
91
|
"title": "ScrollableTabsList",
|
|
@@ -86,6 +97,5 @@
|
|
|
86
97
|
"note": "The same list when it does not fit: a mask fade at each overflowing edge, plus chevron buttons.",
|
|
87
98
|
"interaction": "the chevrons appear only on the side that actually overflows."
|
|
88
99
|
}
|
|
89
|
-
]
|
|
90
|
-
"todo": true
|
|
100
|
+
]
|
|
91
101
|
}
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"--cue-surface-2",
|
|
63
63
|
"--cue-surface-3"
|
|
64
64
|
],
|
|
65
|
-
"summary": "One filled cell of a
|
|
65
|
+
"summary": "One filled cell of a `SeamGrid` — or of a `SeamList`.",
|
|
66
66
|
"examples": [
|
|
67
67
|
{
|
|
68
68
|
"title": "Usage",
|
|
@@ -70,10 +70,20 @@
|
|
|
70
70
|
"language": "tsx"
|
|
71
71
|
}
|
|
72
72
|
],
|
|
73
|
-
"status": "
|
|
73
|
+
"status": "stable",
|
|
74
74
|
"url": "/docs/components/seam-cell",
|
|
75
75
|
"mdUrl": "/docs/components/seam-cell.md",
|
|
76
76
|
"jsonUrl": "/r/components/seam-cell.json",
|
|
77
|
+
"whenToUse": [
|
|
78
|
+
"Every child of a seam container.",
|
|
79
|
+
"Anywhere the cell needs its own ground, an interactive state, or to sit flush against the container edge."
|
|
80
|
+
],
|
|
81
|
+
"whenNotToUse": [
|
|
82
|
+
"Outside a seam container, where the fill has no seam to protect."
|
|
83
|
+
],
|
|
84
|
+
"commonMistakes": [
|
|
85
|
+
"Making the fill transparent. The fill is the load-bearing part: without it the container's border colour shows through everywhere and the seam stops being a hairline."
|
|
86
|
+
],
|
|
77
87
|
"specimens": [
|
|
78
88
|
{
|
|
79
89
|
"title": "SeamGrid / SeamCell",
|
|
@@ -86,6 +96,5 @@
|
|
|
86
96
|
"note": "The 1px-gap hairline idiom as a two-dimensional component: the grid's own background shows through the gaps.",
|
|
87
97
|
"interaction": "`interactive` cells take a hover ground and a focus ring."
|
|
88
98
|
}
|
|
89
|
-
]
|
|
90
|
-
"todo": true
|
|
99
|
+
]
|
|
91
100
|
}
|
|
@@ -63,10 +63,22 @@
|
|
|
63
63
|
"language": "tsx"
|
|
64
64
|
}
|
|
65
65
|
],
|
|
66
|
-
"status": "
|
|
66
|
+
"status": "stable",
|
|
67
67
|
"url": "/docs/components/seam-grid",
|
|
68
68
|
"mdUrl": "/docs/components/seam-grid.md",
|
|
69
69
|
"jsonUrl": "/r/components/seam-grid.json",
|
|
70
|
+
"whenToUse": [
|
|
71
|
+
"A grid of cells that must be divided by a perfect hairline at every corner.",
|
|
72
|
+
"Anywhere borders would double up or disagree — the gap is 1px over the border colour, so there is nothing to double."
|
|
73
|
+
],
|
|
74
|
+
"whenNotToUse": [
|
|
75
|
+
"A plain grid with spacing. Use `Grid`.",
|
|
76
|
+
"A one-dimensional run. Use `SeamList`."
|
|
77
|
+
],
|
|
78
|
+
"commonMistakes": [
|
|
79
|
+
"Using cells that do not paint their own ground. Pair with `SeamCell` — an unfilled cell lets the container's border colour through everywhere, not just at the gap, and the seam disappears into a solid block.",
|
|
80
|
+
"Inlining the idiom by hand. It was inlined at eighteen call sites before it was a component."
|
|
81
|
+
],
|
|
70
82
|
"specimens": [
|
|
71
83
|
{
|
|
72
84
|
"title": "SeamGrid / SeamCell",
|
|
@@ -79,6 +91,5 @@
|
|
|
79
91
|
"note": "The 1px-gap hairline idiom as a two-dimensional component: the grid's own background shows through the gaps.",
|
|
80
92
|
"interaction": "`interactive` cells take a hover ground and a focus ring."
|
|
81
93
|
}
|
|
82
|
-
]
|
|
83
|
-
"todo": true
|
|
94
|
+
]
|
|
84
95
|
}
|
|
@@ -35,10 +35,21 @@
|
|
|
35
35
|
"language": "tsx"
|
|
36
36
|
}
|
|
37
37
|
],
|
|
38
|
-
"status": "
|
|
38
|
+
"status": "stable",
|
|
39
39
|
"url": "/docs/components/seam-list",
|
|
40
40
|
"mdUrl": "/docs/components/seam-list.md",
|
|
41
41
|
"jsonUrl": "/r/components/seam-list.json",
|
|
42
|
+
"whenToUse": [
|
|
43
|
+
"Rows that are cards in their own right, where a border would double up with the row's own.",
|
|
44
|
+
"Anywhere a hairline must stay exactly one pixel and must not disagree with a rounded corner."
|
|
45
|
+
],
|
|
46
|
+
"whenNotToUse": [
|
|
47
|
+
"A plain list of text. A `Stack` with a `gap` is simpler and says the same thing."
|
|
48
|
+
],
|
|
49
|
+
"commonMistakes": [
|
|
50
|
+
"Giving the children a transparent fill. Each child must paint its own opaque fill — that is what makes the 1px gap read as a hairline instead of showing the container's border colour through the row.",
|
|
51
|
+
"Pairing it with rows that draw their own borders. Use `<Row seam>`."
|
|
52
|
+
],
|
|
42
53
|
"specimens": [
|
|
43
54
|
{
|
|
44
55
|
"title": "Row / SeamList",
|
|
@@ -51,6 +62,5 @@
|
|
|
51
62
|
"note": "Hairline rows, and the 1px-gap variant where the gaps themselves are the rule.",
|
|
52
63
|
"interaction": "pass `interactive` for a hover ground and a focus ring; `disabled` dims and stops pointer events."
|
|
53
64
|
}
|
|
54
|
-
]
|
|
55
|
-
"todo": true
|
|
65
|
+
]
|
|
56
66
|
}
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
"--cue-text-label",
|
|
168
168
|
"--cue-text-ui"
|
|
169
169
|
],
|
|
170
|
-
"summary": "A filter box: leading magnifier, Escape to clear, and a debounced change callback
|
|
170
|
+
"summary": "A filter box: leading magnifier, Escape to clear, and a debounced change callback.",
|
|
171
171
|
"examples": [
|
|
172
172
|
{
|
|
173
173
|
"title": "Usage",
|
|
@@ -175,10 +175,22 @@
|
|
|
175
175
|
"language": "tsx"
|
|
176
176
|
}
|
|
177
177
|
],
|
|
178
|
-
"status": "
|
|
178
|
+
"status": "stable",
|
|
179
179
|
"url": "/docs/components/search-input",
|
|
180
180
|
"mdUrl": "/docs/components/search-input.md",
|
|
181
181
|
"jsonUrl": "/r/components/search-input.json",
|
|
182
|
+
"whenToUse": [
|
|
183
|
+
"Any console filter. Escape-to-clear is the behaviour every one needs and every hand-rolled box forgets.",
|
|
184
|
+
"A query that drives expensive work — `debounce` and `onDebouncedChange` exist so it is not run per keystroke."
|
|
185
|
+
],
|
|
186
|
+
"whenNotToUse": [
|
|
187
|
+
"A value that is submitted rather than applied as you type. That is an `Input` in a form.",
|
|
188
|
+
"Choosing from a known set. Use `Combobox`."
|
|
189
|
+
],
|
|
190
|
+
"commonMistakes": [
|
|
191
|
+
"Rebuilding it from `Input` plus an icon, which loses Escape-to-clear and its stopPropagation — without that the key bubbles into the surrounding dialog and closes it underneath the user.",
|
|
192
|
+
"Wiring expensive work to `onValueChange` instead of `onDebouncedChange`."
|
|
193
|
+
],
|
|
182
194
|
"specimens": [
|
|
183
195
|
{
|
|
184
196
|
"title": "SearchInput",
|
|
@@ -190,6 +202,5 @@
|
|
|
190
202
|
"note": "A magnifier, a clear button that appears once there is something to clear, and an optional debounce.",
|
|
191
203
|
"interaction": "Escape clears; the clear button is a real button with a name, not an icon glued to the rim."
|
|
192
204
|
}
|
|
193
|
-
]
|
|
194
|
-
"todo": true
|
|
205
|
+
]
|
|
195
206
|
}
|
|
@@ -120,10 +120,22 @@
|
|
|
120
120
|
"language": "tsx"
|
|
121
121
|
}
|
|
122
122
|
],
|
|
123
|
-
"status": "
|
|
123
|
+
"status": "stable",
|
|
124
124
|
"url": "/docs/components/section-header",
|
|
125
125
|
"mdUrl": "/docs/components/section-header.md",
|
|
126
126
|
"jsonUrl": "/r/components/section-header.json",
|
|
127
|
+
"whenToUse": [
|
|
128
|
+
"Titling a group inside a panel, where the heading must not read as another object.",
|
|
129
|
+
"A group that can be folded away: `collapsible` puts the disclosure on the header itself."
|
|
130
|
+
],
|
|
131
|
+
"whenNotToUse": [
|
|
132
|
+
"A page title. Use `PageShell`'s header.",
|
|
133
|
+
"A row. This names rows; it is not one of them."
|
|
134
|
+
],
|
|
135
|
+
"commonMistakes": [
|
|
136
|
+
"Boxing it — giving the heading a rim and a fill. A heading that is itself a panel competes with the panels underneath it and reads as another object rather than as their title.",
|
|
137
|
+
"Sizing the rule by hand. It is a `flex-1` block so it always fills exactly what the label and the count leave."
|
|
138
|
+
],
|
|
127
139
|
"specimens": [
|
|
128
140
|
{
|
|
129
141
|
"title": "SectionHeader",
|
|
@@ -135,6 +147,5 @@
|
|
|
135
147
|
"note": "A label, a rule, an optional count and an action slot. Collapsible when the section under it is.",
|
|
136
148
|
"interaction": "the collapsible variant is a button: hover tints the label, Enter and Space toggle."
|
|
137
149
|
}
|
|
138
|
-
]
|
|
139
|
-
"todo": true
|
|
150
|
+
]
|
|
140
151
|
}
|
|
@@ -158,10 +158,23 @@
|
|
|
158
158
|
"language": "tsx"
|
|
159
159
|
}
|
|
160
160
|
],
|
|
161
|
-
"status": "
|
|
161
|
+
"status": "stable",
|
|
162
162
|
"url": "/docs/components/segmented-control",
|
|
163
163
|
"mdUrl": "/docs/components/segmented-control.md",
|
|
164
164
|
"jsonUrl": "/r/components/segmented-control.json",
|
|
165
|
+
"whenToUse": [
|
|
166
|
+
"A choice between a small number of views where the answer is always one of them.",
|
|
167
|
+
"Anywhere clicking the active option must be a no-op rather than a way to end up with nothing."
|
|
168
|
+
],
|
|
169
|
+
"whenNotToUse": [
|
|
170
|
+
"A filter that may be cleared. Use `ToggleGroup`, which can be emptied — that difference is the whole distinction.",
|
|
171
|
+
"Actions. Use `ButtonGroup`.",
|
|
172
|
+
"More options than fit comfortably. Use `Select`."
|
|
173
|
+
],
|
|
174
|
+
"commonMistakes": [
|
|
175
|
+
"Choosing between this and `ToggleGroup` on appearance. Ask whether 'none' is a legal answer.",
|
|
176
|
+
"Adding your own clear control, which reintroduces the empty state this refuses."
|
|
177
|
+
],
|
|
165
178
|
"specimens": [
|
|
166
179
|
{
|
|
167
180
|
"title": "SegmentedControl",
|
|
@@ -173,6 +186,5 @@
|
|
|
173
186
|
"note": "Three sizes. The active segment is `accent-soft`, on the same ruling as the active tab. The last specimen is five segments in 15rem: the rim and the height hold, the segments scroll inside them — the same overflow behaviour Toolbar and AppBar have, from the same module.",
|
|
174
187
|
"interaction": "arrow keys move the selection and reach the segments off-screen; the whole control is one tab stop. A chevron appears at whichever edge still hides one."
|
|
175
188
|
}
|
|
176
|
-
]
|
|
177
|
-
"todo": true
|
|
189
|
+
]
|
|
178
190
|
}
|
|
@@ -36,10 +36,22 @@
|
|
|
36
36
|
"language": "tsx"
|
|
37
37
|
}
|
|
38
38
|
],
|
|
39
|
-
"status": "
|
|
39
|
+
"status": "stable",
|
|
40
40
|
"url": "/docs/components/separator",
|
|
41
41
|
"mdUrl": "/docs/components/separator.md",
|
|
42
42
|
"jsonUrl": "/r/components/separator.json",
|
|
43
|
+
"whenToUse": [
|
|
44
|
+
"Dividing groups that are genuinely separate: a menu's sections, a toolbar's clusters, a panel's header from its body.",
|
|
45
|
+
"Anywhere the division needs to exist in the accessibility tree — it carries `role=\"separator\"` and `aria-orientation`."
|
|
46
|
+
],
|
|
47
|
+
"whenNotToUse": [
|
|
48
|
+
"Spacing. If the groups only need air, give them `gap`; a rule adds meaning that may not be there.",
|
|
49
|
+
"The outline of a surface. That is the card's own border, not a separator."
|
|
50
|
+
],
|
|
51
|
+
"commonMistakes": [
|
|
52
|
+
"Replacing it with `border-t` on the next element. The line here is a `h-px` block precisely because a bordered zero-height box collapses unpredictably inside flex rows.",
|
|
53
|
+
"Overriding the colour with a literal instead of letting the `border` token paint it, which breaks the moment a theme changes."
|
|
54
|
+
],
|
|
43
55
|
"specimens": [
|
|
44
56
|
{
|
|
45
57
|
"title": "Separator",
|
|
@@ -51,6 +63,5 @@
|
|
|
51
63
|
"note": "A hairline in either orientation.",
|
|
52
64
|
"interaction": "none."
|
|
53
65
|
}
|
|
54
|
-
]
|
|
55
|
-
"todo": true
|
|
66
|
+
]
|
|
56
67
|
}
|
|
@@ -132,10 +132,21 @@
|
|
|
132
132
|
"language": "tsx"
|
|
133
133
|
}
|
|
134
134
|
],
|
|
135
|
-
"status": "
|
|
135
|
+
"status": "stable",
|
|
136
136
|
"url": "/docs/components/settings-panel",
|
|
137
137
|
"mdUrl": "/docs/components/settings-panel.md",
|
|
138
138
|
"jsonUrl": "/r/components/settings-panel.json",
|
|
139
|
+
"whenToUse": [
|
|
140
|
+
"A compact settings surface for one thread: a few models, the system prompt, temperature and a handful of capability switches."
|
|
141
|
+
],
|
|
142
|
+
"whenNotToUse": [
|
|
143
|
+
"A long model list. `models` feeds a segmented control — keep it to a few; more wants the model picker."
|
|
144
|
+
],
|
|
145
|
+
"commonMistakes": [
|
|
146
|
+
"Driving `temperature` outside 0 to 2, which is the range the slider is built for.",
|
|
147
|
+
"Giving toggles with no explanation. Each switch carries a line saying what it turns on, which is what makes a capability list readable.",
|
|
148
|
+
"Passing `toggles` without `onToggle` and expecting the switches to move — the callback reports the switched capability's key and the state stays yours."
|
|
149
|
+
],
|
|
139
150
|
"specimens": [
|
|
140
151
|
{
|
|
141
152
|
"title": "SettingsPanel",
|
|
@@ -147,6 +158,5 @@
|
|
|
147
158
|
"note": "Model, system prompt, temperature, and what the assistant is allowed to do — the four settings a chat product actually has, on one card. The capability switches each carry a line saying what turning them on does, which is the difference between a settings page and a list of nouns. The panel holds none of it: every value here is the caller's.",
|
|
148
159
|
"interaction": "the segmented model control is a row of `aria-pressed` buttons, and both the prompt textarea and the temperature slider carry their own labels, so nothing on the card depends on the mono caption above it being read."
|
|
149
160
|
}
|
|
150
|
-
]
|
|
151
|
-
"todo": true
|
|
161
|
+
]
|
|
152
162
|
}
|