@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.
Files changed (246) hide show
  1. package/CHANGELOG.md +705 -0
  2. package/dist/brand/_chassis.d.ts +54 -0
  3. package/dist/brand/_chassis.js +81 -0
  4. package/dist/brand/_geometry.js +41 -0
  5. package/dist/brand/cue-logotype.d.ts +29 -0
  6. package/dist/brand/cue-logotype.js +60 -0
  7. package/dist/brand/cue-mark.d.ts +30 -0
  8. package/dist/brand/cue-mark.js +61 -0
  9. package/dist/brand/index.d.ts +5 -0
  10. package/dist/brand/plussie.d.ts +67 -0
  11. package/dist/brand/plussie.js +125 -0
  12. package/dist/chat/agent-pile.js +1 -1
  13. package/dist/chat/ask-box.js +2 -2
  14. package/dist/chat/delegation-card.js +1 -1
  15. package/dist/chat/message.js +2 -2
  16. package/dist/chrome/_edge-scroller.d.ts +45 -0
  17. package/dist/chrome/_edge-scroller.js +149 -0
  18. package/dist/chrome/_glyphs.js +19 -1
  19. package/dist/chrome/_tabs-scroll.d.ts +13 -8
  20. package/dist/chrome/_tabs-scroll.js +13 -8
  21. package/dist/chrome/app-bar.d.ts +103 -0
  22. package/dist/chrome/app-bar.js +175 -0
  23. package/dist/chrome/app-shell.d.ts +125 -0
  24. package/dist/chrome/app-shell.js +167 -0
  25. package/dist/chrome/footer.d.ts +75 -0
  26. package/dist/chrome/footer.js +68 -0
  27. package/dist/chrome/index.d.ts +5 -1
  28. package/dist/chrome/index.js +4 -1
  29. package/dist/chrome/navigation-menu.js +1 -1
  30. package/dist/chrome/page-shell.d.ts +1 -1
  31. package/dist/chrome/page-shell.js +15 -5
  32. package/dist/chrome/segmented-control.d.ts +19 -0
  33. package/dist/chrome/segmented-control.js +40 -21
  34. package/dist/chrome/tabs.js +21 -65
  35. package/dist/chrome/toolbar.d.ts +22 -0
  36. package/dist/chrome/toolbar.js +26 -5
  37. package/dist/configurator/_overrides.js +22 -8
  38. package/dist/configurator/configurator.js +1 -1
  39. package/dist/configurator/panel-sections.js +10 -4
  40. package/dist/dmx/channel-matrix.js +1 -1
  41. package/dist/forms/otp-field.js +1 -1
  42. package/dist/index.d.ts +18 -9
  43. package/dist/index.js +16 -10
  44. package/dist/instruments/data-table.js +1 -1
  45. package/dist/instruments/index.d.ts +2 -2
  46. package/dist/instruments/index.js +2 -2
  47. package/dist/instruments/table.d.ts +14 -1
  48. package/dist/instruments/table.js +20 -1
  49. package/dist/layout/carousel.js +1 -1
  50. package/dist/layout/container.d.ts +1 -1
  51. package/dist/layout/container.js +6 -3
  52. package/dist/layout/index.d.ts +3 -3
  53. package/dist/layout/index.js +3 -3
  54. package/dist/layout/pagination.js +1 -1
  55. package/dist/layout/sidebar.d.ts +23 -3
  56. package/dist/layout/sidebar.js +18 -7
  57. package/dist/midi/spectrum-visualizer.js +1 -1
  58. package/dist/midi/timeline-ruler.js +1 -1
  59. package/dist/overlays/command-palette.js +1 -1
  60. package/dist/overlays/dialog.js +1 -1
  61. package/dist/overlays/dropdown-menu.js +2 -2
  62. package/dist/overlays/hover-card.js +1 -1
  63. package/dist/overlays/index.js +1 -1
  64. package/dist/overlays/popover.js +1 -1
  65. package/dist/overlays/sheet.js +1 -1
  66. package/dist/overlays/toast.js +1 -1
  67. package/dist/primitives/chip.d.ts +1 -1
  68. package/dist/primitives/index.d.ts +1 -1
  69. package/dist/primitives/index.js +1 -1
  70. package/dist/primitives/status-dot.d.ts +7 -0
  71. package/dist/primitives/status-dot.js +8 -1
  72. package/dist/styles.css +58 -2
  73. package/dist/system/density.d.ts +4 -1
  74. package/dist/system/density.js +12 -4
  75. package/dist/system/index.d.ts +4 -4
  76. package/dist/system/portal.d.ts +5 -5
  77. package/dist/system/portal.js +30 -11
  78. package/dist/system/prepaint.d.ts +34 -9
  79. package/dist/system/prepaint.js +48 -25
  80. package/dist/system/theme-provider.d.ts +48 -11
  81. package/dist/system/theme-provider.js +109 -35
  82. package/dist/system/use-density.d.ts +3 -3
  83. package/dist/system/use-density.js +16 -6
  84. package/dist/system/use-theme.d.ts +4 -2
  85. package/dist/system/use-theme.js +4 -2
  86. package/dist/theming/_presets.js +133 -5
  87. package/dist/theming/create-theme.d.ts +2 -2
  88. package/dist/theming/create-theme.js +37 -19
  89. package/dist/theming/serialize.d.ts +1 -1
  90. package/dist/theming/serialize.js +25 -1
  91. package/manifest/components/accordion.json +154 -0
  92. package/manifest/components/agent-pile.json +116 -0
  93. package/manifest/components/alert-dialog.json +190 -0
  94. package/manifest/components/app-bar.json +244 -0
  95. package/manifest/components/app-shell.json +291 -0
  96. package/manifest/components/app-window-frame.json +102 -0
  97. package/manifest/components/ask-box.json +209 -0
  98. package/manifest/components/autocomplete.json +197 -0
  99. package/manifest/components/avatar-group.json +72 -0
  100. package/manifest/components/avatar.json +95 -0
  101. package/manifest/components/breadcrumb.json +74 -0
  102. package/manifest/components/button-group.json +74 -0
  103. package/manifest/components/button.json +125 -0
  104. package/manifest/components/calendar.json +65 -0
  105. package/manifest/components/card.json +140 -0
  106. package/manifest/components/carousel.json +200 -0
  107. package/manifest/components/channel-matrix.json +173 -0
  108. package/manifest/components/chart-container.json +111 -0
  109. package/manifest/components/chart-ramp.json +72 -0
  110. package/manifest/components/chart-swatch.json +65 -0
  111. package/manifest/components/chart-tooltip-content.json +114 -0
  112. package/manifest/components/checkbox-group.json +68 -0
  113. package/manifest/components/checkbox.json +93 -0
  114. package/manifest/components/chip.json +132 -0
  115. package/manifest/components/collapsible.json +120 -0
  116. package/manifest/components/color-area.json +59 -0
  117. package/manifest/components/color-field.json +79 -0
  118. package/manifest/components/color-picker.json +175 -0
  119. package/manifest/components/color-slider.json +75 -0
  120. package/manifest/components/color-swatch.json +68 -0
  121. package/manifest/components/colors-section.json +66 -0
  122. package/manifest/components/combobox.json +198 -0
  123. package/manifest/components/command-palette.json +177 -0
  124. package/manifest/components/composer.json +176 -0
  125. package/manifest/components/container.json +60 -0
  126. package/manifest/components/context-menu.json +121 -0
  127. package/manifest/components/copy-button.json +93 -0
  128. package/manifest/components/cue-logotype.json +96 -0
  129. package/manifest/components/cue-mark.json +97 -0
  130. package/manifest/components/cue-portal-frame.json +55 -0
  131. package/manifest/components/data-table-pagination.json +83 -0
  132. package/manifest/components/data-table-toolbar.json +104 -0
  133. package/manifest/components/date-field.json +80 -0
  134. package/manifest/components/date-picker.json +191 -0
  135. package/manifest/components/date-range-picker.json +191 -0
  136. package/manifest/components/delegation-card.json +144 -0
  137. package/manifest/components/density.json +58 -0
  138. package/manifest/components/description-list.json +84 -0
  139. package/manifest/components/dialog.json +198 -0
  140. package/manifest/components/disclosure.json +109 -0
  141. package/manifest/components/dmx-bar.json +94 -0
  142. package/manifest/components/dmx-strip.json +101 -0
  143. package/manifest/components/drawer.json +179 -0
  144. package/manifest/components/dropdown-menu.json +229 -0
  145. package/manifest/components/empty-state.json +90 -0
  146. package/manifest/components/env-var-input.json +150 -0
  147. package/manifest/components/export-dialog.json +84 -0
  148. package/manifest/components/eyebrow.json +56 -0
  149. package/manifest/components/field-description.json +63 -0
  150. package/manifest/components/field-error.json +77 -0
  151. package/manifest/components/field-label.json +63 -0
  152. package/manifest/components/field.json +79 -0
  153. package/manifest/components/file-upload.json +159 -0
  154. package/manifest/components/flow-background.json +50 -0
  155. package/manifest/components/flow-controls.json +50 -0
  156. package/manifest/components/footer.json +112 -0
  157. package/manifest/components/grid.json +81 -0
  158. package/manifest/components/group-bar.json +102 -0
  159. package/manifest/components/hover-card.json +151 -0
  160. package/manifest/components/icon-button.json +88 -0
  161. package/manifest/components/info-tip.json +98 -0
  162. package/manifest/components/input-group.json +91 -0
  163. package/manifest/components/input.json +89 -0
  164. package/manifest/components/item.json +129 -0
  165. package/manifest/components/kbd.json +52 -0
  166. package/manifest/components/link.json +81 -0
  167. package/manifest/components/log-viewer.json +139 -0
  168. package/manifest/components/menubar.json +157 -0
  169. package/manifest/components/message-list.json +100 -0
  170. package/manifest/components/message.json +116 -0
  171. package/manifest/components/meter.json +114 -0
  172. package/manifest/components/multi-select.json +190 -0
  173. package/manifest/components/musical-time-input.json +113 -0
  174. package/manifest/components/navigation-menu.json +226 -0
  175. package/manifest/components/node-card.json +109 -0
  176. package/manifest/components/node-handle.json +69 -0
  177. package/manifest/components/number-field.json +107 -0
  178. package/manifest/components/otp-field.json +128 -0
  179. package/manifest/components/page-shell.json +96 -0
  180. package/manifest/components/pagination.json +92 -0
  181. package/manifest/components/panel-header.json +77 -0
  182. package/manifest/components/panel.json +71 -0
  183. package/manifest/components/password-input.json +119 -0
  184. package/manifest/components/piano-keyboard.json +120 -0
  185. package/manifest/components/plussie.json +111 -0
  186. package/manifest/components/popover.json +193 -0
  187. package/manifest/components/preset-section.json +73 -0
  188. package/manifest/components/progress.json +95 -0
  189. package/manifest/components/radio-group.json +73 -0
  190. package/manifest/components/radio.json +80 -0
  191. package/manifest/components/rating.json +141 -0
  192. package/manifest/components/resizable.json +88 -0
  193. package/manifest/components/row.json +109 -0
  194. package/manifest/components/scroll-area.json +91 -0
  195. package/manifest/components/scrollable-tabs-list.json +83 -0
  196. package/manifest/components/scrub-input.json +200 -0
  197. package/manifest/components/seam-cell.json +75 -0
  198. package/manifest/components/seam-grid.json +75 -0
  199. package/manifest/components/seam-list.json +56 -0
  200. package/manifest/components/search-input.json +134 -0
  201. package/manifest/components/section-header.json +112 -0
  202. package/manifest/components/segmented-control.json +138 -0
  203. package/manifest/components/select.json +194 -0
  204. package/manifest/components/separator.json +53 -0
  205. package/manifest/components/shape-section.json +66 -0
  206. package/manifest/components/sheet.json +186 -0
  207. package/manifest/components/sidebar.json +198 -0
  208. package/manifest/components/signal-edge.json +56 -0
  209. package/manifest/components/skeleton.json +46 -0
  210. package/manifest/components/slider.json +89 -0
  211. package/manifest/components/sparkline.json +76 -0
  212. package/manifest/components/spectrum-visualizer.json +115 -0
  213. package/manifest/components/spinner.json +61 -0
  214. package/manifest/components/stack.json +96 -0
  215. package/manifest/components/stat.json +87 -0
  216. package/manifest/components/status-bar.json +58 -0
  217. package/manifest/components/status-dot.json +78 -0
  218. package/manifest/components/stepper.json +89 -0
  219. package/manifest/components/switch.json +87 -0
  220. package/manifest/components/table-scroll-region.json +69 -0
  221. package/manifest/components/table.json +155 -0
  222. package/manifest/components/tabs.json +145 -0
  223. package/manifest/components/tags-input.json +190 -0
  224. package/manifest/components/terminal-frame.json +119 -0
  225. package/manifest/components/textarea.json +76 -0
  226. package/manifest/components/theme-configurator.json +124 -0
  227. package/manifest/components/theme-provider.json +134 -0
  228. package/manifest/components/threshold-rail.json +160 -0
  229. package/manifest/components/time-field.json +80 -0
  230. package/manifest/components/timeline-ruler.json +139 -0
  231. package/manifest/components/timeline.json +115 -0
  232. package/manifest/components/title-bar.json +82 -0
  233. package/manifest/components/toast.json +130 -0
  234. package/manifest/components/toggle-group.json +106 -0
  235. package/manifest/components/toggle.json +109 -0
  236. package/manifest/components/token-editor.json +90 -0
  237. package/manifest/components/toolbar.json +163 -0
  238. package/manifest/components/tooltip.json +164 -0
  239. package/manifest/components/tree-visibility-toggle.json +84 -0
  240. package/manifest/components/tree.json +140 -0
  241. package/manifest/components/two-step-button.json +113 -0
  242. package/manifest/components/universe-grid.json +127 -0
  243. package/manifest/components/usage-chart.json +124 -0
  244. package/manifest/manifest.json +2142 -0
  245. package/manifest/tokens.json +138 -0
  246. package/package.json +13 -5
