@cueplusplus/ui 0.10.0 → 0.11.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.
@@ -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
+ }
@@ -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\"",
@@ -42,6 +52,16 @@
42
52
  "kind": "string"
43
53
  }
44
54
  },
55
+ {
56
+ "name": "placeholder",
57
+ "type": "string",
58
+ "required": false,
59
+ "defaultValue": null,
60
+ "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.",
61
+ "control": {
62
+ "kind": "string"
63
+ }
64
+ },
45
65
  {
46
66
  "name": "revealed",
47
67
  "type": "boolean",
@@ -0,0 +1,202 @@
1
+ {
2
+ "name": "Preview",
3
+ "slug": "preview",
4
+ "group": "layout",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A frame for one component: a stage that is its own theme island, a slot for\ntools at the top right, and a footer.\n\n**The stage is the island; the chrome is not.** `theme`, `mode`, `density`\nand `font` land on the stage element only, and the stage republishes the\ntheme and density contexts so an overlay opened on it follows it. The tools,\nthe footer, the grips and anything they open stay in the scope around the\nPreview — a `terminal` preview's own controls do not turn cyan. With none of\nthe four set, the stage carries no attribute and costs what a `<div>` costs.\nA stage `theme` with no `mode` repeats the page's mode beside it.\n\n**`resizable` is handles of its own**, both axes by default: an edge grip per\naxis that is a keyboard-operable `separator` valued in pixels, and a corner\ngrip for the pointer. Double-click resets an axis. The width never outgrows\nthe frame: its bound in force is the frame's own width, observed live, when\nthat is under `maxWidth`. Not `Resizable`, which is split panes on an\noptional peer.\n\nProps, not a compound: one stage and two slots, each saying what it is.",
9
+ "props": [
10
+ {
11
+ "name": "children",
12
+ "type": "ReactNode",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "The specimen. It renders on the stage, inside whatever scope the stage sets.",
16
+ "control": {
17
+ "kind": "node",
18
+ "fixture": "children.text"
19
+ }
20
+ },
21
+ {
22
+ "name": "label",
23
+ "type": "string",
24
+ "required": true,
25
+ "defaultValue": null,
26
+ "description": "The frame's accessible name — \"Button preview\". Required: a frame that holds\ncontrols and has no name is a group nobody can find.",
27
+ "control": {
28
+ "kind": "string"
29
+ }
30
+ },
31
+ {
32
+ "name": "theme",
33
+ "type": "string",
34
+ "required": false,
35
+ "defaultValue": null,
36
+ "description": "A theme for the stage only. Unset, the stage inherits — no attribute is\nemitted at all. **Naming a theme does not load it**: the stage is scoped to\n`[data-theme=\"<name>\"]`, and that theme's stylesheet must already be on the\npage (`@cueplusplus/theme-<name>/theme.css`). The tools, the footer and\nanything they open stay in the page's theme. With no `mode`, the stage\nrepeats the page's mode beside the theme — `\"system\"` included — so a light\npage's stage paints the theme's light block, not its dark one, and agrees\nwith every overlay opened on it.",
37
+ "control": {
38
+ "kind": "string"
39
+ }
40
+ },
41
+ {
42
+ "name": "mode",
43
+ "type": "\"system\" | \"dark\" | \"light\"",
44
+ "required": false,
45
+ "defaultValue": null,
46
+ "description": "Dark, light or system, for the stage only. A theme's light block is the\ncompound selector `[data-theme][data-mode]`, so with no `theme` the stage\nrestates the page's theme beside the mode; outside any `ThemeProvider` there\nis no theme to restate and the mode alone changes nothing. A stage\n`\"system\"` is stamped as it is, so the stylesheet's `[data-mode=\"system\"]`\nblock follows the OS; `useTheme().resolvedMode` read on the stage reports\nthe page's resolved mode.",
47
+ "control": {
48
+ "kind": "enum",
49
+ "members": [
50
+ "system",
51
+ "dark",
52
+ "light"
53
+ ]
54
+ }
55
+ },
56
+ {
57
+ "name": "density",
58
+ "type": "\"normal\" | \"large\" | \"compact\" | \"ultra-compact\" | \"ultra-large\"",
59
+ "required": false,
60
+ "defaultValue": null,
61
+ "description": "A rung of the density ladder for the stage only, as a `<Density>` island would set it.",
62
+ "control": {
63
+ "kind": "enum",
64
+ "members": [
65
+ "normal",
66
+ "large",
67
+ "compact",
68
+ "ultra-compact",
69
+ "ultra-large"
70
+ ]
71
+ }
72
+ },
73
+ {
74
+ "name": "font",
75
+ "type": "\"source\" | \"system\" | \"geist\" | \"inter\" | \"plex\" | \"roboto\" | \"apple\" | \"office\"",
76
+ "required": false,
77
+ "defaultValue": null,
78
+ "description": "A font pairing for the stage only, as `data-font`. Portals still follow the root's pairing.",
79
+ "control": {
80
+ "kind": "enum",
81
+ "members": [
82
+ "source",
83
+ "system",
84
+ "geist",
85
+ "inter",
86
+ "plex",
87
+ "roboto",
88
+ "apple",
89
+ "office"
90
+ ]
91
+ }
92
+ },
93
+ {
94
+ "name": "resizable",
95
+ "type": "boolean | PreviewResizeOptions",
96
+ "required": false,
97
+ "defaultValue": null,
98
+ "description": "Resize the stage by dragging or with the keyboard. `true` gives both axes\ninside the default bounds (160–1280 px wide, 96–960 px tall); an object\nnarrows the axis or moves the bounds. The width never outgrows the frame:\nits bound in force is the smaller of `maxWidth` and the frame's own width,\nobserved with a `ResizeObserver`, so a Preview in a grid track stays inside\nit as the viewport changes. The height is bounded by `maxHeight` alone, and\na taller stage grows its frame. Unset, the stage is fixed: no grips, and\nnothing measured or observed.\n\nA resizable frame fills its container's width (`w-full`), because the room\nit measures has to be its container's. In a flex row or a centred column a\nframe sized by its content would measure its own stage, and a stage bounded\nby itself can only shrink, with each step lowering the ceiling. A fixed\nPreview keeps sizing to its content; `className` can still set a width.",
99
+ "control": {
100
+ "kind": "opaque"
101
+ }
102
+ },
103
+ {
104
+ "name": "tools",
105
+ "type": "ReactNode",
106
+ "required": false,
107
+ "defaultValue": null,
108
+ "description": "The top-right slot — by convention a row of `IconButton`s. Drawn outside the stage.",
109
+ "control": {
110
+ "kind": "node",
111
+ "fixture": "children.text"
112
+ }
113
+ },
114
+ {
115
+ "name": "footer",
116
+ "type": "ReactNode",
117
+ "required": false,
118
+ "defaultValue": null,
119
+ "description": "The strip under the stage: the thin text and the way out. Drawn outside the stage.",
120
+ "control": {
121
+ "kind": "node",
122
+ "fixture": "children.text"
123
+ }
124
+ }
125
+ ],
126
+ "typeReferences": [
127
+ "Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\">"
128
+ ],
129
+ "subcomponents": [],
130
+ "parts": [],
131
+ "variants": {},
132
+ "defaultVariants": {},
133
+ "tokensUsed": [
134
+ "--cue-accent",
135
+ "--cue-border",
136
+ "--cue-border-strong",
137
+ "--cue-control-sm",
138
+ "--cue-fg",
139
+ "--cue-fg-muted",
140
+ "--cue-font-mono",
141
+ "--cue-hair-strong",
142
+ "--cue-radius-control",
143
+ "--cue-radius-surface",
144
+ "--cue-space-2",
145
+ "--cue-space-4",
146
+ "--cue-space-5",
147
+ "--cue-space-6",
148
+ "--cue-space-8",
149
+ "--cue-surface-1",
150
+ "--cue-surface-2",
151
+ "--cue-surface-3",
152
+ "--cue-text-label"
153
+ ],
154
+ "summary": "A frame for one component: a stage that is its own theme island, tools at the top right, a footer, and grips that resize it on both axes.",
155
+ "examples": [
156
+ {
157
+ "title": "Inheriting the page, resizable",
158
+ "code": "<Preview label=\"Button preview\" resizable footer={<span>Button</span>}>\n <Button variant=\"primary\">Take cue</Button>\n</Preview>",
159
+ "language": "tsx"
160
+ },
161
+ {
162
+ "title": "Its own theme and density",
163
+ "code": "<Preview label=\"Chip preview\" theme=\"terminal\" density=\"compact\">\n <Chip tone=\"accent\">Standby</Chip>\n</Preview>",
164
+ "language": "tsx"
165
+ },
166
+ {
167
+ "title": "Usage",
168
+ "code": "<Preview label=\"Button preview\" tools={<IconButton aria-label=\"Configure Button\" icon={Wrench} />}>\n <Button variant=\"primary\">Take cue</Button>\n</Preview>\n<Preview label=\"Chip preview\" theme=\"terminal\" density=\"compact\" resizable>\n <Chip tone=\"accent\">Standby</Chip>\n</Preview>",
169
+ "language": "tsx"
170
+ }
171
+ ],
172
+ "status": "stable",
173
+ "url": "/docs/components/preview",
174
+ "mdUrl": "/docs/components/preview.md",
175
+ "jsonUrl": "/r/components/preview.json",
176
+ "whenToUse": [
177
+ "Showing one component in a state a reader can see and change — a gallery tile, a docs listing, a design review page.",
178
+ "Putting a component in a different theme, mode, density or font from the page around it, without re-theming the controls that change it.",
179
+ "Letting a reader watch a component respond to its container: pass `resizable` and drag it narrow, or short."
180
+ ],
181
+ "whenNotToUse": [
182
+ "Laying several components out side by side. That is `Bento` or `Grid`; a Preview holds one specimen.",
183
+ "Split panes a user resizes as part of an app. That is `Resizable`; a Preview's grips resize a stage, not a layout."
184
+ ],
185
+ "commonMistakes": [
186
+ "Naming a `theme` whose stylesheet is not on the page. The stage is scoped to `[data-theme]`, and a Preview loads no CSS — import `@cueplusplus/theme-<name>/theme.css` yourself, or the stage paints the blank base.",
187
+ "Setting `mode` outside any `ThemeProvider` and expecting a change. A theme's light block needs the theme on the same element, and with no provider there is no theme to restate.",
188
+ "Putting the controls that configure the specimen in `children`. They would take the stage's theme; put them in `tools`, which follows the page."
189
+ ],
190
+ "specimens": [
191
+ {
192
+ "title": "Preview",
193
+ "group": "layout",
194
+ "components": [
195
+ "Preview"
196
+ ],
197
+ "code": "<Specimens>\n <Specimen label=\"inherits the page, resizable\" wide>\n <Preview\n label=\"Button preview\"\n resizable\n footer={<span className=\"font-mono text-(length:--cue-text-label) text-fg-subtle\">Button · inherits</span>}\n >\n <Button variant=\"primary\">Take cue</Button>\n </Preview>\n </Specimen>\n <Specimen label=\"its own theme and density\" wide>\n <Preview\n label=\"Chip preview\"\n theme=\"terminal\"\n density=\"compact\"\n footer={<span className=\"font-mono text-(length:--cue-text-label) text-fg-subtle\">Chip · terminal · compact</span>}\n >\n <Chip tone=\"accent\">Standby</Chip>\n </Preview>\n </Specimen>\n</Specimens>",
198
+ "note": "A frame for one component. The stage is its own theme island — theme, mode, density and font land on it and nowhere else — while the tools, the footer and anything they open follow the page.",
199
+ "interaction": "with `resizable`, the width and height grips are separators: Left and Right step the width, Up and Down the height, 8 px a press and 64 with Shift; Home and End reach the bounds, and a double-click resets an axis. The corner grip is a pointer convenience over the two."
200
+ }
201
+ ]
202
+ }
@@ -27,6 +27,16 @@
27
27
  "kind": "string"
28
28
  }
