@cueplusplus/ui 0.10.0 → 0.11.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.
Files changed (113) hide show
  1. package/CHANGELOG.md +195 -0
  2. package/README.md +109 -3
  3. package/dist/chrome/index.d.ts +2 -1
  4. package/dist/chrome/index.js +3 -2
  5. package/dist/chrome/inspector.d.ts +61 -0
  6. package/dist/chrome/inspector.js +121 -0
  7. package/dist/elements/scroll-anchor.js +4 -2
  8. package/dist/forms/input.d.ts +12 -0
  9. package/dist/forms/textarea.d.ts +12 -0
  10. package/dist/forms/toggle.d.ts +6 -0
  11. package/dist/index.d.ts +4 -1
  12. package/dist/index.js +5 -2
  13. package/dist/instruments/code-block.d.ts +35 -0
  14. package/dist/instruments/code-block.js +173 -0
  15. package/dist/instruments/index.d.ts +2 -1
  16. package/dist/instruments/index.js +2 -1
  17. package/dist/layout/bento.js +1 -1
  18. package/dist/layout/index.d.ts +2 -1
  19. package/dist/layout/index.js +2 -1
  20. package/dist/layout/preview.d.ts +110 -0
  21. package/dist/layout/preview.js +459 -0
  22. package/dist/primitives/chip.d.ts +1 -1
  23. package/manifest/components/activity-graph.json +2 -1
  24. package/manifest/components/agent-card.json +2 -1
  25. package/manifest/components/agent-pile.json +2 -1
  26. package/manifest/components/background-inbox.json +2 -1
  27. package/manifest/components/breadcrumb.json +2 -1
  28. package/manifest/components/chart-tooltip-content.json +2 -1
  29. package/manifest/components/checkpoint-history.json +2 -1
  30. package/manifest/components/code-block.json +106 -0
  31. package/manifest/components/code-diff.json +2 -1
  32. package/manifest/components/combobox.json +2 -1
  33. package/manifest/components/comparison-card.json +2 -1
  34. package/manifest/components/composer-attachment-chip.json +2 -1
  35. package/manifest/components/composer-context.json +2 -1
  36. package/manifest/components/composer-model-item.json +2 -1
  37. package/manifest/components/composer-person-item.json +2 -1
  38. package/manifest/components/computer-use.json +2 -1
  39. package/manifest/components/confidence-marker.json +2 -1
  40. package/manifest/components/context-breakdown.json +2 -1
  41. package/manifest/components/context-usage.json +2 -1
  42. package/manifest/components/conversation-search.json +2 -1
  43. package/manifest/components/cost-meter.json +2 -1
  44. package/manifest/components/day-separator.json +2 -1
  45. package/manifest/components/document-reference.json +2 -1
  46. package/manifest/components/elements-command-palette.json +2 -1
  47. package/manifest/components/elements-timeline.json +2 -1
  48. package/manifest/components/elicitation-form.json +2 -1
  49. package/manifest/components/file-tree.json +2 -1
  50. package/manifest/components/flow-graph.json +4 -2
  51. package/manifest/components/frac.json +1 -1
  52. package/manifest/components/group-bar.json +2 -1
  53. package/manifest/components/inline-citation.json +2 -1
  54. package/manifest/components/input.json +20 -0
  55. package/manifest/components/inspector.json +199 -0
  56. package/manifest/components/job-progress.json +2 -1
  57. package/manifest/components/log-viewer.json +2 -1
  58. package/manifest/components/map-answer.json +2 -1
  59. package/manifest/components/math-block.json +1 -1
  60. package/manifest/components/mcp-server-panel.json +2 -1
  61. package/manifest/components/memory-chips.json +2 -1
  62. package/manifest/components/message-actions.json +2 -1
  63. package/manifest/components/message-attachments.json +2 -1
  64. package/manifest/components/message-queue.json +2 -1
  65. package/manifest/components/message-timing.json +2 -1
  66. package/manifest/components/meter.json +1 -1
  67. package/manifest/components/model-picker.json +2 -1
  68. package/manifest/components/multi-select.json +2 -1
  69. package/manifest/components/onboarding.json +2 -1
  70. package/manifest/components/password-input.json +20 -0
  71. package/manifest/components/preview.json +202 -0
  72. package/manifest/components/prompt-library.json +2 -1
  73. package/manifest/components/queue-dock.json +2 -1
  74. package/manifest/components/quote-reply.json +2 -1
  75. package/manifest/components/reasoning-effort.json +2 -1
  76. package/manifest/components/reasoning-panel.json +2 -1
  77. package/manifest/components/regenerate-menu.json +2 -1
  78. package/manifest/components/research-report.json +2 -1
  79. package/manifest/components/retrieval-chunks.json +2 -1
  80. package/manifest/components/reviewable-diff.json +2 -1
  81. package/manifest/components/schedule-card.json +2 -1
  82. package/manifest/components/score-breakdown.json +2 -1
  83. package/manifest/components/scroll-anchor.json +2 -1
  84. package/manifest/components/search-input.json +20 -0
  85. package/manifest/components/segmented-control.json +2 -1
  86. package/manifest/components/settings-panel.json +2 -1
  87. package/manifest/components/shared-conversation.json +2 -1
  88. package/manifest/components/sources.json +2 -1
  89. package/manifest/components/speaker-identity.json +2 -1
  90. package/manifest/components/spec-sheet.json +2 -1
  91. package/manifest/components/spectrum-visualizer.json +2 -1
  92. package/manifest/components/stepper.json +2 -1
  93. package/manifest/components/streaming-text.json +2 -1
  94. package/manifest/components/sub.json +1 -1
  95. package/manifest/components/subagent-list.json +4 -2
  96. package/manifest/components/sup.json +1 -1
  97. package/manifest/components/swap-label.json +2 -1
  98. package/manifest/components/textarea.json +20 -0
  99. package/manifest/components/thread-list.json +2 -1
  100. package/manifest/components/thread-search.json +2 -1
  101. package/manifest/components/todo-list.json +2 -1
  102. package/manifest/components/toggle.json +10 -0
  103. package/manifest/components/tool-group.json +2 -1
  104. package/manifest/components/trace-waterfall.json +2 -1
  105. package/manifest/components/tree.json +2 -1
  106. package/manifest/components/universe-grid.json +2 -1
  107. package/manifest/components/usage-chart.json +2 -1
  108. package/manifest/components/voice-conversation.json +2 -1
  109. package/manifest/components/web-search.json +2 -1
  110. package/manifest/fixtures.json +670 -0
  111. package/manifest/manifest.json +125 -86
  112. package/manifest/tokens.json +1 -1
  113. package/package.json +4 -4
