@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
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { useIsomorphicLayoutEffect } from "../system/use-isomorphic-layout-effect.js";
4
- import { AmbientThemeContext, DensityContext, StyleSetContext } from "../system/density.js";
4
+ import { AmbientThemeContext, DensityContext, PaintContext, StyleSetContext } from "../system/density.js";
5
5
  import { OverridesContext } from "../system/overrides.js";
6
6
  import { ThemeContext } from "../system/theme-provider.js";
7
7
  import { GROUND_CLASSES } from "./_ground.js";
@@ -241,6 +241,7 @@ function stageAttributes(asked, page) {
241
241
  }
242
242
  if (asked.font !== void 0) attributes["data-font"] = asked.font;
243
243
  if (asked.styleSet !== void 0) attributes["data-style"] = asked.styleSet;
244
+ if (asked.paint !== void 0) attributes["data-paint"] = asked.paint;
244
245
  return attributes;
245
246
  }
246
247
  /**
@@ -258,12 +259,13 @@ function stageAttributes(asked, page) {
258
259
  * route: `useCuePortalProps()` stamps a portal container from `StyleSetContext`,
259
260
  * and a popup opened on the stage inherits nothing from the stage's DOM.
260
261
  */
261
- function StageScope({ theme, mode, density, styleSet, children }) {
262
+ function StageScope({ theme, mode, density, styleSet, paint, children }) {
262
263
  const outer = React.useContext(ThemeContext);
263
264
  const outerOverrides = React.useContext(OverridesContext);
264
265
  const outerDensity = React.useContext(DensityContext);
265
266
  const outerAmbient = React.useContext(AmbientThemeContext);
266
267
  const outerStyleSet = React.useContext(StyleSetContext);
268
+ const outerPaint = React.useContext(PaintContext);
267
269
  const value = React.useMemo(() => {
268
270
  if (outer === null || theme === void 0 && mode === void 0) return outer;
269
271
  const scoped = theme ?? outer.theme;
@@ -286,11 +288,14 @@ function StageScope({ theme, mode, density, styleSet, children }) {
286
288
  value: density ?? outerDensity,
287
289
  children: /* @__PURE__ */ jsx(StyleSetContext.Provider, {
288
290
  value: styleSet ?? outerStyleSet,
289
- children: /* @__PURE__ */ jsx(OverridesContext.Provider, {
290
- value: stamped ? null : outerOverrides,
291
- children: /* @__PURE__ */ jsx(ThemeContext.Provider, {
292
- value,
293
- children
291
+ children: /* @__PURE__ */ jsx(PaintContext.Provider, {
292
+ value: paint ?? outerPaint,
293
+ children: /* @__PURE__ */ jsx(OverridesContext.Provider, {
294
+ value: stamped ? null : outerOverrides,
295
+ children: /* @__PURE__ */ jsx(ThemeContext.Provider, {
296
+ value,
297
+ children
298
+ })
294
299
  })
295
300
  })
296
301
  })
@@ -505,7 +510,7 @@ function Grips({ label, options, size }) {
505
510
  * <Container className="max-w-(--cue-measure-prose)">…</Container>
506
511
  * </Preview>
507
512
  */
508
- const Preview = React.forwardRef(function Preview({ children, label, theme, mode, density, font, styleSet, resizable, tools, footer, presentation = "panel", name, count, ground, captions = true, className, ...elementProps }, ref) {
513
+ const Preview = React.forwardRef(function Preview({ children, label, theme, mode, density, font, styleSet, paint, resizable, tools, footer, presentation = "panel", name, count, ground, captions = true, className, ...elementProps }, ref) {
509
514
  const outer = React.useContext(ThemeContext);
510
515
  const bench = React.useRef(null);
511
516
  const given = resolveResize(resizable);
@@ -517,7 +522,8 @@ const Preview = React.forwardRef(function Preview({ children, label, theme, mode
517
522
  mode,
518
523
  density,
519
524
  font,
520
- styleSet
525
+ styleSet,
526
+ paint
521
527
  }, outer);
522
528
  const framed = presentation === "frame";
523
529
  const stage = /* @__PURE__ */ jsx("div", {
@@ -530,6 +536,7 @@ const Preview = React.forwardRef(function Preview({ children, label, theme, mode
530
536
  mode,
531
537
  density,
532
538
  styleSet,
539
+ paint,
533
540
  children
534
541
  })
535
542
  });
@@ -101,7 +101,7 @@ const Sidebar = {
101
101
  ...elementProps,
102
102
  children: [label === void 0 || collapsed ? null : /* @__PURE__ */ jsx("div", {
103
103
  "data-slot": "sidebar-section-label",
104
- className: "flex h-control-sm items-center px-(--cue-space-2) font-mono text-(length:--cue-text-label) tracking-[0.15em] text-fg-subtle uppercase",
104
+ className: "flex h-control-sm items-center px-(--cue-space-2) font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps) text-fg-subtle uppercase",
105
105
  children: label
106
106
  }), children]
107
107
  });
@@ -43,7 +43,7 @@ const Stepper = React.forwardRef(function Stepper({ className, steps, current, o
43
43
  className: cn("min-w-0", className),
44
44
  ...elementProps,
45
45
  children: /* @__PURE__ */ jsx("ol", {
46
- className: "m-0 flex list-none flex-wrap items-center gap-(--cue-space-3) p-0 font-mono text-(length:--cue-text-label) tracking-[0.1em] uppercase",
46
+ className: "m-0 flex list-none flex-wrap items-center gap-(--cue-space-3) p-0 font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps-tight) uppercase",
47
47
  children: steps.map((step, index) => {
48
48
  const state = currentIndex === -1 || index > currentIndex ? "upcoming" : index === currentIndex ? "current" : "complete";
49
49
  const navigable = onStepChange !== void 0 && state === "complete";
@@ -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 { TimeSignature } from "./_time.js";
3
4
  import * as React from "react";
4
5
  //#region src/midi/musical-time-input.d.ts
@@ -18,7 +18,7 @@
18
18
  * @example
19
19
  * <Popover.Popup className={cn(overlaySurfaceClasses, className)} />
20
20
  */
21
- declare const overlaySurfaceClasses = "border border-border-overlay bg-surface-2 rounded-(--radius-overlay) shadow-[0_8px_24px_rgba(0,0,0,0.4)]";
21
+ declare const overlaySurfaceClasses = "rounded-(--radius-overlay) border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-surface-2),var(--cue-surface-2)),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-from,var(--cue-border-overlay)),var(--cue-paint-stroke-to,var(--cue-border-overlay)))] bg-origin-border [background-clip:padding-box,border-box] shadow-[0_0_0_var(--cue-paint-rim-width)_var(--cue-paint-shade-hairline,transparent),0_calc(2px*var(--cue-paint-shadow-scale))_calc(6px*var(--cue-paint-shadow-scale))_var(--cue-paint-shadow-spread)_var(--cue-paint-shade-near,transparent),0_calc(8px*var(--cue-paint-shadow-scale))_calc(24px*var(--cue-paint-shadow-scale))_var(--cue-paint-shadow-spread)_var(--cue-paint-shade-far,rgba(0,0,0,0.4)),inset_0_1px_0_0_var(--cue-paint-sheen-ink,transparent)]";
22
22
  /**
23
23
  * The full-viewport dim behind a modal surface. `--cue-scrim` is theme-owned —
24
24
  * dusk and hivehub tune their own — so the value is never hard-coded here.
@@ -59,7 +59,7 @@ declare const overlayFooterClasses = "flex items-center justify-end gap-(--cue-s
59
59
  */
60
60
  declare const menuItemClasses = "flex h-control-sm cursor-default items-center gap-(--cue-space-2) rounded-(--radius-control) px-(--cue-space-3) font-mono text-(length:--cue-text-ui) text-fg-muted outline-none select-none data-[highlighted]:bg-accent-soft data-[highlighted]:text-fg data-[disabled]:pointer-events-none data-[disabled]:opacity-40";
61
61
  /** The uppercase mono caption over a group of menu rows. */
62
- declare const menuLabelClasses = "flex h-control-sm items-center px-(--cue-space-3) font-mono text-(length:--cue-text-label) tracking-[0.15em] text-fg-subtle uppercase select-none";
62
+ declare const menuLabelClasses = "flex h-control-sm items-center px-(--cue-space-3) font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps) text-fg-subtle uppercase select-none";
63
63
  /** The hairline between menu groups. */
64
64
  declare const menuSeparatorClasses = "my-(--cue-space-1) h-px bg-border";
65
65
  /** Padding of a menu popup — a single space unit so rows reach the rim. */
@@ -1,3 +1,5 @@
1
+ import { ELEVATION_2 } from "../system/_paint-elevation.js";
2
+ import { STROKE_SURFACE_2 } from "../system/_paint-stroke-surface-2.js";
1
3
  //#region src/overlays/_surface.ts
2
4
  /**
3
5
  * The conventions every floating surface in this system shares.
@@ -18,7 +20,7 @@
18
20
  * @example
19
21
  * <Popover.Popup className={cn(overlaySurfaceClasses, className)} />
20
22
  */
21
- const overlaySurfaceClasses = "border border-border-overlay bg-surface-2 rounded-(--radius-overlay) shadow-[0_8px_24px_rgba(0,0,0,0.4)]";
23
+ const overlaySurfaceClasses = `rounded-(--radius-overlay) ${STROKE_SURFACE_2} ${ELEVATION_2}`;
22
24
  /**
23
25
  * The full-viewport dim behind a modal surface. `--cue-scrim` is theme-owned —
24
26
  * dusk and hivehub tune their own — so the value is never hard-coded here.
@@ -59,7 +61,7 @@ const overlayFooterClasses = "flex items-center justify-end gap-(--cue-space-3)
59
61
  */
60
62
  const menuItemClasses = "flex h-control-sm cursor-default items-center gap-(--cue-space-2) rounded-(--radius-control) px-(--cue-space-3) font-mono text-(length:--cue-text-ui) text-fg-muted outline-none select-none data-[highlighted]:bg-accent-soft data-[highlighted]:text-fg data-[disabled]:pointer-events-none data-[disabled]:opacity-40";
61
63
  /** The uppercase mono caption over a group of menu rows. */
62
- const menuLabelClasses = "flex h-control-sm items-center px-(--cue-space-3) font-mono text-(length:--cue-text-label) tracking-[0.15em] text-fg-subtle uppercase select-none";
64
+ const menuLabelClasses = "flex h-control-sm items-center px-(--cue-space-3) font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps) text-fg-subtle uppercase select-none";
63
65
  /** The hairline between menu groups. */
64
66
  const menuSeparatorClasses = "my-(--cue-space-1) h-px bg-border";
65
67
  /** Padding of a menu popup — a single space unit so rows reach the rim. */
@@ -155,7 +155,7 @@ function CommandPalette({ items, onSelect, open: openProp, defaultOpen = false,
155
155
  items: group.items,
156
156
  className: "block",
157
157
  children: [group.value === "" ? null : /* @__PURE__ */ jsx(Combobox.GroupLabel, {
158
- className: "flex h-control-sm items-center px-(--cue-space-3) font-mono text-(length:--cue-text-micro) tracking-[0.15em] text-fg-subtle uppercase select-none",
158
+ className: "flex h-control-sm items-center px-(--cue-space-3) font-mono text-(length:--cue-text-micro) tracking-(--cue-tracking-caps) text-fg-subtle uppercase select-none",
159
159
  children: group.value
160
160
  }), /* @__PURE__ */ jsx(Combobox.Collection, { children: (item) => /* @__PURE__ */ jsxs(Combobox.Item, {
161
161
  value: item,
@@ -87,7 +87,7 @@ function ToastItem({ toast, className, closeLabel }) {
87
87
  }),
88
88
  /* @__PURE__ */ jsx(Toast.Action, {
89
89
  "data-slot": "toast-action",
90
- className: "mt-(--cue-space-1) inline-flex h-control-sm w-fit cursor-pointer items-center justify-center rounded-(--radius-control) border border-border px-(--cue-space-3) font-mono text-(length:--cue-text-label) tracking-[0.1em] text-fg-muted uppercase transition-colors outline-none hover:border-border-strong hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent"
90
+ className: "mt-(--cue-space-1) inline-flex h-control-sm w-fit cursor-pointer items-center justify-center rounded-(--radius-control) border border-border px-(--cue-space-3) font-mono text-(length:--cue-text-label) tracking-(--cue-tracking-caps-tight) text-fg-muted uppercase transition-colors outline-none hover:border-border-strong hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent"
91
91
  }),
92
92
  /* @__PURE__ */ jsx(Toast.Close, {
93
93
  "aria-label": closeLabel,
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { cva } from "../lib/cva.js";
4
+ import { GLOW_CLASSES } from "../system/_paint-glow.js";
4
5
  import * as React from "react";
5
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
7
  import { useRender } from "@base-ui/react/use-render";
@@ -39,7 +40,7 @@ const buttonChassis = "inline-flex select-none items-center justify-center gap-[
39
40
  * @internal Not part of the public API; imported by `icon-button.tsx`.
40
41
  */
41
42
  const buttonTones = {
42
- primary: "bg-accent text-accent-fg hover:bg-accent-hover border border-transparent",
43
+ primary: `bg-accent text-accent-fg hover:bg-accent-hover border border-transparent ${GLOW_CLASSES}`,
43
44
  secondary: "border border-border text-fg-muted hover:border-border-strong hover:text-fg bg-surface-2",
44
45
  ghost: "text-fg-muted hover:text-fg hover:bg-surface-2 border border-transparent",
45
46
  outline: "border border-border text-fg hover:border-accent hover:text-accent bg-transparent",
@@ -30,7 +30,7 @@ import * as React from "react";
30
30
  * <span className={chipVariants({ variant: "tag" })}>mcp</span>
31
31
  */
32
32
  declare const chipVariants: (props?: ({
33
- tone?: "info" | "warn" | "danger" | "busy" | "accent" | "ok" | "neutral" | null | undefined;
33
+ tone?: "danger" | "info" | "warn" | "accent" | "ok" | "busy" | "neutral" | null | undefined;
34
34
  variant?: "outline" | "tinted" | "tag" | null | undefined;
35
35
  interactive?: boolean | null | undefined;
36
36
  } & ClassProp) | undefined) => string;
@@ -44,8 +44,8 @@ const chipVariants = cva("inline-flex h-chip select-none items-center justify-ce
44
44
  info: "border-info/35 text-info"
45
45
  },
46
46
  variant: {
47
- tinted: "px-(--cue-space-3) text-(length:--cue-text-label) tracking-[0.15em]",
48
- outline: "bg-transparent px-(--cue-space-3) text-(length:--cue-text-label) tracking-[0.15em]",
47
+ tinted: "px-(--cue-space-3) text-(length:--cue-text-label) tracking-(--cue-tracking-caps)",
48
+ outline: "bg-transparent px-(--cue-space-3) text-(length:--cue-text-label) tracking-(--cue-tracking-caps)",
49
49
  tag: "bg-transparent px-(--cue-space-2) text-(length:--cue-text-micro) tracking-[0.06em]"
50
50
  },
51
51
  interactive: {
@@ -0,0 +1,9 @@
1
+ //#region src/system/_paint-elevation.ts
2
+ /**
3
+ * An overlay. Its default MUST render `0 8px 24px rgba(0,0,0,0.4)` — the literal
4
+ * at four call sites — which is why `--cue-paint-shade-far` is the one
5
+ * non-transparent shadow ink. Measured pixel-identical to it.
6
+ */
7
+ const ELEVATION_2 = "shadow-[0_0_0_var(--cue-paint-rim-width)_var(--cue-paint-shade-hairline,transparent),0_calc(2px*var(--cue-paint-shadow-scale))_calc(6px*var(--cue-paint-shadow-scale))_var(--cue-paint-shadow-spread)_var(--cue-paint-shade-near,transparent),0_calc(8px*var(--cue-paint-shadow-scale))_calc(24px*var(--cue-paint-shadow-scale))_var(--cue-paint-shadow-spread)_var(--cue-paint-shade-far,rgba(0,0,0,0.4)),inset_0_1px_0_0_var(--cue-paint-sheen-ink,transparent)]";
8
+ //#endregion
9
+ export { ELEVATION_2 };
@@ -0,0 +1,46 @@
1
+ //#region src/system/_paint-glass.ts
2
+ /**
3
+ * Translucency, with the opaque twin every glass rule needs.
4
+ *
5
+ * **Why this writes `--tw-backdrop-blur` instead of `backdrop-filter`.** Spec
6
+ * §13.5, decided on measurements. Tailwind composes every backdrop utility into
7
+ * ONE declaration — `backdrop-filter: var(--tw-backdrop-blur,)
8
+ * var(--tw-backdrop-brightness,) …` — so a raw `[backdrop-filter:var(…)]` here
9
+ * is a second, competing declaration. Measured: a consumer passing
10
+ * `backdrop-brightness-50` through `className` then computes
11
+ * `brightness(0.5)` and **no blur at all**. The glass does not narrow, it
12
+ * disappears, silently.
13
+ *
14
+ * Filling Tailwind's own slot keeps the composition: the default computes
15
+ * `blur(8px)`, a consumer's brightness composes onto it, and a pack's
16
+ * `blur(12px) saturate(1.4)` survives whole — which a length-valued
17
+ * `backdrop-blur-(--name)` could not express at all.
18
+ *
19
+ * **`backdrop-saturate-100` is there to make the composed declaration exist**,
20
+ * and the choice of utility is load-bearing. Filling a slot paints nothing
21
+ * unless something emits the `backdrop-filter` that reads the slots, and only a
22
+ * backdrop utility emits it. `backdrop-blur-none` would have done that — and it
23
+ * writes `--tw-backdrop-blur` itself, so whichever of the two came later in the
24
+ * stylesheet won: measured, with `blur-none` last the glass computes `none` and
25
+ * disappears. `backdrop-saturate-100` writes a different slot, so the two cannot
26
+ * race, and `saturate(1)` is the identity filter.
27
+ *
28
+ * **The cost is naming an internal, and it is pinned rather than accepted.**
29
+ * `test/system/paint-glass.test.ts` asks the Tailwind compiler what
30
+ * `backdrop-blur` emits and asserts the variable name against that answer, so a
31
+ * rename fails loudly instead of the glass quietly ceasing to compose.
32
+ *
33
+ * **The fill is an explicit `background-color`, not `bg-(--name)`.** The
34
+ * shorthand has nowhere to put the `var()` fallback an ink requires, and an ink
35
+ * spent without one leaves the declaration invalid and CSS drops it in silence.
36
+ *
37
+ * **The `@supports` twin is not decoration.** A browser without
38
+ * `backdrop-filter` paints the translucent fill over whatever is behind it and
39
+ * the bar becomes unreadable; the fallback ink is the opaque surface it would
40
+ * have had.
41
+ *
42
+ * @internal Not part of the public API.
43
+ */
44
+ const GLASS_CLASSES = "[--tw-backdrop-blur:var(--cue-paint-glass-filter,blur(8px))] backdrop-saturate-100 [background-color:var(--cue-paint-glass-ink,color-mix(in_oklch,var(--cue-surface-1)_95%,transparent))] [@supports_not_(backdrop-filter:blur(0px))]:[background-color:var(--cue-paint-glass-fallback-ink,var(--cue-surface-1))]";
45
+ //#endregion
46
+ export { GLASS_CLASSES };
@@ -0,0 +1,32 @@
1
+ //#region src/system/_paint-glow.ts
2
+ /**
3
+ * The halo: two offsetless stops at rest, two more on hover.
4
+ *
5
+ * **Offsetless is the rule that keeps this name from being `elevation` twice.**
6
+ * A drop shadow has a y-offset and reads as light from above; a halo has none
7
+ * and reads as the element emitting. The build refuses a glow value with an
8
+ * offset for that reason, with a positive control that must throw.
9
+ *
10
+ * **A separate rest and hover ink, not a `calc()` on one.** The corpus doubles
11
+ * the alpha on hover — railway `0.25`→`0.50`, aceternity `0.2`→`0.4` — and one
12
+ * site's three-layer white halo exists *only* on hover. A single ink with a
13
+ * multiplier cannot express the last of those at all.
14
+ *
15
+ * **Its own module**, because `@repo/docgen` attributes a token by the file its
16
+ * class string lives in, including through a type-only import. One device per
17
+ * file; the two ways that bit are recorded in `_paint-elevation.ts`.
18
+ *
19
+ * **Every ink carries its default as a `var()` fallback**, without exception: an
20
+ * ink is declared in no stylesheet, so a spend without one leaves the whole
21
+ * `box-shadow` invalid and CSS drops it in silence — measured, and the reason
22
+ * the elevation rungs and the stroke recipe carry theirs.
23
+ *
24
+ * **Nothing wearing this may also carry a `shadow-` literal**: `twMerge` keeps
25
+ * one of two `shadow-` utilities on the same element. `buttonTones` carries none
26
+ * on any tone, which is what makes the adoption additive.
27
+ *
28
+ * @internal Not part of the public API.
29
+ */
30
+ const GLOW_CLASSES = "shadow-[0_0_var(--cue-paint-glow-blur)_var(--cue-paint-glow-ink,transparent),0_0_var(--cue-paint-glow-blur-far)_var(--cue-paint-glow-ink,transparent)] hover:shadow-[0_0_var(--cue-paint-glow-blur)_var(--cue-paint-glow-ink-hover,transparent),0_0_var(--cue-paint-glow-blur-far)_var(--cue-paint-glow-ink-hover,transparent)]";
31
+ //#endregion
32
+ export { GLOW_CLASSES };
@@ -0,0 +1,30 @@
1
+ //#region src/system/_paint-ground-pattern.ts
2
+ /**
3
+ * A repeating pattern on a page-level ground.
4
+ *
5
+ * **Distinct from a texture, and the difference is the layer.** A texture is
6
+ * noise on a pseudo-element *over* the host (`_paint-texture.ts`); a ground
7
+ * pattern is a repeating geometry painted as the host's own `background-image`,
8
+ * beneath its content and beside its `background-color`. A page can carry both:
9
+ * a hatch under a grain.
10
+ *
11
+ * **It sets `background-image`, so a host that paints its own image cannot take
12
+ * it.** The two adopting surfaces paint a `background-color` only.
13
+ *
14
+ * **Its own module**, because `@repo/docgen` attributes a token by the file its
15
+ * class string lives in, including through a type-only import.
16
+ *
17
+ * **The ink is spent by the pack's own image, not here.** A pattern is a whole
18
+ * CSS `<image>` a pack writes, and `--cue-paint-ground-pattern-ink` is the name
19
+ * that image references — which is why §4 documents these four image slots as
20
+ * freezing their ink at the element the pack block sits on, and why they are
21
+ * page-level devices where that costs nothing measurable.
22
+ *
23
+ * At the default `--cue-paint-ground-pattern` is `none`, so the host paints
24
+ * exactly what it painted before.
25
+ *
26
+ * @internal Not part of the public API.
27
+ */
28
+ const GROUND_PATTERN_CLASSES = "bg-[image:var(--cue-paint-ground-pattern)] bg-[length:var(--cue-paint-ground-pattern-size)]";
29
+ //#endregion
30
+ export { GROUND_PATTERN_CLASSES };
@@ -0,0 +1,41 @@
1
+ //#region src/system/_paint-rim.ts
2
+ /**
3
+ * An inset ring on a surface that carries no shadow of its own.
4
+ *
5
+ * **A ring, not a border.** It is drawn as an inset `box-shadow`, outside the
6
+ * box model, so it costs no layout and sits inside the surface's radius. That
7
+ * is what lets a pack put a hairline of light on a panel without moving a
8
+ * single pixel of content.
9
+ *
10
+ * **NOT the recessed control chassis**, and that is an accessibility rule
11
+ * rather than a preference. `forced-colors: active` discards `box-shadow`
12
+ * entirely and repaints outlines in the user's own highlight colour, so a ring
13
+ * drawn as a shadow vanishes for exactly the people who most need it — and a
14
+ * form control's ring is a focus indicator. `forms/chassis.test.ts` asserts
15
+ * `controlSurface` contains no `shadow` at all, and it is right to.
16
+ * §22's inventory lists `_chassis.ts:101` as a rim site; it is wrong, and the
17
+ * guard predates it.
18
+ *
19
+ * A panel's or a card's rim is decorative, so the same loss is cosmetic there.
20
+ *
21
+ * **Nothing already carrying a `shadow-` utility may take this**, because
22
+ * `twMerge` keeps one of two on the same element. The three adopting surfaces
23
+ * were checked and carry none; an elevated surface gets its ring as the
24
+ * hairline *layer* of `ELEVATION_*` instead, which is what that layer is for.
25
+ *
26
+ * **Its own module**, because `@repo/docgen` attributes a token by the file its
27
+ * class string lives in, including through a type-only import.
28
+ *
29
+ * **The ink carries its default as a `var()` fallback**: an ink is declared in
30
+ * no stylesheet, so a spend without one leaves the whole `box-shadow` invalid
31
+ * and CSS drops it in silence — measured twice in earlier slices, once costing
32
+ * an element its border and its fill together.
33
+ *
34
+ * At the defaults `--cue-paint-rim-width` is `0px` and the ink is
35
+ * `transparent`, so the ring is a no-op twice over.
36
+ *
37
+ * @internal Not part of the public API.
38
+ */
39
+ const RIM_INSET = "shadow-[inset_0_0_0_var(--cue-paint-rim-width)_var(--cue-paint-rim-ink,transparent)]";
40
+ //#endregion
41
+ export { RIM_INSET };
@@ -0,0 +1,19 @@
1
+ //#region src/system/_paint-stroke-sunken.ts
2
+ /**
3
+ * The gradient-stroke recipe for a recessed control — the `--cue-sunken` fill.
4
+ *
5
+ * **One fill per module, and that is the point of the file.** `@repo/docgen`
6
+ * attributes a token to a component by the FILE the class string lives in, so a
7
+ * single `_paint.ts` holding all three fills gave every adopting component all
8
+ * three tokens: `card.json` claimed `--cue-sunken` and `--cue-surface-2`, which
9
+ * `Card` does not paint. Measured on the first manifest regeneration of Slice 2;
10
+ * the spec's own risk register predicted it and named this split as the remedy.
11
+ *
12
+ * The recipe itself, and why its off state is a flat gradient rather than
13
+ * `none`, is documented once in `./_paint`.
14
+ *
15
+ * @internal Not part of the public API.
16
+ */
17
+ const STROKE_SUNKEN = "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]";
18
+ //#endregion
19
+ export { STROKE_SUNKEN };
@@ -0,0 +1,19 @@
1
+ //#region src/system/_paint-stroke-surface-1.ts
2
+ /**
3
+ * The gradient-stroke recipe for a card or panel — the `--cue-surface-1` fill.
4
+ *
5
+ * **One fill per module, and that is the point of the file.** `@repo/docgen`
6
+ * attributes a token to a component by the FILE the class string lives in, so a
7
+ * single `_paint.ts` holding all three fills gave every adopting component all
8
+ * three tokens: `card.json` claimed `--cue-sunken` and `--cue-surface-2`, which
9
+ * `Card` does not paint. Measured on the first manifest regeneration of Slice 2;
10
+ * the spec's own risk register predicted it and named this split as the remedy.
11
+ *
12
+ * The recipe itself, and why its off state is a flat gradient rather than
13
+ * `none`, is documented once in `./_paint`.
14
+ *
15
+ * @internal Not part of the public API.
16
+ */
17
+ const STROKE_SURFACE_1 = "border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-surface-1),var(--cue-surface-1)),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]";
18
+ //#endregion
19
+ export { STROKE_SURFACE_1 };
@@ -0,0 +1,27 @@
1
+ //#region src/system/_paint-stroke-surface-2.ts
2
+ /**
3
+ * The gradient-stroke recipe for an overlay — the `--cue-surface-2` fill.
4
+ *
5
+ * **One fill per module, and that is the point of the file.** `@repo/docgen`
6
+ * attributes a token to a component by the FILE the class string lives in, so a
7
+ * single `_paint.ts` holding all three fills gave every adopting component all
8
+ * three tokens: `card.json` claimed `--cue-sunken` and `--cue-surface-2`, which
9
+ * `Card` does not paint. Measured on the first manifest regeneration of Slice 2;
10
+ * the spec's own risk register predicted it and named this split as the remedy.
11
+ *
12
+ * **Its stops fall back to `--cue-border-overlay`, not `--cue-border`**, and
13
+ * that is the one place the three fills differ. An overlay has always drawn its
14
+ * rim in `border-overlay`: a distinct token that some themes — venu — match to
15
+ * the surface deliberately so the rim vanishes. Falling back to `--cue-border`
16
+ * here would repaint every dialog, menu, popover and toast in a colour the
17
+ * theme did not choose for them. Caught by the manifest, which showed 22
18
+ * components losing `--cue-border-overlay` the moment this fill was adopted.
19
+ *
20
+ * The recipe itself, and why its off state is a flat gradient rather than
21
+ * `none`, is documented once in `./_paint`.
22
+ *
23
+ * @internal Not part of the public API.
24
+ */
25
+ const STROKE_SURFACE_2 = "border-transparent border-(length:--cue-paint-stroke-width) bg-[linear-gradient(var(--cue-surface-2),var(--cue-surface-2)),linear-gradient(var(--cue-paint-stroke-angle),var(--cue-paint-stroke-from,var(--cue-border-overlay)),var(--cue-paint-stroke-to,var(--cue-border-overlay)))] bg-origin-border [background-clip:padding-box,border-box]";
26
+ //#endregion
27
+ export { STROKE_SURFACE_2 };
@@ -0,0 +1,53 @@
1
+ //#region src/system/_paint-texture.ts
2
+ /**
3
+ * A grain or pattern overlay, riding a pseudo-element.
4
+ *
5
+ * **Why `::before` and not the element's own background.** A texture sits *over*
6
+ * whatever the host already paints — a band's ground, a shell's fill — and a
7
+ * component's `background-image` is not free to take. The overlay is
8
+ * `pointer-events-none` and `inset-0`, so it covers the host exactly and
9
+ * intercepts nothing.
10
+ *
11
+ * **Its own module**, because `@repo/docgen` attributes a token by the file its
12
+ * class string lives in, including through a type-only import. One device per
13
+ * file; the two ways that bit are recorded in `_paint-elevation.ts`.
14
+ *
15
+ * **`isolate` and `before:-z-10` together, and neither works alone.** An
16
+ * absolutely-positioned `::before` paints ABOVE its host's in-flow content, so
17
+ * without them the texture covers the band's own text — measured, the white
18
+ * text's brightest pixel drops 255 to 204 under a 60% overlay. `-z-10` alone
19
+ * does not fix it: with no stacking context on the host the pseudo-element
20
+ * falls behind the band's own background and the texture becomes invisible
21
+ * entirely (measured: the ground pixel does not move). `isolate` gives the host
22
+ * a stacking context, and inside one a negative-z child paints above the
23
+ * background and below the content — which is exactly the layer a texture wants.
24
+ * Found in review; the first gate could not see it because its test band had no
25
+ * content in it.
26
+ *
27
+ * **The mask carries its `-webkit-` prefix**, which is the library's
28
+ * convention rather than a guess: `elements/clamp.tsx:223` and
29
+ * `chrome/_edge-scroller.tsx:73` are the only other mask users here and both
30
+ * prefix it. Measured for completeness — Playwright's WebKit honours the
31
+ * unprefixed property, identically to Chromium — so this is for the Safari
32
+ * versions that engine is not, and it matches what the two existing sites
33
+ * already decided. Found in review.
34
+ *
35
+ * **Nothing else in the library may take this pseudo-element on the same
36
+ * element.** §6.5 note 2 is about that, and it is why the host was checked
37
+ * before adopting: neither `Band` nor `AppShell` uses `::before` today.
38
+ *
39
+ * **No ink here, so no fallback rule to keep.** Every name this spends is a
40
+ * declared pack name with a `:root` default — `texture` is `none`,
41
+ * `texture-size` `auto`, `texture-opacity` `1`, `texture-blend` `normal`, and
42
+ * `fade` (Slice 7's) `none`. Measured: at those defaults the overlay renders
43
+ * identically to the same host with no pseudo-element at all.
44
+ *
45
+ * **The token layer ships no binary.** `--cue-paint-texture` takes a `data:`
46
+ * URI a pack file holds inline, or an absolute `https://` URL a consumer's own
47
+ * CDN serves — `PAINT_VALUES` enforces exactly those two and says why.
48
+ *
49
+ * @internal Not part of the public API.
50
+ */
51
+ const TEXTURE_CLASSES = "relative isolate before:pointer-events-none before:absolute before:inset-0 before:-z-10 before:content-[''] before:bg-[image:var(--cue-paint-texture)] before:bg-[length:var(--cue-paint-texture-size)] before:opacity-(--cue-paint-texture-opacity) before:[mix-blend-mode:var(--cue-paint-texture-blend)] before:[mask-image:var(--cue-paint-fade)] before:[-webkit-mask-image:var(--cue-paint-fade)]";
52
+ //#endregion
53
+ export { TEXTURE_CLASSES };
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- import { StyleSet } from "@cueplusplus/tokens";
2
+ import { Paint, StyleSet } from "@cueplusplus/tokens";
3
3
  import { Density as Density$1 } from "@cueplusplus/theme-base";
4
4
  //#region src/system/density.d.ts
5
5
  interface DensityProps {
@@ -8,6 +8,15 @@ interface DensityProps {
8
8
  * `large` or `ultra-large`.
9
9
  */
10
10
  density: Density$1;
11
+ /**
12
+ * A look pack for this subtree.
13
+ *
14
+ * Optional, and **absent means inherit**, exactly as `styleSet` is: an island
15
+ * that names none stamps no `data-paint` and passes the ambient pack straight
16
+ * through. `none` is a *value*, not an absence — it restates the `:root`
17
+ * defaults, so a subtree stamps it to opt out of a pack its parent set.
18
+ */
19
+ paint?: Paint;
11
20
  /**
12
21
  * A style set for this subtree: `console`, `editorial` or `marketing`.
13
22
  *
@@ -68,6 +77,6 @@ interface DensityProps {
68
77
  * <Toolbar />
69
78
  * </Density>
70
79
  */
71
- declare function Density$2({ density, styleSet, children, className, style }: DensityProps): React.JSX.Element;
80
+ declare function Density$2({ density, styleSet, paint, children, className, style }: DensityProps): React.JSX.Element;
72
81
  //#endregion
73
82
  export { Density$2 as Density, DensityProps };
@@ -57,6 +57,21 @@ const AmbientThemeContext = React.createContext(null);
57
57
  */
58
58
  const StyleSetContext = React.createContext(null);
59
59
  /**
60
+ * The look pack stamped around this subtree, or `null` when none is.
61
+ *
62
+ * The fifth axis's counterpart to {@link StyleSetContext}, and internal for the
63
+ * same reasons: a provider publishes this and its `ThemeContext.paint` from one
64
+ * value, a `<Density paint>` island re-scopes it without a `ThemeContext` of its
65
+ * own, and `Preview`'s stage and the portal stamp both leave the DOM they were
66
+ * written in and have to carry the answer with them.
67
+ *
68
+ * `null` is not `"none"`. Absent means *inherit*; `none` is a pack that restates
69
+ * the `:root` defaults, which is what a subtree stamps to opt OUT of an ambient
70
+ * pack. Collapsing the two would make every unpainted subtree override its
71
+ * parent instead of inheriting from it.
72
+ */
73
+ const PaintContext = React.createContext(null);
74
+ /**
60
75
  * Re-scope any subtree to a different density level.
61
76
  *
62
77
  * Renders a plain `<div data-density="…" data-cue-theme="…">`: the geometry
@@ -89,23 +104,28 @@ const StyleSetContext = React.createContext(null);
89
104
  * <Toolbar />
90
105
  * </Density>
91
106
  */
92
- function Density({ density, styleSet, children, className, style }) {
107
+ function Density({ density, styleSet, paint, children, className, style }) {
93
108
  const theme = React.useContext(AmbientThemeContext);
94
109
  const ambientStyleSet = React.useContext(StyleSetContext);
110
+ const ambientPaint = React.useContext(PaintContext);
95
111
  return /* @__PURE__ */ jsx(DensityContext.Provider, {
96
112
  value: density,
97
113
  children: /* @__PURE__ */ jsx(StyleSetContext.Provider, {
98
114
  value: styleSet ?? ambientStyleSet,
99
- children: /* @__PURE__ */ jsx("div", {
100
- "data-density": density,
101
- "data-cue-theme": theme ?? void 0,
102
- "data-style": styleSet ?? void 0,
103
- className,
104
- style,
105
- children
115
+ children: /* @__PURE__ */ jsx(PaintContext.Provider, {
116
+ value: paint ?? ambientPaint,
117
+ children: /* @__PURE__ */ jsx("div", {
118
+ "data-density": density,
119
+ "data-cue-theme": theme ?? void 0,
120
+ "data-style": styleSet ?? void 0,
121
+ "data-paint": paint ?? void 0,
122
+ className,
123
+ style,
124
+ children
125
+ })
106
126
  })
107
127
  })
108
128
  });
109
129
  }
110
130
  //#endregion
111
- export { AmbientThemeContext, DEFAULT_DENSITY, Density, DensityContext, StyleSetContext };
131
+ export { AmbientThemeContext, DEFAULT_DENSITY, Density, DensityContext, PaintContext, StyleSetContext };