29
29
  },
30
+ {
31
+ "name": "aria-label",
32
+ "type": "string",
33
+ "required": false,
34
+ "defaultValue": null,
35
+ "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.",
36
+ "control": {
37
+ "kind": "string"
38
+ }
39
+ },
30
40
  {
31
41
  "name": "size",
32
42
  "type": "\"sm\" | \"md\" | \"lg\"",
@@ -62,6 +72,16 @@
62
72
  "kind": "string"
63
73
  }
64
74
  },
75
+ {
76
+ "name": "placeholder",
77
+ "type": "string",
78
+ "required": false,
79
+ "defaultValue": null,
80
+ "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.",
81
+ "control": {
82
+ "kind": "string"
83
+ }
84
+ },
65
85
  {
66
86
  "name": "onValueChange",
67
87
  "type": "((value: string) => void)",
@@ -26,6 +26,26 @@
26
26
  "control": {
27
27
  "kind": "number"
28
28
  }
29
+ },
30
+ {
31
+ "name": "aria-label",
32
+ "type": "string",
33
+ "required": false,
34
+ "defaultValue": null,
35
+ "description": "Accessible name for the textarea, when no `FieldLabel` names it. Declared\nhere rather than left to the inherited attribute so the props table carries\nthe row: a bare textarea outside a `Field` has no other way to be named.",
36
+ "control": {
37
+ "kind": "string"
38
+ }
39
+ },
40
+ {
41
+ "name": "placeholder",
42
+ "type": "string",
43
+ "required": false,
44
+ "defaultValue": null,
45
+ "description": "An example of what goes in the box, 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.",
46
+ "control": {
47
+ "kind": "string"
48
+ }
29
49
  }