@@ -27,7 +27,8 @@
27
27
  "defaultValue": null,
28
28
  "description": "Two or three options. More than that wants a table, not a comparison.",
29
29
  "control": {
30
- "kind": "array"
30
+ "kind": "array",
31
+ "fixture": "knowledge.fixture-options"
31
32
  }
32
33
  },
33
34
  {
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "The file this chip stands for.",
18
18
  "control": {
19
- "kind": "opaque"
19
+ "kind": "opaque",
20
+ "fixture": "composer.attachment"
20
21
  }
21
22
  },
22
23
  {
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "Where the window has gone, and how big it is.",
18
18
  "control": {
19
- "kind": "opaque"
19
+ "kind": "opaque",
20
+ "fixture": "composer.usage"
20
21
  }
21
22
  }
22
23
  ],
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "The model this row offers.",
18
18
  "control": {
19
- "kind": "opaque"
19
+ "kind": "opaque",
20
+ "fixture": "composer.model"
20
21
  }
21
22
  },
22
23
  {
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "The person this row would mention.",
18
18
  "control": {
19
- "kind": "opaque"
19
+ "kind": "opaque",
20
+ "fixture": "composer.person"
20
21
  }
21
22
  },
22
23
  {
@@ -26,7 +26,8 @@
26
26
  "defaultValue": null,
27
27
  "description": "Actions taken, in order. Each carries the coordinates the cursor moved to.",
28
28
  "control": {
29
- "kind": "array"
29
+ "kind": "array",
30
+ "fixture": "agents.clicks"
30
31
  }
31
32
  },
