@cueplusplus/ui 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +705 -0
- package/dist/brand/_chassis.d.ts +54 -0
- package/dist/brand/_chassis.js +81 -0
- package/dist/brand/_geometry.js +41 -0
- package/dist/brand/cue-logotype.d.ts +29 -0
- package/dist/brand/cue-logotype.js +60 -0
- package/dist/brand/cue-mark.d.ts +30 -0
- package/dist/brand/cue-mark.js +61 -0
- package/dist/brand/index.d.ts +5 -0
- package/dist/brand/plussie.d.ts +67 -0
- package/dist/brand/plussie.js +125 -0
- package/dist/chat/agent-pile.js +1 -1
- package/dist/chat/ask-box.js +2 -2
- package/dist/chat/delegation-card.js +1 -1
- package/dist/chat/message.js +2 -2
- package/dist/chrome/_edge-scroller.d.ts +45 -0
- package/dist/chrome/_edge-scroller.js +149 -0
- package/dist/chrome/_glyphs.js +19 -1
- package/dist/chrome/_tabs-scroll.d.ts +13 -8
- package/dist/chrome/_tabs-scroll.js +13 -8
- package/dist/chrome/app-bar.d.ts +103 -0
- package/dist/chrome/app-bar.js +175 -0
- package/dist/chrome/app-shell.d.ts +125 -0
- package/dist/chrome/app-shell.js +167 -0
- package/dist/chrome/footer.d.ts +75 -0
- package/dist/chrome/footer.js +68 -0
- package/dist/chrome/index.d.ts +5 -1
- package/dist/chrome/index.js +4 -1
- package/dist/chrome/navigation-menu.js +1 -1
- package/dist/chrome/page-shell.d.ts +1 -1
- package/dist/chrome/page-shell.js +15 -5
- package/dist/chrome/segmented-control.d.ts +19 -0
- package/dist/chrome/segmented-control.js +40 -21
- package/dist/chrome/tabs.js +21 -65
- package/dist/chrome/toolbar.d.ts +22 -0
- package/dist/chrome/toolbar.js +26 -5
- package/dist/configurator/_overrides.js +22 -8
- package/dist/configurator/configurator.js +1 -1
- package/dist/configurator/panel-sections.js +10 -4
- package/dist/dmx/channel-matrix.js +1 -1
- package/dist/forms/otp-field.js +1 -1
- package/dist/index.d.ts +18 -9
- package/dist/index.js +16 -10
- package/dist/instruments/data-table.js +1 -1
- package/dist/instruments/index.d.ts +2 -2
- package/dist/instruments/index.js +2 -2
- package/dist/instruments/table.d.ts +14 -1
- package/dist/instruments/table.js +20 -1
- package/dist/layout/carousel.js +1 -1
- package/dist/layout/container.d.ts +1 -1
- package/dist/layout/container.js +6 -3
- package/dist/layout/index.d.ts +3 -3
- package/dist/layout/index.js +3 -3
- package/dist/layout/pagination.js +1 -1
- package/dist/layout/sidebar.d.ts +23 -3
- package/dist/layout/sidebar.js +18 -7
- package/dist/midi/spectrum-visualizer.js +1 -1
- package/dist/midi/timeline-ruler.js +1 -1
- package/dist/overlays/command-palette.js +1 -1
- package/dist/overlays/dialog.js +1 -1
- package/dist/overlays/dropdown-menu.js +2 -2
- package/dist/overlays/hover-card.js +1 -1
- package/dist/overlays/index.js +1 -1
- package/dist/overlays/popover.js +1 -1
- package/dist/overlays/sheet.js +1 -1
- package/dist/overlays/toast.js +1 -1
- package/dist/primitives/chip.d.ts +1 -1
- package/dist/primitives/index.d.ts +1 -1
- package/dist/primitives/index.js +1 -1
- package/dist/primitives/status-dot.d.ts +7 -0
- package/dist/primitives/status-dot.js +8 -1
- package/dist/styles.css +58 -2
- package/dist/system/density.d.ts +4 -1
- package/dist/system/density.js +12 -4
- package/dist/system/index.d.ts +4 -4
- package/dist/system/portal.d.ts +5 -5
- package/dist/system/portal.js +30 -11
- package/dist/system/prepaint.d.ts +34 -9
- package/dist/system/prepaint.js +48 -25
- package/dist/system/theme-provider.d.ts +48 -11
- package/dist/system/theme-provider.js +109 -35
- package/dist/system/use-density.d.ts +3 -3
- package/dist/system/use-density.js +16 -6
- package/dist/system/use-theme.d.ts +4 -2
- package/dist/system/use-theme.js +4 -2
- package/dist/theming/_presets.js +133 -5
- package/dist/theming/create-theme.d.ts +2 -2
- package/dist/theming/create-theme.js +37 -19
- package/dist/theming/serialize.d.ts +1 -1
- package/dist/theming/serialize.js +25 -1
- package/manifest/components/accordion.json +154 -0
- package/manifest/components/agent-pile.json +116 -0
- package/manifest/components/alert-dialog.json +190 -0
- package/manifest/components/app-bar.json +244 -0
- package/manifest/components/app-shell.json +291 -0
- package/manifest/components/app-window-frame.json +102 -0
- package/manifest/components/ask-box.json +209 -0
- package/manifest/components/autocomplete.json +197 -0
- package/manifest/components/avatar-group.json +72 -0
- package/manifest/components/avatar.json +95 -0
- package/manifest/components/breadcrumb.json +74 -0
- package/manifest/components/button-group.json +74 -0
- package/manifest/components/button.json +125 -0
- package/manifest/components/calendar.json +65 -0
- package/manifest/components/card.json +140 -0
- package/manifest/components/carousel.json +200 -0
- package/manifest/components/channel-matrix.json +173 -0
- package/manifest/components/chart-container.json +111 -0
- package/manifest/components/chart-ramp.json +72 -0
- package/manifest/components/chart-swatch.json +65 -0
- package/manifest/components/chart-tooltip-content.json +114 -0
- package/manifest/components/checkbox-group.json +68 -0
- package/manifest/components/checkbox.json +93 -0
- package/manifest/components/chip.json +132 -0
- package/manifest/components/collapsible.json +120 -0
- package/manifest/components/color-area.json +59 -0
- package/manifest/components/color-field.json +79 -0
- package/manifest/components/color-picker.json +175 -0
- package/manifest/components/color-slider.json +75 -0
- package/manifest/components/color-swatch.json +68 -0
- package/manifest/components/colors-section.json +66 -0
- package/manifest/components/combobox.json +198 -0
- package/manifest/components/command-palette.json +177 -0
- package/manifest/components/composer.json +176 -0
- package/manifest/components/container.json +60 -0
- package/manifest/components/context-menu.json +121 -0
- package/manifest/components/copy-button.json +93 -0
- package/manifest/components/cue-logotype.json +96 -0
- package/manifest/components/cue-mark.json +97 -0
- package/manifest/components/cue-portal-frame.json +55 -0
- package/manifest/components/data-table-pagination.json +83 -0
- package/manifest/components/data-table-toolbar.json +104 -0
- package/manifest/components/date-field.json +80 -0
- package/manifest/components/date-picker.json +191 -0
- package/manifest/components/date-range-picker.json +191 -0
- package/manifest/components/delegation-card.json +144 -0
- package/manifest/components/density.json +58 -0
- package/manifest/components/description-list.json +84 -0
- package/manifest/components/dialog.json +198 -0
- package/manifest/components/disclosure.json +109 -0
- package/manifest/components/dmx-bar.json +94 -0
- package/manifest/components/dmx-strip.json +101 -0
- package/manifest/components/drawer.json +179 -0
- package/manifest/components/dropdown-menu.json +229 -0
- package/manifest/components/empty-state.json +90 -0
- package/manifest/components/env-var-input.json +150 -0
- package/manifest/components/export-dialog.json +84 -0
- package/manifest/components/eyebrow.json +56 -0
- package/manifest/components/field-description.json +63 -0
- package/manifest/components/field-error.json +77 -0
- package/manifest/components/field-label.json +63 -0
- package/manifest/components/field.json +79 -0
- package/manifest/components/file-upload.json +159 -0
- package/manifest/components/flow-background.json +50 -0
- package/manifest/components/flow-controls.json +50 -0
- package/manifest/components/footer.json +112 -0
- package/manifest/components/grid.json +81 -0
- package/manifest/components/group-bar.json +102 -0
- package/manifest/components/hover-card.json +151 -0
- package/manifest/components/icon-button.json +88 -0
- package/manifest/components/info-tip.json +98 -0
- package/manifest/components/input-group.json +91 -0
- package/manifest/components/input.json +89 -0
- package/manifest/components/item.json +129 -0
- package/manifest/components/kbd.json +52 -0
- package/manifest/components/link.json +81 -0
- package/manifest/components/log-viewer.json +139 -0
- package/manifest/components/menubar.json +157 -0
- package/manifest/components/message-list.json +100 -0
- package/manifest/components/message.json +116 -0
- package/manifest/components/meter.json +114 -0
- package/manifest/components/multi-select.json +190 -0
- package/manifest/components/musical-time-input.json +113 -0
- package/manifest/components/navigation-menu.json +226 -0
- package/manifest/components/node-card.json +109 -0
- package/manifest/components/node-handle.json +69 -0
- package/manifest/components/number-field.json +107 -0
- package/manifest/components/otp-field.json +128 -0
- package/manifest/components/page-shell.json +96 -0
- package/manifest/components/pagination.json +92 -0
- package/manifest/components/panel-header.json +77 -0
- package/manifest/components/panel.json +71 -0
- package/manifest/components/password-input.json +119 -0
- package/manifest/components/piano-keyboard.json +120 -0
- package/manifest/components/plussie.json +111 -0
- package/manifest/components/popover.json +193 -0
- package/manifest/components/preset-section.json +73 -0
- package/manifest/components/progress.json +95 -0
- package/manifest/components/radio-group.json +73 -0
- package/manifest/components/radio.json +80 -0
- package/manifest/components/rating.json +141 -0
- package/manifest/components/resizable.json +88 -0
- package/manifest/components/row.json +109 -0
- package/manifest/components/scroll-area.json +91 -0
- package/manifest/components/scrollable-tabs-list.json +83 -0
- package/manifest/components/scrub-input.json +200 -0
- package/manifest/components/seam-cell.json +75 -0
- package/manifest/components/seam-grid.json +75 -0
- package/manifest/components/seam-list.json +56 -0
- package/manifest/components/search-input.json +134 -0
- package/manifest/components/section-header.json +112 -0
- package/manifest/components/segmented-control.json +138 -0
- package/manifest/components/select.json +194 -0
- package/manifest/components/separator.json +53 -0
- package/manifest/components/shape-section.json +66 -0
- package/manifest/components/sheet.json +186 -0
- package/manifest/components/sidebar.json +198 -0
- package/manifest/components/signal-edge.json +56 -0
- package/manifest/components/skeleton.json +46 -0
- package/manifest/components/slider.json +89 -0
- package/manifest/components/sparkline.json +76 -0
- package/manifest/components/spectrum-visualizer.json +115 -0
- package/manifest/components/spinner.json +61 -0
- package/manifest/components/stack.json +96 -0
- package/manifest/components/stat.json +87 -0
- package/manifest/components/status-bar.json +58 -0
- package/manifest/components/status-dot.json +78 -0
- package/manifest/components/stepper.json +89 -0
- package/manifest/components/switch.json +87 -0
- package/manifest/components/table-scroll-region.json +69 -0
- package/manifest/components/table.json +155 -0
- package/manifest/components/tabs.json +145 -0
- package/manifest/components/tags-input.json +190 -0
- package/manifest/components/terminal-frame.json +119 -0
- package/manifest/components/textarea.json +76 -0
- package/manifest/components/theme-configurator.json +124 -0
- package/manifest/components/theme-provider.json +134 -0
- package/manifest/components/threshold-rail.json +160 -0
- package/manifest/components/time-field.json +80 -0
- package/manifest/components/timeline-ruler.json +139 -0
- package/manifest/components/timeline.json +115 -0
- package/manifest/components/title-bar.json +82 -0
- package/manifest/components/toast.json +130 -0
- package/manifest/components/toggle-group.json +106 -0
- package/manifest/components/toggle.json +109 -0
- package/manifest/components/token-editor.json +90 -0
- package/manifest/components/toolbar.json +163 -0
- package/manifest/components/tooltip.json +164 -0
- package/manifest/components/tree-visibility-toggle.json +84 -0
- package/manifest/components/tree.json +140 -0
- package/manifest/components/two-step-button.json +113 -0
- package/manifest/components/universe-grid.json +127 -0
- package/manifest/components/usage-chart.json +124 -0
- package/manifest/manifest.json +2142 -0
- package/manifest/tokens.json +138 -0
- package/package.json +13 -5
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Progress",
|
|
3
|
+
"slug": "progress",
|
|
4
|
+
"group": "instruments",
|
|
5
|
+
"importPath": "@cueplusplus/ui",
|
|
6
|
+
"peerDependencies": [],
|
|
7
|
+
"clientOnly": false,
|
|
8
|
+
"description": "Determinate work, drawn as a filling rule.\n\nWraps Base UI's `Progress`, so `role=\"progressbar\"`, the value formatting and\nthe completion status are the primitive's; this layer adds the console skin:\na sunk `surface-3` track, an accent fill and a 120ms linear width transition\n— linear because a progress bar that eases is lying about its rate.\n\nPassing `value={null}` makes it indeterminate: the fill collapses and the\ntrack pulses instead, which says \"working, size unknown\" without inventing a\nnumber. The pulse stills under `prefers-reduced-motion`.\n\nUse `Meter` instead for a *level* (how full something is); a progress bar is\nfor a *task* (how far along something is).\n\nStatic markup — no `\"use client\"`.",
|
|
9
|
+
"props": [
|
|
10
|
+
{
|
|
11
|
+
"name": "label",
|
|
12
|
+
"type": "ReactNode",
|
|
13
|
+
"required": false,
|
|
14
|
+
"defaultValue": null,
|
|
15
|
+
"description": "Caption above the bar. Rendered as Base UI's `Progress.Label`, so it also\nbecomes the bar's accessible name — pass one, or an `aria-label`."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "className",
|
|
19
|
+
"type": "string",
|
|
20
|
+
"required": false,
|
|
21
|
+
"defaultValue": null,
|
|
22
|
+
"description": "Extra classes for the frame that holds the header and the track."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "height",
|
|
26
|
+
"type": "number",
|
|
27
|
+
"required": false,
|
|
28
|
+
"defaultValue": "5",
|
|
29
|
+
"description": "Track height in px at the 16px root, emitted as `rem`. Defaults to `5`."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "showValue",
|
|
33
|
+
"type": "boolean",
|
|
34
|
+
"required": false,
|
|
35
|
+
"defaultValue": "false",
|
|
36
|
+
"description": "Show the formatted value opposite the label. Defaults to `false`."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "trackClassName",
|
|
40
|
+
"type": "string",
|
|
41
|
+
"required": false,
|
|
42
|
+
"defaultValue": null,
|
|
43
|
+
"description": "Extra classes for the track."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "indicatorClassName",
|
|
47
|
+
"type": "string",
|
|
48
|
+
"required": false,
|
|
49
|
+
"defaultValue": null,
|
|
50
|
+
"description": "Extra classes for the fill."
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"typeReferences": [
|
|
54
|
+
"Omit<BaseProgress.Root.Props, \"className\">"
|
|
55
|
+
],
|
|
56
|
+
"subcomponents": [],
|
|
57
|
+
"parts": [],
|
|
58
|
+
"variants": {},
|
|
59
|
+
"defaultVariants": {},
|
|
60
|
+
"tokensUsed": [
|
|
61
|
+
"--cue-accent",
|
|
62
|
+
"--cue-fg-muted",
|
|
63
|
+
"--cue-fg-subtle",
|
|
64
|
+
"--cue-font-mono",
|
|
65
|
+
"--cue-space-2",
|
|
66
|
+
"--cue-space-3",
|
|
67
|
+
"--cue-surface-3",
|
|
68
|
+
"--cue-text-label"
|
|
69
|
+
],
|
|
70
|
+
"summary": "Determinate work, drawn as a filling rule.",
|
|
71
|
+
"examples": [
|
|
72
|
+
{
|
|
73
|
+
"title": "Usage",
|
|
74
|
+
"code": "<Progress value={40} label=\"Rendering\" showValue />\n<Progress value={null} aria-label=\"Connecting\" />",
|
|
75
|
+
"language": "tsx"
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
"status": "todo-docs",
|
|
79
|
+
"url": "/docs/components/progress",
|
|
80
|
+
"mdUrl": "/docs/components/progress.md",
|
|
81
|
+
"jsonUrl": "/r/components/progress.json",
|
|
82
|
+
"specimens": [
|
|
83
|
+
{
|
|
84
|
+
"title": "Progress",
|
|
85
|
+
"group": "instruments",
|
|
86
|
+
"components": [
|
|
87
|
+
"Progress"
|
|
88
|
+
],
|
|
89
|
+
"code": "<div className=\"flex w-full max-w-[36rem] flex-col gap-(--cue-space-5)\">\n <Progress label=\"Rendering preview\" value={62} showValue />\n <Progress label={COPY.loading.title} value={null} />\n <Progress label=\"Tall\" value={30} height={8} showValue />\n</div>",
|
|
90
|
+
"note": "Determinate and indeterminate, with an optional printed value.",
|
|
91
|
+
"interaction": "the indeterminate track stills under prefers-reduced-motion."
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
"todo": true
|
|
95
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "RadioGroup",
|
|
3
|
+
"slug": "radio-group",
|
|
4
|
+
"group": "forms",
|
|
5
|
+
"importPath": "@cueplusplus/ui",
|
|
6
|
+
"peerDependencies": [],
|
|
7
|
+
"clientOnly": true,
|
|
8
|
+
"description": "One-of-many selection: a roving-tabindex group of {@link Radio}s sharing a\nsingle value.\n\nArrow keys move *and* select, per the WAI-ARIA radio group pattern that Base\nUI implements — so the whole group is one tab stop, which is what keeps a\ndense settings panel navigable.",
|
|
9
|
+
"props": [
|
|
10
|
+
{
|
|
11
|
+
"name": "className",
|
|
12
|
+
"type": "string",
|
|
13
|
+
"required": false,
|
|
14
|
+
"defaultValue": null,
|
|
15
|
+
"description": "Extra classes, merged over the stack defaults."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "orientation",
|
|
19
|
+
"type": "\"horizontal\" | \"vertical\"",
|
|
20
|
+
"required": false,
|
|
21
|
+
"defaultValue": "vertical",
|
|
22
|
+
"description": "Lay the options out in a column (default) or a row."
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"typeReferences": [
|
|
26
|
+
"Omit<BaseRadioGroup.Props, \"className\">"
|
|
27
|
+
],
|
|
28
|
+
"subcomponents": [],
|
|
29
|
+
"parts": [],
|
|
30
|
+
"variants": {},
|
|
31
|
+
"defaultVariants": {},
|
|
32
|
+
"tokensUsed": [
|
|
33
|
+
"--cue-accent",
|
|
34
|
+
"--cue-border",
|
|
35
|
+
"--cue-border-strong",
|
|
36
|
+
"--cue-danger",
|
|
37
|
+
"--cue-fg-muted",
|
|
38
|
+
"--cue-font-mono",
|
|
39
|
+
"--cue-icon-md",
|
|
40
|
+
"--cue-icon-sm",
|
|
41
|
+
"--cue-space-2",
|
|
42
|
+
"--cue-space-3",
|
|
43
|
+
"--cue-space-5",
|
|
44
|
+
"--cue-sunken",
|
|
45
|
+
"--cue-text-ui"
|
|
46
|
+
],
|
|
47
|
+
"summary": "One-of-many selection: a roving-tabindex group of {@link Radio}s sharing a single value.",
|
|
48
|
+
"examples": [
|
|
49
|
+
{
|
|
50
|
+
"title": "Usage",
|
|
51
|
+
"code": "<RadioGroup aria-label=\"Blend mode\" value={mode} onValueChange={setMode}>\n <Radio value=\"htp\" label=\"HTP\" />\n <Radio value=\"ltp\" label=\"LTP\" />\n</RadioGroup>",
|
|
52
|
+
"language": "tsx"
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
"status": "todo-docs",
|
|
56
|
+
"url": "/docs/components/radio-group",
|
|
57
|
+
"mdUrl": "/docs/components/radio-group.md",
|
|
58
|
+
"jsonUrl": "/r/components/radio-group.json",
|
|
59
|
+
"specimens": [
|
|
60
|
+
{
|
|
61
|
+
"title": "RadioGroup",
|
|
62
|
+
"group": "forms",
|
|
63
|
+
"components": [
|
|
64
|
+
"RadioGroup",
|
|
65
|
+
"Radio"
|
|
66
|
+
],
|
|
67
|
+
"code": "<div className=\"grid w-full gap-(--cue-space-5) lg:grid-cols-2\">\n <RadioGroup aria-label=\"Blend mode\" defaultValue=\"htp\">\n {BLEND_MODES.map((option) => (\n <Radio key={option.value} value={option.value} label={option.label} />\n ))}\n </RadioGroup>\n <RadioGroup aria-label=\"Blend mode, horizontal\" defaultValue=\"ltp\" orientation=\"horizontal\">\n {BLEND_MODES.map((option) => (\n <Radio key={option.value} value={option.value} label={option.label} />\n ))}\n <Radio value=\"off\" label=\"Off\" disabled />\n </RadioGroup>\n</div>",
|
|
68
|
+
"note": "One choice out of a short set, in either orientation.",
|
|
69
|
+
"interaction": "arrow keys move the selection, and the group is one tab stop."
|
|
70
|
+
}
|
|
71
|
+
],
|
|
72
|
+
"todo": true
|
|
73
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Radio",
|
|
3
|
+
"slug": "radio",
|
|
4
|
+
"group": "forms",
|
|
5
|
+
"importPath": "@cueplusplus/ui",
|
|
6
|
+
"peerDependencies": [],
|
|
7
|
+
"clientOnly": true,
|
|
8
|
+
"description": "One option inside a {@link RadioGroup}.\n\nRound, to say \"exactly one\" the way a square {@link Checkbox } says \"any\nnumber\". Checked draws an accent rim with an accent core rather than a solid\nfill, so the selected option stays legible against the sunken field colour on\nevery theme.",
|
|
9
|
+
"props": [
|
|
10
|
+
{
|
|
11
|
+
"name": "label",
|
|
12
|
+
"type": "ReactNode",
|
|
13
|
+
"required": false,
|
|
14
|
+
"defaultValue": null,
|
|
15
|
+
"description": "Inline label rendered beside the dot and wrapped with it in a `<label>`, so\nthe text is both the accessible name and part of the hit target."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "className",
|
|
19
|
+
"type": "string",
|
|
20
|
+
"required": false,
|
|
21
|
+
"defaultValue": null,
|
|
22
|
+
"description": "Extra classes, merged over the dot defaults."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "size",
|
|
26
|
+
"type": "\"sm\" | \"md\"",
|
|
27
|
+
"required": false,
|
|
28
|
+
"defaultValue": "md",
|
|
29
|
+
"description": "Rung of the density icon ladder for the dot. Defaults to `\"md\"`."
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"typeReferences": [
|
|
33
|
+
"Omit<BaseRadio.Root.Props, \"className\">"
|
|
34
|
+
],
|
|
35
|
+
"subcomponents": [],
|
|
36
|
+
"parts": [],
|
|
37
|
+
"variants": {},
|
|
38
|
+
"defaultVariants": {},
|
|
39
|
+
"tokensUsed": [
|
|
40
|
+
"--cue-accent",
|
|
41
|
+
"--cue-border",
|
|
42
|
+
"--cue-border-strong",
|
|
43
|
+
"--cue-danger",
|
|
44
|
+
"--cue-fg-muted",
|
|
45
|
+
"--cue-font-mono",
|
|
46
|
+
"--cue-icon-md",
|
|
47
|
+
"--cue-icon-sm",
|
|
48
|
+
"--cue-space-2",
|
|
49
|
+
"--cue-space-3",
|
|
50
|
+
"--cue-space-5",
|
|
51
|
+
"--cue-sunken",
|
|
52
|
+
"--cue-text-ui"
|
|
53
|
+
],
|
|
54
|
+
"summary": "One option inside a {@link RadioGroup}.",
|
|
55
|
+
"examples": [
|
|
56
|
+
{
|
|
57
|
+
"title": "Usage",
|
|
58
|
+
"code": "<Radio value=\"htp\" label=\"Highest takes precedence\" />",
|
|
59
|
+
"language": "tsx"
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"status": "todo-docs",
|
|
63
|
+
"url": "/docs/components/radio",
|
|
64
|
+
"mdUrl": "/docs/components/radio.md",
|
|
65
|
+
"jsonUrl": "/r/components/radio.json",
|
|
66
|
+
"specimens": [
|
|
67
|
+
{
|
|
68
|
+
"title": "RadioGroup",
|
|
69
|
+
"group": "forms",
|
|
70
|
+
"components": [
|
|
71
|
+
"RadioGroup",
|
|
72
|
+
"Radio"
|
|
73
|
+
],
|
|
74
|
+
"code": "<div className=\"grid w-full gap-(--cue-space-5) lg:grid-cols-2\">\n <RadioGroup aria-label=\"Blend mode\" defaultValue=\"htp\">\n {BLEND_MODES.map((option) => (\n <Radio key={option.value} value={option.value} label={option.label} />\n ))}\n </RadioGroup>\n <RadioGroup aria-label=\"Blend mode, horizontal\" defaultValue=\"ltp\" orientation=\"horizontal\">\n {BLEND_MODES.map((option) => (\n <Radio key={option.value} value={option.value} label={option.label} />\n ))}\n <Radio value=\"off\" label=\"Off\" disabled />\n </RadioGroup>\n</div>",
|
|
75
|
+
"note": "One choice out of a short set, in either orientation.",
|
|
76
|
+
"interaction": "arrow keys move the selection, and the group is one tab stop."
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
"todo": true
|
|
80
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Rating",
|
|
3
|
+
"slug": "rating",
|
|
4
|
+
"group": "forms",
|
|
5
|
+
"importPath": "@cueplusplus/ui",
|
|
6
|
+
"peerDependencies": [],
|
|
7
|
+
"clientOnly": true,
|
|
8
|
+
"description": "A 0–N rating, drawn as marks.\n\nBuilt as a **radio group**, not a row of buttons: exactly one value is in\neffect, arrow keys move between the options, and one Tab stop covers the whole\nwidget. A row of toggle buttons would put five stops in the tab order and\nannounce five unrelated controls.\n\nRead-only renders as a single `img` with the value in its name — an\nun-interactive control that still takes focus is a trap, and five disabled\nradios announce five things where one sentence will do.",
|
|
9
|
+
"props": [
|
|
10
|
+
{
|
|
11
|
+
"name": "value",
|
|
12
|
+
"type": "number",
|
|
13
|
+
"required": false,
|
|
14
|
+
"defaultValue": null,
|
|
15
|
+
"description": "The rating, `0`–`count`. Use with `onValueChange` for a controlled widget."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "defaultValue",
|
|
19
|
+
"type": "number",
|
|
20
|
+
"required": false,
|
|
21
|
+
"defaultValue": "0",
|
|
22
|
+
"description": "Initial rating for an uncontrolled widget. Defaults to `0`."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "onValueChange",
|
|
26
|
+
"type": "((value: number) => void)",
|
|
27
|
+
"required": false,
|
|
28
|
+
"defaultValue": null,
|
|
29
|
+
"description": "Called with the new rating; `0` means \"cleared\"."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "count",
|
|
33
|
+
"type": "number",
|
|
34
|
+
"required": false,
|
|
35
|
+
"defaultValue": "5",
|
|
36
|
+
"description": "How many marks. Defaults to `5`."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "size",
|
|
40
|
+
"type": "\"sm\" | \"md\" | \"lg\"",
|
|
41
|
+
"required": false,
|
|
42
|
+
"defaultValue": "md",
|
|
43
|
+
"description": "Rung of the icon ladder. Defaults to `\"md\"`."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "allowClear",
|
|
47
|
+
"type": "boolean",
|
|
48
|
+
"required": false,
|
|
49
|
+
"defaultValue": "true",
|
|
50
|
+
"description": "Picking the current value clears it back to `0`. Defaults to `true` — a\nrating you cannot take back is a trap, and there is no other affordance for\n\"actually, no opinion\"."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "readOnly",
|
|
54
|
+
"type": "boolean",
|
|
55
|
+
"required": false,
|
|
56
|
+
"defaultValue": "false",
|
|
57
|
+
"description": "Render a static readout with no controls."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "disabled",
|
|
61
|
+
"type": "boolean",
|
|
62
|
+
"required": false,
|
|
63
|
+
"defaultValue": "false",
|
|
64
|
+
"description": "Grey the marks out and refuse interaction."
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"name": "label",
|
|
68
|
+
"type": "string",
|
|
69
|
+
"required": false,
|
|
70
|
+
"defaultValue": null,
|
|
71
|
+
"description": "Accessible name for the group. Also the prefix of the read-only readout —\n`\"Signal quality: 4 of 5\"`. Synonym of `aria-label`, which wins if both are\ngiven."
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"name": "aria-label",
|
|
75
|
+
"type": "string",
|
|
76
|
+
"required": false,
|
|
77
|
+
"defaultValue": null,
|
|
78
|
+
"description": "Accessible name for the group, for callers who prefer the ARIA spelling."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"name": "icon",
|
|
82
|
+
"type": "ElementType<any, keyof IntrinsicElements>",
|
|
83
|
+
"required": false,
|
|
84
|
+
"defaultValue": "StarGlyph",
|
|
85
|
+
"description": "The mark component. Defaults to a filled star."
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"name": "markLabel",
|
|
89
|
+
"type": "((index: number, count: number) => string)",
|
|
90
|
+
"required": false,
|
|
91
|
+
"defaultValue": "(index, total) => `${index} of ${total}`",
|
|
92
|
+
"description": "Accessible name for mark `index` (1-based) of `count`. Defaults to\n``(index, count) => `${index} of ${count}` ``."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "className",
|
|
96
|
+
"type": "string",
|
|
97
|
+
"required": false,
|
|
98
|
+
"defaultValue": null,
|
|
99
|
+
"description": "Extra classes for the group."
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"typeReferences": [
|
|
103
|
+
"Omit<React.ComponentPropsWithoutRef<\"div\">, \"onChange\" | \"defaultValue\">"
|
|
104
|
+
],
|
|
105
|
+
"subcomponents": [],
|
|
106
|
+
"parts": [],
|
|
107
|
+
"variants": {},
|
|
108
|
+
"defaultVariants": {},
|
|
109
|
+
"tokensUsed": [
|
|
110
|
+
"--cue-accent",
|
|
111
|
+
"--cue-fg-subtle",
|
|
112
|
+
"--cue-icon-md",
|
|
113
|
+
"--cue-icon-sm",
|
|
114
|
+
"--cue-space-1"
|
|
115
|
+
],
|
|
116
|
+
"summary": "A 0–N rating, drawn as marks.",
|
|
117
|
+
"examples": [
|
|
118
|
+
{
|
|
119
|
+
"title": "Usage",
|
|
120
|
+
"code": "<Rating label=\"Signal quality\" value={score} onValueChange={setScore} />\n<Rating aria-label=\"Signal quality\" value={4} readOnly size=\"sm\" />",
|
|
121
|
+
"language": "tsx"
|
|
122
|
+
}
|
|
123
|
+
],
|
|
124
|
+
"status": "todo-docs",
|
|
125
|
+
"url": "/docs/components/rating",
|
|
126
|
+
"mdUrl": "/docs/components/rating.md",
|
|
127
|
+
"jsonUrl": "/r/components/rating.json",
|
|
128
|
+
"specimens": [
|
|
129
|
+
{
|
|
130
|
+
"title": "Rating",
|
|
131
|
+
"group": "forms",
|
|
132
|
+
"components": [
|
|
133
|
+
"Rating"
|
|
134
|
+
],
|
|
135
|
+
"code": "<Specimens>\n <Specimen label=\"default\">\n <Rating label=\"Rig condition\" defaultValue={4} />\n </Specimen>\n <Specimen label=\"clearable\">\n <Rating label=\"Rig condition, clearable\" defaultValue={3} allowClear />\n </Specimen>\n <Specimen label=\"read-only\">\n <Rating label=\"Rig condition, read-only\" value={5} readOnly />\n </Specimen>\n <Specimen label=\"disabled\">\n <Rating label=\"Rig condition, disabled\" defaultValue={2} disabled />\n </Specimen>\n</Specimens>",
|
|
136
|
+
"note": "A radio group of marks, with the value spoken rather than implied by how many glyphs are filled.",
|
|
137
|
+
"interaction": "arrow keys move; clicking the current mark clears it when `allowClear` is on."
|
|
138
|
+
}
|
|
139
|
+
],
|
|
140
|
+
"todo": true
|
|
141
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Resizable",
|
|
3
|
+
"slug": "resizable",
|
|
4
|
+
"group": "layout",
|
|
5
|
+
"importPath": "@cueplusplus/ui/layout/resizable",
|
|
6
|
+
"peerDependencies": [
|
|
7
|
+
"react-resizable-panels"
|
|
8
|
+
],
|
|
9
|
+
"clientOnly": true,
|
|
10
|
+
"description": "Split panes the user can drag, on `react-resizable-panels`.\n\n`react-resizable-panels` is an **optional peer**: import this from\n`@cueplusplus/ui/layout/resizable`, never from the core barrel, so an app\nwith no split view never installs one.",
|
|
11
|
+
"props": [],
|
|
12
|
+
"typeReferences": [],
|
|
13
|
+
"subcomponents": [
|
|
14
|
+
"Group",
|
|
15
|
+
"Panel",
|
|
16
|
+
"Handle"
|
|
17
|
+
],
|
|
18
|
+
"parts": [
|
|
19
|
+
{
|
|
20
|
+
"name": "Group",
|
|
21
|
+
"usage": "Resizable.Group",
|
|
22
|
+
"description": "The frame that owns the layout and divides it between its panels.",
|
|
23
|
+
"props": [],
|
|
24
|
+
"typeReferences": [
|
|
25
|
+
"React.ComponentProps<typeof PanelGroup>"
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "Panel",
|
|
30
|
+
"usage": "Resizable.Panel",
|
|
31
|
+
"description": "One resizable region.\n\n`className` lands on the panel's inner content box, not on the flex child —\nthat is the library's contract, and it exists so a padding or a border cannot\nfight the flex-basis arithmetic that sizes the panel. `min-h-0 min-w-0` is\npart of the recipe: without it a panel containing a scroll area refuses to\nshrink below its content.",
|
|
32
|
+
"props": [],
|
|
33
|
+
"typeReferences": [
|
|
34
|
+
"React.ComponentProps<typeof PanelPrimitive>"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "Handle",
|
|
39
|
+
"usage": "Resizable.Handle",
|
|
40
|
+
"description": "The draggable seam between two panels.\n\n4px — the widest a separator can be before it reads as a gutter, and the\nnarrowest that is still a comfortable pointer target. It sits at border\ncolour, takes the accent under the pointer, while dragging and on keyboard\nfocus, and keeps a real focus ring because the separator is operable with the\narrow keys.",
|
|
41
|
+
"props": [
|
|
42
|
+
{
|
|
43
|
+
"name": "withGrip",
|
|
44
|
+
"type": "boolean",
|
|
45
|
+
"required": false,
|
|
46
|
+
"defaultValue": "false",
|
|
47
|
+
"description": "Draw a short grip line down the middle of the handle.\n\nA 4px strip that only colours on hover is easy to miss on first sight; the\ngrip is the standing hint that the seam is draggable, for the price of one\nhairline."
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"typeReferences": [
|
|
51
|
+
"React.ComponentProps<typeof PanelSeparator>"
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
"variants": {},
|
|
56
|
+
"defaultVariants": {},
|
|
57
|
+
"tokensUsed": [
|
|
58
|
+
"--cue-accent",
|
|
59
|
+
"--cue-border",
|
|
60
|
+
"--cue-border-strong",
|
|
61
|
+
"--cue-space-6"
|
|
62
|
+
],
|
|
63
|
+
"summary": "Split panes the user can drag, on `react-resizable-panels`.",
|
|
64
|
+
"examples": [
|
|
65
|
+
{
|
|
66
|
+
"title": "Usage",
|
|
67
|
+
"code": "<Resizable.Group orientation=\"horizontal\">\n <Resizable.Panel id=\"tree\" defaultSize={25} minSize={15}>…</Resizable.Panel>\n <Resizable.Handle withGrip />\n <Resizable.Panel id=\"editor\">…</Resizable.Panel>\n</Resizable.Group>",
|
|
68
|
+
"language": "tsx"
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"status": "todo-docs",
|
|
72
|
+
"url": "/docs/components/resizable",
|
|
73
|
+
"mdUrl": "/docs/components/resizable.md",
|
|
74
|
+
"jsonUrl": "/r/components/resizable.json",
|
|
75
|
+
"specimens": [
|
|
76
|
+
{
|
|
77
|
+
"title": "Resizable",
|
|
78
|
+
"group": "layout",
|
|
79
|
+
"components": [
|
|
80
|
+
"Resizable"
|
|
81
|
+
],
|
|
82
|
+
"code": "<Resizable.Group\n orientation=\"horizontal\"\n className=\"h-[9rem] w-full max-w-[36rem] overflow-hidden rounded-(--radius-surface) border border-border\"\n>\n <Resizable.Panel id=\"patch\" defaultSize=\"35\" minSize=\"20\">\n <div className=\"flex h-full items-center justify-center font-mono text-(length:--cue-text-ui) text-fg-muted\">\n Patch\n </div>\n </Resizable.Panel>\n <Resizable.Handle withGrip />\n <Resizable.Panel id=\"preview\">\n <div className=\"flex h-full items-center justify-center font-mono text-(length:--cue-text-ui) text-fg-muted\">\n Preview\n </div>\n </Resizable.Panel>\n</Resizable.Group>",
|
|
83
|
+
"note": "react-resizable-panels with a 4px handle that goes accent on hover. Also an optional peer, from @cueplusplus/ui/layout/resizable.",
|
|
84
|
+
"interaction": "the handle is a `separator` with a value: arrow keys resize, Home and End collapse either way."
|
|
85
|
+
}
|
|
86
|
+
],
|
|
87
|
+
"todo": true
|
|
88
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Row",
|
|
3
|
+
"slug": "row",
|
|
4
|
+
"group": "chrome",
|
|
5
|
+
"importPath": "@cueplusplus/ui",
|
|
6
|
+
"peerDependencies": [],
|
|
7
|
+
"clientOnly": false,
|
|
8
|
+
"description": "One row of a hairline list: the workhorse of every console panel.\n\nStatic by default and a real `<button>` when `interactive` — never a `<div>`\nwith an `onClick`, so keyboard users get it for free. Vertical rhythm comes\nfrom the density row-padding tokens, so the same list is 22px tall in\nultra-compact and 34px tall in large without touching the markup.\n\nStatic markup — no `\"use client\"`.",
|
|
9
|
+
"props": [
|
|
10
|
+
{
|
|
11
|
+
"name": "interactive",
|
|
12
|
+
"type": "boolean",
|
|
13
|
+
"required": false,
|
|
14
|
+
"defaultValue": "false",
|
|
15
|
+
"description": "Render as a `<button>` with hover feedback and a focus ring instead of a\nstatic `<div>`. Use for rows that select, open or toggle something."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "seam",
|
|
19
|
+
"type": "boolean",
|
|
20
|
+
"required": false,
|
|
21
|
+
"defaultValue": null,
|
|
22
|
+
"description": "Drop the hairline and paint the row's own fill, for use inside a\n{@link SeamList}. Without a `SeamList` parent the rows will simply touch."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "disabled",
|
|
26
|
+
"type": "boolean",
|
|
27
|
+
"required": false,
|
|
28
|
+
"defaultValue": null,
|
|
29
|
+
"description": "Disable the interactive form. Ignored when `interactive` is not set."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "children",
|
|
33
|
+
"type": "ReactNode",
|
|
34
|
+
"required": false,
|
|
35
|
+
"defaultValue": null,
|
|
36
|
+
"description": "Row content — normally a label, a spacer and a value or control."
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"typeReferences": [
|
|
40
|
+
"React.HTMLAttributes<HTMLElement>",
|
|
41
|
+
"VariantProps<typeof rowVariants>"
|
|
42
|
+
],
|
|
43
|
+
"subcomponents": [],
|
|
44
|
+
"parts": [],
|
|
45
|
+
"variants": {
|
|
46
|
+
"seam": [
|
|
47
|
+
"true",
|
|
48
|
+
"false"
|
|
49
|
+
],
|
|
50
|
+
"interactive": [
|
|
51
|
+
"true",
|
|
52
|
+
"false"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
"defaultVariants": {
|
|
56
|
+
"seam": "false",
|
|
57
|
+
"interactive": "false"
|
|
58
|
+
},
|
|
59
|
+
"tokensUsed": [
|
|
60
|
+
"--cue-accent",
|
|
61
|
+
"--cue-bg",
|
|
62
|
+
"--cue-border",
|
|
63
|
+
"--cue-fg",
|
|
64
|
+
"--cue-font-mono",
|
|
65
|
+
"--cue-pad-row-x",
|
|
66
|
+
"--cue-pad-row-y",
|
|
67
|
+
"--cue-radius-surface",
|
|
68
|
+
"--cue-space-3",
|
|
69
|
+
"--cue-surface-2",
|
|
70
|
+
"--cue-text-ui"
|
|
71
|
+
],
|
|
72
|
+
"summary": "The list row, in both of the system's separator idioms.",
|
|
73
|
+
"examples": [
|
|
74
|
+
{
|
|
75
|
+
"title": "Usage",
|
|
76
|
+
"code": "<Panel><Row>Channel 1<span className=\"ml-auto\">255</span></Row></Panel>\n<SeamList>\n <Row seam interactive onClick={select}>Cue 1</Row>\n <Row seam interactive onClick={select}>Cue 2</Row>\n</SeamList>",
|
|
77
|
+
"language": "tsx"
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"status": "stable",
|
|
81
|
+
"url": "/docs/components/row",
|
|
82
|
+
"mdUrl": "/docs/components/row.md",
|
|
83
|
+
"jsonUrl": "/r/components/row.json",
|
|
84
|
+
"whenToUse": [
|
|
85
|
+
"Items in a list inside a `Panel`, separated by hairlines rather than gaps.",
|
|
86
|
+
"Rows that select, open or toggle something. Pass `interactive` for the button semantics and the focus ring."
|
|
87
|
+
],
|
|
88
|
+
"whenNotToUse": [
|
|
89
|
+
"Data with shared columns a reader compares across rows. Use `Table`.",
|
|
90
|
+
"Free-standing blocks with their own padding and rim. Use `Card` or `Item`."
|
|
91
|
+
],
|
|
92
|
+
"commonMistakes": [
|
|
93
|
+
"Passing `seam` without a `SeamList` parent, which drops the border and leaves the rows touching.",
|
|
94
|
+
"Making the whole row interactive and then nesting a button inside it, which puts a control inside a control."
|
|
95
|
+
],
|
|
96
|
+
"specimens": [
|
|
97
|
+
{
|
|
98
|
+
"title": "Row / SeamList",
|
|
99
|
+
"group": "chrome",
|
|
100
|
+
"components": [
|
|
101
|
+
"Row",
|
|
102
|
+
"SeamList"
|
|
103
|
+
],
|
|
104
|
+
"code": "<div className=\"grid w-full gap-(--cue-space-5) lg:grid-cols-2\">\n <Panel>\n <Row>Default row</Row>\n <Row interactive>Interactive row</Row>\n <Row interactive disabled>\n Disabled row\n </Row>\n </Panel>\n <SeamList>\n <Row seam>Seam row</Row>\n <Row seam interactive>\n Seam row, interactive\n </Row>\n <Row seam>Seam row</Row>\n </SeamList>\n</div>",
|
|
105
|
+
"note": "Hairline rows, and the 1px-gap variant where the gaps themselves are the rule.",
|
|
106
|
+
"interaction": "pass `interactive` for a hover ground and a focus ring; `disabled` dims and stops pointer events."
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
}
|