30
50
  ],
31
51
  "typeReferences": [
@@ -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. An icon-only toggle has no text to be named by, so this is\nits name; declared here rather than left to the inherited attribute so the\nprops table carries the row the sentence above tells a caller to pass.",
26
+ "control": {
27
+ "kind": "string"
28
+ }
29
+ },
20
30
  {
21
31
  "name": "children",
22
32
  "type": "ReactNode",
@@ -12,6 +12,11 @@
12
12
  "kind": "node",
13
13
  "label": "A bold line and a paragraph"
14
14
  },
15
+ {
16
+ "id": "children.label",
17
+ "kind": "node",
18
+ "label": "A short label"
19
+ },
15
20
  {
16
21
  "id": "bento.tiles",
17
22
  "kind": "node",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "library": "@cueplusplus/ui",
4
- "version": "0.10.0",
4
+ "version": "0.11.0",
5
5
  "generatedAt": "1970-01-01T00:00:00.000Z",
6
6
  "themes": [
7
7
  "cue",
@@ -29,7 +29,7 @@
29
29
  ],
30
30
  "tokens": {
31
31
  "path": "./tokens.json",
32
- "sha256": "da4ab9ce51ff4d26641da90b5e7f018c2a1c181e932080a4ed287e96255cf0a5"
32
+ "sha256": "0da7f4a2dd5bde4a91d9402d09e11dad26fb9ee607db38c372e875d07e1ee48d"
33
33
  },
34
34
  "systemApis": [
35
35
  {
@@ -454,6 +454,19 @@
454
454
  "path": "./components/footer.json",
455
455
  "sha256": "19aeac290a3141f986d307732ea889d06af942ee9ab16d5a12a9e3a118d095e2"
456
456
  },
457
+ {
458
+ "name": "Inspector",
459
+ "slug": "inspector",
460
+ "group": "chrome",
461
+ "importPath": "@cueplusplus/ui",
462
+ "summary": "Titled sections of label-and-control rows, with a footer: the layout of a settings panel, a properties sidebar or a wrench menu.",
463
+ "status": "stable",
464
+ "url": "/docs/components/inspector",
465
+ "mdUrl": "/docs/components/inspector.md",
466
+ "jsonUrl": "/r/components/inspector.json",
467
+ "path": "./components/inspector.json",
468
+ "sha256": "67c675b0a485804c99db1ad436093c8c687af294a93271d9aa25948869ae4612"
469
+ },
457
470
  {
458
471
  "name": "NavigationMenu",
459
472
  "slug": "navigation-menu",
@@ -3117,7 +3130,7 @@
3117
3130
  "mdUrl": "/docs/components/input.md",
3118
3131
  "jsonUrl": "/r/components/input.json",
3119
3132
  "path": "./components/input.json",
3120
- "sha256": "891dd51873f17c96fd0a0e6b851a484796d5c1839fcfe87f1581486fa8afabe8"
3133
+ "sha256": "8c81a85831d864899e9d0ebf8d41286dfcbb04138a0c46e96285f593b0e529a1"
3121
3134
  },
3122
3135
  {
3123
3136
  "name": "InputGroup",
@@ -3182,7 +3195,7 @@
3182
3195
  "mdUrl": "/docs/components/password-input.md",
3183
3196
  "jsonUrl": "/r/components/password-input.json",
3184
3197
  "path": "./components/password-input.json",
3185
- "sha256": "ce9410082ecb3f757d23a7b5d44fb2e264cb052f4fd83b860f899061c7d910ae"
3198
+ "sha256": "93007b72df5a5dcb660b6bc8e34ffe73150cd680394bdc03afe869a85fea48c7"
3186
3199
  },
3187
3200
  {
3188
3201
  "name": "Radio",
@@ -3247,7 +3260,7 @@
3247
3260
  "mdUrl": "/docs/components/search-input.md",
3248
3261
  "jsonUrl": "/r/components/search-input.json",
3249
3262
  "path": "./components/search-input.json",
3250
- "sha256": "0bd9b8ad5b5dfeed200e007d81fa60c4cf6064c7aefefd754507089f2d6b217e"
3263
+ "sha256": "172f028e01b635d0a68dc7b6b4a062702b681a487af00d59f06d51fa880cccda"
3251
3264
  },
3252
3265
  {
3253
3266
  "name": "Select",
@@ -3312,7 +3325,7 @@
3312
3325
  "mdUrl": "/docs/components/textarea.md",
3313
3326
  "jsonUrl": "/r/components/textarea.json",
3314
3327
  "path": "./components/textarea.json",
3315
- "sha256": "c28ee70b1e428b5148e6affcbf752daf21f99731ad15cd99194cccb53900cfac"
3328
+ "sha256": "6d2eab2642fc7b1c287310accf8694fac910f02f52c3bf69cddbff51143d2b02"
3316
3329
  },
3317
3330
  {
3318
3331
  "name": "Toggle",
@@ -3325,7 +3338,7 @@
3325
3338
  "mdUrl": "/docs/components/toggle.md",
3326
3339
  "jsonUrl": "/r/components/toggle.json",
3327
3340
  "path": "./components/toggle.json",
3328
- "sha256": "c9b24fa9da718b0af6aade2b734020f6f190dfab47e9833a16a07baac67e54bf"
3341
+ "sha256": "a334c3ea14f7e41b55c8ff2d3b1662cf06e11814fe432aa69f3eae0c8e8b3a2e"
3329
3342
  },
3330
3343
  {
3331
3344
  "name": "ToggleGroup",
@@ -3483,6 +3496,19 @@
3483
3496
  "path": "./components/app-window-frame.json",
3484
3497
  "sha256": "b9864857ce00f46aff4c4cd11fadc0ae29ed3e8b0b694cb1317f23ee435ee7c8"
3485
3498
  },
3499
+ {
3500
+ "name": "CodeBlock",
3501
+ "slug": "code-block",
3502
+ "group": "instruments",
3503
+ "importPath": "@cueplusplus/ui",
3504
+ "summary": "A block of code with a copy button and no highlighter palette; `language=\"jsx\"` adds emphasis in three inks the theme already has.",
3505
+ "status": "stable",
3506
+ "url": "/docs/components/code-block",
3507
+ "mdUrl": "/docs/components/code-block.md",
3508
+ "jsonUrl": "/r/components/code-block.json",
3509
+ "path": "./components/code-block.json",
3510
+ "sha256": "c8ceba2d609b900c1032b480070f6b1046752b9f5bbdecdc1e9555f0f24f9aa2"
3511
+ },
3486
3512
  {
3487
3513
  "name": "CopyButton",
3488
3514
  "slug": "copy-button",
@@ -3899,6 +3925,19 @@
3899
3925
  "path": "./components/pagination.json",
3900
3926
  "sha256": "b61ac63fe74b38fff64d239efbca77934effc61dd3f02818a5b333890dc29dc4"
3901
3927
  },
3928
+ {
3929
+ "name": "Preview",
3930
+ "slug": "preview",
3931
+ "group": "layout",
3932
+ "importPath": "@cueplusplus/ui",
3933
+ "summary": "A frame for one component: a stage that is its own theme island, tools at the top right, a footer, and grips that resize it on both axes.",
3934
+ "status": "stable",
3935
+ "url": "/docs/components/preview",
3936
+ "mdUrl": "/docs/components/preview.md",
3937
+ "jsonUrl": "/r/components/preview.json",
3938
+ "path": "./components/preview.json",
3939
+ "sha256": "5d76161163185776ed88381d903742ba9c6bd079ff10c9a817024cac95bcb6b8"
3940
+ },
3902
3941
  {
3903
3942
  "name": "Resizable",
3904
3943
  "slug": "resizable",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "library": "@cueplusplus/tokens",
4
- "version": "0.10.0",
4
+ "version": "0.11.0",
5
5
  "themes": [
6
6
  {
7
7
  "name": "cue",