32
33
  {
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "The answer split into claims. Each is underlined according to how well it is\nsupported.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "knowledge.claims"
18
19
  }
19
20
  },
20
21
  {
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "What is occupying the window, in stacking order. Headroom is derived, not passed.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "agents.context"
18
19
  }
19
20
  },
20
21
  {
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "What is occupying the window, in the order it stacks in the bar. Headroom\nis derived from the limit, never passed.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "agents.window"
18
19
  }
19
20
  },
20
21
  {
@@ -26,7 +26,8 @@
26
26
  "defaultValue": null,
27
27
  "description": "Matches in document order. Each carries its own surrounding text so no lookup is\nneeded to render the preview.",
28
28
  "control": {
29
- "kind": "array"
29
+ "kind": "array",
30
+ "fixture": "composer.hits"
30
31
  }
31
32
  },
32
33
  {
@@ -34,7 +34,8 @@
34
34
  "defaultValue": null,
35
35
  "description": "Per-model breakdown, ordered largest first so the bar reads left to right.",
36
36
  "control": {
37
- "kind": "array"
37
+ "kind": "array",
38
+ "fixture": "agents.costs"
38
39
  }
39
40
  }
40
41
  ],
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "Turns in order. A separator is inserted wherever day changes from the previous\nmessage, so grouping needs no pre-processing.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "thread.days"
18
19
  }
19
20
  }
20
21
  ],
@@ -36,7 +36,8 @@
36
36
  "defaultValue": null,
37
37
  "description": "The passages the answer drew on, each pinned to a page.",
38
38
  "control": {
39
- "kind": "array"
39
+ "kind": "array",
40
+ "fixture": "knowledge.anchors"
40
41
  }
41
42
  },
42
43
  {
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "Everything runnable. Groups are derived from the entries and keep first-seen order.",
18
18
  "control": {
19
- "kind": "array"
19
+ "kind": "array",
20
+ "fixture": "composer.palette"
20
21
  }
21
22
  },
22
23
  {
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "Events in chronological order, past and scheduled together.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "agents.events"
18
19
  }
19
20
  },
20
21
  {
@@ -36,7 +36,8 @@
36
36
  "defaultValue": null,
37
37
  "description": "The schema the server sent, already resolved to display values.",
38
38
  "control": {
39
- "kind": "array"
39
+ "kind": "array",
40
+ "fixture": "composer.fields"
40
41
  }
41
42
  },
42
43
  {
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "Flat list in display order. Nesting comes from each node's depth, not from\nchildren arrays.",
18
18
  "control": {
19
- "kind": "array"
19
+ "kind": "array",
20
+ "fixture": "agent.touched-files"
20
21
  }
21
22
  },
22
23
  {
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "Every node with its grid position. Layout is explicit; the element runs no solver.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "agents.flow-nodes"
18
19
  }
19
20
  },
20
21
  {
@@ -24,7 +25,8 @@
24
25
  "defaultValue": null,
25
26
  "description": "Connections by node id. An edge dims until both of its ends are visible.",
26
27
  "control": {
27
- "kind": "array"
28
+ "kind": "array",
29
+ "fixture": "agents.flow-edges"
28
30
  }
29
31
  },
30
32
  {
@@ -58,7 +58,7 @@
58
58
  "Sub",
59
59
  "Sup"
60
60
  ],
61
- "code": "<Specimens>\n <Specimen label=\"worked through\" wide>\n <MathBlock label=\"illuminance at the deck\" steps={MATH} visibleSteps={MATH.length} />\n </Specimen>\n <Specimen label=\"first step only\" wide>\n <MathBlock steps={MATH} visibleSteps={1} />\n </Specimen>\n</Specimens>",
61
+ "code": "<Specimens>\n <Specimen label=\"worked through\" wide>\n <MathBlock label=\"illuminance at the deck\" steps={MATH} visibleSteps={3} />\n </Specimen>\n <Specimen label=\"first step only\" wide>\n <MathBlock steps={MATH} visibleSteps={1} />\n </Specimen>\n</Specimens>",
62
62
  "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.",
