@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.
- package/CHANGELOG.md +195 -0
- package/README.md +109 -3
- package/dist/chrome/index.d.ts +2 -1
- package/dist/chrome/index.js +3 -2
- package/dist/chrome/inspector.d.ts +61 -0
- package/dist/chrome/inspector.js +121 -0
- package/dist/elements/scroll-anchor.js +4 -2
- package/dist/forms/input.d.ts +12 -0
- package/dist/forms/textarea.d.ts +12 -0
- package/dist/forms/toggle.d.ts +6 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +5 -2
- package/dist/instruments/code-block.d.ts +35 -0
- package/dist/instruments/code-block.js +173 -0
- package/dist/instruments/index.d.ts +2 -1
- package/dist/instruments/index.js +2 -1
- package/dist/layout/bento.js +1 -1
- package/dist/layout/index.d.ts +2 -1
- package/dist/layout/index.js +2 -1
- package/dist/layout/preview.d.ts +110 -0
- package/dist/layout/preview.js +459 -0
- package/dist/primitives/chip.d.ts +1 -1
- package/manifest/components/activity-graph.json +2 -1
- package/manifest/components/agent-card.json +2 -1
- package/manifest/components/agent-pile.json +2 -1
- package/manifest/components/background-inbox.json +2 -1
- package/manifest/components/breadcrumb.json +2 -1
- package/manifest/components/chart-tooltip-content.json +2 -1
- package/manifest/components/checkpoint-history.json +2 -1
- package/manifest/components/code-block.json +106 -0
- package/manifest/components/code-diff.json +2 -1
- package/manifest/components/combobox.json +2 -1
- package/manifest/components/comparison-card.json +2 -1
- package/manifest/components/composer-attachment-chip.json +2 -1
- package/manifest/components/composer-context.json +2 -1
- package/manifest/components/composer-model-item.json +2 -1
- package/manifest/components/composer-person-item.json +2 -1
- package/manifest/components/computer-use.json +2 -1
- package/manifest/components/confidence-marker.json +2 -1
- package/manifest/components/context-breakdown.json +2 -1
- package/manifest/components/context-usage.json +2 -1
- package/manifest/components/conversation-search.json +2 -1
- package/manifest/components/cost-meter.json +2 -1
- package/manifest/components/day-separator.json +2 -1
- package/manifest/components/document-reference.json +2 -1
- package/manifest/components/elements-command-palette.json +2 -1
- package/manifest/components/elements-timeline.json +2 -1
- package/manifest/components/elicitation-form.json +2 -1
- package/manifest/components/file-tree.json +2 -1
- package/manifest/components/flow-graph.json +4 -2
- package/manifest/components/frac.json +1 -1
- package/manifest/components/group-bar.json +2 -1
- package/manifest/components/inline-citation.json +2 -1
- package/manifest/components/input.json +20 -0
- package/manifest/components/inspector.json +199 -0
- package/manifest/components/job-progress.json +2 -1
- package/manifest/components/log-viewer.json +2 -1
- package/manifest/components/map-answer.json +2 -1
- package/manifest/components/math-block.json +1 -1
- package/manifest/components/mcp-server-panel.json +2 -1
- package/manifest/components/memory-chips.json +2 -1
- package/manifest/components/message-actions.json +2 -1
- package/manifest/components/message-attachments.json +2 -1
- package/manifest/components/message-queue.json +2 -1
- package/manifest/components/message-timing.json +2 -1
- package/manifest/components/meter.json +1 -1
- package/manifest/components/model-picker.json +2 -1
- package/manifest/components/multi-select.json +2 -1
- package/manifest/components/onboarding.json +2 -1
- package/manifest/components/password-input.json +20 -0
- package/manifest/components/preview.json +202 -0
- package/manifest/components/prompt-library.json +2 -1
- package/manifest/components/queue-dock.json +2 -1
- package/manifest/components/quote-reply.json +2 -1
- package/manifest/components/reasoning-effort.json +2 -1
- package/manifest/components/reasoning-panel.json +2 -1
- package/manifest/components/regenerate-menu.json +2 -1
- package/manifest/components/research-report.json +2 -1
- package/manifest/components/retrieval-chunks.json +2 -1
- package/manifest/components/reviewable-diff.json +2 -1
- package/manifest/components/schedule-card.json +2 -1
- package/manifest/components/score-breakdown.json +2 -1
- package/manifest/components/scroll-anchor.json +2 -1
- package/manifest/components/search-input.json +20 -0
- package/manifest/components/segmented-control.json +2 -1
- package/manifest/components/settings-panel.json +2 -1
- package/manifest/components/shared-conversation.json +2 -1
- package/manifest/components/sources.json +2 -1
- package/manifest/components/speaker-identity.json +2 -1
- package/manifest/components/spec-sheet.json +2 -1
- package/manifest/components/spectrum-visualizer.json +2 -1
- package/manifest/components/stepper.json +2 -1
- package/manifest/components/streaming-text.json +2 -1
- package/manifest/components/sub.json +1 -1
- package/manifest/components/subagent-list.json +4 -2
- package/manifest/components/sup.json +1 -1
- package/manifest/components/swap-label.json +2 -1
- package/manifest/components/textarea.json +20 -0
- package/manifest/components/thread-list.json +2 -1
- package/manifest/components/thread-search.json +2 -1
- package/manifest/components/todo-list.json +2 -1
- package/manifest/components/toggle.json +10 -0
- package/manifest/components/tool-group.json +2 -1
- package/manifest/components/trace-waterfall.json +2 -1
- package/manifest/components/tree.json +2 -1
- package/manifest/components/universe-grid.json +2 -1
- package/manifest/components/usage-chart.json +2 -1
- package/manifest/components/voice-conversation.json +2 -1
- package/manifest/components/web-search.json +2 -1
- package/manifest/fixtures.json +670 -0
- package/manifest/manifest.json +125 -86
- package/manifest/tokens.json +1 -1
- package/package.json +4 -4
|
@@ -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
|
{
|
|
@@ -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
|
],
|
|
@@ -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={
|
|
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
|
}
|
|
@@ -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
|
+
}
|
|
@@ -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={
|
|
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
|
}
|
|
@@ -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={
|
|
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
|
}
|