@cueplusplus/ui 0.11.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 (86) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/elements/scroll-anchor.js +4 -2
  3. package/dist/primitives/chip.d.ts +1 -1
  4. package/manifest/components/activity-graph.json +2 -1
  5. package/manifest/components/agent-card.json +2 -1
  6. package/manifest/components/agent-pile.json +2 -1
  7. package/manifest/components/background-inbox.json +2 -1
  8. package/manifest/components/breadcrumb.json +2 -1
  9. package/manifest/components/chart-tooltip-content.json +2 -1
  10. package/manifest/components/checkpoint-history.json +2 -1
  11. package/manifest/components/code-diff.json +2 -1
  12. package/manifest/components/combobox.json +2 -1
  13. package/manifest/components/comparison-card.json +2 -1
  14. package/manifest/components/composer-attachment-chip.json +2 -1
  15. package/manifest/components/composer-context.json +2 -1
  16. package/manifest/components/composer-model-item.json +2 -1
  17. package/manifest/components/composer-person-item.json +2 -1
  18. package/manifest/components/computer-use.json +2 -1
  19. package/manifest/components/confidence-marker.json +2 -1
  20. package/manifest/components/context-breakdown.json +2 -1
  21. package/manifest/components/context-usage.json +2 -1
  22. package/manifest/components/conversation-search.json +2 -1
  23. package/manifest/components/cost-meter.json +2 -1
  24. package/manifest/components/day-separator.json +2 -1
  25. package/manifest/components/document-reference.json +2 -1
  26. package/manifest/components/elements-command-palette.json +2 -1
  27. package/manifest/components/elements-timeline.json +2 -1
  28. package/manifest/components/elicitation-form.json +2 -1
  29. package/manifest/components/file-tree.json +2 -1
  30. package/manifest/components/flow-graph.json +4 -2
  31. package/manifest/components/frac.json +1 -1
  32. package/manifest/components/group-bar.json +2 -1
  33. package/manifest/components/inline-citation.json +2 -1
  34. package/manifest/components/job-progress.json +2 -1
  35. package/manifest/components/log-viewer.json +2 -1
  36. package/manifest/components/map-answer.json +2 -1
  37. package/manifest/components/math-block.json +1 -1
  38. package/manifest/components/mcp-server-panel.json +2 -1
  39. package/manifest/components/memory-chips.json +2 -1
  40. package/manifest/components/message-actions.json +2 -1
  41. package/manifest/components/message-attachments.json +2 -1
  42. package/manifest/components/message-queue.json +2 -1
  43. package/manifest/components/message-timing.json +2 -1
  44. package/manifest/components/meter.json +1 -1
  45. package/manifest/components/model-picker.json +2 -1
  46. package/manifest/components/multi-select.json +2 -1
  47. package/manifest/components/onboarding.json +2 -1
  48. package/manifest/components/prompt-library.json +2 -1
  49. package/manifest/components/queue-dock.json +2 -1
  50. package/manifest/components/quote-reply.json +2 -1
  51. package/manifest/components/reasoning-effort.json +2 -1
  52. package/manifest/components/reasoning-panel.json +2 -1
  53. package/manifest/components/regenerate-menu.json +2 -1
  54. package/manifest/components/research-report.json +2 -1
  55. package/manifest/components/retrieval-chunks.json +2 -1
  56. package/manifest/components/reviewable-diff.json +2 -1
  57. package/manifest/components/schedule-card.json +2 -1
  58. package/manifest/components/score-breakdown.json +2 -1
  59. package/manifest/components/scroll-anchor.json +2 -1
  60. package/manifest/components/segmented-control.json +2 -1
  61. package/manifest/components/settings-panel.json +2 -1
  62. package/manifest/components/shared-conversation.json +2 -1
  63. package/manifest/components/sources.json +2 -1
  64. package/manifest/components/speaker-identity.json +2 -1
  65. package/manifest/components/spec-sheet.json +2 -1
  66. package/manifest/components/spectrum-visualizer.json +2 -1
  67. package/manifest/components/stepper.json +2 -1
  68. package/manifest/components/streaming-text.json +2 -1
  69. package/manifest/components/sub.json +1 -1
  70. package/manifest/components/subagent-list.json +4 -2
  71. package/manifest/components/sup.json +1 -1
  72. package/manifest/components/swap-label.json +2 -1
  73. package/manifest/components/thread-list.json +2 -1
  74. package/manifest/components/thread-search.json +2 -1
  75. package/manifest/components/todo-list.json +2 -1
  76. package/manifest/components/tool-group.json +2 -1
  77. package/manifest/components/trace-waterfall.json +2 -1
  78. package/manifest/components/tree.json +2 -1
  79. package/manifest/components/universe-grid.json +2 -1
  80. package/manifest/components/usage-chart.json +2 -1
  81. package/manifest/components/voice-conversation.json +2 -1
  82. package/manifest/components/web-search.json +2 -1
  83. package/manifest/fixtures.json +665 -0
  84. package/manifest/manifest.json +81 -81
  85. package/manifest/tokens.json +1 -1
  86. package/package.json +5 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,58 @@