63
63
  "interaction": "none. Each step's note says what justified it, which is what turns three lines of algebra into an explanation."
64
64
  }
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "The slices, in display order.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "instruments.patch-groups"
18
19
  }
19
20
  },
20
21
  {
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "Sources attached to the numbered reference markers in the sentence.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "knowledge.citations"
18
19
  }
19
20
  },
20
21
  {
@@ -17,6 +17,16 @@
17
17
  "kind": "string"
18
18
  }
19
19
  },
20
+ {
21
+ "name": "aria-label",
22
+ "type": "string",
23
+ "required": false,
24
+ "defaultValue": null,
25
+ "description": "Accessible name for the input, when no `FieldLabel` names it. Declared here\nrather than left to the inherited attribute so the props table carries the\nrow: a bare input outside a `Field` has no other way to be named.",
26
+ "control": {
27
+ "kind": "string"
28
+ }
29
+ },
20
30
  {
21
31
  "name": "size",
22
32
  "type": "\"sm\" | \"md\" | \"lg\"",
@@ -31,6 +41,16 @@
31
41
  "lg"
32
42
  ]
33
43
  }
44
+ },
45
+ {
46
+ "name": "placeholder",
47
+ "type": "string",
48
+ "required": false,
49
+ "defaultValue": null,
50
+ "description": "An example of what goes in the field, shown while it is empty. Not a name:\nit disappears on the first keystroke, so pair it with `aria-label` or a\n`FieldLabel`. Declared for the props-table row, as `aria-label` is above.",
51
+ "control": {
52
+ "kind": "string"
53
+ }
34
54
  }
35
55
  ],
