@cueplusplus/ui 0.14.1 → 0.16.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 (182) hide show
  1. package/CHANGELOG.md +415 -0
  2. package/README.md +26 -0
  3. package/dist/agent-runtime/tool-call-card.js +1 -1
  4. package/dist/chat/message-list.js +2 -1
  5. package/dist/chat/message.js +1 -1
  6. package/dist/chrome/_tabs-scroll.d.ts +17 -1
  7. package/dist/chrome/_tabs-scroll.js +20 -3
  8. package/dist/chrome/app-bar.js +2 -1
  9. package/dist/chrome/band.js +13 -5
  10. package/dist/chrome/eyebrow.js +1 -1
  11. package/dist/chrome/footer.js +1 -1
  12. package/dist/chrome/panel.js +2 -1
  13. package/dist/chrome/section-header.js +1 -1
  14. package/dist/color/color-field.d.ts +2 -1
  15. package/dist/color/color-picker.d.ts +2 -1
  16. package/dist/configurator/configurator.js +1 -1
  17. package/dist/configurator/export-dialog.js +1 -1
  18. package/dist/configurator/panel-sections.js +1 -1
  19. package/dist/configurator/token-editor.js +1 -1
  20. package/dist/date/calendar.js +2 -2
  21. package/dist/date/date-field.d.ts +2 -1
  22. package/dist/date/date-picker.d.ts +2 -1
  23. package/dist/date/date-range-picker.d.ts +2 -1
  24. package/dist/date/time-field.d.ts +2 -1
  25. package/dist/elements/context-usage.js +3 -3
  26. package/dist/elements/transcript-rules.js +1 -1
  27. package/dist/forms/_chassis-size.d.ts +22 -0
  28. package/dist/forms/_chassis.d.ts +3 -10
  29. package/dist/forms/_chassis.js +2 -1
  30. package/dist/forms/autocomplete.d.ts +2 -1
  31. package/dist/forms/combobox.d.ts +2 -1
  32. package/dist/forms/env-var-input.d.ts +2 -1
  33. package/dist/forms/field.js +1 -1
  34. package/dist/forms/index.d.ts +2 -1
  35. package/dist/forms/input-group.d.ts +2 -1
  36. package/dist/forms/input.d.ts +2 -1
  37. package/dist/forms/multi-select.d.ts +2 -1
  38. package/dist/forms/otp-field.d.ts +2 -1
  39. package/dist/forms/password-input.d.ts +2 -1
  40. package/dist/forms/scrub-input.d.ts +2 -1
  41. package/dist/forms/search-input.d.ts +2 -1
  42. package/dist/forms/select.d.ts +2 -1
  43. package/dist/forms/select.js +2 -1
  44. package/dist/forms/slider.js +1 -1
  45. package/dist/forms/tags-input.d.ts +2 -1
  46. package/dist/forms/toggle-group.d.ts +1 -1
  47. package/dist/forms/toggle.d.ts +1 -1
  48. package/dist/index.d.ts +2 -1
  49. package/dist/instruments/code-block.js +1 -1
  50. package/dist/instruments/ledger.js +1 -1
  51. package/dist/instruments/log-viewer.js +2 -1
  52. package/dist/instruments/progress.js +1 -1
  53. package/dist/instruments/stat.js +1 -1
  54. package/dist/instruments/table.js +2 -2
  55. package/dist/instruments/terminal-frame.js +1 -1
  56. package/dist/layout/_ground.js +1 -1
  57. package/dist/layout/card.js +3 -1
  58. package/dist/layout/collapsible.js +1 -1
  59. package/dist/layout/description-list.js +1 -1
  60. package/dist/layout/preview.d.ts +13 -1
  61. package/dist/layout/preview.js +16 -9
  62. package/dist/layout/sidebar.js +1 -1
  63. package/dist/layout/stepper.js +1 -1
  64. package/dist/midi/musical-time-input.d.ts +2 -1
  65. package/dist/overlays/_surface.d.ts +2 -2
  66. package/dist/overlays/_surface.js +4 -2
  67. package/dist/overlays/command-palette.js +1 -1
  68. package/dist/overlays/toast.js +1 -1
  69. package/dist/primitives/button.js +2 -1
  70. package/dist/primitives/chip.d.ts +1 -1
  71. package/dist/primitives/chip.js +2 -2
  72. package/dist/system/_paint-elevation.js +9 -0
  73. package/dist/system/_paint-glass.js +46 -0
  74. package/dist/system/_paint-glow.js +32 -0
  75. package/dist/system/_paint-ground-pattern.js +30 -0
  76. package/dist/system/_paint-rim.js +41 -0
  77. package/dist/system/_paint-stroke-sunken.js +19 -0
  78. package/dist/system/_paint-stroke-surface-1.js +19 -0
  79. package/dist/system/_paint-stroke-surface-2.js +27 -0
  80. package/dist/system/_paint-texture.js +53 -0
  81. package/dist/system/density.d.ts +11 -2
  82. package/dist/system/density.js +29 -9
  83. package/dist/system/portal.js +8 -2
  84. package/dist/system/prepaint.d.ts +18 -1
  85. package/dist/system/prepaint.js +8 -2
  86. package/dist/system/theme-provider.d.ts +64 -38
  87. package/dist/system/theme-provider.js +70 -23
  88. package/dist/system/vocabulary.d.ts +1 -1
  89. package/dist/system/vocabulary.js +14 -2
  90. package/manifest/components/alert-dialog.json +13 -1
  91. package/manifest/components/app-bar.json +4 -0
  92. package/manifest/components/autocomplete.json +13 -1
  93. package/manifest/components/band.json +9 -2
  94. package/manifest/components/button.json +4 -0
  95. package/manifest/components/calendar.json +3 -1
  96. package/manifest/components/card.json +6 -0
  97. package/manifest/components/channel-matrix.json +13 -1
  98. package/manifest/components/chart-tooltip-content.json +13 -1
  99. package/manifest/components/chip.json +1 -0
  100. package/manifest/components/code-block.json +2 -1
  101. package/manifest/components/collapsible.json +2 -1
  102. package/manifest/components/color-field.json +4 -0
  103. package/manifest/components/color-picker.json +4 -0
  104. package/manifest/components/colors-section.json +2 -1
  105. package/manifest/components/combobox.json +13 -1
  106. package/manifest/components/command-palette.json +13 -1
  107. package/manifest/components/composer.json +4 -0
  108. package/manifest/components/context-menu.json +13 -1
  109. package/manifest/components/context-usage.json +1 -0
  110. package/manifest/components/date-field.json +4 -0
  111. package/manifest/components/date-picker.json +4 -0
  112. package/manifest/components/date-range-picker.json +4 -0
  113. package/manifest/components/density.json +19 -0
  114. package/manifest/components/description-list.json +2 -1
  115. package/manifest/components/dialog.json +13 -1
  116. package/manifest/components/disclosure.json +2 -1
  117. package/manifest/components/dmx-bar.json +13 -1
  118. package/manifest/components/dmx-strip.json +13 -1
  119. package/manifest/components/drawer.json +13 -1
  120. package/manifest/components/dropdown-menu.json +13 -1
  121. package/manifest/components/env-var-input.json +4 -0
  122. package/manifest/components/export-dialog.json +2 -1
  123. package/manifest/components/eyebrow.json +2 -1
  124. package/manifest/components/field-description.json +2 -1
  125. package/manifest/components/field-error.json +2 -1
  126. package/manifest/components/field-label.json +2 -1
  127. package/manifest/components/field.json +2 -1
  128. package/manifest/components/footer.json +1 -0
  129. package/manifest/components/frames.json +2 -1
  130. package/manifest/components/hover-card.json +13 -1
  131. package/manifest/components/input-group.json +4 -0
  132. package/manifest/components/input.json +4 -0
  133. package/manifest/components/ledger.json +2 -1
  134. package/manifest/components/log-viewer.json +7 -0
  135. package/manifest/components/menubar.json +13 -1
  136. package/manifest/components/message-list.json +7 -0
  137. package/manifest/components/message.json +2 -1
  138. package/manifest/components/multi-select.json +13 -1
  139. package/manifest/components/musical-time-input.json +4 -0
  140. package/manifest/components/navigation-menu.json +13 -1
  141. package/manifest/components/number-field.json +4 -0
  142. package/manifest/components/otp-field.json +4 -0
  143. package/manifest/components/panel-header.json +2 -0
  144. package/manifest/components/panel.json +2 -0
  145. package/manifest/components/password-input.json +4 -0
  146. package/manifest/components/popover.json +13 -1
  147. package/manifest/components/preset-section.json +2 -1
  148. package/manifest/components/preview.json +21 -1
  149. package/manifest/components/progress.json +2 -1
  150. package/manifest/components/scrollable-tabs-list.json +1 -0
  151. package/manifest/components/scrub-input.json +4 -0
  152. package/manifest/components/search-input.json +4 -0
  153. package/manifest/components/section-header.json +2 -1
  154. package/manifest/components/segmented-control.json +1 -0
  155. package/manifest/components/select.json +11 -0
  156. package/manifest/components/shape-section.json +2 -1
  157. package/manifest/components/sheet.json +13 -1
  158. package/manifest/components/sidebar.json +2 -1
  159. package/manifest/components/slider.json +2 -1
  160. package/manifest/components/stat.json +1 -0
  161. package/manifest/components/stepper.json +2 -1
  162. package/manifest/components/table-scroll-region.json +2 -1
  163. package/manifest/components/table.json +2 -1
  164. package/manifest/components/tabs.json +1 -0
  165. package/manifest/components/tags-input.json +13 -1
  166. package/manifest/components/terminal-frame.json +1 -0
  167. package/manifest/components/textarea.json +4 -0
  168. package/manifest/components/theme-configurator.json +13 -1
  169. package/manifest/components/theme-provider.json +20 -1
  170. package/manifest/components/time-boundary.json +2 -1
  171. package/manifest/components/time-field.json +4 -0
  172. package/manifest/components/toast.json +13 -0
  173. package/manifest/components/toggle-group.json +1 -19
  174. package/manifest/components/toggle.json +0 -6
  175. package/manifest/components/token-editor.json +2 -1
  176. package/manifest/components/tool-call-card.json +2 -1
  177. package/manifest/components/toolbar.json +1 -0
  178. package/manifest/components/tooltip.json +13 -1
  179. package/manifest/components/unread-divider.json +2 -1
  180. package/manifest/manifest.json +94 -94
  181. package/manifest/tokens.json +48 -2
  182. package/package.json +6 -6
