@cueplusplus/ui 0.20.0 → 0.21.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 +134 -0
- package/dist/brand/particle-logo.js +11 -3
- package/dist/chat/agent-pile.js +2 -2
- package/dist/chrome/_status-bar.js +1 -1
- package/dist/chrome/app-shell.js +1 -1
- package/dist/chrome/navigation-menu.js +3 -3
- package/dist/chrome/row.js +1 -1
- package/dist/chrome/scroll-area.js +1 -1
- package/dist/chrome/section-header.js +1 -1
- package/dist/chrome/segmented-control.js +1 -1
- package/dist/chrome/tabs.js +1 -1
- package/dist/chrome/toolbar.js +1 -1
- package/dist/chrome/tree.js +3 -3
- package/dist/date/calendar.js +3 -3
- package/dist/dmx/channel-matrix.js +1 -1
- package/dist/dmx/universe-grid.js +1 -1
- package/dist/elements/agent-handoff.js +3 -3
- package/dist/elements/agent-plan.js +1 -1
- package/dist/elements/agent-status.js +1 -1
- package/dist/elements/agent-surface.d.ts +9 -6
- package/dist/elements/agent-surface.js +3 -2
- package/dist/elements/approval-card.d.ts +29 -3
- package/dist/elements/approval-card.js +18 -8
- package/dist/elements/artifact-card.js +2 -2
- package/dist/elements/canvas-split.js +3 -3
- package/dist/elements/chart.js +1 -1
- package/dist/elements/chat-panel.js +2 -2
- package/dist/elements/checkpoint-history.js +1 -1
- package/dist/elements/code-diff.js +1 -1
- package/dist/elements/code-runner.js +1 -1
- package/dist/elements/composer.d.ts +8 -2
- package/dist/elements/composer.js +20 -12
- package/dist/elements/computer-use.js +2 -2
- package/dist/elements/confidence-marker.js +1 -1
- package/dist/elements/connection-state.js +2 -2
- package/dist/elements/context-breakdown.js +1 -1
- package/dist/elements/context-usage.js +1 -1
- package/dist/elements/conversation-search.js +2 -2
- package/dist/elements/cost-meter.js +1 -1
- package/dist/elements/data-table.js +1 -1
- package/dist/elements/diagram.js +1 -1
- package/dist/elements/draft-restore.js +2 -2
- package/dist/elements/edit-message.js +1 -1
- package/dist/elements/elements.css +134 -0
- package/dist/elements/elicitation-form.d.ts +8 -1
- package/dist/elements/elicitation-form.js +24 -16
- package/dist/elements/empty-state.js +3 -3
- package/dist/elements/error-state.js +2 -2
- package/dist/elements/event-feed.d.ts +88 -0
- package/dist/elements/event-feed.js +190 -0
- package/dist/elements/feedback-dialog.js +2 -2
- package/dist/elements/file-tree.js +1 -1
- package/dist/elements/flow-graph.js +2 -2
- package/dist/elements/generative.css +13 -0
- package/dist/elements/generative.d.ts +8 -6
- package/dist/elements/generative.js +4 -3
- package/dist/elements/image-generation.js +2 -2
- package/dist/elements/index.d.ts +7 -3
- package/dist/elements/index.js +5 -2
- package/dist/elements/inline-citation.js +1 -1
- package/dist/elements/job-progress.js +1 -1
- package/dist/elements/launcher-bubble.js +3 -3
- package/dist/elements/loading-state.js +1 -1
- package/dist/elements/map-answer.js +1 -1
- package/dist/elements/math-block.js +1 -1
- package/dist/elements/mcp-server-panel.js +3 -3
- package/dist/elements/memory-chips.js +1 -1
- package/dist/elements/message-attachment.js +3 -3
- package/dist/elements/message-branches.js +1 -1
- package/dist/elements/message-pair.js +2 -2
- package/dist/elements/message-queue.js +1 -1
- package/dist/elements/message-timing.js +1 -1
- package/dist/elements/mobile-composer.js +1 -1
- package/dist/elements/model-picker.js +1 -1
- package/dist/elements/number-ticker.js +1 -1
- package/dist/elements/onboarding.js +3 -3
- package/dist/elements/permission-grant.js +3 -3
- package/dist/elements/prompt-library.js +1 -1
- package/dist/elements/question-card.d.ts +50 -0
- package/dist/elements/question-card.js +117 -0
- package/dist/elements/queue-dock.js +1 -1
- package/dist/elements/quota-banner.js +1 -1
- package/dist/elements/quote-reply.js +3 -3
- package/dist/elements/read-aloud.js +2 -2
- package/dist/elements/reasoning-effort.js +2 -2
- package/dist/elements/reasoning-panel.js +3 -3
- package/dist/elements/recommendation-card.js +2 -2
- package/dist/elements/regenerate-menu.js +1 -1
- package/dist/elements/request-delivery.js +31 -0
- package/dist/elements/research-report.js +1 -1
- package/dist/elements/retrieval-chunks.js +3 -3
- package/dist/elements/revert-dock.js +1 -1
- package/dist/elements/reviewable-diff.js +4 -4
- package/dist/elements/schedule-card.js +2 -2
- package/dist/elements/score-breakdown.js +2 -2
- package/dist/elements/scroll-anchor.js +2 -2
- package/dist/elements/settings-panel.js +3 -3
- package/dist/elements/sources.js +1 -1
- package/dist/elements/spec-sheet.js +1 -1
- package/dist/elements/stopped-run.js +2 -2
- package/dist/elements/streaming-text.js +2 -2
- package/dist/elements/subagent-list.js +4 -4
- package/dist/elements/suggestions.js +1 -1
- package/dist/elements/surfaces.d.ts +6 -6
- package/dist/elements/surfaces.js +7 -7
- package/dist/elements/tail-status.js +1 -1
- package/dist/elements/terminal-block.js +1 -1
- package/dist/elements/thinking-indicator.js +1 -1
- package/dist/elements/timeline.js +1 -1
- package/dist/elements/todo-list.js +1 -1
- package/dist/elements/tool-call.d.ts +18 -2
- package/dist/elements/tool-call.js +20 -11
- package/dist/elements/tool-error.js +2 -2
- package/dist/elements/tool-group.d.ts +11 -3
- package/dist/elements/tool-group.js +62 -38
- package/dist/elements/tool-state.d.ts +13 -0
- package/dist/elements/tool-state.js +44 -0
- package/dist/elements/tool-timeline.js +2 -2
- package/dist/elements/trace-waterfall.js +2 -2
- package/dist/elements/unsupported-request-card.d.ts +31 -0
- package/dist/elements/unsupported-request-card.js +80 -0
- package/dist/elements/vocabulary.d.ts +50 -1
- package/dist/elements/vocabulary.js +50 -1
- package/dist/elements/voice-conversation.js +5 -5
- package/dist/elements/web-preview.js +1 -1
- package/dist/elements/web-search.js +2 -2
- package/dist/elements/work-collapse.js +1 -1
- package/dist/forms/file-upload.js +1 -1
- package/dist/forms/rating.js +1 -1
- package/dist/forms/select.js +1 -1
- package/dist/forms/switch.js +2 -2
- package/dist/forms/toggle.js +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -1
- package/dist/instruments/_ledger-disclosure.js +1 -1
- package/dist/instruments/data-tree.js +1 -1
- package/dist/instruments/meter.js +1 -1
- package/dist/instruments/seam-grid.js +1 -1
- package/dist/layout/_collapse.js +3 -3
- package/dist/layout/bento.js +1 -1
- package/dist/layout/breadcrumb.js +1 -1
- package/dist/layout/carousel.js +1 -1
- package/dist/layout/collapsible.js +1 -1
- package/dist/layout/index.d.ts +3 -1
- package/dist/layout/index.js +3 -1
- package/dist/layout/item.js +1 -1
- package/dist/layout/link.js +1 -1
- package/dist/layout/pagination.js +1 -1
- package/dist/layout/pane-seam.d.ts +75 -0
- package/dist/layout/pane-seam.js +127 -0
- package/dist/layout/resizable.d.ts +2 -1
- package/dist/layout/resizable.js +3 -2
- package/dist/layout/reveal.js +10 -4
- package/dist/layout/sidebar.js +3 -3
- package/dist/layout/split-pane.d.ts +74 -0
- package/dist/layout/split-pane.js +135 -0
- package/dist/layout/stepper.js +1 -1
- package/dist/lib/auto-grow.js +42 -0
- package/dist/overlays/_surface.d.ts +4 -4
- package/dist/overlays/_surface.js +4 -4
- package/dist/overlays/drawer.js +1 -1
- package/dist/overlays/menubar.js +1 -1
- package/dist/overlays/sheet.js +1 -1
- package/dist/overlays/toast.js +1 -1
- package/dist/primitives/button.js +1 -1
- package/dist/primitives/chip.d.ts +1 -1
- package/dist/styles.css +12 -0
- package/dist/system/agent-skin.d.ts +11 -5
- package/dist/system/frame-clock.js +1 -0
- package/dist/system/theme-registry.d.ts +1 -1
- package/dist/system/theme-registry.js +1 -1
- package/manifest/components/agent-surface.json +5 -4
- package/manifest/components/approval-card.json +45 -7
- package/manifest/components/composer-input.json +16 -2
- package/manifest/components/elicitation-form.json +16 -1
- package/manifest/components/event-feed.json +171 -0
- package/manifest/components/event-row.json +116 -0
- package/manifest/components/generative-ui.json +4 -3
- package/manifest/components/pane-seam.json +171 -0
- package/manifest/components/question-card.json +157 -0
- package/manifest/components/resizable.json +1 -1
- package/manifest/components/reveal.json +3 -1
- package/manifest/components/split-pane.json +224 -0
- package/manifest/components/tool-call.json +46 -2
- package/manifest/components/tool-group.json +15 -3
- package/manifest/components/unsupported-request-card.json +117 -0
- package/manifest/fixtures.json +16 -0
- package/manifest/manifest.json +91 -13
- package/manifest/tokens.json +9 -2
- package/package.json +8 -6
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "QuestionCard",
|
|
3
|
+
"slug": "question-card",
|
|
4
|
+
"group": "elements",
|
|
5
|
+
"importPath": "@cueplusplus/ui/elements",
|
|
6
|
+
"peerDependencies": [
|
|
7
|
+
"lucide-react"
|
|
8
|
+
],
|
|
9
|
+
"clientOnly": true,
|
|
10
|
+
"description": "An agent's free-text question, answered in place.\n\nThe answer is the caller's to deliver. The card reports it through\n`onAnswer` and says where it has got to from `delivery`: on its way, arrived,\nor not arrived. It never claims more than that.",
|
|
11
|
+
"props": [
|
|
12
|
+
{
|
|
13
|
+
"name": "question",
|
|
14
|
+
"type": "string",
|
|
15
|
+
"required": true,
|
|
16
|
+
"defaultValue": null,
|
|
17
|
+
"description": "What the agent asked, in its own words. It also names the answer field.",
|
|
18
|
+
"control": {
|
|
19
|
+
"kind": "string"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "context",
|
|
24
|
+
"type": "string",
|
|
25
|
+
"required": false,
|
|
26
|
+
"defaultValue": null,
|
|
27
|
+
"description": "A supporting line under the question: who is asking, or why.",
|
|
28
|
+
"control": {
|
|
29
|
+
"kind": "string"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "placeholder",
|
|
34
|
+
"type": "string",
|
|
35
|
+
"required": false,
|
|
36
|
+
"defaultValue": null,
|
|
37
|
+
"description": "The field's resting text. Defaults to `QUESTION_LABELS.placeholder`.",
|
|
38
|
+
"control": {
|
|
39
|
+
"kind": "string"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "answer",
|
|
44
|
+
"type": "string",
|
|
45
|
+
"required": false,
|
|
46
|
+
"defaultValue": null,
|
|
47
|
+
"description": "The answer as the caller holds it. Drawn as sent while `delivery` is\n`sending` or `sent`, and put back in the field when it is `failed`, so a\nretry is one press.",
|
|
48
|
+
"control": {
|
|
49
|
+
"kind": "string"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "delivery",
|
|
54
|
+
"type": "\"failed\" | \"sending\" | \"sent\"",
|
|
55
|
+
"required": false,
|
|
56
|
+
"defaultValue": null,
|
|
57
|
+
"description": "Where the answer has got to: `sending`, `sent` or `failed`. Unset while\nthe question is still waiting on the person.",
|
|
58
|
+
"control": {
|
|
59
|
+
"kind": "enum",
|
|
60
|
+
"members": [
|
|
61
|
+
"failed",
|
|
62
|
+
"sending",
|
|
63
|
+
"sent"
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"name": "onAnswer",
|
|
69
|
+
"type": "((answer: string) => void)",
|
|
70
|
+
"required": false,
|
|
71
|
+
"defaultValue": null,
|
|
72
|
+
"description": "Called with the typed answer, trimmed, when the person sends it.",
|
|
73
|
+
"control": {
|
|
74
|
+
"kind": "callback",
|
|
75
|
+
"fixture": "callback.log"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"name": "onDismiss",
|
|
80
|
+
"type": "(() => void)",
|
|
81
|
+
"required": false,
|
|
82
|
+
"defaultValue": null,
|
|
83
|
+
"description": "Called when the person skips the question. Skip is drawn only when this is set.",
|
|
84
|
+
"control": {
|
|
85
|
+
"kind": "callback",
|
|
86
|
+
"fixture": "callback.log"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "labels",
|
|
91
|
+
"type": "Partial<QuestionLabels>",
|
|
92
|
+
"required": false,
|
|
93
|
+
"defaultValue": null,
|
|
94
|
+
"description": "Replace any of the card's own copy.",
|
|
95
|
+
"control": {
|
|
96
|
+
"kind": "opaque"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
"typeReferences": [
|
|
101
|
+
"Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\" | \"onSubmit\">"
|
|
102
|
+
],
|
|
103
|
+
"subcomponents": [],
|
|
104
|
+
"parts": [],
|
|
105
|
+
"variants": {},
|
|
106
|
+
"defaultVariants": {},
|
|
107
|
+
"tokensUsed": [
|
|
108
|
+
"--cue-fg",
|
|
109
|
+
"--cue-fg-muted",
|
|
110
|
+
"--cue-fg-subtle",
|
|
111
|
+
"--cue-focus",
|
|
112
|
+
"--cue-focus-ring",
|
|
113
|
+
"--cue-radius-overlay",
|
|
114
|
+
"--cue-radius-surface",
|
|
115
|
+
"--cue-style-focus-width",
|
|
116
|
+
"--cue-surface-1",
|
|
117
|
+
"--cue-surface-2",
|
|
118
|
+
"--cue-text-body",
|
|
119
|
+
"--cue-text-ui"
|
|
120
|
+
],
|
|
121
|
+
"summary": "An agent's free-text question, answered in place, with where the answer has got to.",
|
|
122
|
+
"examples": [
|
|
123
|
+
{
|
|
124
|
+
"title": "Usage",
|
|
125
|
+
"code": "import { QuestionCard } from \"@cueplusplus/ui/elements\";\n\n<QuestionCard\n question=\"Which branch should I deploy?\"\n context=\"Asked by the release agent\"\n onAnswer={(text) => reply(request.id, text)}\n/>\n// While the answer travels, the card shows it and takes no other.\n<QuestionCard question=\"Which branch?\" answer=\"main\" delivery=\"sending\" />",
|
|
126
|
+
"language": "tsx"
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
"status": "stable",
|
|
130
|
+
"url": "/docs/components/question-card",
|
|
131
|
+
"mdUrl": "/docs/components/question-card.md",
|
|
132
|
+
"jsonUrl": "/r/components/question-card.json",
|
|
133
|
+
"whenToUse": [
|
|
134
|
+
"An agent asking something whose answer is a sentence: which branch, what to call the release, what the user meant.",
|
|
135
|
+
"Relaying a remote agent, where the answer can be on its way, arrive, or fail. `delivery` says which."
|
|
136
|
+
],
|
|
137
|
+
"whenNotToUse": [
|
|
138
|
+
"A question with typed fields, such as a repository, a toggle or a choice. `ElicitationForm` draws those.",
|
|
139
|
+
"A yes or no about running something. `ApprovalCard` draws the decision as buttons."
|
|
140
|
+
],
|
|
141
|
+
"commonMistakes": [
|
|
142
|
+
"Setting `delivery` to `sent` and treating the question as answered by the agent. Sent says the answer arrived, nothing more.",
|
|
143
|
+
"Dropping `answer` when delivery fails. Pass it back, and the field holds it again so the retry is one press."
|
|
144
|
+
],
|
|
145
|
+
"specimens": [
|
|
146
|
+
{
|
|
147
|
+
"title": "QuestionCard",
|
|
148
|
+
"group": "elements",
|
|
149
|
+
"components": [
|
|
150
|
+
"QuestionCard"
|
|
151
|
+
],
|
|
152
|
+
"code": "<Specimens>\n <Specimen label=\"asking\" wide>\n <LiveQuestion />\n </Specimen>\n <Specimen label=\"sending\" wide>\n <QuestionCard\n question=\"Which universe holds the house lights?\"\n answer=\"Universe 1, channels 1 to 12\"\n delivery=\"sending\"\n />\n </Specimen>\n <Specimen label=\"not sent\" wide>\n <QuestionCard\n question=\"Which universe holds the house lights?\"\n answer=\"Universe 1, channels 1 to 12\"\n delivery=\"failed\"\n onAnswer={() => {}}\n />\n </Specimen>\n</Specimens>",
|
|
153
|
+
"note": "An agent's free-text question, answered in place. The answer is the caller's to deliver: the card reports it and says where it has got to. While it travels the card shows it and takes no other, and a failed delivery keeps what was typed, so sending again is one press.",
|
|
154
|
+
"interaction": "type an answer and press Enter to send it; Shift+Enter breaks the line. The first card is live and shows its answer as sent. Skip is drawn only when the question can be skipped."
|
|
155
|
+
}
|
|
156
|
+
]
|
|
157
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"react-resizable-panels"
|
|
8
8
|
],
|
|
9
9
|
"clientOnly": true,
|
|
10
|
-
"description": "Split panes the user can drag, on `react-resizable-panels`.\n\n`react-resizable-panels` is an **optional peer**: import this from\n`@cueplusplus/ui/layout/resizable`, never from the core barrel, so an app\nwith no split view never installs one.",
|
|
10
|
+
"description": "Split panes the user can drag, on `react-resizable-panels`.\n\n`react-resizable-panels` is an **optional peer**: import this from\n`@cueplusplus/ui/layout/resizable`, never from the core barrel, so an app\nwith no split view never installs one. For one seam beside one pane,\n`PaneSeam` in the core barrel needs no peer at all.",
|
|
11
11
|
"props": [],
|
|
12
12
|
"typeReferences": [],
|
|
13
13
|
"subcomponents": [
|
|
@@ -66,7 +66,9 @@
|
|
|
66
66
|
"parts": [],
|
|
67
67
|
"variants": {},
|
|
68
68
|
"defaultVariants": {},
|
|
69
|
-
"tokensUsed": [
|
|
69
|
+
"tokensUsed": [
|
|
70
|
+
"--cue-reveal-distance"
|
|
71
|
+
],
|
|
70
72
|
"summary": "Content that rises into place the first time it scrolls into view, once — cueplusplus.com's section entrance, with an optional stagger over the items you mark.",
|
|
71
73
|
"examples": [
|
|
72
74
|
{
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "SplitPane",
|
|
3
|
+
"slug": "split-pane",
|
|
4
|
+
"group": "layout",
|
|
5
|
+
"importPath": "@cueplusplus/ui",
|
|
6
|
+
"peerDependencies": [],
|
|
7
|
+
"clientOnly": true,
|
|
8
|
+
"description": "A list beside its detail, which stacks into a drill-in when narrow (#102).\n\nThe master-detail opinion on top of {@link PaneSeam}. Side by side while\nthe detail would be at least twice the list, measured on the frame rather\nthan the window, so it works in any column. Below that it stacks the way a\nphone does: the list, or the detail with a Back button, and Escape inside the\ndetail goes back too. `detailOpen` says which shows; selection and the list's\nown keyboard stay with the list.\n\nThe frame measures itself with a `ResizeObserver` and draws side by side\nuntil it has, so a server render and a browser without one get the split.",
|
|
9
|
+
"props": [
|
|
10
|
+
{
|
|
11
|
+
"name": "list",
|
|
12
|
+
"type": "ReactNode",
|
|
13
|
+
"required": true,
|
|
14
|
+
"defaultValue": null,
|
|
15
|
+
"description": "The master: a list of rows, a tree, a feed. It owns its own keyboard.",
|
|
16
|
+
"control": {
|
|
17
|
+
"kind": "node",
|
|
18
|
+
"fixture": "children.text"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"name": "detail",
|
|
23
|
+
"type": "ReactNode",
|
|
24
|
+
"required": true,
|
|
25
|
+
"defaultValue": null,
|
|
26
|
+
"description": "The detail for whatever the list has selected.",
|
|
27
|
+
"control": {
|
|
28
|
+
"kind": "node",
|
|
29
|
+
"fixture": "children.text"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "listLabel",
|
|
34
|
+
"type": "string",
|
|
35
|
+
"required": true,
|
|
36
|
+
"defaultValue": null,
|
|
37
|
+
"description": "What the list is, in a word or two: `events`. It names the seam (`Resize\nthe events`), the Back button (`Back to events`) and the fold (`Hide\nevents`), so each control says what it acts on.",
|
|
38
|
+
"control": {
|
|
39
|
+
"kind": "string"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "listSize",
|
|
44
|
+
"type": "number",
|
|
45
|
+
"required": false,
|
|
46
|
+
"defaultValue": null,
|
|
47
|
+
"description": "The list's width in pixels, when the caller holds it.",
|
|
48
|
+
"control": {
|
|
49
|
+
"kind": "number"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "defaultListSize",
|
|
54
|
+
"type": "number",
|
|
55
|
+
"required": false,
|
|
56
|
+
"defaultValue": "320",
|
|
57
|
+
"description": "The list's starting width when nothing controls it. Defaults to 320.",
|
|
58
|
+
"control": {
|
|
59
|
+
"kind": "number"
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "onListSizeChange",
|
|
64
|
+
"type": "((size: number) => void)",
|
|
65
|
+
"required": false,
|
|
66
|
+
"defaultValue": null,
|
|
67
|
+
"description": "Called with every new list width, clamped to `minListSize` and `maxListSize`.",
|
|
68
|
+
"control": {
|
|
69
|
+
"kind": "callback",
|
|
70
|
+
"fixture": "callback.log"
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"name": "minListSize",
|
|
75
|
+
"type": "number",
|
|
76
|
+
"required": false,
|
|
77
|
+
"defaultValue": "200",
|
|
78
|
+
"description": "The narrowest the list may be dragged, in pixels. Defaults to 200.",
|
|
79
|
+
"control": {
|
|
80
|
+
"kind": "number"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"name": "maxListSize",
|
|
85
|
+
"type": "number",
|
|
86
|
+
"required": false,
|
|
87
|
+
"defaultValue": "480",
|
|
88
|
+
"description": "The widest the list may be dragged, in pixels. Defaults to 480.",
|
|
89
|
+
"control": {
|
|
90
|
+
"kind": "number"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"name": "stackBelow",
|
|
95
|
+
"type": "number",
|
|
96
|
+
"required": false,
|
|
97
|
+
"defaultValue": null,
|
|
98
|
+
"description": "The frame width, in pixels, below which the panes stack. Unset, they stack\nonce the detail would be narrower than twice the list.",
|
|
99
|
+
"control": {
|
|
100
|
+
"kind": "number"
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"name": "detailOpen",
|
|
105
|
+
"type": "boolean",
|
|
106
|
+
"required": false,
|
|
107
|
+
"defaultValue": "false",
|
|
108
|
+
"description": "Which pane shows when stacked: the detail when `true`, the list when not.\nSide by side, both always show.",
|
|
109
|
+
"control": {
|
|
110
|
+
"kind": "boolean"
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"name": "onBack",
|
|
115
|
+
"type": "(() => void)",
|
|
116
|
+
"required": false,
|
|
117
|
+
"defaultValue": null,
|
|
118
|
+
"description": "Called by the stacked detail's Back button and by Escape inside it.",
|
|
119
|
+
"control": {
|
|
120
|
+
"kind": "callback",
|
|
121
|
+
"fixture": "callback.log"
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"name": "collapsible",
|
|
126
|
+
"type": "boolean",
|
|
127
|
+
"required": false,
|
|
128
|
+
"defaultValue": "false",
|
|
129
|
+
"description": "Whether the list can fold to a thin tab while side by side.",
|
|
130
|
+
"control": {
|
|
131
|
+
"kind": "boolean"
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"name": "collapsed",
|
|
136
|
+
"type": "boolean",
|
|
137
|
+
"required": false,
|
|
138
|
+
"defaultValue": null,
|
|
139
|
+
"description": "Whether the list is folded, when the caller holds it.",
|
|
140
|
+
"control": {
|
|
141
|
+
"kind": "boolean"
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"name": "defaultCollapsed",
|
|
146
|
+
"type": "boolean",
|
|
147
|
+
"required": false,
|
|
148
|
+
"defaultValue": "false",
|
|
149
|
+
"description": "Whether the list starts folded when nothing controls it.",
|
|
150
|
+
"control": {
|
|
151
|
+
"kind": "boolean"
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"name": "onCollapsedChange",
|
|
156
|
+
"type": "((collapsed: boolean) => void)",
|
|
157
|
+
"required": false,
|
|
158
|
+
"defaultValue": null,
|
|
159
|
+
"description": "Called when the list folds (`true`) or opens (`false`).",
|
|
160
|
+
"control": {
|
|
161
|
+
"kind": "callback",
|
|
162
|
+
"fixture": "callback.log"
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
"typeReferences": [
|
|
167
|
+
"Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\">"
|
|
168
|
+
],
|
|
169
|
+
"subcomponents": [],
|
|
170
|
+
"parts": [],
|
|
171
|
+
"variants": {},
|
|
172
|
+
"defaultVariants": {},
|
|
173
|
+
"tokensUsed": [
|
|
174
|
+
"--cue-border",
|
|
175
|
+
"--cue-fg",
|
|
176
|
+
"--cue-fg-muted",
|
|
177
|
+
"--cue-focus",
|
|
178
|
+
"--cue-focus-ring",
|
|
179
|
+
"--cue-radius-control",
|
|
180
|
+
"--cue-space-1",
|
|
181
|
+
"--cue-space-2",
|
|
182
|
+
"--cue-space-6",
|
|
183
|
+
"--cue-style-focus-width",
|
|
184
|
+
"--cue-surface-2",
|
|
185
|
+
"--cue-text-ui"
|
|
186
|
+
],
|
|
187
|
+
"summary": "A list beside its detail, stacking into a drill-in with Back when the frame is narrow.",
|
|
188
|
+
"examples": [
|
|
189
|
+
{
|
|
190
|
+
"title": "Usage",
|
|
191
|
+
"code": "const [selected, setSelected] = React.useState<string | null>(null);\n\n<SplitPane\n listLabel=\"events\"\n list={<EventFeed events={events} selectedId={selected} onSelect={setSelected} />}\n detail={selected ? <EventDetail id={selected} /> : <EmptyState title=\"Pick an event\" />}\n detailOpen={selected !== null}\n onBack={() => setSelected(null)}\n collapsible\n/>",
|
|
192
|
+
"language": "tsx"
|
|
193
|
+
}
|
|
194
|
+
],
|
|
195
|
+
"status": "stable",
|
|
196
|
+
"url": "/docs/components/split-pane",
|
|
197
|
+
"mdUrl": "/docs/components/split-pane.md",
|
|
198
|
+
"jsonUrl": "/r/components/split-pane.json",
|
|
199
|
+
"whenToUse": [
|
|
200
|
+
"A list and an inspector: events, logs, jobs, an inbox, an MCP catalogue.",
|
|
201
|
+
"One layout for a wide console and a narrow column. It measures its own frame, so it stacks inside a sidebar as readily as on a phone."
|
|
202
|
+
],
|
|
203
|
+
"whenNotToUse": [
|
|
204
|
+
"Two panes that are equals rather than a list and its detail. Use `Resizable`.",
|
|
205
|
+
"A single side pane with no stacking. `PaneSeam` alone is lighter."
|
|
206
|
+
],
|
|
207
|
+
"commonMistakes": [
|
|
208
|
+
"Leaving `detailOpen` true with nothing selected. When stacked, it decides which pane shows, so tie it to the selection.",
|
|
209
|
+
"Omitting `onBack`. When stacked, Back and Escape are the only ways out of the detail, and both call it.",
|
|
210
|
+
"A `listLabel` that is a sentence. It is spliced into three controls (`Resize the …`, `Back to …`, `Hide …`), so give it a noun: `events`."
|
|
211
|
+
],
|
|
212
|
+
"specimens": [
|
|
213
|
+
{
|
|
214
|
+
"title": "SplitPane",
|
|
215
|
+
"group": "layout",
|
|
216
|
+
"components": [
|
|
217
|
+
"SplitPane"
|
|
218
|
+
],
|
|
219
|
+
"code": "<Specimens>\n <Specimen label=\"side by side\" wide>\n <SplitPane\n listLabel=\"cues\"\n defaultListSize={180}\n minListSize={140}\n maxListSize={260}\n collapsible\n detailOpen={cue !== null}\n onBack={() => setCue(null)}\n list={cueList}\n detail={cueDetail}\n className=\"h-[11rem] w-full max-w-[36rem] overflow-hidden rounded-(--radius-surface) border border-border\"\n />\n </Specimen>\n <Specimen label=\"stacked, under twice the list\" wide>\n <SplitPane\n listLabel=\"cues\"\n defaultListSize={180}\n detailOpen={cue !== null}\n onBack={() => setCue(null)}\n list={cueList}\n detail={cueDetail}\n className=\"h-[11rem] w-full max-w-[22rem] overflow-hidden rounded-(--radius-surface) border border-border\"\n />\n </Specimen>\n</Specimens>",
|
|
220
|
+
"note": "A list beside its detail, on PaneSeam. Side by side while the detail is at least twice the list, measured on the frame, not the window; below that it stacks like a phone, the list or the detail with Back. Both specimens share one selection: the wide one splits, and the narrow one is the same split stacked.",
|
|
221
|
+
"interaction": "pick a cue. In the narrow frame that opens the detail, and Back or Escape returns to the list. In the wide frame drag or arrow the seam, or fold the list to its tab with the chevron."
|
|
222
|
+
}
|
|
223
|
+
]
|
|
224
|
+
}
|
|
@@ -62,13 +62,58 @@
|
|
|
62
62
|
{
|
|
63
63
|
"name": "running",
|
|
64
64
|
"type": "boolean",
|
|
65
|
-
"required":
|
|
65
|
+
"required": false,
|
|
66
66
|
"defaultValue": null,
|
|
67
67
|
"description": "When true a spinner replaces the success check on the trigger.",
|
|
68
68
|
"control": {
|
|
69
69
|
"kind": "boolean"
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
|
+
{
|
|
73
|
+
"name": "state",
|
|
74
|
+
"type": "\"done\" | \"failed\" | \"running\" | \"refused\"",
|
|
75
|
+
"required": false,
|
|
76
|
+
"defaultValue": null,
|
|
77
|
+
"description": "Where the call got to: `running`, `done`, `failed` or `refused`. Each settled\nstate ends the row with its own mark. Supersedes `running`.",
|
|
78
|
+
"control": {
|
|
79
|
+
"kind": "enum",
|
|
80
|
+
"members": [
|
|
81
|
+
"done",
|
|
82
|
+
"failed",
|
|
83
|
+
"running",
|
|
84
|
+
"refused"
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "variant",
|
|
90
|
+
"type": "\"inline\" | \"card\"",
|
|
91
|
+
"required": false,
|
|
92
|
+
"defaultValue": "card",
|
|
93
|
+
"description": "`card` (the default) or `inline`, a denser row that spans its column, for a\ntranscript of many calls.",
|
|
94
|
+
"control": {
|
|
95
|
+
"kind": "enum",
|
|
96
|
+
"members": [
|
|
97
|
+
"inline",
|
|
98
|
+
"card"
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"name": "absence",
|
|
104
|
+
"type": "\"none\" | \"refused\" | \"unanswered\"",
|
|
105
|
+
"required": false,
|
|
106
|
+
"defaultValue": null,
|
|
107
|
+
"description": "What an empty `result` means: `none` (it returned nothing), `refused` or\n`unanswered`. Read only when `result` is empty.",
|
|
108
|
+
"control": {
|
|
109
|
+
"kind": "enum",
|
|
110
|
+
"members": [
|
|
111
|
+
"none",
|
|
112
|
+
"refused",
|
|
113
|
+
"unanswered"
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
},
|
|
72
117
|
{
|
|
73
118
|
"name": "open",
|
|
74
119
|
"type": "boolean",
|
|
@@ -113,7 +158,6 @@
|
|
|
113
158
|
"--cue-focus",
|
|
114
159
|
"--cue-focus-ring",
|
|
115
160
|
"--cue-font-mono",
|
|
116
|
-
"--cue-ok",
|
|
117
161
|
"--cue-radius-control",
|
|
118
162
|
"--cue-radius-overlay",
|
|
119
163
|
"--cue-style-focus-width",
|
|
@@ -50,10 +50,24 @@
|
|
|
50
50
|
"kind": "callback",
|
|
51
51
|
"fixture": "callback.log"
|
|
52
52
|
}
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "variant",
|
|
56
|
+
"type": "\"inline\" | \"card\"",
|
|
57
|
+
"required": false,
|
|
58
|
+
"defaultValue": "card",
|
|
59
|
+
"description": "`card` (the default) or `inline`, a row in its column without the paper, for a\ntranscript of many groups.",
|
|
60
|
+
"control": {
|
|
61
|
+
"kind": "enum",
|
|
62
|
+
"members": [
|
|
63
|
+
"inline",
|
|
64
|
+
"card"
|
|
65
|
+
]
|
|
66
|
+
}
|
|
53
67
|
}
|
|
54
68
|
],
|
|
55
69
|
"typeReferences": [
|
|
56
|
-
"Omit<\n ComponentProps<\"div\">,\n \"children\" | \"label\" | \"tools\" | \"open\" | \"onOpenChange\"\n> & {\n /** What the group did, as one line. */\n label: string;\n /**\n * Calls issued together. The header summarizes them: progress while any run,\n * failures if any failed, otherwise the count.\n */\n tools: readonly GroupedTool[];\n /** Whether the per-call list is expanded. */\n open: boolean;\n /** Called when the group is expanded or collapsed. */\n onOpenChange?: (open: boolean) => void;\n}"
|
|
70
|
+
"Omit<\n ComponentProps<\"div\">,\n \"children\" | \"label\" | \"tools\" | \"open\" | \"onOpenChange\"\n> & {\n /** What the group did, as one line. */\n label: string;\n /**\n * Calls issued together. The header summarizes them: progress while any run,\n * failures if any failed, otherwise the count.\n */\n tools: readonly GroupedTool[];\n /** Whether the per-call list is expanded. */\n open: boolean;\n /** Called when the group is expanded or collapsed. */\n onOpenChange?: (open: boolean) => void;\n /**\n * `card` (the default) or `inline`, a row in its column without the paper, for a\n * transcript of many groups.\n */\n variant?: \"card\" | \"inline\";\n}"
|
|
57
71
|
],
|
|
58
72
|
"subcomponents": [],
|
|
59
73
|
"parts": [],
|
|
@@ -61,10 +75,8 @@
|
|
|
61
75
|
"defaultVariants": {},
|
|
62
76
|
"tokensUsed": [
|
|
63
77
|
"--cue-border",
|
|
64
|
-
"--cue-danger",
|
|
65
78
|
"--cue-fg-muted",
|
|
66
79
|
"--cue-fg-subtle",
|
|
67
|
-
"--cue-ok",
|
|
68
80
|
"--cue-radius-overlay",
|
|
69
81
|
"--cue-surface-1",
|
|
70
82
|
"--cue-text-body"
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "UnsupportedRequestCard",
|
|
3
|
+
"slug": "unsupported-request-card",
|
|
4
|
+
"group": "elements",
|
|
5
|
+
"importPath": "@cueplusplus/ui/elements",
|
|
6
|
+
"peerDependencies": [
|
|
7
|
+
"lucide-react"
|
|
8
|
+
],
|
|
9
|
+
"clientOnly": true,
|
|
10
|
+
"description": "A request this client cannot answer, said plainly, with no answer offered.",
|
|
11
|
+
"props": [
|
|
12
|
+
{
|
|
13
|
+
"name": "title",
|
|
14
|
+
"type": "string",
|
|
15
|
+
"required": true,
|
|
16
|
+
"defaultValue": null,
|
|
17
|
+
"description": "What the agent asked for, in its words: `Pick a file`, `Open a browser`.",
|
|
18
|
+
"control": {
|
|
19
|
+
"kind": "string"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "kind",
|
|
24
|
+
"type": "string",
|
|
25
|
+
"required": false,
|
|
26
|
+
"defaultValue": null,
|
|
27
|
+
"description": "The request's kind as the protocol names it, printed in mono so it can be reported.",
|
|
28
|
+
"control": {
|
|
29
|
+
"kind": "string"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "detail",
|
|
34
|
+
"type": "string",
|
|
35
|
+
"required": false,
|
|
36
|
+
"defaultValue": null,
|
|
37
|
+
"description": "A supporting line: which agent asked, or what it was doing.",
|
|
38
|
+
"control": {
|
|
39
|
+
"kind": "string"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "onDismiss",
|
|
44
|
+
"type": "(() => void)",
|
|
45
|
+
"required": false,
|
|
46
|
+
"defaultValue": null,
|
|
47
|
+
"description": "Called when the person clears the card. Dismiss is drawn only when this is set.",
|
|
48
|
+
"control": {
|
|
49
|
+
"kind": "callback",
|
|
50
|
+
"fixture": "callback.log"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"name": "labels",
|
|
55
|
+
"type": "Partial<UnsupportedRequestLabels>",
|
|
56
|
+
"required": false,
|
|
57
|
+
"defaultValue": null,
|
|
58
|
+
"description": "Replace any of the card's own copy.",
|
|
59
|
+
"control": {
|
|
60
|
+
"kind": "opaque"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"typeReferences": [
|
|
65
|
+
"Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\">"
|
|
66
|
+
],
|
|
67
|
+
"subcomponents": [],
|
|
68
|
+
"parts": [],
|
|
69
|
+
"variants": {},
|
|
70
|
+
"defaultVariants": {},
|
|
71
|
+
"tokensUsed": [
|
|
72
|
+
"--cue-fg",
|
|
73
|
+
"--cue-fg-muted",
|
|
74
|
+
"--cue-fg-subtle",
|
|
75
|
+
"--cue-radius-overlay",
|
|
76
|
+
"--cue-radius-surface",
|
|
77
|
+
"--cue-surface-1",
|
|
78
|
+
"--cue-surface-2",
|
|
79
|
+
"--cue-text-body",
|
|
80
|
+
"--cue-text-ui"
|
|
81
|
+
],
|
|
82
|
+
"summary": "A request this app cannot answer, said plainly, with no answer offered.",
|
|
83
|
+
"examples": [
|
|
84
|
+
{
|
|
85
|
+
"title": "Usage",
|
|
86
|
+
"code": "import { UnsupportedRequestCard } from \"@cueplusplus/ui/elements\";\n\n<UnsupportedRequestCard\n title=\"Pick a file\"\n kind=\"file-picker\"\n detail=\"Asked by the coding agent\"\n onDismiss={() => dismiss(request.id)}\n/>",
|
|
87
|
+
"language": "tsx"
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
"status": "stable",
|
|
91
|
+
"url": "/docs/components/unsupported-request-card",
|
|
92
|
+
"mdUrl": "/docs/components/unsupported-request-card.md",
|
|
93
|
+
"jsonUrl": "/r/components/unsupported-request-card.json",
|
|
94
|
+
"whenToUse": [
|
|
95
|
+
"An agent request your client has no way to fulfil: a file picker, a browser session, or a request kind newer than the client.",
|
|
96
|
+
"Keeping the transcript honest. The request stays visible, and `kind` names it so the person can report it."
|
|
97
|
+
],
|
|
98
|
+
"whenNotToUse": [
|
|
99
|
+
"A request you can answer but have not built yet. Answer it with `ApprovalCard`, `QuestionCard` or `ElicitationForm` rather than calling it unsupported."
|
|
100
|
+
],
|
|
101
|
+
"commonMistakes": [
|
|
102
|
+
"Drawing an unsupported request as an approval or a question. A button the client cannot deliver is a false statement.",
|
|
103
|
+
"Leaving `kind` off. It is the one detail the person can pass on to whoever runs the agent."
|
|
104
|
+
],
|
|
105
|
+
"specimens": [
|
|
106
|
+
{
|
|
107
|
+
"title": "UnsupportedRequestCard",
|
|
108
|
+
"group": "elements",
|
|
109
|
+
"components": [
|
|
110
|
+
"UnsupportedRequestCard"
|
|
111
|
+
],
|
|
112
|
+
"code": "<Specimens>\n <Specimen label=\"with dismiss\" wide>\n <UnsupportedRequestCard\n title=\"Pick a show file\"\n kind=\"file-picker\"\n detail=\"Asked by the patcher\"\n onDismiss={() => {}}\n />\n </Specimen>\n <Specimen label=\"nothing to press\" wide>\n <UnsupportedRequestCard title=\"Open a browser\" kind=\"browser-session\" />\n </Specimen>\n</Specimens>",
|
|
113
|
+
"note": "A request this app cannot answer, said plainly and with nothing offered. A card drawn as an approval or a question would invite an answer nothing can deliver. The request's kind is printed in mono, so a reader can name it to whoever runs the agent.",
|
|
114
|
+
"interaction": "Dismiss is drawn only when the caller can clear the card."
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
}
|
package/manifest/fixtures.json
CHANGED
|
@@ -686,6 +686,22 @@
|
|
|
686
686
|
"readonly QueuedFollowUp[]"
|
|
687
687
|
]
|
|
688
688
|
},
|
|
689
|
+
{
|
|
690
|
+
"id": "agents.feed",
|
|
691
|
+
"kind": "array",
|
|
692
|
+
"label": "5 run events",
|
|
693
|
+
"accepts": [
|
|
694
|
+
"readonly FeedEvent[]"
|
|
695
|
+
]
|
|
696
|
+
},
|
|
697
|
+
{
|
|
698
|
+
"id": "agents.feed-event",
|
|
699
|
+
"kind": "opaque",
|
|
700
|
+
"label": "One run event",
|
|
701
|
+
"accepts": [
|
|
702
|
+
"FeedEvent"
|
|
703
|
+
]
|
|
704
|
+
},
|
|
689
705
|
{
|
|
690
706
|
"id": "composer.attachment",
|
|
691
707
|
"kind": "opaque",
|