36
56
  "typeReferences": [
@@ -0,0 +1,199 @@
1
+ {
2
+ "name": "Inspector",
3
+ "slug": "inspector",
4
+ "group": "chrome",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "The shape a settings panel, a properties sidebar and a wrench menu share:\ntitled sections of label-and-control rows, with a footer.\n\nLayout and nothing else — the controls are the library's own. A section is\na group headed by a `SectionHeader`; a row is a label then its control, one\ncolumn in a narrow container and two from 18rem; the footer holds a quiet\nnote and one action.\n\n**Static markup — no hooks, no `\"use client\"`**, so a server page can draw\none. Labels are strings for the same reason: a row with no `htmlFor` lays its\nlabel on its control as `aria-label`, rather than pointing at an id nobody\nhas generated. The row itself carries no role.",
9
+ "props": [],
10
+ "typeReferences": [],
11
+ "subcomponents": [
12
+ "Root",
13
+ "Section",
14
+ "Row",
15
+ "Footer"
16
+ ],
17
+ "parts": [
18
+ {
19
+ "name": "Root",
20
+ "usage": "Inspector.Root",
21
+ "description": "The inspector's frame: a size container, so each row's columns follow the\ninspector's own width — a popover's, a sidebar's — and not the viewport's.\nIt holds the sections, then the footer.",
22
+ "props": [
23
+ {
24
+ "name": "children",
25
+ "type": "ReactNode",
26
+ "required": false,
27
+ "defaultValue": null,
28
+ "description": "The sections, then the footer.",
29
+ "control": {
30
+ "kind": "node",
31
+ "fixture": "children.text"
32
+ }
33
+ }
34
+ ],
35
+ "typeReferences": [
36
+ "React.ComponentPropsWithoutRef<\"div\">"
37
+ ]
38
+ },
39
+ {
40
+ "name": "Section",
41
+ "usage": "Inspector.Section",
42
+ "description": "One titled group of rows: a `SectionHeader` carrying its `label`, and a group named by the same words.",
43
+ "props": [
44
+ {
45
+ "name": "label",
46
+ "type": "string",
47
+ "required": true,
48
+ "defaultValue": null,
49
+ "description": "The section's title — \"Variants\", \"Stage\". Drawn by a `SectionHeader` and read as the group's name.",
50
+ "control": {
51
+ "kind": "string"
52
+ }
53
+ },
54
+ {
55
+ "name": "children",
56
+ "type": "ReactNode",
57
+ "required": false,
58
+ "defaultValue": null,
59
+ "description": "The section's rows.",
60
+ "control": {
61
+ "kind": "node",
62
+ "fixture": "children.text"
63
+ }
64
+ }
65
+ ],
66
+ "typeReferences": [
67
+ "React.ComponentPropsWithoutRef<\"div\">"
68
+ ]
69
+ },
70
+ {
71
+ "name": "Row",
72
+ "usage": "Inspector.Row",
73
+ "description": "One label and its control: one column in a narrow inspector, two from 18rem.\nWith `htmlFor` the label is a `<label>` for that control; without it the\nlabel is laid on the control as its `aria-label`, unless the control already\nnames itself. The row carries no role.",
74
+ "props": [
75
+ {
76
+ "name": "label",
77
+ "type": "string",
78
+ "required": true,
79
+ "defaultValue": null,
80
+ "description": "What the control sets — \"Size\", \"Theme\". Drawn before it, and read as its\nname: a `<label>` for it when `htmlFor` is given, and otherwise laid on\nthe control as `aria-label`, unless the control already names itself.",
81
+ "control": {
82
+ "kind": "string"
83
+ }
84
+ },
85
+ {
86
+ "name": "htmlFor",
87
+ "type": "string",
88
+ "required": false,
89
+ "defaultValue": null,
90
+ "description": "The control's `id`, when it takes one: the label then becomes a `<label>` for it.",
91
+ "control": {
92
+ "kind": "string"
93
+ }
94
+ },
95
+ {
96
+ "name": "children",
97
+ "type": "ReactNode",
98
+ "required": false,
99
+ "defaultValue": null,
100
+ "description": "The control — one element, any of the library's own. A row names a single control.",
101
+ "control": {
102
+ "kind": "node",
103
+ "fixture": "children.text"
104
+ }
105
+ }
106
+ ],
107
+ "typeReferences": [
108
+ "React.ComponentPropsWithoutRef<\"div\">"
109
+ ]
110
+ },
111
+ {
112
+ "name": "Footer",
113
+ "usage": "Inspector.Footer",
114
+ "description": "The inspector's closing strip: a quiet `note` on the left and one `action` on the right, each drawn only when given.",
115
+ "props": [
116
+ {
117
+ "name": "note",
118
+ "type": "ReactNode",
119
+ "required": false,
120
+ "defaultValue": null,
121
+ "description": "A quiet line on the left: which preset this is, or that none matches.",
122
+ "control": {
123
+ "kind": "node",
124
+ "fixture": "children.text"
125
+ }
126
+ },
127
+ {
128
+ "name": "action",
129
+ "type": "ReactNode",
130
+ "required": false,
131
+ "defaultValue": null,
132
+ "description": "The footer's one action, on the right — by convention a small `Button`.",
133
+ "control": {
134
+ "kind": "node",
135
+ "fixture": "children.text"
136
+ }
137
+ }
138
+ ],
139
+ "typeReferences": [
140
+ "React.ComponentPropsWithoutRef<\"div\">"
141
+ ]
142
+ }
143
+ ],
144
+ "variants": {},
145
+ "defaultVariants": {},
146
+ "tokensUsed": [
147
+ "--cue-border",
148
+ "--cue-fg-muted",
149
+ "--cue-fg-subtle",
150
+ "--cue-font-mono",
151
+ "--cue-space-2",
152
+ "--cue-space-3",
153
+ "--cue-space-4",
154
+ "--cue-text-label",
155
+ "--cue-text-ui"
156
+ ],
157
+ "summary": "Titled sections of label-and-control rows, with a footer: the layout of a settings panel, a properties sidebar or a wrench menu.",
158
+ "examples": [
159
+ {
160
+ "title": "A wrench menu",
161
+ "code": "<Inspector.Root>\n <Inspector.Section label=\"Variants\">\n <Inspector.Row label=\"Size\">\n <SegmentedControl aria-label=\"Size\" items={sizes} defaultValue=\"md\" />\n </Inspector.Row>\n <Inspector.Row label=\"Label\" htmlFor=\"label\">\n <Input id=\"label\" defaultValue=\"Take cue\" />\n </Inspector.Row>\n </Inspector.Section>\n <Inspector.Footer note=\"preset · button-hero\" action={<Button size=\"sm\">Reset</Button>} />\n</Inspector.Root>",
162
+ "language": "tsx"
163
+ },
164
+ {
165
+ "title": "Usage",
166
+ "code": "<Inspector.Root>\n <Inspector.Section label=\"Variants\">\n <Inspector.Row label=\"Size\"><SegmentedControl items={sizes} /></Inspector.Row>\n <Inspector.Row label=\"Label\" htmlFor=\"label\"><Input id=\"label\" /></Inspector.Row>\n </Inspector.Section>\n <Inspector.Footer note=\"preset · button-hero\" action={<Button size=\"sm\">Reset</Button>} />\n</Inspector.Root>",
167
+ "language": "tsx"
168
+ }
169
+ ],
170
+ "status": "stable",
171
+ "url": "/docs/components/inspector",
172
+ "mdUrl": "/docs/components/inspector.md",
173
+ "jsonUrl": "/r/components/inspector.json",
174
+ "whenToUse": [
175
+ "A popover or sidebar that edits several properties of one thing, grouped under a few headings.",
176
+ "Any panel whose rows are a label and a control — the controls stay the library's own; this lays them out."
177
+ ],
178
+ "whenNotToUse": [
179
+ "A form someone submits. That is `Field` and its family, which carry validation and descriptions an inspector row does not.",
180
+ "A list of records. That is `Panel` with `Row`."
181
+ ],
182
+ "commonMistakes": [
183
+ "Leaving a text input's row without `htmlFor`. The row then lays its words on the input as `aria-label`, which names it but gives it no `<label>` to click — give the input an `id` and the row `htmlFor`.",
184
+ "Putting two controls in one row. A row names one control; two controls are two rows.",
185
+ "Nesting sections. An inspector is one level of headings; a section inside a section is a second panel."
186
+ ],
187
+ "specimens": [
188
+ {
189
+ "title": "Inspector",
190
+ "group": "chrome",
191
+ "components": [
192
+ "Inspector"
193
+ ],
194
+ "code": "<div className=\"w-full max-w-[20rem] rounded-(--radius-surface) border border-border bg-surface-2\">\n <Inspector.Root>\n {/*\n Data first, Variants second: `seedFromSpecimen` (`@repo/docgen`)\n takes each prop's first tag-order value across the whole bench,\n per prop name and not per row, so `defaults@Inspector.Row`'s\n `label` and `htmlFor` have to come off the same row to name a\n coherent pair — and `htmlFor` is only ever set on this one, the\n only row whose control is a single labelable element. Putting\n it first makes it that row for both props at once. Reordering\n Size and Icon ahead of it would seed `label: \"Size\"` (the first\n `Inspector.Row` tag) beside this row's `htmlFor`, pointing a\n `<label for>` at an id that scope's control never renders.\n */}\n <Inspector.Section label=\"Data\">\n <Inspector.Row label=\"Label\" htmlFor=\"inspector-bench-label\">\n <Input id=\"inspector-bench-label\" defaultValue=\"Take cue\" />\n </Inspector.Row>\n </Inspector.Section>\n <Inspector.Section label=\"Variants\">\n <Inspector.Row label=\"Size\">\n <SegmentedControl\n aria-label=\"Size\"\n size=\"sm\"\n items={[\n { value: \"sm\", label: \"sm\" },\n { value: \"md\", label: \"md\" },\n { value: \"lg\", label: \"lg\" },\n ]}\n defaultValue=\"md\"\n />\n </Inspector.Row>\n <Inspector.Row label=\"Icon\">\n <Switch aria-label=\"Icon\" defaultChecked />\n </Inspector.Row>\n </Inspector.Section>\n <Inspector.Footer\n note=\"preset · button-hero\"\n action={\n <Button size=\"sm\" variant=\"secondary\">\n Reset\n </Button>\n }\n />\n </Inspector.Root>\n</div>",
195
+ "note": "Titled sections of label-and-control rows, with a footer — the shape of a settings panel, a properties sidebar and the docs' wrench menu. Layout only: the controls are the ones you already use.",
196
+ "interaction": "nothing of its own takes focus. Each row's control is a real one: a row given `htmlFor` labels its control with a `<label>`, and one without lays its label on the control as `aria-label`. A row is never a group of its own."
197
+ }
198
+ ]
199
+ }
@@ -26,7 +26,8 @@
26
26
  "defaultValue": null,
27
27
  "description": "Stages with relative weights, so a long install does not read the same as a fast\nclone.",
28
28
  "control": {
29
- "kind": "array"
29
+ "kind": "array",
30
+ "fixture": "agents.stages"
30
31
  }
31
32
  },