@@ -35,7 +35,7 @@ const SectionHeader = React.forwardRef(function SectionHeader({ className, label
35
35
  }) : null,
36
36
  /* @__PURE__ */ jsx("span", {
37
37
  "data-slot": "section-header-label",
38
- className: "shrink-0 font-mono text-(length:--cue-text-label) tracking-[0.15em] text-fg-muted uppercase",
38
+ className: "shrink-0 font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps) text-fg-muted uppercase",
39
39
  children: label
40
40
  }),
41
41
  count === void 0 ? null : /* @__PURE__ */ jsx("span", {
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "../forms/_chassis.js";
1
+ import { FormControlSize } from "../forms/_chassis-size.js";
2
+ import "../forms/_chassis.js";
2
3
  import * as React from "react";
3
4
  import { ColorFieldProps, InputProps } from "react-aria-components";
4
5
  //#region src/color/color-field.d.ts
@@ -1,5 +1,6 @@
1
1
  import { ColorFormat } from "./_convert.js";
2
- import { FormControlSize } from "../forms/_chassis.js";
2
+ import { FormControlSize } from "../forms/_chassis-size.js";
3
+ import "../forms/_chassis.js";
3
4
  import * as React from "react";
4
5
  //#region src/color/color-picker.d.ts
5
6
  interface ColorPickerProps {
@@ -221,7 +221,7 @@ function ThemeConfigurator({ position: positionProp, defaultPosition = "floating
221
221
  }),
222
222
  /* @__PURE__ */ jsx("span", {
223
223
  id: titleId,
224
- className: "flex-1 truncate font-mono text-(length:--cue-text-label) tracking-[0.15em] text-fg-muted uppercase",
224
+ className: "flex-1 truncate font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps) text-fg-muted uppercase",
225
225
  children: title
226
226
  }),
227
227
  moved === 0 ? null : /* @__PURE__ */ jsx(Chip, {
@@ -70,7 +70,7 @@ function ExportDialog({ open, onOpenChange, overrides, scope, defaultFormat = "c
70
70
  /* @__PURE__ */ jsxs(Field, {
71
71
  className: "gap-(--cue-space-1)",
72
72
  children: [/* @__PURE__ */ jsx(FieldLabel, {
73
- className: "font-mono text-(length:--cue-text-micro) tracking-[0.15em] uppercase",
73
+ className: "font-mono text-(length:--cue-text-micro) tracking-(--cue-tracking-caps) uppercase",
74
74
  children: "Theme name"
75
75
  }), /* @__PURE__ */ jsx(Input, {
76
76
  size: "sm",
@@ -133,7 +133,7 @@ function TextTokenField({ label, token, edits, placeholder }) {
133
133
  return /* @__PURE__ */ jsxs(Field, {
134
134
  className: "gap-(--cue-space-1)",
135
135
  children: [/* @__PURE__ */ jsx(FieldLabel, {
136
- className: "font-mono text-(length:--cue-text-micro) tracking-[0.15em] uppercase",
136
+ className: "font-mono text-(length:--cue-text-micro) tracking-(--cue-tracking-caps) uppercase",
137
137
  children: label
138
138
  }), /* @__PURE__ */ jsx(Input, {
139
139
  size: "sm",
@@ -133,7 +133,7 @@ function TokenEditor({ values, overridden, onTokenChange, onTokenReset, groups =
133
133
  "data-slot": "configurator-token-group",
134
134
  className: "flex flex-col gap-(--cue-space-2)",
135
135
  children: [/* @__PURE__ */ jsx("span", {
136
- className: "font-mono text-(length:--cue-text-micro) tracking-[0.15em] text-fg-subtle uppercase",
136
+ className: "font-mono text-(length:--cue-text-micro) tracking-(--cue-tracking-caps) text-fg-subtle uppercase",
137
137
  children: group.label
138
138
  }), group.tokens.map((token) => {
139
139
  const property = tokenProperty(token);
@@ -23,14 +23,14 @@ const CALENDAR_CLASSES = {
23
23
  months: "relative flex flex-wrap items-start gap-(--cue-space-5)",
24
24
  month: "flex flex-col gap-(--cue-space-2)",
25
25
  month_caption: "flex h-control-sm items-center justify-center",
26
- caption_label: "font-mono text-(length:--cue-text-label) tracking-[0.15em] text-fg-subtle uppercase",
26
+ caption_label: "font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps) text-fg-subtle uppercase",
27
27
  nav: "absolute inset-x-0 top-0 flex h-control-sm items-center justify-between",
28
28
  button_previous: "flex size-control-sm cursor-pointer items-center justify-center rounded-(--radius-control) border-0 bg-transparent p-0 text-fg-subtle outline-none transition-colors duration-150 hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent disabled:pointer-events-none disabled:opacity-30 motion-reduce:transition-none",
29
29
  button_next: "flex size-control-sm cursor-pointer items-center justify-center rounded-(--radius-control) border-0 bg-transparent p-0 text-fg-subtle outline-none transition-colors duration-150 hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent disabled:pointer-events-none disabled:opacity-30 motion-reduce:transition-none",
30
30
  chevron: "size-icon-sm fill-current",
31
31
  month_grid: "border-collapse border-spacing-0",
32
32
  weekdays: "",
33
- weekday: "size-control-sm p-0 text-center align-middle font-mono text-(length:--cue-text-micro) font-normal tracking-[0.1em] text-fg-subtle uppercase",
33
+ weekday: "size-control-sm p-0 text-center align-middle font-mono text-(length:--cue-text-micro) font-normal tracking-(--cue-tracking-caps-tight) text-fg-subtle uppercase",
34
34
  week: "",
35
35
  day: "p-0 text-center align-middle",
36
36
  day_button: "size-control-sm cursor-pointer rounded-(--radius-control) border-0 bg-transparent p-0 font-mono text-(length:--cue-text-ui) tabular-nums text-fg-muted outline-none transition-colors duration-150 hover:bg-surface-3 hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent disabled:pointer-events-none disabled:opacity-30 motion-reduce:transition-none",
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "../forms/_chassis.js";
1
+ import { FormControlSize } from "../forms/_chassis-size.js";
2
+ import "../forms/_chassis.js";
2
3
  import * as React from "react";
3
4
  import { DateFieldProps, DateInputProps, DateValue } from "react-aria-components";
4
5
  //#region src/date/date-field.d.ts
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "../forms/_chassis.js";
1
+ import { FormControlSize } from "../forms/_chassis-size.js";
2
+ import "../forms/_chassis.js";
2
3
  import { CalendarProps } from "./calendar.js";
3
4
  import * as React from "react";
4
5
  //#region src/date/date-picker.d.ts
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "../forms/_chassis.js";
1
+ import { FormControlSize } from "../forms/_chassis-size.js";
2
+ import "../forms/_chassis.js";
2
3
  import { CalendarProps } from "./calendar.js";
3
4
  import * as React from "react";
4
5
  import { DateRange } from "react-day-picker";
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "../forms/_chassis.js";
1
+ import { FormControlSize } from "../forms/_chassis-size.js";
2
+ import "../forms/_chassis.js";
2
3
  import * as React from "react";
3
4
  import { DateInputProps, TimeFieldProps, TimeValue } from "react-aria-components";
4
5
  //#region src/date/time-field.d.ts
@@ -136,17 +136,17 @@ const ContextUsage = React.forwardRef(function ContextUsage({ categories, limit,
136
136
  children: [
137
137
  /* @__PURE__ */ jsx("th", {
138
138
  scope: "col",
139
- className: "pb-1 text-start font-normal tracking-[0.12em]",
139
+ className: "pb-1 text-start font-normal tracking-(--cue-tracking-label)",
140
140
  children: copy.category
141
141
  }),
142
142
  /* @__PURE__ */ jsx("th", {
143
143
  scope: "col",
144
- className: "pb-1 text-end font-normal tracking-[0.12em]",
144
+ className: "pb-1 text-end font-normal tracking-(--cue-tracking-label)",
145
145
  children: copy.tokens
146
146
  }),
147
147
  /* @__PURE__ */ jsx("th", {
148
148
  scope: "col",
149
- className: "pb-1 text-end font-normal tracking-[0.12em]",
149
+ className: "pb-1 text-end font-normal tracking-(--cue-tracking-label)",
150
150
  children: copy.usage
151
151
  })
152
152
  ]
@@ -86,7 +86,7 @@ const UnreadDivider = React.forwardRef(function UnreadDivider({ label = "New", c
86
86
  className: "bg-accent/40 h-px flex-1"
87
87
  }), /* @__PURE__ */ jsx("span", {
88
88
  "aria-hidden": true,
89
- className: cn(mono, "text-accent shrink-0 tracking-[0.15em] uppercase"),
89
+ className: cn(mono, "text-accent shrink-0 tracking-(--cue-tracking-caps) uppercase"),
90
90
  children: label
91
91
  })]
92
92
  });
@@ -0,0 +1,22 @@
1
+ //#region src/forms/_chassis-size.d.ts
2
+ /**
3
+ * The rung of the density control ladder a form control sits on.
4
+ *
5
+ * Named `FormControlSize` rather than `ControlSize` because
6
+ * `@cueplusplus/ui/system` already exports a `ControlSize` for
7
+ * `useControlHeight`, and the root barrel re-exports both.
8
+ *
9
+ * **Its own module, and the reason is the manifest.** `@repo/docgen`
10
+ * attributes a custom property to a component by the FILE its class string
11
+ * lives in, and it does not distinguish a type-only import from a value one.
12
+ * While this type lived in `_chassis.ts`, `Toggle` and `ToggleGroup` — which
13
+ * import nothing from there but the type and paint their own `toggleVariants`
14
+ * box — advertised `--cue-paint-stroke-*` in their published manifests. Found
15
+ * in review of the stroke slice; the manifest is a public contract, so a
16
+ * component claiming a token it never paints is wrong in the way that matters.
17
+ *
18
+ * Nothing but a type may join this file, for the same reason.
19
+ */
20
+ type FormControlSize = "sm" | "md" | "lg";
21
+ //#endregion
22
+ export { FormControlSize };
@@ -1,13 +1,6 @@
1
1
  import { ClassProp, VariantProps } from "../lib/cva.js";
2
+ import { FormControlSize } from "./_chassis-size.js";
2
3
  //#region src/forms/_chassis.d.ts
3
- /**
4
- * The rung of the density control ladder a form control sits on.
5
- *
6
- * Named `FormControlSize` rather than `ControlSize` because
7
- * `@cueplusplus/ui/system` already exports a `ControlSize` for
8
- * `useControlHeight`, and the root barrel re-exports both.
9
- */
10
- type FormControlSize = "sm" | "md" | "lg";
11
4
  /**
12
5
  * Everything the recessed control chassis paints except the box itself.
13
6
  *
@@ -97,7 +90,7 @@ type FormControlSize = "sm" | "md" | "lg";
97
90
  * `focus-visible:outline-solid` re-declares the outline style the sibling
98
91
  * `outline-none` switched off — see the note on `buttonChassis`.
99
92
  */
100
- declare const controlSurface = "w-full rounded-(--radius-control) border border-border bg-sunken font-mono text-fg placeholder:text-fg-subtle outline-none focus:border-border-strong focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-1 focus-visible:outline-(--cue-focus) disabled:opacity-40 data-[disabled]:opacity-40 data-[invalid]:border-danger data-[invalid]:focus-visible:outline-danger";
93
+ declare const controlSurface = "w-full rounded-(--radius-control) border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-sunken),var(--cue-sunken)),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-from,var(--cue-border)),var(--cue-paint-stroke-to,var(--cue-border)))] bg-origin-border [background-clip:padding-box,border-box] font-mono text-fg placeholder:text-fg-subtle outline-none focus:border-border-strong focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-1 focus-visible:outline-(--cue-focus) disabled:opacity-40 data-[disabled]:opacity-40 data-[invalid]:border-danger data-[invalid]:focus-visible:outline-danger";
101
94
  /**
102
95
  * The full recessed-control recipe, one variant per rung of the control ladder.
103
96
  *
@@ -161,4 +154,4 @@ declare const bareControlClasses = "min-w-0 flex-1 border-0 bg-transparent p-0 f
161
154
  */
162
155
  declare const controlGroupFocusClasses = "focus-within:border-border-strong has-focus-visible:outline-2 has-focus-visible:outline-solid has-focus-visible:-outline-offset-1 has-focus-visible:outline-(--cue-focus) data-[invalid]:has-focus-visible:outline-danger";
163
156
  //#endregion
164
- export { ControlVariantProps, FormControlSize, bareControlClasses, controlClasses, controlGroupFocusClasses, controlSurface, controlVariants };
157
+ export { ControlVariantProps, type FormControlSize, bareControlClasses, controlClasses, controlGroupFocusClasses, controlSurface, controlVariants };
@@ -1,4 +1,5 @@
1
1
  import { cva } from "../lib/cva.js";
2
+ import { STROKE_SUNKEN } from "../system/_paint-stroke-sunken.js";
2
3
  //#region src/forms/_chassis.ts
3
4
  /**
4
5
  * Everything the recessed control chassis paints except the box itself.
@@ -89,7 +90,7 @@ import { cva } from "../lib/cva.js";
89
90
  * `focus-visible:outline-solid` re-declares the outline style the sibling
90
91
  * `outline-none` switched off — see the note on `buttonChassis`.
91
92
  */
92
- const controlSurface = "w-full rounded-(--radius-control) border border-border bg-sunken font-mono text-fg placeholder:text-fg-subtle outline-none focus:border-border-strong focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-1 focus-visible:outline-(--cue-focus) disabled:opacity-40 data-[disabled]:opacity-40 data-[invalid]:border-danger data-[invalid]:focus-visible:outline-danger";
93
+ const controlSurface = `w-full rounded-(--radius-control) ${STROKE_SUNKEN} font-mono text-fg placeholder:text-fg-subtle outline-none focus:border-border-strong focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-1 focus-visible:outline-(--cue-focus) disabled:opacity-40 data-[disabled]:opacity-40 data-[invalid]:border-danger data-[invalid]:focus-visible:outline-danger`;
93
94
  /**
94
95
  * The full recessed-control recipe, one variant per rung of the control ladder.
95
96
  *
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import "./_chassis.js";
2
3
  import * as React from "react";
3
4
  //#region src/forms/autocomplete.d.ts
4
5
  interface AutocompleteProps {
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import "./_chassis.js";
2
3
  import * as React from "react";
3
4
  //#region src/forms/combobox.d.ts
4
5
  /** One row in a {@link Combobox} or {@link MultiSelect}. */
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import "./_chassis.js";
2
3
  import * as React from "react";
3
4
  //#region src/forms/env-var-input.d.ts
4
5
  /**
@@ -43,7 +43,7 @@ const FieldLabel = React.forwardRef(function FieldLabel({ className, ...elementP
43
43
  return /* @__PURE__ */ jsx(Field.Label, {
44
44
  ref,
45
45
  "data-slot": "field-label",
46
- className: cn("font-mono text-(length:--cue-text-label) leading-none tracking-[0.1em] text-fg-muted uppercase select-none data-[disabled]:opacity-40", className),
46
+ className: cn("font-mono text-(length:--cue-text-label) leading-none tracking-(--cue-tracking-caps-tight) text-fg-muted uppercase select-none data-[disabled]:opacity-40", className),
47
47
  ...elementProps
48
48
  });
49
49
  });
@@ -1,4 +1,5 @@
1
- import { ControlVariantProps, FormControlSize, bareControlClasses, controlClasses, controlGroupFocusClasses, controlSurface, controlVariants } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import { ControlVariantProps, bareControlClasses, controlClasses, controlGroupFocusClasses, controlSurface, controlVariants } from "./_chassis.js";
2
3
  import { Autocomplete, AutocompleteProps } from "./autocomplete.js";
3
4
  import { ButtonGroup, ButtonGroupOrientation, ButtonGroupProps } from "./button-group.js";
4
5
  import { Checkbox, CheckboxGroup, CheckboxGroupProps, CheckboxProps } from "./checkbox.js";
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import "./_chassis.js";
2
3
  import * as React from "react";
3
4
  //#region src/forms/input-group.d.ts
4
5
  interface InputGroupProps extends React.ComponentPropsWithoutRef<"div"> {
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import "./_chassis.js";
2
3
  import * as React from "react";
3
4
  import { Input } from "@base-ui/react/input";
4
5
  //#region src/forms/input.d.ts
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import "./_chassis.js";
2
3
  import { ComboboxOption } from "./combobox.js";
3
4
  import * as React from "react";
4
5
  //#region src/forms/multi-select.d.ts
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import "./_chassis.js";
2
3
  import * as React from "react";
3
4
  import { OTPField } from "@base-ui/react/otp-field";
4
5
  //#region src/forms/otp-field.d.ts
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import "./_chassis.js";
2
3
  import { InputProps } from "./input.js";
3
4
  import * as React from "react";
4
5
  //#region src/forms/password-input.d.ts
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import "./_chassis.js";
2
3
  import * as React from "react";
3
4
  //#region src/forms/scrub-input.d.ts
4
5
  interface ScrubInputProps extends Omit<React.ComponentPropsWithoutRef<"div">, "onChange" | "defaultValue" | "onDragStart" | "onDragEnd"> {
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import "./_chassis.js";
2
3
  import { InputProps } from "./input.js";
3
4
  import * as React from "react";
4
5
  //#region src/forms/search-input.d.ts
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import "./_chassis.js";
2
3
  import * as React from "react";
3
4
  //#region src/forms/select.d.ts
4
5
  /** One row in a {@link Select}. */
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { controlVariants } from "./_chassis.js";
4
+ import { ELEVATION_2 } from "../system/_paint-elevation.js";
4
5
  import { useCuePortalProps } from "../system/portal.js";
5
6
  import { CaretGlyph, TickGlyph } from "./_glyphs.js";
6
7
  import * as React from "react";
@@ -65,7 +66,7 @@ const Select$1 = React.forwardRef(function Select$2({ items, value, defaultValue
65
66
  alignItemWithTrigger: false,
66
67
  children: /* @__PURE__ */ jsx(Select.Popup, {
67
68
  "data-slot": "select-popup",
68
- className: cn("min-w-(--anchor-width) origin-(--transform-origin) overflow-hidden rounded-(--radius-overlay) border border-border-overlay bg-surface-2 py-(--cue-space-1) shadow-[0_8px_24px_rgba(0,0,0,0.4)] outline-none", "transition-[opacity,scale] duration-100 ease-out motion-reduce:transition-none", "data-[starting-style]:scale-[0.98] data-[starting-style]:opacity-0", "data-[ending-style]:scale-[0.98] data-[ending-style]:opacity-0", popupClassName),
69
+ className: cn(`min-w-(--anchor-width) origin-(--transform-origin) overflow-hidden rounded-(--radius-overlay) border border-border-overlay bg-surface-2 py-(--cue-space-1) ${ELEVATION_2} outline-none`, "transition-[opacity,scale] duration-100 ease-out motion-reduce:transition-none", "data-[starting-style]:scale-[0.98] data-[starting-style]:opacity-0", "data-[ending-style]:scale-[0.98] data-[ending-style]:opacity-0", popupClassName),
69
70
  children: /* @__PURE__ */ jsx(Select.List, {
70
71
  className: "max-h-(--available-height) overflow-y-auto",
71
72
  children: items.map((item) => /* @__PURE__ */ jsxs(Select.Item, {
@@ -40,7 +40,7 @@ const Slider$1 = React.forwardRef(function Slider$2({ className, onCommit, label
40
40
  className: cn("flex w-full flex-col gap-(--cue-space-2)", className),
41
41
  ...elementProps,
42
42
  children: [label === void 0 && !showValue ? null : /* @__PURE__ */ jsxs("div", {
43
- className: "flex items-baseline justify-between gap-(--cue-space-3) font-mono text-(length:--cue-text-label) tracking-[0.1em] text-fg-muted uppercase",
43
+ className: "flex items-baseline justify-between gap-(--cue-space-3) font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps-tight) text-fg-muted uppercase",
44
44
  children: [label === void 0 ? /* @__PURE__ */ jsx("span", {}) : /* @__PURE__ */ jsx(Slider.Label, { children: label }), showValue ? /* @__PURE__ */ jsx(Slider.Value, { className: "tabular-nums text-fg normal-case tracking-normal" }) : null]
45
45
  }), /* @__PURE__ */ jsx(Slider.Control, {
46
46
  "data-slot": "slider-control",
@@ -1,4 +1,5 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
+ import "./_chassis.js";
2
3
  import * as React from "react";
3
4
  //#region src/forms/tags-input.d.ts
4
5
  interface TagsInputProps {
@@ -1,4 +1,4 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
2
  import * as React from "react";
3
3
  import { ToggleGroup } from "@base-ui/react/toggle-group";
4
4
  //#region src/forms/toggle-group.d.ts
@@ -1,4 +1,4 @@
1
- import { FormControlSize } from "./_chassis.js";
1
+ import { FormControlSize } from "./_chassis-size.js";
2
2
  import * as React from "react";
3
3
  import { Toggle } from "@base-ui/react/toggle";
4
4
  //#region src/forms/toggle.d.ts
package/dist/index.d.ts CHANGED
@@ -34,7 +34,8 @@ import { TitleBar, TitleBarProps } from "./chrome/title-bar.js";
34
34
  import { Tree, TreeProps, TreeVisibility, TreeVisibilityToggle, TreeVisibilityToggleProps } from "./chrome/tree.js";
35
35
  import { Toolbar, ToolbarButtonProps, ToolbarGroupProps, ToolbarRootProps, ToolbarSeparatorProps } from "./chrome/toolbar.js";
36
36
  import "./chrome/index.js";
37
- import { ControlVariantProps, FormControlSize, bareControlClasses, controlClasses, controlGroupFocusClasses, controlSurface, controlVariants } from "./forms/_chassis.js";
37
+ import { FormControlSize } from "./forms/_chassis-size.js";
38
+ import { ControlVariantProps, bareControlClasses, controlClasses, controlGroupFocusClasses, controlSurface, controlVariants } from "./forms/_chassis.js";
38
39
  import { TokenOverrides, isSafeTokenValue } from "./system/overrides.js";
39
40
  import { FontFamilies, ResolvedMode, ThemeContextValue, ThemeProvider, ThemeProviderProps } from "./system/theme-provider.js";
40
41
  import { Autocomplete, AutocompleteProps } from "./forms/autocomplete.js";
@@ -159,7 +159,7 @@ const CodeBlock = React.forwardRef(function CodeBlock({ code, label, language =
159
159
  className: "flex items-center justify-between gap-(--cue-space-4) border-b border-border px-(--cue-pad-row-x) py-(--cue-pad-row-y)",
160
160
  children: [/* @__PURE__ */ jsx("span", {
161
161
  "data-slot": "code-block-label",
162
- className: "font-mono text-(length:--cue-text-micro) tracking-[0.15em] text-fg-subtle uppercase",
162
+ className: "font-mono text-(length:--cue-text-micro) tracking-(--cue-tracking-caps) text-fg-subtle uppercase",
163
163
  children: label ?? language
164
164
  }), /* @__PURE__ */ jsx(CopyButton, { value: code })]
165
165
  }), /* @__PURE__ */ jsx("pre", {
@@ -13,7 +13,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
13
  * be said out loud, because `<h2>` and `<h3>` come bold by default and a bold
14
14
  * micro-label in a dense list reads as a second kind of emphasis.
15
15
  */
16
- const LEDGER_LABEL = "font-mono text-(length:--cue-text-label) font-normal tracking-[0.15em] text-fg-subtle uppercase";
16
+ const LEDGER_LABEL = "font-mono text-(length:--cue-text-label) font-normal tracking-(--cue-tracking-caps) text-fg-subtle uppercase";
17
17
  /**
18
18
  * The disclosure button a collapsible heading holds.
19
19
  *
@@ -2,6 +2,7 @@
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { Chip } from "../primitives/chip.js";
4
4
  import { useIsomorphicLayoutEffect } from "../system/use-isomorphic-layout-effect.js";
5
+ import { ELEVATION_2 } from "../system/_paint-elevation.js";
5
6
  import { toRem } from "./_rem.js";
6
7
  import { useControlHeight } from "../system/use-density.js";
7
8
  import { ansiSpans } from "./_ansi.js";
@@ -204,7 +205,7 @@ const LogViewer = React.forwardRef(function LogViewer({ className, lines, follow
204
205
  pending > 0 ? /* @__PURE__ */ jsx("button", {
205
206
  type: "button",
206
207
  "data-slot": "log-viewer-jump",
207
- className: "absolute bottom-(--cue-space-4) left-1/2 -translate-x-1/2 cursor-pointer rounded-(--radius-control) border border-border-overlay bg-surface-2 px-(--cue-space-4) py-(--cue-space-2) font-mono text-(length:--cue-text-label) text-fg shadow-[0_8px_24px_rgba(0,0,0,0.4)] outline-none hover:border-accent hover:text-accent focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent",
208
+ className: `absolute bottom-(--cue-space-4) left-1/2 -translate-x-1/2 cursor-pointer rounded-(--radius-control) border border-border-overlay bg-surface-2 px-(--cue-space-4) py-(--cue-space-2) font-mono text-(length:--cue-text-label) text-fg ${ELEVATION_2} outline-none hover:border-accent hover:text-accent focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent`,
208
209
  onClick: jumpToBottom,
209
210
  children: newLinesLabel(pending)
210
211
  }) : null
@@ -58,7 +58,7 @@ const Progress$1 = React.forwardRef(function Progress$2({ className, trackClassN
58
58
  children: [label === void 0 ? null : /* @__PURE__ */ jsx(Progress.Label, {
59
59
  id: namedByCaption ? captionId : void 0,
60
60
  "data-slot": "progress-label",
61
- className: "truncate tracking-[0.15em] text-fg-subtle uppercase",
61
+ className: "truncate tracking-(--cue-tracking-caps) text-fg-subtle uppercase",
62
62
  children: label
63
63
  }), showValue ? /* @__PURE__ */ jsx(Progress.Value, {
64
64
  "data-slot": "progress-value",
@@ -39,7 +39,7 @@ const Stat = React.forwardRef(function Stat({ className, label, value, detail, t
39
39
  children: [
40
40
  /* @__PURE__ */ jsx("span", {
41
41
  "data-slot": "stat-label",
42
- className: "truncate font-mono text-(length:--cue-text-micro) tracking-[0.15em] text-fg-subtle uppercase",
42
+ className: "truncate font-mono text-(length:--cue-text-micro) tracking-(--cue-tracking-caps) text-fg-subtle uppercase",
43
43
  children: label
44
44
  }),
45
45
  /* @__PURE__ */ jsx("span", {
@@ -122,7 +122,7 @@ const TableHead = React.forwardRef(function TableHead({ className, numeric = fal
122
122
  scope,
123
123
  "data-slot": "table-head",
124
124
  "data-numeric": numeric ? "" : void 0,
125
- className: cn("border-b border-border bg-surface-1 px-(--cue-pad-row-x) py-(--cue-pad-row-y) text-left font-mono text-(length:--cue-text-label) font-normal tracking-[0.15em] whitespace-nowrap text-fg-subtle uppercase", sticky ? "sticky top-0 z-3 border-b-0 shadow-[inset_0_-1px_0_var(--cue-hair-strong)]" : null, className),
125
+ className: cn("border-b border-border bg-surface-1 px-(--cue-pad-row-x) py-(--cue-pad-row-y) text-left font-mono text-(length:--cue-text-label) font-normal tracking-(--cue-tracking-caps) whitespace-nowrap text-fg-subtle uppercase", sticky ? "sticky top-0 z-3 border-b-0 shadow-[inset_0_-1px_0_var(--cue-hair-strong)]" : null, className),
126
126
  ...elementProps
127
127
  });
128
128
  });
@@ -201,7 +201,7 @@ const Table = {
201
201
  colSpan: span,
202
202
  scope: "rowgroup",
203
203
  "data-slot": "table-group-cell",
204
- className: cn("bg-bg px-(--cue-pad-row-x) py-(--cue-pad-row-y) text-left font-mono text-(length:--cue-text-label) font-normal tracking-[0.15em] whitespace-nowrap text-fg-subtle uppercase", sticky ? "sticky z-2 [top:var(--cue-table-group-top,0px)]" : null, className),
204
+ className: cn("bg-bg px-(--cue-pad-row-x) py-(--cue-pad-row-y) text-left font-mono text-(length:--cue-text-label) font-normal tracking-(--cue-tracking-caps) whitespace-nowrap text-fg-subtle uppercase", sticky ? "sticky z-2 [top:var(--cue-table-group-top,0px)]" : null, className),
205
205
  children: [/* @__PURE__ */ jsx(Label, {
206
206
  "data-slot": "table-group-label",
207
207
  className: TABLE_GROUP_LABEL,
@@ -191,7 +191,7 @@ const TerminalFrame = React.forwardRef(function TerminalFrame({ className, title
191
191
  className: "flex h-control-md shrink-0 items-center justify-between gap-(--cue-space-3) border-b border-border px-(--cue-pad-row-x)",
192
192
  children: [/* @__PURE__ */ jsx("span", {
193
193
  "data-slot": "terminal-frame-title",
194
- className: "min-w-0 truncate text-(length:--cue-text-label) tracking-[0.15em] text-fg-subtle uppercase",
194
+ className: "min-w-0 truncate text-(length:--cue-text-label) tracking-(--cue-tracking-caps) text-fg-subtle uppercase",
195
195
  children: title
196
196
  }), copy ? /* @__PURE__ */ jsx("span", {
197
197
  "data-slot": "terminal-frame-copy",
@@ -2,7 +2,7 @@
2
2
  /** What each ground paints. `"none"` paints nothing, so whatever is behind shows through. */
3
3
  const GROUND_CLASSES = {
4
4
  plain: "bg-surface-1",
5
- dots: "bg-surface-1 bg-[radial-gradient(circle,var(--cue-hair-strong)_1px,transparent_1.3px)] bg-[length:14px_14px]",
5
+ dots: "bg-surface-1 bg-(image:--cue-paint-screen) bg-(length:--cue-paint-screen-size)",
6
6
  none: ""
7
7
  };
8
8
  //#endregion
@@ -1,4 +1,6 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { RIM_INSET } from "../system/_paint-rim.js";
3
+ import { STROKE_SURFACE_1 } from "../system/_paint-stroke-surface-1.js";
2
4
  import * as React from "react";
3
5
  import { jsx, jsxs } from "react/jsx-runtime";
4
6
  /**
@@ -19,7 +21,7 @@ const Card = {
19
21
  ref,
20
22
  "data-slot": "card",
21
23
  "data-seam": seam ? "" : void 0,
22
- className: cn("group/card flex flex-col overflow-hidden rounded-(--radius-surface) border border-border", seam ? "gap-px bg-border" : "bg-surface-1", className),
24
+ className: cn("group/card flex flex-col overflow-hidden rounded-(--radius-surface)", seam ? "border border-border gap-px bg-border" : `${STROKE_SURFACE_1} ${RIM_INSET}`, className),
23
25
  ...elementProps
24
26
  });
25
27
  }),
@@ -94,7 +94,7 @@ const Disclosure = React.forwardRef(function Disclosure({ className, label = "ad
94
94
  children: [/* @__PURE__ */ jsxs(Collapsible.Trigger, {
95
95
  ref,
96
96
  "data-slot": "disclosure-trigger",
97
- className: cn("group/disclosure inline-flex cursor-pointer items-center gap-(--cue-space-2) self-start border-0 bg-transparent p-0 py-(--cue-space-2) font-mono text-(length:--cue-text-label) tracking-[0.15em] text-fg-subtle uppercase transition-colors duration-150 outline-none select-none hover:text-fg-muted focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-2 focus-visible:outline-accent", className),
97
+ className: cn("group/disclosure inline-flex cursor-pointer items-center gap-(--cue-space-2) self-start border-0 bg-transparent p-0 py-(--cue-space-2) font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps) text-fg-subtle uppercase transition-colors duration-150 outline-none select-none hover:text-fg-muted focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-2 focus-visible:outline-accent", className),
98
98
  ...elementProps,
99
99
  children: [
100
100
  /* @__PURE__ */ jsx("span", {
@@ -20,7 +20,7 @@ const DescriptionList = {
20
20
  return /* @__PURE__ */ jsx("dt", {
21
21
  ref,
22
22
  "data-slot": "description-list-term",
23
- className: cn("font-mono text-(length:--cue-text-label) tracking-[0.15em] text-fg-subtle uppercase", className),
23
+ className: cn("font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps) text-fg-subtle uppercase", className),
24
24
  ...elementProps
25
25
  });
26
26
  }),
@@ -1,6 +1,6 @@
1
1
  import { PreviewGround } from "./_ground.js";
2
2
  import * as React from "react";
3
- import { StyleSet } from "@cueplusplus/tokens";
3
+ import { Paint, StyleSet } from "@cueplusplus/tokens";
4
4
  import { Density as Density$1, FontName, Mode, ThemeName } from "@cueplusplus/theme-base";
5
5
  //#region src/layout/preview.d.ts
6
6
  /** Where the chrome sits and what the stage's ground is. */
@@ -71,6 +71,18 @@ interface PreviewProps extends Omit<React.ComponentPropsWithoutRef<"div">, "chil
71
71
  * `<body>` and inherits nothing from the stage's DOM.
72
72
  */
73
73
  styleSet?: StyleSet;
74
+ /**
75
+ * A look pack for the stage: the finish its surfaces wear.
76
+ *
77
+ * Stamped as `data-paint` on the stage element, and republished to React for
78
+ * the same reason `styleSet` is — a popover opened on the stage mounts on
79
+ * `<body>` and inherits nothing from the stage's DOM, so it has to be told.
80
+ *
81
+ * Absent means inherit. `none` is a value that opts OUT of an ambient pack,
82
+ * which is what a stage uses to show a component unpainted inside a page that
83
+ * is not.
84
+ */
85
+ paint?: Paint;
74
86
  /**
75
87
  * Resize the stage by dragging or with the keyboard. `true` gives both axes
76
88
  * inside the default bounds (160–1280 px wide, 96–960 px tall); an object