@@ -0,0 +1,98 @@
1
+ {
2
+ "name": "InfoTip",
3
+ "slug": "info-tip",
4
+ "group": "overlays",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "The 13px circular \"i\" badge: a footnote marker for a field, a column or a\nnumber whose definition is not obvious.\n\nA real focusable `<button>`, not a bare `<span>` with a hover handler — the\nexplanation has to be reachable from the keyboard, and the badge's own\n`cursor-help` is the only hint sighted users get that it is there at all.\nEverything else (portal theme stamping, `role=\"tooltip\"`, dismissal) comes\nfrom {@link Tooltip}.\n\nThe badge stays 13px across densities on purpose: it is a punctuation mark\nsitting in a line of text, so it tracks the text, not the control ladder.",
9
+ "props": [
10
+ {
11
+ "name": "text",
12
+ "type": "ReactNode",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "The explanation to reveal. One or two sentences; longer belongs in a `Popover`."
16
+ },
17
+ {
18
+ "name": "width",
19
+ "type": "number",
20
+ "required": false,
21
+ "defaultValue": "224",
22
+ "description": "Width of the revealed panel in px, applied as rem so it scales with the\nroot font size. Defaults to `224`."
23
+ },
24
+ {
25
+ "name": "label",
26
+ "type": "string",
27
+ "required": false,
28
+ "defaultValue": "More information",
29
+ "description": "Accessible name for the badge. Defaults to `\"More information\"`."
30
+ },
31
+ {
32
+ "name": "side",
33
+ "type": "\"left\" | \"right\" | \"top\" | \"bottom\" | \"inline-end\" | \"inline-start\"",
34
+ "required": false,
35
+ "defaultValue": "top",
36
+ "description": "Preferred side of the badge. Defaults to `\"top\"`."
37
+ },
38
+ {
39
+ "name": "align",
40
+ "type": "\"center\" | \"end\" | \"start\"",
41
+ "required": false,
42
+ "defaultValue": null,
43
+ "description": "Alignment along that side. Defaults to `\"center\"`."
44
+ },
45
+ {
46
+ "name": "delay",
47
+ "type": "number",
48
+ "required": false,
49
+ "defaultValue": "200",
50
+ "description": "Hover delay in ms before the panel appears. Defaults to `200`."
51
+ },
52
+ {
53
+ "name": "className",
54
+ "type": "string",
55
+ "required": false,
56
+ "defaultValue": null,
57
+ "description": "Extra classes for the badge."
58
+ }
59
+ ],
60
+ "typeReferences": [],
61
+ "subcomponents": [],
62
+ "parts": [],
63
+ "variants": {},
64
+ "defaultVariants": {},
65
+ "tokensUsed": [
66
+ "--cue-accent",
67
+ "--cue-border-strong",
68
+ "--cue-fg-muted",
69
+ "--cue-font-mono",
70
+ "--cue-text-micro"
71
+ ],
72
+ "summary": "The 13px circular \"i\" badge: a footnote marker for a field, a column or a number whose definition is not obvious.",
73
+ "examples": [
74
+ {
75
+ "title": "Usage",
76
+ "code": "<FieldLabel>Pace <InfoTip text=\"Where usage should be by today, pro-rated.\" /></FieldLabel>",
77
+ "language": "tsx"
78
+ }
79
+ ],
80
+ "status": "todo-docs",
81
+ "url": "/docs/components/info-tip",
82
+ "mdUrl": "/docs/components/info-tip.md",
83
+ "jsonUrl": "/r/components/info-tip.json",
84
+ "specimens": [
85
+ {
86
+ "title": "Tooltip / InfoTip",
87
+ "group": "overlays",
88
+ "components": [
89
+ "Tooltip",
90
+ "InfoTip"
91
+ ],
92
+ "code": "<Tooltip.Provider>\n <Specimens>\n <Specimen label=\"tooltip\">\n <Tooltip.Root>\n <Tooltip.Trigger render={<IconButton aria-label=\"Go\" icon={Play} />} />\n <Tooltip.Content>Fire the selected cue</Tooltip.Content>\n </Tooltip.Root>\n </Specimen>\n <Specimen label=\"side bottom\">\n <Tooltip.Root>\n <Tooltip.Trigger render={<IconButton aria-label=\"Copy address\" icon={Copy} />} />\n <Tooltip.Content side=\"bottom\">Copy 10.0.0.42</Tooltip.Content>\n </Tooltip.Root>\n </Specimen>\n <Specimen label=\"info tip\">\n <span className=\"flex items-center gap-(--cue-space-2) font-mono text-(length:--cue-text-ui) text-fg-muted\">\n Pace tick\n <InfoTip text=\"Where the meter would be if usage were flat across the period.\" />\n </span>\n </Specimen>\n <Specimen label=\"wide info tip\">\n <InfoTip\n width={320}\n label=\"About provenance\"\n text=\"Vendor numbers are measured, estimated ones are hatched, and an unbounded meter draws no percentage at all.\"\n />\n </Specimen>\n </Specimens>\n</Tooltip.Provider>",
93
+ "note": "A tooltip names a control; an InfoTip is the 13px `i` badge that explains one.",
94
+ "interaction": "tooltips open on hover and on keyboard focus, and never on touch; the InfoTip badge is a real button."
95
+ }
96
+ ],
97
+ "todo": true
98
+ }
@@ -0,0 +1,91 @@
1
+ {
2
+ "name": "InputGroup",
3
+ "slug": "input-group",
4
+ "group": "forms",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A control and its adornments, drawn as a single field.\n\nThe group — not the input — owns the chassis, so there is exactly one rim and\none fill however many affordances are bolted on. It publishes that fact\nthrough context: an {@link Input } rendered inside strips its own border,\nbackground, height and padding and inherits the group's font size. Focus\nfeedback moves to `focus-within`, since a `<div>` never matches\n`:focus-visible`.",
9
+ "props": [
10
+ {
11
+ "name": "leading",
12
+ "type": "ReactNode",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "Content pinned to the left gutter — a glyph, a unit prefix, a protocol."
16
+ },
17
+ {
18
+ "name": "trailing",
19
+ "type": "ReactNode",
20
+ "required": false,
21
+ "defaultValue": null,
22
+ "description": "Content pinned to the right gutter — a unit suffix, a `Kbd`, a clear button."
23
+ },
24
+ {
25
+ "name": "size",
26
+ "type": "\"sm\" | \"md\" | \"lg\"",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "Rung of the control ladder for the whole cluster. Defaults to `\"md\"`."
30
+ },
31
+ {
32
+ "name": "children",
33
+ "type": "ReactNode",
34
+ "required": true,
35
+ "defaultValue": null,
36
+ "description": "The control. An {@link Input } here renders bare and fills the middle."
37
+ }
38
+ ],
39
+ "typeReferences": [
40
+ "React.ComponentPropsWithoutRef<\"div\">"
41
+ ],
42
+ "subcomponents": [],
43
+ "parts": [],
44
+ "variants": {},
45
+ "defaultVariants": {},
46
+ "tokensUsed": [
47
+ "--cue-accent",
48
+ "--cue-border",
49
+ "--cue-control-lg",
50
+ "--cue-control-md",
51
+ "--cue-control-sm",
52
+ "--cue-danger",
53
+ "--cue-fg",
54
+ "--cue-fg-subtle",
55
+ "--cue-font-mono",
56
+ "--cue-radius-control",
57
+ "--cue-space-2",
58
+ "--cue-space-3",
59
+ "--cue-space-4",
60
+ "--cue-space-5",
61
+ "--cue-sunken",
62
+ "--cue-text-body",
63
+ "--cue-text-label",
64
+ "--cue-text-ui"
65
+ ],
66
+ "summary": "A control and its adornments, drawn as a single field.",
67
+ "examples": [
68
+ {
69
+ "title": "Usage",
70
+ "code": "<InputGroup leading={<Search />} trailing={<Kbd>⌘K</Kbd>}>\n <Input aria-label=\"Search cues\" />\n</InputGroup>",
71
+ "language": "tsx"
72
+ }
73
+ ],
74
+ "status": "todo-docs",
75
+ "url": "/docs/components/input-group",
76
+ "mdUrl": "/docs/components/input-group.md",
77
+ "jsonUrl": "/r/components/input-group.json",
78
+ "specimens": [
79
+ {
80
+ "title": "InputGroup",
81
+ "group": "forms",
82
+ "components": [
83
+ "InputGroup"
84
+ ],
85
+ "code": "<Specimens>\n <Specimen label=\"leading\">\n <InputGroup leading={<Plug aria-hidden=\"true\" className=\"size-icon-md\" />}>\n <Input aria-label=\"Node address\" defaultValue=\"10.0.0.42\" />\n </InputGroup>\n </Specimen>\n <Specimen label=\"trailing\">\n <InputGroup trailing={<span className=\"font-mono text-fg-subtle\">%</span>}>\n <Input aria-label=\"Level\" defaultValue=\"80\" />\n </InputGroup>\n </Specimen>\n <Specimen label=\"both, sm\">\n <InputGroup\n size=\"sm\"\n leading={<Ruler aria-hidden=\"true\" className=\"size-icon-sm\" />}\n trailing={<span className=\"font-mono text-fg-subtle\">m</span>}\n >\n <Input aria-label=\"Throw distance\" defaultValue=\"7.5\" />\n </InputGroup>\n </Specimen>\n</Specimens>",
86
+ "note": "One rim around a control and its adornments, so the group focuses as a unit.",
87
+ "interaction": "focus inside the group lights the whole rim, not just the input."
88
+ }
89
+ ],
90
+ "todo": true
91
+ }
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "Input",
3
+ "slug": "input",
4
+ "group": "forms",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "The single-line text control.\n\nWraps Base UI's `Input`, so dropping one inside a {@link Field } wires up the\nlabel, the description and the validity state with no `id` plumbing. Rides\nthe recessed chassis: `bg-sunken` sets it into the panel rather than raising\nit off, which is how this system distinguishes \"you type here\" from \"you\npress here\".\n\nInside an {@link InputGroup } it renders bare — the group owns the rim — so the\ntwo compose without a doubled border.",
9
+ "props": [
10
+ {
11
+ "name": "className",
12
+ "type": "string",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "Extra classes, merged over the chassis."
16
+ },
17
+ {
18
+ "name": "size",
19
+ "type": "\"sm\" | \"md\" | \"lg\"",
20
+ "required": false,
21
+ "defaultValue": null,
22
+ "description": "Rung of the control ladder. Defaults to `\"md\"`. Shadows the native `size`\nattribute (a character count), which nothing in a token-driven layout wants."
23
+ }
24
+ ],
25
+ "typeReferences": [
26
+ "Omit<BaseInput.Props, \"className\" | \"size\">"
27
+ ],
28
+ "subcomponents": [],
29
+ "parts": [],
30
+ "variants": {},
31
+ "defaultVariants": {},
32
+ "tokensUsed": [
33
+ "--cue-accent",
34
+ "--cue-border",
35
+ "--cue-control-lg",
36
+ "--cue-control-md",
37
+ "--cue-control-sm",
38
+ "--cue-danger",
39
+ "--cue-fg",
40
+ "--cue-fg-subtle",
41
+ "--cue-font-mono",
42
+ "--cue-radius-control",
43
+ "--cue-space-3",
44
+ "--cue-space-4",
45
+ "--cue-space-5",
46
+ "--cue-sunken",
47
+ "--cue-text-body",
48
+ "--cue-text-label",
49
+ "--cue-text-ui"
50
+ ],
51
+ "summary": "The single-line text control, recessed into its surface.",
52
+ "examples": [
53
+ {
54
+ "title": "Usage",
55
+ "code": "<Input placeholder=\"e.g. Blackout\" />\n<Input type=\"number\" size=\"sm\" defaultValue={512} />",
56
+ "language": "tsx"
57
+ }
58
+ ],
59
+ "status": "stable",
60
+ "url": "/docs/components/input",
61
+ "mdUrl": "/docs/components/input.md",
62
+ "jsonUrl": "/r/components/input.json",
63
+ "whenToUse": [
64
+ "Free text or a plain number the user types: names, addresses, ports, counts.",
65
+ "Inside a `Field`, which wires the label, the description and the error state with no id plumbing."
66
+ ],
67
+ "whenNotToUse": [
68
+ "A number the user adjusts by feel rather than types. Use `ScrubInput`, or `NumberField` where a stepper is expected.",
69
+ "A value from a known set. Use `Select`, `Combobox` or `RadioGroup`.",
70
+ "A search box with debounce and Escape-to-clear. Use `SearchInput`."
71
+ ],
72
+ "commonMistakes": [
73
+ "Expecting its own rim inside an `InputGroup`. The group owns the border; the input renders bare.",
74
+ "Using the placeholder as the label. A placeholder is gone the moment typing starts.",
75
+ "Adding a background utility. Inputs are sunken in this system, which is how a reader tells \"type here\" from \"press here\"."
76
+ ],
77
+ "specimens": [
78
+ {
79
+ "title": "Input",
80
+ "group": "forms",
81
+ "components": [
82
+ "Input"
83
+ ],
84
+ "code": "<Specimens>\n {SIZES.map((size) => (\n <Specimen key={size} label={size}>\n <Input aria-label={`Cue label, ${size}`} size={size} defaultValue=\"1/12 @ 80%\" />\n </Specimen>\n ))}\n <Specimen label=\"placeholder\">\n <Input aria-label=\"Empty cue label\" placeholder=\"e.g. Blackout\" />\n </Specimen>\n <Specimen label=\"disabled\">\n <Input aria-label=\"Disabled cue label\" defaultValue=\"Read-only\" disabled />\n </Specimen>\n <Specimen label=\"readonly\">\n <Input aria-label=\"Read-only cue label\" defaultValue=\"1/12 @ 80%\" readOnly />\n </Specimen>\n</Specimens>",
85
+ "note": "The recessed chassis: sunken fill, hairline rim, height from the density ladder.",
86
+ "interaction": "the rim goes accent on focus and the ring sits outside it; `invalid` turns the rim danger and outranks focus."
87
+ }
88
+ ]
89
+ }
@@ -0,0 +1,129 @@
1
+ {
2
+ "name": "Item",
3
+ "slug": "item",
4
+ "group": "layout",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "One thing in a list, with room for a glyph, a name, a line of detail and a\ncontrol — the shape a settings entry, a search hit and a device row all want.\n\nWhere `Row` is a line of a hairline table, `Item` is a self-contained object\nthat can stand alone, sit in a `Stack` or fill a `Grid` cell. It is a real\n`<button>` when interactive rather than a `<div>` with an `onClick`, so\nkeyboard users get it for free.\n\nStatic markup — no `\"use client\"`.",
9
+ "props": [
10
+ {
11
+ "name": "media",
12
+ "type": "ReactNode",
13
+ "required": false,
14
+ "defaultValue": null,
15
+ "description": "Leading slot: an icon, an avatar, a status dot."
16
+ },
17
+ {
18
+ "name": "title",
19
+ "type": "ReactNode",
20
+ "required": false,
21
+ "defaultValue": null,
22
+ "description": "The item's name — one line, truncated rather than wrapped."
23
+ },
24
+ {
25
+ "name": "description",
26
+ "type": "ReactNode",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "One supporting line under the title, a rung smaller and muted."
30
+ },
31
+ {
32
+ "name": "actions",
33
+ "type": "ReactNode",
34
+ "required": false,
35
+ "defaultValue": null,
36
+ "description": "Trailing slot: a value, a chip, a control.\n\nDo not combine with `interactive` — the whole item is then a `<button>`,\nand a button may not contain another one. Put the controls beside the item\ninstead, or drop `interactive` and make the title itself the link."
37
+ },
38
+ {
39
+ "name": "variant",
40
+ "type": "\"plain\" | \"outline\" | \"soft\"",
41
+ "required": false,
42
+ "defaultValue": null,
43
+ "description": "Which framing to paint. Defaults to `\"plain\"`."
44
+ },
45
+ {
46
+ "name": "interactive",
47
+ "type": "boolean",
48
+ "required": false,
49
+ "defaultValue": "false",
50
+ "description": "Render as a `<button>` with hover feedback and a focus ring instead of a\nstatic `<div>`. Use for items that select, open or toggle something."
51
+ },
52
+ {
53
+ "name": "disabled",
54
+ "type": "boolean",
55
+ "required": false,
56
+ "defaultValue": null,
57
+ "description": "Disable the interactive form. Ignored when `interactive` is not set."
58
+ },
59
+ {
60
+ "name": "children",
61
+ "type": "ReactNode",
62
+ "required": false,
63
+ "defaultValue": null,
64
+ "description": "Extra content between the text column and the action slot."
65
+ }
66
+ ],
67
+ "typeReferences": [
68
+ "Omit<React.HTMLAttributes<HTMLElement>, \"title\">",
69
+ "VariantProps<typeof itemVariants>"
70
+ ],
71
+ "subcomponents": [],
72
+ "parts": [],
73
+ "variants": {
74
+ "variant": [
75
+ "plain",
76
+ "outline",
77
+ "soft"
78
+ ],
79
+ "interactive": [
80
+ "true",
81
+ "false"
82
+ ]
83
+ },
84
+ "defaultVariants": {
85
+ "variant": "plain",
86
+ "interactive": "false"
87
+ },
88
+ "tokensUsed": [
89
+ "--cue-accent",
90
+ "--cue-border",
91
+ "--cue-fg",
92
+ "--cue-fg-muted",
93
+ "--cue-font-mono",
94
+ "--cue-pad-row-x",
95
+ "--cue-pad-row-y",
96
+ "--cue-radius-control",
97
+ "--cue-space-1",
98
+ "--cue-space-2",
99
+ "--cue-space-4",
100
+ "--cue-surface-2",
101
+ "--cue-text-label",
102
+ "--cue-text-ui"
103
+ ],
104
+ "summary": "One thing in a list, with room for a glyph, a name, a line of detail and a control — the shape a settings entry, a search hit and a device row all want.",
105
+ "examples": [
106
+ {
107
+ "title": "Usage",
108
+ "code": "<Item media={<StatusDot tone=\"ok\" />} title=\"Node 12\" description=\"10.0.0.12\" />\n<Item interactive variant=\"outline\" title=\"Front truss\" onClick={open} />",
109
+ "language": "tsx"
110
+ }
111
+ ],
112
+ "status": "todo-docs",
113
+ "url": "/docs/components/item",
114
+ "mdUrl": "/docs/components/item.md",
115
+ "jsonUrl": "/r/components/item.json",
116
+ "specimens": [
117
+ {
118
+ "title": "Item",
119
+ "group": "layout",
120
+ "components": [
121
+ "Item"
122
+ ],
123
+ "code": "<div className=\"flex w-full max-w-[36rem] flex-col gap-(--cue-space-3)\">\n <Item\n media={<Lightbulb aria-hidden=\"true\" className=\"size-icon-md text-fg-subtle\" />}\n title=\"Source Four 26°\"\n description=\"Universe 1, channels 12 to 19.\"\n actions={<Chip tone=\"ok\">patched</Chip>}\n />\n <Item\n variant=\"outline\"\n title=\"MAC Viper Profile\"\n description=\"Universe 2, channels 1 to 32.\"\n actions={<Button size=\"sm\">Inspect</Button>}\n />\n <Item variant=\"soft\" interactive title=\"Sharpy Plus\" description=\"Unpatched.\" />\n <Item variant=\"outline\" disabled title=\"Molefay 4-lite\" description=\"Profile missing.\" />\n</div>",
124
+ "note": "A media, title, description and actions row. Three variants, plus interactive and disabled.",
125
+ "interaction": "the interactive variant takes a hover ground and a focus ring; it is a button, so Enter and Space activate it."
126
+ }
127
+ ],
128
+ "todo": true
129
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "Kbd",
3
+ "slug": "kbd",
4
+ "group": "primitives",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": false,
8
+ "description": "A key cap for documenting shortcuts inline: `⌘K`, `Esc`, `Shift`.\n\nStatic markup — no `\"use client\"`, so it renders on the server. Sized off the\nchip height so a `Kbd` and a `Chip` line up on the same row, and set in the\nmicro type step because shortcut hints are reference material, not content.",
9
+ "props": [],
10
+ "typeReferences": [
11
+ "React.ComponentPropsWithoutRef<\"kbd\">"
12
+ ],
13
+ "subcomponents": [],
14
+ "parts": [],
15
+ "variants": {},
16
+ "defaultVariants": {},
17
+ "tokensUsed": [
18
+ "--cue-border",
19
+ "--cue-chip-h",
20
+ "--cue-fg-muted",
21
+ "--cue-font-mono",
22
+ "--cue-radius-control",
23
+ "--cue-space-2",
24
+ "--cue-surface-2",
25
+ "--cue-text-micro"
26
+ ],
27
+ "summary": "A key cap for documenting shortcuts inline: `⌘K`, `Esc`, `Shift`.",
28
+ "examples": [
29
+ {
30
+ "title": "Usage",
31
+ "code": "<span>Press <Kbd>⌘</Kbd><Kbd>K</Kbd> to search</span>",
32
+ "language": "tsx"
33
+ }
34
+ ],
35
+ "status": "todo-docs",
36
+ "url": "/docs/components/kbd",
37
+ "mdUrl": "/docs/components/kbd.md",
38
+ "jsonUrl": "/r/components/kbd.json",
39
+ "specimens": [
40
+ {
41
+ "title": "Kbd",
42
+ "group": "primitives",
43
+ "components": [
44
+ "Kbd"
45
+ ],
46
+ "code": "<Specimens>\n <Specimen label=\"single\">\n <Kbd>G</Kbd>\n </Specimen>\n <Specimen label=\"chord\">\n <Kbd>⌘K</Kbd>\n </Specimen>\n <Specimen label=\"in a line\">\n <span className=\"font-mono text-(length:--cue-text-ui) text-fg-muted\">\n Press <Kbd>⌘</Kbd> <Kbd>⇧</Kbd> <Kbd>P</Kbd> to open the palette.\n </span>\n </Specimen>\n</Specimens>",
47
+ "note": "A key cap, in the mono face. Static markup, so it renders on the server.",
48
+ "interaction": "none."
49
+ }
50
+ ],
51
+ "todo": true
52
+ }
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "Link",
3
+ "slug": "link",
4
+ "group": "layout",
5
+ "importPath": "@cueplusplus/ui",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A text link: accent on hover, no rule unless you ask for one.",
9
+ "props": [
10
+ {
11
+ "name": "external",
12
+ "type": "boolean",
13
+ "required": false,
14
+ "defaultValue": "false",
15
+ "description": "Open in a new tab, mark the anchor `rel=\"noreferrer noopener\"` and append a\n`↗`. The glyph is not decoration: a link that replaces the user's context\nwithout warning is a WCAG 3.2.5 failure, and the arrow is the warning."
16
+ },
17
+ {
18
+ "name": "render",
19
+ "type": "RenderProp<Record<string, unknown>>",
20
+ "required": false,
21
+ "defaultValue": null,
22
+ "description": "Replace the rendered element (Base UI render prop). Accepts an element —\n`render={<NextLink href=\"/x\" />}` — or a function returning one. This is\nhow the design system composes with a router without depending on one."
23
+ },
24
+ {
25
+ "name": "variant",
26
+ "type": "\"plain\" | \"underline\"",
27
+ "required": false,
28
+ "defaultValue": "plain",
29
+ "description": ""
30
+ }
31
+ ],
32
+ "typeReferences": [
33
+ "React.ComponentPropsWithoutRef<\"a\">",
34
+ "VariantProps<typeof linkVariants>"
35
+ ],
36
+ "subcomponents": [],
37
+ "parts": [],
38
+ "variants": {
39
+ "variant": [
40
+ "plain",
41
+ "underline"
42
+ ]
43
+ },
44
+ "defaultVariants": {
45
+ "variant": "plain"
46
+ },
47
+ "tokensUsed": [
48
+ "--cue-accent",
49
+ "--cue-border",
50
+ "--cue-fg",
51
+ "--cue-font-mono",
52
+ "--cue-radius-control",
53
+ "--cue-space-1",
54
+ "--cue-text-micro"
55
+ ],
56
+ "summary": "A text link: accent on hover, no rule unless you ask for one.",
57
+ "examples": [
58
+ {
59
+ "title": "Usage",
60
+ "code": "<Link href=\"/patch\">Patch</Link>\n<Link href=\"https://base-ui.com\" external variant=\"underline\">Base UI</Link>\n<Link render={<NextLink href=\"/cues\" />}>Cues</Link>",
61
+ "language": "tsx"
62
+ }
63
+ ],
64
+ "status": "todo-docs",
65
+ "url": "/docs/components/link",
66
+ "mdUrl": "/docs/components/link.md",
67
+ "jsonUrl": "/r/components/link.json",
68
+ "specimens": [
69
+ {
70
+ "title": "Link",
71
+ "group": "layout",
72
+ "components": [
73
+ "Link"
74
+ ],
75
+ "code": "<Specimens>\n <Specimen label=\"plain\">\n <Link href=\"#patch\">Open the patch</Link>\n </Specimen>\n <Specimen label=\"underline\">\n <Link href=\"#patch\" variant=\"underline\">\n Open the patch\n </Link>\n </Specimen>\n <Specimen label=\"external\">\n <Link href=\"https://cueplusplus.com\" external>\n cueplusplus.com\n </Link>\n </Specimen>\n</Specimens>",
76
+ "note": "Two variants. Links do not underline by default; the underline variant offsets by 4px so descenders survive.",
77
+ "interaction": "hover moves the ink to the accent."
78
+ }
79
+ ],
80
+ "todo": true
81
+ }