32
33
  {
@@ -17,7 +17,8 @@
17
17
  "defaultValue": null,
18
18
  "description": "The buffer, oldest first.",
19
19
  "control": {
20
- "kind": "array"
20
+ "kind": "array",
21
+ "fixture": "instruments.art-net-log"
21
22
  }
22
23
  },
23
24
  {
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "Places in the answer, positioned as percentages so the element needs no tiles.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "knowledge.pins"
18
19
  }
19
20
  },
20
21
  {
@@ -74,7 +74,7 @@
74
74
  "Sub",
75
75
  "Sup"
76
76
  ],
77
- "code": "<Specimens>\n <Specimen label=\"worked through\" wide>\n <MathBlock label=\"illuminance at the deck\" steps={MATH} visibleSteps={MATH.length} />\n </Specimen>\n <Specimen label=\"first step only\" wide>\n <MathBlock steps={MATH} visibleSteps={1} />\n </Specimen>\n</Specimens>",
77
+ "code": "<Specimens>\n <Specimen label=\"worked through\" wide>\n <MathBlock label=\"illuminance at the deck\" steps={MATH} visibleSteps={3} />\n </Specimen>\n <Specimen label=\"first step only\" wide>\n <MathBlock steps={MATH} visibleSteps={1} />\n </Specimen>\n</Specimens>",
78
78
  "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.",