1
1
  # @cueplusplus/ui
2
2
 
3
+ ## 0.11.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 8ddd141: The manifest's fixture catalogue grows from 18 entries to 106, and 76 props across 74 components
8
+ now name one in `control.fixture`. A code generator, playground or agent reading
9
+ `manifest/components/<name>.json` now finds a named sample for props such as `TodoList.items`,
10
+ `CodeDiff.lines`, `Combobox.items` and `Breadcrumb.items`, where before it found nothing to fill
11
+ them with.
12
+
13
+ **Nothing to do.** No prop, type or export changed, and apart from the one fix at the end of this
14
+ note this release touches only the files under `manifest/`. `@cueplusplus/tokens` and `@cueplusplus/brand-tokens` move to 0.11.1 with it,
15
+ as one fixed family, and neither changes.
16
+
17
+ `manifest/fixtures.json` gains 88 entries:
18
+
19
+ - **Six short text fixtures** (kind `node`): `text.heading`, `text.count`, `text.total`,
20
+ `text.detail`, `text.author` and `text.time` — a heading, a figure, the figure it is out of, a
21
+ qualifier under a figure, an author's name and a clock time. Like `children.label` in 0.11.0,
22
+ they are for a playground or propSet to pick by hand, and no prop's `control.fixture` names them.
23
+ - **82 data fixtures** (71 `array`, 11 `opaque`), each a sample taken from its component's own
24
+ documentation specimen: todo items, diff hunks, trace spans, log lines, chart points, sources,
25
+ threads, models and the like. 75 of them list the printed type they fit in `accepts` —
26
+ `agent.todos` accepts `readonly TodoItem[]`, `layout.show-crumbs` accepts
27
+ `readonly BreadcrumbItem[]` — and every one of those 75 is now the `control.fixture` of at least
28
+ one prop. The other seven (`agent.subagent-progress`, `agents.window-start`,
29
+ `agents.window-end`, `chrome.expanded-front`, `composer.model-names`,
30
+ `knowledge.rig-dashboard`, `knowledge.trait-labels`) claim no type, so they are only ever picked
31
+ by hand.
32
+
33
+ An entry carries an id, a kind, a label and `accepts`, never the value itself. The values live with
34
+ the tools that render or export them: the docs playground, and the studio, whose bridge
35
+ `@cueplusplus/studio-mcp` exports each one as code from 0.1.1.
36
+
37
+ In `manifest/components/`, every change adds a `control.fixture` to a prop that had none, and no
38
+ existing one moved. `Combobox.items` and `MultiSelect.items` share `forms.fixture-types`, and
39
+ `FlowGraph` (`nodes`, `edges`) and `SubagentList` (`agents`, `summaryAgent`) gain two each.
40
+ `manifest.json` changes only in the SHA-256 of each record that changed.
41
+
42
+ Two records also correct the specimen code they embed:
43
+
44
+ - `meter.json` passed `paceTick={50}`, but `paceTick` is how far through the window you are, from
45
+ 0 to 1, so the example drew no tick. It now passes `0.6`, labelled "60% of period elapsed".
46
+ - `math-block.json`, and `frac.json`, `sub.json` and `sup.json`, which embed the same specimen,
47
+ now write `visibleSteps={3}` instead of `visibleSteps={MATH.length}`. The count is the same, but
48
+ a tool that reads only literals can now read it.
49
+
50
+ One fix: `ScrollAnchor` (`@cueplusplus/ui/elements`) now stops its append timer once every message
51
+ has landed, where before the timer went on firing every 1.3 seconds for as long as the element was
52
+ mounted, though nothing on screen changed.
53
+
54
+ - @cueplusplus/tokens@0.11.1
55
+
3
56
  ## 0.11.0
4
57
 
5
58
  ### Minor Changes