79
79
  "interaction": "none. Each step's note says what justified it, which is what turns three lines of algebra into an explanation."
80
80
  }
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "Every configured server, connected or not. The header counts how many are live.",
18
18
  "control": {
19
- "kind": "array"
19
+ "kind": "array",
20
+ "fixture": "composer.servers"
20
21
  }
21
22
  },
22
23
  {
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "What is remembered. Anything not marked existing is counted as new this turn and\ntinted.",
18
18
  "control": {
19
- "kind": "array"
19
+ "kind": "array",
20
+ "fixture": "composer.memory"
20
21
  }
21
22
  },
22
23
  {
@@ -26,7 +26,8 @@
26
26
  "defaultValue": null,
27
27
  "description": "Active thumbs reaction, or null when none is selected.",
28
28
  "control": {
29
- "kind": "opaque"
29
+ "kind": "opaque",
30
+ "fixture": "thread.reaction-up"
30
31
  }
31
32
  },
32
33
  {
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "Files carried by the message. Images render as a thumbnail row, everything else as\na chip.",
18
18
  "control": {
19
- "kind": "array"
19
+ "kind": "array",
20
+ "fixture": "thread.attachments"
20
21
  }
21
22
  },
22
23
  {
@@ -26,7 +26,8 @@
26
26
  "defaultValue": null,
27
27
  "description": "Turns waiting to send, in the order they will drain once the run finishes.",
28
28
  "control": {
29
- "kind": "array"
29
+ "kind": "array",
30
+ "fixture": "thread.queued"
30
31
  }
31
32
  },
32
33
  {
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "Label and value pairs, pre-formatted. Show fewer while streaming and the full set\nonce the turn settles.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "thread.timing"
18
19
  }