@@ -27,8 +27,9 @@ function ScrollAnchor({ messages, paused = false, onSettled, className, ...props
27
27
  const [count, setCount] = useState(INITIAL_COUNT);
28
28
  const [pinned, setPinned] = useState(true);
29
29
  const [seenCount, setSeenCount] = useState(INITIAL_COUNT);
30
+ const settled = count >= messages.length;
30
31
  useEffect(() => {
31
- if (paused) return;
32
+ if (paused || settled) return;
32
33
  if (reduced) {
33
34
  setCount(messages.length);
34
35
  return;
@@ -42,8 +43,9 @@ function ScrollAnchor({ messages, paused = false, onSettled, className, ...props
42
43
  return () => clearInterval(id);
43
44
  }, [
44
45
  messages.length,
46
+ reduced,
45
47
  paused,
46
- reduced
48
+ settled
47
49
  ]);
48
50
  useEffect(() => {
49
51
  if (count >= messages.length && pinned) onSettled?.();
@@ -30,7 +30,7 @@ import * as React from "react";
30
30
  * <span className={chipVariants({ variant: "tag" })}>mcp</span>
31
31
  */
32
32
  declare const chipVariants: (props?: ({
33
- tone?: "danger" | "info" | "warn" | "accent" | "ok" | "busy" | "neutral" | null | undefined;
33
+ tone?: "info" | "warn" | "danger" | "accent" | "ok" | "busy" | "neutral" | null | undefined;
34
34
  variant?: "outline" | "tinted" | "tag" | null | undefined;
35
35
  interactive?: boolean | null | undefined;
36
36
  } & ClassProp) | undefined) => string;
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "Date and count pairs from the heat-graph package. Levels are classified for you;\ngaps are filled as empty cells.",
18
18
  "control": {
19
- "kind": "array"
19
+ "kind": "array",
20
+ "fixture": "agents.run-days"
20
21
  }
21
22
  },
22
23
  {
@@ -76,7 +76,8 @@
76
76
  "defaultValue": null,
77
77
  "description": "Named capabilities the card advertises.",
78
78
  "control": {
79
- "kind": "array"
79
+ "kind": "array",
80
+ "fixture": "agents.skills"
80
81
  }
81
82
  },
82
83
  {
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "The roster, in the order it should read. Renders nothing when empty.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "chat.agents"
18
19
  }
19
20
  },
20
21
  {
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "Detached runs. The header counts what is ready rather than what is in flight,\nbecause ready is the thing that needs you.",
18
18
  "control": {
19
- "kind": "array"
19
+ "kind": "array",
20
+ "fixture": "agents.inbox"
20
21
  }
21
22
  },
22
23
  {
@@ -14,7 +14,8 @@
14
14
  "defaultValue": null,
15
15
  "description": "The trail, root first. The last entry is the current page.",
16
16
  "control": {
17
- "kind": "array"
17
+ "kind": "array",
18
+ "fixture": "layout.show-crumbs"
18
19
  }
19
20
  },
20
21
  {
@@ -24,7 +24,8 @@
24
24
  "defaultValue": null,
25
25
  "description": "One entry per series at the hovered index. Recharts supplies this.",
26
26
  "control": {
27
- "kind": "array"
27
+ "kind": "array",
28
+ "fixture": "charts.tooltip-rows"
28
29
  }
29
30
  },
30
31
  {
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "Points in the run you can fall back to, oldest first.",
18
18
  "control": {
19
- "kind": "array"
19
+ "kind": "array",
20
+ "fixture": "agents.checkpoints"
20
21
  }
21
22
  },
22
23
  {
@@ -44,7 +44,8 @@
44
44
  "defaultValue": null,
45
45
  "description": "Unified diff lines with context, added, or removed kind.",
46
46
  "control": {
47
- "kind": "array"
47
+ "kind": "array",
48
+ "fixture": "agent.diff-lines"
48
49
  }
49
50
  },
50
51
  {
@@ -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
  {
@@ -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
  {
@@ -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
  {
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "Everything saved. Filtering happens inside against the name.",
18
18
  "control": {
19
- "kind": "array"
19
+ "kind": "array",
20
+ "fixture": "composer.prompts"
20
21
  }
21
22
  },
22
23
  {
@@ -16,7 +16,8 @@
16
16
  "defaultValue": null,
17
17
  "description": "The turns waiting to send, in the order they will drain. Ordering is the\ncaller's: Cursor lets a person drag one up the list, and a component that\nsorted the array it was given could not be dragged.",
18
18
  "control": {
19
- "kind": "array"
19
+ "kind": "array",
20
+ "fixture": "agents.follow-ups"
20
21
  }
21
22
  },
22
23
  {
@@ -46,7 +46,8 @@
46
46
  "defaultValue": null,
47
47
  "description": "What the toolbar offers. Each action names one of the three built-in icons.",
48
48
  "control": {
49
- "kind": "array"
49
+ "kind": "array",
50
+ "fixture": "thread.quote-actions"
50
51
  }
51
52
  },
52
53
  {