19
20
  },
20
21
  {
@@ -142,7 +142,7 @@
142
142
  "components": [
143
143
  "Meter"
144
144
  ],
145
- "code": "<Panel className=\"w-full max-w-[36rem]\">\n {CHANNELS.map((channel) => (\n <Row key={channel.name} className=\"gap-(--cue-space-4)\">\n <span className=\"w-[7rem] shrink-0 truncate\">{channel.name}</span>\n <Meter percent={channel.level} tone={channel.tone} className=\"flex-1\" />\n <span className=\"w-[3rem] shrink-0 text-right font-mono tabular-nums\">\n {channel.level}%\n </span>\n </Row>\n ))}\n <Row className=\"gap-(--cue-space-4)\">\n <span className=\"w-[7rem] shrink-0 truncate\">Pace tick</span>\n <Meter percent={64} paceTick={50} className=\"flex-1\" label=\"64% used, 50% of period elapsed\" />\n </Row>\n <Row className=\"gap-(--cue-space-4)\">\n <span className=\"w-[7rem] shrink-0 truncate\">Estimated</span>\n <Meter percent={40} provenance=\"estimated\" className=\"flex-1\" />\n </Row>\n <Row className=\"gap-(--cue-space-4)\">\n <span className=\"w-[7rem] shrink-0 truncate\">Unbounded</span>\n <Meter percent={0} provenance=\"unbounded\" className=\"flex-1\" />\n </Row>\n <Row className=\"gap-(--cue-space-4)\">\n <span className=\"w-[7rem] shrink-0 truncate\">No data</span>\n <Meter percent={0} empty className=\"flex-1\" />\n </Row>\n</Panel>",
145
+ "code": "<Panel className=\"w-full max-w-[36rem]\">\n {CHANNELS.map((channel) => (\n <Row key={channel.name} className=\"gap-(--cue-space-4)\">\n <span className=\"w-[7rem] shrink-0 truncate\">{channel.name}</span>\n <Meter percent={channel.level} tone={channel.tone} className=\"flex-1\" />\n <span className=\"w-[3rem] shrink-0 text-right font-mono tabular-nums\">\n {channel.level}%\n </span>\n </Row>\n ))}\n <Row className=\"gap-(--cue-space-4)\">\n <span className=\"w-[7rem] shrink-0 truncate\">Pace tick</span>\n <Meter percent={64} paceTick={0.6} className=\"flex-1\" label=\"64% used, 60% of period elapsed\" />\n </Row>\n <Row className=\"gap-(--cue-space-4)\">\n <span className=\"w-[7rem] shrink-0 truncate\">Estimated</span>\n <Meter percent={40} provenance=\"estimated\" className=\"flex-1\" />\n </Row>\n <Row className=\"gap-(--cue-space-4)\">\n <span className=\"w-[7rem] shrink-0 truncate\">Unbounded</span>\n <Meter percent={0} provenance=\"unbounded\" className=\"flex-1\" />\n </Row>\n <Row className=\"gap-(--cue-space-4)\">\n <span className=\"w-[7rem] shrink-0 truncate\">No data</span>\n <Meter percent={0} empty className=\"flex-1\" />\n </Row>\n</Panel>",
146
146
  "note": "Never invents a number: an unbounded meter draws no percentage, an empty one draws stripes rather than a zero, and an estimated ceiling is hatched so it cannot pass for a measurement.",
147
147
  "interaction": "the over-pace pulse stills under prefers-reduced-motion and stays readable as a data attribute."
148
148
  }
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "Every model on offer. Families are derived from the entries and keep their\nfirst-seen order.",
18
18
  "control": {
19
- "kind": "array"
19
+ "kind": "array",
20
+ "fixture": "composer.models"
20
21
  }
21
22
  },
22
23
  {
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "The rows, in display order. Base UI filters them against what is typed.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "forms.fixture-types"
18
19
  }
19
20
  },
20
21
  {
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "What to teach, in order. Three is usually the limit before it is skipped.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "composer.onboarding"
18
19
  }
19
20
  },
20
21
  {