@cueplusplus/ui 0.12.0 → 0.14.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 (196) hide show
  1. package/CHANGELOG.md +305 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE.md +34 -0
  4. package/README.md +2 -19
  5. package/dist/agent-runtime/tool-call-card.js +2 -2
  6. package/dist/chat/ask-box.js +2 -2
  7. package/dist/chat/composer.js +1 -1
  8. package/dist/chat/message.js +1 -1
  9. package/dist/chrome/_band.js +54 -0
  10. package/dist/chrome/band.d.ts +106 -0
  11. package/dist/chrome/band.js +97 -0
  12. package/dist/chrome/empty-state.js +1 -1
  13. package/dist/chrome/footer.d.ts +13 -0
  14. package/dist/chrome/footer.js +17 -2
  15. package/dist/chrome/index.d.ts +2 -1
  16. package/dist/chrome/index.js +2 -1
  17. package/dist/chrome/navigation-menu.js +1 -1
  18. package/dist/chrome/page-shell.js +4 -4
  19. package/dist/configurator/export-dialog.js +1 -1
  20. package/dist/configurator/panel-sections.js +1 -1
  21. package/dist/elements/agent-card.js +1 -1
  22. package/dist/elements/agent-handoff.js +2 -2
  23. package/dist/elements/canvas-split.js +2 -2
  24. package/dist/elements/chat-panel.js +1 -1
  25. package/dist/elements/code-diff.js +1 -1
  26. package/dist/elements/code-runner.js +2 -2
  27. package/dist/elements/comparison-card.js +1 -1
  28. package/dist/elements/confidence-marker.js +1 -1
  29. package/dist/elements/conversation-search.js +1 -1
  30. package/dist/elements/day-separator.js +1 -1
  31. package/dist/elements/document-reference.js +1 -1
  32. package/dist/elements/edit-message.js +1 -1
  33. package/dist/elements/elicitation-form.js +1 -1
  34. package/dist/elements/guardrail-notice.js +1 -1
  35. package/dist/elements/image-generation.js +1 -1
  36. package/dist/elements/inline-citation.js +2 -2
  37. package/dist/elements/markdown.js +1 -1
  38. package/dist/elements/math-block.js +1 -1
  39. package/dist/elements/message-branches.js +1 -1
  40. package/dist/elements/message-pair.js +1 -1
  41. package/dist/elements/onboarding.js +2 -2
  42. package/dist/elements/prompt-library.js +1 -1
  43. package/dist/elements/quote-reply.js +2 -2
  44. package/dist/elements/read-aloud.js +1 -1
  45. package/dist/elements/reasoning-panel.js +1 -1
  46. package/dist/elements/recommendation-card.js +1 -1
  47. package/dist/elements/research-report.js +1 -1
  48. package/dist/elements/retrieval-chunks.js +1 -1
  49. package/dist/elements/reviewable-diff.js +1 -1
  50. package/dist/elements/score-breakdown.js +1 -1
  51. package/dist/elements/scroll-anchor.js +1 -1
  52. package/dist/elements/settings-panel.js +1 -1
  53. package/dist/elements/shared-conversation.js +1 -1
  54. package/dist/elements/speaker-identity.js +1 -1
  55. package/dist/elements/stopped-run.js +1 -1
  56. package/dist/elements/streaming-text.js +1 -1
  57. package/dist/elements/timeline.js +1 -1
  58. package/dist/elements/tool-error.js +1 -1
  59. package/dist/elements/voice-conversation.js +1 -1
  60. package/dist/forms/textarea.js +1 -1
  61. package/dist/index.d.ts +5 -4
  62. package/dist/index.js +4 -2
  63. package/dist/instruments/code-block.js +1 -1
  64. package/dist/instruments/progress.d.ts +19 -3
  65. package/dist/instruments/progress.js +19 -1
  66. package/dist/instruments/terminal-frame.js +1 -1
  67. package/dist/layout/_collapse.js +1 -1
  68. package/dist/layout/card.js +1 -1
  69. package/dist/layout/container.js +3 -3
  70. package/dist/layout/frames.d.ts +19 -1
  71. package/dist/layout/frames.js +21 -7
  72. package/dist/layout/index.d.ts +2 -2
  73. package/dist/layout/preview.d.ts +29 -9
  74. package/dist/layout/preview.js +38 -17
  75. package/dist/overlays/_surface.d.ts +1 -1
  76. package/dist/overlays/_surface.js +1 -1
  77. package/dist/overlays/toast.js +1 -1
  78. package/dist/overlays/tooltip.js +1 -1
  79. package/dist/primitives/chip.d.ts +1 -1
  80. package/dist/system/density.d.ts +34 -6
  81. package/dist/system/density.js +41 -10
  82. package/dist/system/index.d.ts +2 -1
  83. package/dist/system/index.js +2 -1
  84. package/dist/system/portal.d.ts +8 -7
  85. package/dist/system/portal.js +16 -9
  86. package/dist/system/prepaint.d.ts +25 -5
  87. package/dist/system/prepaint.js +10 -2
  88. package/dist/system/theme-provider.d.ts +86 -7
  89. package/dist/system/theme-provider.js +62 -20
  90. package/dist/system/use-theme.d.ts +9 -2
  91. package/dist/system/use-theme.js +9 -2
  92. package/dist/system/vocabulary.d.ts +2 -1
  93. package/dist/system/vocabulary.js +16 -2
  94. package/manifest/components/accordion.json +1 -0
  95. package/manifest/components/agent-card.json +1 -0
  96. package/manifest/components/agent-handoff.json +1 -0
  97. package/manifest/components/alert-dialog.json +1 -0
  98. package/manifest/components/ask-box.json +1 -0
  99. package/manifest/components/autocomplete.json +1 -0
  100. package/manifest/components/band.json +104 -0
  101. package/manifest/components/canvas-split-body.json +1 -0
  102. package/manifest/components/canvas-split-document.json +1 -0
  103. package/manifest/components/canvas-split-header.json +1 -0
  104. package/manifest/components/canvas-split-line.json +1 -0
  105. package/manifest/components/canvas-split-message.json +1 -0
  106. package/manifest/components/canvas-split-thread.json +1 -0
  107. package/manifest/components/canvas-split.json +1 -0
  108. package/manifest/components/card.json +1 -0
  109. package/manifest/components/channel-matrix.json +1 -0
  110. package/manifest/components/chart-tooltip-content.json +1 -0
  111. package/manifest/components/chat-panel-assistant-message.json +1 -0
  112. package/manifest/components/chat-panel-composer.json +1 -0
  113. package/manifest/components/chat-panel-messages.json +1 -0
  114. package/manifest/components/chat-panel-typing.json +1 -0
  115. package/manifest/components/chat-panel-user-message.json +1 -0
  116. package/manifest/components/chat-panel.json +1 -0
  117. package/manifest/components/code-block.json +1 -0
  118. package/manifest/components/code-diff.json +1 -0
  119. package/manifest/components/code-runner.json +1 -0
  120. package/manifest/components/collapsible.json +1 -0
  121. package/manifest/components/colors-section.json +1 -0
  122. package/manifest/components/combobox.json +1 -0
  123. package/manifest/components/command-palette.json +1 -0
  124. package/manifest/components/comparison-card.json +1 -0
  125. package/manifest/components/composer.json +1 -0
  126. package/manifest/components/confidence-marker.json +1 -0
  127. package/manifest/components/container.json +3 -0
  128. package/manifest/components/context-menu.json +1 -0
  129. package/manifest/components/conversation-search.json +1 -0
  130. package/manifest/components/cue-portal-frame.json +1 -1
  131. package/manifest/components/day-separator.json +1 -0
  132. package/manifest/components/density.json +16 -1
  133. package/manifest/components/dialog.json +1 -0
  134. package/manifest/components/disclosure.json +1 -0
  135. package/manifest/components/dmx-bar.json +1 -0
  136. package/manifest/components/dmx-strip.json +1 -0
  137. package/manifest/components/document-reference.json +1 -0
  138. package/manifest/components/drawer.json +1 -0
  139. package/manifest/components/dropdown-menu.json +1 -0
  140. package/manifest/components/edit-message.json +1 -0
  141. package/manifest/components/elements-timeline.json +1 -0
  142. package/manifest/components/elicitation-form.json +1 -0
  143. package/manifest/components/empty-state.json +1 -0
  144. package/manifest/components/export-dialog.json +1 -0
  145. package/manifest/components/footer.json +3 -2
  146. package/manifest/components/frac.json +1 -0
  147. package/manifest/components/frames.json +14 -0
  148. package/manifest/components/guardrail-notice.json +1 -0
  149. package/manifest/components/hover-card.json +1 -0
  150. package/manifest/components/inline-citation.json +1 -0
  151. package/manifest/components/markdown-text.json +1 -0
  152. package/manifest/components/math-block.json +1 -0
  153. package/manifest/components/menubar.json +1 -0
  154. package/manifest/components/message-branches.json +1 -0
  155. package/manifest/components/message-pair.json +1 -0
  156. package/manifest/components/message.json +1 -0
  157. package/manifest/components/multi-select.json +1 -0
  158. package/manifest/components/navigation-menu.json +1 -0
  159. package/manifest/components/onboarding.json +1 -0
  160. package/manifest/components/page-shell.json +4 -0
  161. package/manifest/components/popover.json +1 -0
  162. package/manifest/components/preset-section.json +1 -0
  163. package/manifest/components/preview.json +17 -2
  164. package/manifest/components/progress.json +2 -2
  165. package/manifest/components/prompt-library.json +1 -0
  166. package/manifest/components/quote-reply.json +1 -0
  167. package/manifest/components/read-aloud.json +1 -0
  168. package/manifest/components/reasoning-panel.json +1 -0
  169. package/manifest/components/recommendation-card.json +1 -0
  170. package/manifest/components/research-report.json +1 -0
  171. package/manifest/components/retrieval-chunks.json +1 -0
  172. package/manifest/components/reviewable-diff.json +1 -0
  173. package/manifest/components/score-breakdown.json +1 -0
  174. package/manifest/components/scroll-anchor.json +1 -0
  175. package/manifest/components/settings-panel.json +1 -0
  176. package/manifest/components/shape-section.json +1 -0
  177. package/manifest/components/shared-conversation.json +1 -0
  178. package/manifest/components/sheet.json +1 -0
  179. package/manifest/components/speaker-identity.json +1 -0
  180. package/manifest/components/stopped-run.json +1 -0
  181. package/manifest/components/streaming-text.json +1 -0
  182. package/manifest/components/sub.json +1 -0
  183. package/manifest/components/sup.json +1 -0
  184. package/manifest/components/tags-input.json +1 -0
  185. package/manifest/components/terminal-frame.json +1 -0
  186. package/manifest/components/textarea.json +1 -0
  187. package/manifest/components/theme-configurator.json +1 -0
  188. package/manifest/components/theme-provider.json +26 -1
  189. package/manifest/components/toast.json +1 -0
  190. package/manifest/components/tool-call-card.json +1 -0
  191. package/manifest/components/tool-error.json +1 -0
  192. package/manifest/components/tooltip.json +1 -0
  193. package/manifest/components/voice-conversation.json +1 -0
  194. package/manifest/manifest.json +133 -105
  195. package/manifest/tokens.json +20 -1
  196. package/package.json +11 -9
@@ -0,0 +1,97 @@
1
+ import { cn } from "../lib/cn.js";
2
+ import { Container } from "../layout/container.js";
3
+ import { bandClasses } from "./_band.js";
4
+ import * as React from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/chrome/band.tsx
7
+ /**
8
+ * What each separation adds to the frame `bandClasses` draws, and the two
9
+ * `--cue-*` names that live in this file rather than in the chassis beside it.
10
+ *
11
+ * `_band.ts` holds only what `Footer` can also render — the rhythm and the
12
+ * rule — because docgen's token scanner reads a chassis file whole and cannot
13
+ * see that `Footer` calls `bandClasses` with the literal `"rule"`. The ground
14
+ * is reachable only from `<Band separation="ground">`, so it is written here,
15
+ * next to the prop whose value selects it. `_band.ts`'s own docblock carries
16
+ * the argument.
17
+ *
18
+ * `rule`'s entry is the colour and not the width: the width is
19
+ * `--cue-band-rule` and belongs to the chassis, and both elements name
20
+ * `border-border` in their own class list rather than inheriting it from the
21
+ * other.
22
+ */
23
+ const SEPARATION_PAINT = {
24
+ rule: "border-border",
25
+ ground: "bg-(--cue-band-ground)",
26
+ bleed: null,
27
+ none: null
28
+ };
29
+ /**
30
+ * A full-bleed horizontal section: the page's rhythm, its separation, and a
31
+ * column at the measure.
32
+ *
33
+ * This is `Footer`'s recipe with the footer taken out of it — a `w-full`
34
+ * element, a rule running edge to edge, and a centred `Container` inside so the
35
+ * line reaches the window while the words stop at the measure. `Footer` is
36
+ * built on this rather than beside it; the recipe exists once.
37
+ *
38
+ * Every dimension it spends belongs to the style axis, so the same markup
39
+ * composes differently under `[data-style]` without a prop changing: the
40
+ * vertical rhythm is `--cue-band-y` (one `--cue-space-7` with no set, doubled
41
+ * under `editorial`, trebled under `marketing`), the column is
42
+ * `--cue-measure-prose` unless `width` names a fixed rung, and the rule and the
43
+ * ground are `--cue-band-rule` and `--cue-band-ground`. Read `separation`'s own
44
+ * documentation before choosing one, because two of the four can come out to
45
+ * nothing and they do not vanish symmetrically: `--cue-band-ground` is
46
+ * `transparent` on `:root` and on two of the three sets, so a `"ground"` paints
47
+ * nothing in three of the four states a page can be in, while `--cue-band-rule`
48
+ * is `0px` under `marketing` alone. Both are deliberate and nothing warns.
49
+ *
50
+ * **Two substitution boundaries, because `--cue-band-y` is a `calc()` resolved
51
+ * at the element that declares it.** A `<Density>` island nested inside a
52
+ * styled page moves every `--cue-space-*` and the band rhythm does **not**
53
+ * follow it — the island inherits the rhythm already resolved above. Restate
54
+ * the set on the island (`<Density density="compact" styleSet="editorial">`) to
55
+ * re-resolve it against that island's rung. Likewise a nested `[data-theme]`
56
+ * under a marketing band paints the **outer** theme's `--cue-surface-1` through
57
+ * an already-resolved `--cue-band-ground`.
58
+ *
59
+ * It renders a `<section>`, which is not a landmark until it has an accessible
60
+ * name — so a band with a heading should carry `aria-labelledby` pointing at
61
+ * it, and a band without one costs the document nothing.
62
+ *
63
+ * Static markup — no `"use client"`.
64
+ *
65
+ * @example
66
+ * <Band aria-labelledby="pitch">
67
+ * <h2 id="pitch">One import</h2>
68
+ * <p>Everything on one token layer.</p>
69
+ * </Band>
70
+ * @example
71
+ * <Band separation="ground" width="broad">
72
+ * <Bento.Root cols={3}>{tiles}</Bento.Root>
73
+ * </Band>
74
+ */
75
+ const Band = React.forwardRef(function Band({ className, columnClassName, separation = "rule", width = "prose", children, ...elementProps }, ref) {
76
+ const column = width === "prose" ? {
77
+ width: "full",
78
+ className: "max-w-(--cue-measure-prose)"
79
+ } : {
80
+ width,
81
+ className: null
82
+ };
83
+ return /* @__PURE__ */ jsx("section", {
84
+ ref,
85
+ "data-slot": "band",
86
+ "data-separation": separation,
87
+ className: cn(bandClasses(separation), SEPARATION_PAINT[separation], className),
88
+ ...elementProps,
89
+ children: separation === "bleed" ? children : /* @__PURE__ */ jsx(Container, {
90
+ width: column.width,
91
+ className: cn(column.className, columnClassName),
92
+ children
93
+ })
94
+ });
95
+ });
96
+ //#endregion
97
+ export { Band };
@@ -41,7 +41,7 @@ const EmptyState = React.forwardRef(function EmptyState({ className, title, hint
41
41
  }),
42
42
  hint === void 0 ? null : /* @__PURE__ */ jsx("p", {
43
43
  "data-slot": "empty-state-hint",
44
- className: "max-w-[36ch] text-(length:--cue-text-ui) leading-relaxed text-fg-muted",
44
+ className: "max-w-[36ch] text-(length:--cue-text-ui) leading-(--cue-leading-ui) text-fg-muted",
45
45
  children: hint
46
46
  }),
47
47
  children,
@@ -53,6 +53,19 @@ interface FooterProps extends React.ComponentPropsWithoutRef<"footer"> {
53
53
  * and reads as chrome it is not. It coexists with `StatusBar`, which is the
54
54
  * opposite object: a strip of the frame, always on screen, never scrolled.
55
55
  *
56
+ * Under the skin this **is** `Band`'s recipe — `separation="rule"`, spent
57
+ * through `bandClasses` rather than through `<Band>` itself, because `Band`
58
+ * renders a `<section>` and this has to render the `<footer>` that makes it the
59
+ * `contentinfo` landmark. The two dimensions that recipe carries are the
60
+ * rhythm and the rule, and both are the style axis's now, the same as any other
61
+ * band: see `separation`'s table on `Band` for what each `[data-style]` set
62
+ * makes them paint. With no set active nothing changes from what this component
63
+ * always rendered. It does **not** reach `Band`'s other two style-owned
64
+ * spends — the ground and the reading measure — because `separation` is the
65
+ * literal `"rule"` here and `width` is a `ContainerWidth`; `_band.ts`'s
66
+ * docblock says why that is a fact about the published manifest and not only
67
+ * about the markup.
68
+ *
56
69
  * Static markup — no `"use client"`.
57
70
  *
58
71
  * @example
@@ -1,5 +1,6 @@
1
1
  import { cn } from "../lib/cn.js";
2
2
  import { Container } from "../layout/container.js";
3
+ import { bandClasses } from "./_band.js";
3
4
  import * as React from "react";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  //#region src/chrome/footer.tsx
@@ -30,6 +31,19 @@ import { jsx, jsxs } from "react/jsx-runtime";
30
31
  * and reads as chrome it is not. It coexists with `StatusBar`, which is the
31
32
  * opposite object: a strip of the frame, always on screen, never scrolled.
32
33
  *
34
+ * Under the skin this **is** `Band`'s recipe — `separation="rule"`, spent
35
+ * through `bandClasses` rather than through `<Band>` itself, because `Band`
36
+ * renders a `<section>` and this has to render the `<footer>` that makes it the
37
+ * `contentinfo` landmark. The two dimensions that recipe carries are the
38
+ * rhythm and the rule, and both are the style axis's now, the same as any other
39
+ * band: see `separation`'s table on `Band` for what each `[data-style]` set
40
+ * makes them paint. With no set active nothing changes from what this component
41
+ * always rendered. It does **not** reach `Band`'s other two style-owned
42
+ * spends — the ground and the reading measure — because `separation` is the
43
+ * literal `"rule"` here and `width` is a `ContainerWidth`; `_band.ts`'s
44
+ * docblock says why that is a fact about the published manifest and not only
45
+ * about the markup.
46
+ *
33
47
  * Static markup — no `"use client"`.
34
48
  *
35
49
  * @example
@@ -51,11 +65,12 @@ const Footer = React.forwardRef(function Footer({ className, columnClassName, wi
51
65
  return /* @__PURE__ */ jsx("footer", {
52
66
  ref,
53
67
  "data-slot": "footer",
54
- className: cn("w-full border-t border-border", className),
68
+ "data-separation": "rule",
69
+ className: cn(bandClasses("rule"), "border-border", className),
55
70
  ...elementProps,
56
71
  children: /* @__PURE__ */ jsxs(Container, {
57
72
  width,
58
- className: cn("flex flex-col gap-(--cue-space-6) py-(--cue-space-7) font-mono text-(length:--cue-text-ui)", columnClassName),
73
+ className: cn("flex flex-col gap-(--cue-space-6) font-mono text-(length:--cue-text-ui)", columnClassName),
59
74
  children: [children, meta === void 0 ? null : /* @__PURE__ */ jsx("div", {
60
75
  "data-slot": "footer-meta",
61
76
  className: "flex flex-wrap items-center justify-between gap-(--cue-space-3) border-t border-border pt-(--cue-space-5) font-mono text-(length:--cue-text-label) text-fg-subtle",
@@ -3,6 +3,7 @@ import { BarOverflow } from "./_edge-scroller.js";
3
3
  import { TREE_GUIDE_GLYPHS, TreeGuide, TreeItem, TreeRow, flattenTree } from "./_tree.js";
4
4
  import { AppBar, AppBarActionsProps, AppBarBrandProps, AppBarLinkProps, AppBarNavProps, AppBarRegister, AppBarRootProps, AppBarSeparatorProps } from "./app-bar.js";
5
5
  import { AppShell, AppShellAsideProps, AppShellBarProps, AppShellBodyProps, AppShellContentProps, AppShellNavTriggerProps, AppShellRootProps, AppShellScrollerProps, AppShellSidebarProps } from "./app-shell.js";
6
+ import { Band, BandProps, BandSeparation, BandWidth } from "./band.js";
6
7
  import { EmptyState, EmptyStateProps } from "./empty-state.js";
7
8
  import { Eyebrow, EyebrowProps } from "./eyebrow.js";
8
9
  import { Footer, FooterProps } from "./footer.js";
@@ -20,4 +21,4 @@ import { ScrollableTabsList, ScrollableTabsListProps, Tabs, TabsListProps, TabsP
20
21
  import { TitleBar, TitleBarProps } from "./title-bar.js";
21
22
  import { Tree, TreeProps, TreeVisibility, TreeVisibilityToggle, TreeVisibilityToggleProps } from "./tree.js";
22
23
  import { Toolbar, ToolbarButtonProps, ToolbarGroupProps, ToolbarRootProps, ToolbarSeparatorProps } from "./toolbar.js";
23
- export { AppBar, type AppBarActionsProps, type AppBarBrandProps, type AppBarLinkProps, type AppBarNavProps, type AppBarRegister, type AppBarRootProps, type AppBarSeparatorProps, AppShell, type AppShellAsideProps, type AppShellBarProps, type AppShellBodyProps, type AppShellContentProps, type AppShellNavTriggerProps, type AppShellRootProps, type AppShellScrollerProps, type AppShellSidebarProps, type BarOverflow, EmptyState, type EmptyStateProps, Eyebrow, type EyebrowProps, Footer, type FooterProps, Inspector, type InspectorFooterProps, type InspectorRootProps, type InspectorRowProps, type InspectorSectionProps, NavigationMenu, type NavigationMenuContentProps, type NavigationMenuItemProps, type NavigationMenuLinkProps, type NavigationMenuListProps, type NavigationMenuRootProps, type NavigationMenuTriggerProps, type NavigationMenuViewportProps, PageShell, type PageShellProps, type PageWidth, Panel, PanelHeader, type PanelHeaderProps, type PanelProps, Row, type RowProps, ScrollArea, type ScrollAreaOrientation, type ScrollAreaProps, type ScrollEdges, ScrollableTabsList, type ScrollableTabsListProps, SeamList, type SeamListProps, SectionHeader, type SectionHeaderProps, SegmentedControl, type SegmentedControlItem, type SegmentedControlProps, type SegmentedControlSize, StatusBar, type StatusBarGroupProps, type StatusBarItemProps, type StatusBarProminence, type StatusBarProps, type StatusBarTone, TAB_FADE_PX, TREE_GUIDE_GLYPHS, Tabs, type TabsListProps, type TabsPanelProps, type TabsRootProps, type TabsTabProps, TitleBar, type TitleBarProps, Toolbar, type ToolbarButtonProps, type ToolbarGroupProps, type ToolbarRootProps, type ToolbarSeparatorProps, Tree, type TreeGuide, type TreeItem, type TreeProps, type TreeRow, type TreeVisibility, TreeVisibilityToggle, type TreeVisibilityToggleProps, computeScrollEdges, edgeFadeMask, flattenTree, rowVariants };
24
+ export { AppBar, type AppBarActionsProps, type AppBarBrandProps, type AppBarLinkProps, type AppBarNavProps, type AppBarRegister, type AppBarRootProps, type AppBarSeparatorProps, AppShell, type AppShellAsideProps, type AppShellBarProps, type AppShellBodyProps, type AppShellContentProps, type AppShellNavTriggerProps, type AppShellRootProps, type AppShellScrollerProps, type AppShellSidebarProps, Band, type BandProps, type BandSeparation, type BandWidth, type BarOverflow, EmptyState, type EmptyStateProps, Eyebrow, type EyebrowProps, Footer, type FooterProps, Inspector, type InspectorFooterProps, type InspectorRootProps, type InspectorRowProps, type InspectorSectionProps, NavigationMenu, type NavigationMenuContentProps, type NavigationMenuItemProps, type NavigationMenuLinkProps, type NavigationMenuListProps, type NavigationMenuRootProps, type NavigationMenuTriggerProps, type NavigationMenuViewportProps, PageShell, type PageShellProps, type PageWidth, Panel, PanelHeader, type PanelHeaderProps, type PanelProps, Row, type RowProps, ScrollArea, type ScrollAreaOrientation, type ScrollAreaProps, type ScrollEdges, ScrollableTabsList, type ScrollableTabsListProps, SeamList, type SeamListProps, SectionHeader, type SectionHeaderProps, SegmentedControl, type SegmentedControlItem, type SegmentedControlProps, type SegmentedControlSize, StatusBar, type StatusBarGroupProps, type StatusBarItemProps, type StatusBarProminence, type StatusBarProps, type StatusBarTone, TAB_FADE_PX, TREE_GUIDE_GLYPHS, Tabs, type TabsListProps, type TabsPanelProps, type TabsRootProps, type TabsTabProps, TitleBar, type TitleBarProps, Toolbar, type ToolbarButtonProps, type ToolbarGroupProps, type ToolbarRootProps, type ToolbarSeparatorProps, Tree, type TreeGuide, type TreeItem, type TreeProps, type TreeRow, type TreeVisibility, TreeVisibilityToggle, type TreeVisibilityToggleProps, computeScrollEdges, edgeFadeMask, flattenTree, rowVariants };
@@ -2,6 +2,7 @@ import { TAB_FADE_PX, computeScrollEdges, edgeFadeMask } from "./_tabs-scroll.js
2
2
  import { TREE_GUIDE_GLYPHS, flattenTree } from "./_tree.js";
3
3
  import { AppBar } from "./app-bar.js";
4
4
  import { AppShell } from "./app-shell.js";
5
+ import { Band } from "./band.js";
5
6
  import { EmptyState } from "./empty-state.js";
6
7
  import { Eyebrow } from "./eyebrow.js";
7
8
  import { Footer } from "./footer.js";
@@ -18,4 +19,4 @@ import { ScrollableTabsList, Tabs } from "./tabs.js";
18
19
  import { TitleBar } from "./title-bar.js";
19
20
  import { Tree, TreeVisibilityToggle } from "./tree.js";
20
21
  import { Toolbar } from "./toolbar.js";
21
- export { AppBar, AppShell, EmptyState, Eyebrow, Footer, Inspector, NavigationMenu, PageShell, Panel, PanelHeader, Row, ScrollArea, ScrollableTabsList, SeamList, SectionHeader, SegmentedControl, StatusBar, TAB_FADE_PX, TREE_GUIDE_GLYPHS, Tabs, TitleBar, Toolbar, Tree, TreeVisibilityToggle, computeScrollEdges, edgeFadeMask, flattenTree, rowVariants };
22
+ export { AppBar, AppShell, Band, EmptyState, Eyebrow, Footer, Inspector, NavigationMenu, PageShell, Panel, PanelHeader, Row, ScrollArea, ScrollableTabsList, SeamList, SectionHeader, SegmentedControl, StatusBar, TAB_FADE_PX, TREE_GUIDE_GLYPHS, Tabs, TitleBar, Toolbar, Tree, TreeVisibilityToggle, computeScrollEdges, edgeFadeMask, flattenTree, rowVariants };
@@ -89,7 +89,7 @@ const NavigationMenu$1 = {
89
89
  className: cn("flex cursor-pointer flex-col gap-(--cue-space-1) rounded-(--radius-control) px-(--cue-space-3) py-(--cue-space-2) font-mono text-(length:--cue-text-ui) text-fg-muted no-underline transition-colors duration-150 outline-none select-none hover:bg-surface-3 hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:-outline-offset-1 focus-visible:outline-accent data-[active]:text-accent", className),
90
90
  ...elementProps,
91
91
  children: [/* @__PURE__ */ jsx("span", { children }), description === void 0 ? null : /* @__PURE__ */ jsx("span", {
92
- className: "text-(length:--cue-text-label) leading-relaxed text-fg-subtle",
92
+ className: "text-(length:--cue-text-label) leading-(--cue-leading-ui) text-fg-subtle",
93
93
  children: description
94
94
  })]
95
95
  });
@@ -17,9 +17,9 @@ import { jsx, jsxs } from "react/jsx-runtime";
17
17
  * with its own scroller — is `AppShell`, not this.
18
18
  */
19
19
  const WIDTHS = {
20
- narrow: "max-w-[42rem]",
21
- wide: "max-w-[54rem]",
22
- broad: "max-w-[84rem]",
20
+ narrow: "max-w-(--cue-measure-narrow)",
21
+ wide: "max-w-(--cue-measure-wide)",
22
+ broad: "max-w-(--cue-measure-broad)",
23
23
  full: ""
24
24
  };
25
25
  /**
@@ -60,7 +60,7 @@ const PageShell = React.forwardRef(function PageShell({ className, width = "narr
60
60
  }),
61
61
  subtitle === void 0 ? null : /* @__PURE__ */ jsx("p", {
62
62
  "data-slot": "page-shell-subtitle",
63
- className: "font-mono text-(length:--cue-text-ui) leading-relaxed text-fg-muted",
63
+ className: "font-mono text-(length:--cue-text-ui) leading-(--cue-leading-ui) text-fg-muted",
64
64
  children: subtitle
65
65
  })
66
66
  ]
@@ -96,7 +96,7 @@ function ExportDialog({ open, onOpenChange, overrides, scope, defaultFormat = "c
96
96
  }), /* @__PURE__ */ jsx("pre", {
97
97
  "data-testid": "configurator-export-text",
98
98
  "data-slot": "configurator-export-text",
99
- className: "max-h-[38vh] overflow-auto rounded-(--radius-control) border border-border bg-sunken p-(--cue-space-3) font-mono text-(length:--cue-text-label) leading-relaxed whitespace-pre text-fg",
99
+ className: "max-h-[38vh] overflow-auto rounded-(--radius-control) border border-border bg-sunken p-(--cue-space-3) font-mono text-(length:--cue-text-label) leading-(--cue-leading-ui) whitespace-pre text-fg",
100
100
  children: entry.text
101
101
  })]
102
102
  }, entry.id))]
@@ -327,7 +327,7 @@ function ShapeSection({ edits, className }) {
327
327
  bounds: DENSITY_NUDGE
328
328
  }),
329
329
  /* @__PURE__ */ jsxs("p", {
330
- className: "font-mono text-(length:--cue-text-micro) leading-relaxed text-fg-subtle",
330
+ className: "font-mono text-(length:--cue-text-micro) leading-(--cue-leading-ui) text-fg-subtle",
331
331
  children: [
332
332
  "Density factor scales app geometry that reads ",
333
333
  /* @__PURE__ */ jsx("code", { children: "var(--cue-density)" }),
@@ -51,7 +51,7 @@ function AgentCard({ name, description, provider, version, model, endpoint, skil
51
51
  })]
52
52
  }),
53
53
  /* @__PURE__ */ jsx("p", {
54
- className: "text-fg-muted text-(length:--cue-text-ui) leading-relaxed",
54
+ className: "text-fg-muted text-(length:--cue-text-ui) leading-(--cue-leading-ui)",
55
55
  children: description
56
56
  }),
57
57
  /* @__PURE__ */ jsx("div", {
@@ -33,7 +33,7 @@ function AgentHandoff({ from, to, reason, carried, settled, className, ...props
33
33
  ]
34
34
  }),
35
35
  /* @__PURE__ */ jsx("p", {
36
- className: "text-fg-muted text-(length:--cue-text-ui) leading-relaxed",
36
+ className: "text-fg-muted text-(length:--cue-text-ui) leading-(--cue-leading-ui)",
37
37
  children: reason
38
38
  }),
39
39
  carried.length > 0 && /* @__PURE__ */ jsxs("div", {
@@ -42,7 +42,7 @@ function AgentHandoff({ from, to, reason, carried, settled, className, ...props
42
42
  className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle"),
43
43
  children: "carried over"
44
44
  }), carried.map((item) => /* @__PURE__ */ jsx("span", {
45
- className: "text-fg-muted border-border border-s ps-2.5 text-(length:--cue-text-ui) leading-relaxed",
45
+ className: "text-fg-muted border-border border-s ps-2.5 text-(length:--cue-text-ui) leading-(--cue-leading-ui)",
46
46
  children: item
47
47
  }, item))]
48
48
  })
@@ -54,7 +54,7 @@ function CanvasSplitMessage({ speaker, className, ...props }) {
54
54
  return /* @__PURE__ */ jsx("div", {
55
55
  "data-slot": "canvas-split-message",
56
56
  "data-speaker": speaker,
57
- className: cn("cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both text-(length:--cue-text-body) leading-relaxed duration-300", speaker === "user" ? cn(field, "text-fg-muted ms-auto rounded-(--radius-overlay) px-3 py-2") : "text-fg-muted", className),
57
+ className: cn("cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both text-(length:--cue-text-body) leading-(--cue-leading-ui) duration-300", speaker === "user" ? cn(field, "text-fg-muted ms-auto rounded-(--radius-overlay) px-3 py-2") : "text-fg-muted", className),
58
58
  ...props
59
59
  });
60
60
  }
@@ -130,7 +130,7 @@ function CanvasSplitBody({ writing, className, children, ...props }) {
130
130
  function CanvasSplitLine({ heading, className, ...props }) {
131
131
  return /* @__PURE__ */ jsx("p", {
132
132
  "data-slot": "canvas-split-line",
133
- className: cn("cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both text-(length:--cue-text-body) leading-relaxed duration-300", heading ? "text-fg font-medium" : "text-fg-muted", className),
133
+ className: cn("cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both text-(length:--cue-text-body) leading-(--cue-leading-ui) duration-300", heading ? "text-fg font-medium" : "text-fg-muted", className),
134
134
  ...props
135
135
  });
136
136
  }
@@ -54,7 +54,7 @@ function ChatPanelUserMessage({ className, ...props }) {
54
54
  function ChatPanelAssistantMessage({ className, ...props }) {
55
55
  return /* @__PURE__ */ jsx("p", {
56
56
  "data-slot": "chat-panel-assistant-message",
57
- className: cn("text-fg-muted max-w-[85%] self-start text-(length:--cue-text-ui) leading-relaxed", className),
57
+ className: cn("text-fg-muted max-w-[85%] self-start text-(length:--cue-text-ui) leading-(--cue-leading-ui)", className),
58
58
  ...props
59
59
  });
60
60
  }
@@ -54,7 +54,7 @@ function CodeDiff({ filename, additions, deletions, lines, cycle, className, ...
54
54
  children: /* @__PURE__ */ jsx("div", {
55
55
  className: codeSurface,
56
56
  children: lines.map((line, i) => /* @__PURE__ */ jsxs("div", {
57
- className: cn("cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both flex px-4 py-0.5 leading-relaxed whitespace-pre duration-300", line.kind === "context" && "text-fg-muted", line.kind === "added" && "bg-ok/10 text-ok", line.kind === "removed" && "bg-danger/10 text-danger"),
57
+ className: cn("cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both flex px-4 py-0.5 leading-(--cue-leading-ui) whitespace-pre duration-300", line.kind === "context" && "text-fg-muted", line.kind === "added" && "bg-ok/10 text-ok", line.kind === "removed" && "bg-danger/10 text-danger"),
58
58
  style: { animationDelay: `${i * 60}ms` },
59
59
  children: [/* @__PURE__ */ jsx("span", {
60
60
  className: "w-4 shrink-0 select-none",
@@ -47,7 +47,7 @@ function CodeRunner({ language, code, state, output, durationMs, onRun, classNam
47
47
  ]
48
48
  }),
49
49
  /* @__PURE__ */ jsx("pre", {
50
- className: "border-border overflow-x-auto border-t px-3.5 py-2.5 font-mono text-(length:--cue-text-ui) leading-relaxed",
50
+ className: "border-border overflow-x-auto border-t px-3.5 py-2.5 font-mono text-(length:--cue-text-ui) leading-(--cue-leading-ui)",
51
51
  children: /* @__PURE__ */ jsx("code", {
52
52
  className: "text-fg-muted",
53
53
  children: code
@@ -65,7 +65,7 @@ function CodeRunner({ language, code, state, output, durationMs, onRun, classNam
65
65
  children: /* @__PURE__ */ jsx("div", {
66
66
  className: cn("w-max min-w-full", "flex flex-col"),
67
67
  children: output.map((line, i) => /* @__PURE__ */ jsx("span", {
68
- className: cn("cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both font-mono text-(length:--cue-text-ui) leading-relaxed whitespace-pre", state === "error" ? "text-danger" : "text-fg-muted"),
68
+ className: cn("cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both font-mono text-(length:--cue-text-ui) leading-(--cue-leading-ui) whitespace-pre", state === "error" ? "text-danger" : "text-fg-muted"),
69
69
  style: { animationDelay: `${i * 80}ms` },
70
70
  children: line
71
71
  }, `${i}-${line}`))
@@ -60,7 +60,7 @@ function ComparisonCard({ traitLabels, options, recommendedId, reason, className
60
60
  }, option.id);
61
61
  })
62
62
  }), /* @__PURE__ */ jsx("p", {
63
- className: "text-fg-muted text-(length:--cue-text-ui) leading-relaxed",
63
+ className: "text-fg-muted text-(length:--cue-text-ui) leading-(--cue-leading-ui)",
64
64
  children: reason
65
65
  })]
66
66
  });
@@ -30,7 +30,7 @@ function ConfidenceMarker({ claims, hoveredId, onHover, className, ...props }) {
30
30
  className: cn("flex w-full max-w-sm flex-col gap-2.5", className),
31
31
  ...props,
32
32
  children: [/* @__PURE__ */ jsx("p", {
33
- className: "text-(length:--cue-text-body) leading-relaxed",
33
+ className: "text-(length:--cue-text-body) leading-(--cue-leading-ui)",
34
34
  children: claims.map((claim) => /* @__PURE__ */ jsxs("button", {
35
35
  type: "button",
36
36
  "aria-describedby": hoveredId === claim.id ? basisId : void 0,
@@ -58,7 +58,7 @@ function ConversationSearch({ query, hits, activeIndex, onQueryChange, onStep, c
58
58
  })
59
59
  ]
60
60
  }), active && /* @__PURE__ */ jsxs("div", {
61
- className: cn("bg-fg/[0.06]", "cue-elements-fade-in cue-elements-animate-in rounded-(--radius-surface) px-3 py-2 text-(length:--cue-text-ui) leading-relaxed duration-200"),
61
+ className: cn("bg-fg/[0.06]", "cue-elements-fade-in cue-elements-animate-in rounded-(--radius-surface) px-3 py-2 text-(length:--cue-text-ui) leading-(--cue-leading-ui) duration-200"),
62
62
  children: [
63
63
  /* @__PURE__ */ jsx("span", {
64
64
  className: "text-fg-muted",
@@ -35,7 +35,7 @@ function DaySeparator({ messages, className, ...props }) {
35
35
  }), /* @__PURE__ */ jsxs("div", {
36
36
  className: cn("group flex items-baseline gap-2", message.role === "user" && "flex-row-reverse"),
37
37
  children: [/* @__PURE__ */ jsx("span", {
38
- className: cn("max-w-[80%] text-(length:--cue-text-body) leading-relaxed break-words", message.role === "user" ? "bg-surface-1 rounded-(--radius-overlay) px-3.5 py-2" : "text-fg-muted"),
38
+ className: cn("max-w-[80%] text-(length:--cue-text-body) leading-(--cue-leading-ui) break-words", message.role === "user" ? "bg-surface-1 rounded-(--radius-overlay) px-3.5 py-2" : "text-fg-muted"),
39
39
  children: message.text
40
40
  }), /* @__PURE__ */ jsx("span", {
41
41
  className: cn(mono, "text-transparent group-hover:text-fg-subtle shrink-0 tabular-nums transition-colors"),
@@ -55,7 +55,7 @@ function DocumentReference({ title, pages, anchors, activePage, onJump, classNam
55
55
  className: cn(mono, "text-fg-subtle"),
56
56
  children: ["p. ", anchor.page]
57
57
  }), /* @__PURE__ */ jsx("span", {
58
- className: "text-fg-muted border-border-strong border-s-2 ps-2 text-(length:--cue-text-ui) leading-relaxed break-words",
58
+ className: "text-fg-muted border-border-strong border-s-2 ps-2 text-(length:--cue-text-ui) leading-(--cue-leading-ui) break-words",
59
59
  children: anchor.quote
60
60
  })]
61
61
  }, `${anchor.page}-${i}`))
@@ -42,7 +42,7 @@ function EditMessage({ value, discardedReplies, editing, onValueChange, onSave,
42
42
  onChange: (event) => onValueChange?.(event.target.value),
43
43
  rows: 2,
44
44
  "aria-label": "Edit your message",
45
- className: cn(field, "text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent resize-none rounded-(--radius-surface) px-3 py-2.5 text-(length:--cue-text-body) leading-relaxed outline-none")
45
+ className: cn(field, "text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent resize-none rounded-(--radius-surface) px-3 py-2.5 text-(length:--cue-text-body) leading-(--cue-leading-ui) outline-none")
46
46
  }),
47
47
  discardedReplies > 0 && /* @__PURE__ */ jsxs("div", {
48
48
  className: "flex items-center gap-2 text-warn",
@@ -43,7 +43,7 @@ function ElicitationForm({ server, message, fields, state, onAccept, onDecline,
43
43
  ]
44
44
  }),
45
45
  /* @__PURE__ */ jsx("p", {
46
- className: "text-fg-muted text-(length:--cue-text-ui) leading-relaxed",
46
+ className: "text-fg-muted text-(length:--cue-text-ui) leading-(--cue-leading-ui)",
47
47
  children: message
48
48
  }),
49
49
  /* @__PURE__ */ jsx("div", {
@@ -41,7 +41,7 @@ function GuardrailNotice({ title, explanation, policy, alternatives, onPick, cla
41
41
  ]
42
42
  }),
43
43
  /* @__PURE__ */ jsx("p", {
44
- className: "text-fg-muted text-(length:--cue-text-ui) leading-relaxed",
44
+ className: "text-fg-muted text-(length:--cue-text-ui) leading-(--cue-leading-ui)",
45
45
  children: explanation
46
46
  }),
47
47
  alternatives.length > 0 && /* @__PURE__ */ jsxs("div", {
@@ -35,7 +35,7 @@ function ImageGeneration({ prompt, generating, className, ...props }) {
35
35
  }),
36
36
  /* @__PURE__ */ jsx("div", {
37
37
  "aria-hidden": true,
38
- className: cn("absolute inset-0 transition-[opacity,filter] duration-1000 ease-out motion-reduce:transition-none", generating ? "opacity-0 blur-xl" : "blur-0 opacity-100"),
38
+ className: cn("absolute inset-0 transition-[opacity,filter] duration-1000 ease-out motion-reduce:transition-none", generating ? "opacity-0 blur-xl" : "blur-none opacity-100"),
39
39
  style: { background: "radial-gradient(120% 90% at 20% 100%, oklch(0.45 0.09 265) 0%, transparent 55%), radial-gradient(110% 80% at 85% 90%, oklch(0.62 0.1 300 / 0.8) 0%, transparent 60%), radial-gradient(130% 100% at 60% 0%, oklch(0.88 0.06 60) 0%, oklch(0.74 0.09 25 / 0.9) 45%, transparent 75%), linear-gradient(to top, oklch(0.35 0.06 275), oklch(0.82 0.07 50))" }
40
40
  }),
41
41
  /* @__PURE__ */ jsx("span", {
@@ -38,7 +38,7 @@ function Citation({ index, source, open, onOpenChange }) {
38
38
  children: source.title
39
39
  }),
40
40
  /* @__PURE__ */ jsx("p", {
41
- className: "text-fg-muted mt-1 text-(length:--cue-text-body) leading-relaxed",
41
+ className: "text-fg-muted mt-1 text-(length:--cue-text-body) leading-(--cue-leading-ui)",
42
42
  children: source.snippet
43
43
  })
44
44
  ]
@@ -68,7 +68,7 @@ function Citation({ index, source, open, onOpenChange }) {
68
68
  function InlineCitation({ sources, openIndex, onOpenIndexChange, className, ...props }) {
69
69
  return /* @__PURE__ */ jsxs("p", {
70
70
  "data-slot": "inline-citation",
71
- className: cn("text-fg max-w-sm text-(length:--cue-text-body) leading-relaxed", className),
71
+ className: cn("text-fg max-w-sm text-(length:--cue-text-body) leading-(--cue-leading-ui)", className),
72
72
  ...props,
73
73
  children: [
74
74
  "Optimistic updates keep the thread responsive while the server confirms the write",
@@ -403,7 +403,7 @@ const MarkdownText = React.forwardRef(function MarkdownText({ className, childre
403
403
  ref,
404
404
  "data-slot": "markdown-text",
405
405
  "data-streaming": streaming ? "" : void 0,
406
- className: cn("flex min-w-0 flex-col gap-(--cue-space-3) text-(length:--cue-text-body) leading-relaxed break-words whitespace-normal", className),
406
+ className: cn("flex min-w-0 flex-col gap-(--cue-space-3) text-(length:--cue-text-body) leading-(--cue-leading-ui) break-words whitespace-normal", className),
407
407
  ...elementProps,
408
408
  children: /* @__PURE__ */ jsx(Markdown, {
409
409
  components,
@@ -23,7 +23,7 @@ function MathBlock({ label, steps, visibleSteps, className, ...props }) {
23
23
  }), take(steps, visibleSteps).map((step, i) => /* @__PURE__ */ jsxs("div", {
24
24
  className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both flex flex-col gap-1 duration-300",
25
25
  children: [/* @__PURE__ */ jsx("span", {
26
- className: "text-fg overflow-x-auto py-1 text-center font-serif text-(length:--cue-text-emphasis) leading-relaxed italic",
26
+ className: "text-fg overflow-x-auto py-1 text-center font-serif text-(length:--cue-text-emphasis) leading-(--cue-leading-ui) italic",
27
27
  children: step.expression
28
28
  }), step.note && /* @__PURE__ */ jsx("span", {
29
29
  className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle text-center"),
@@ -32,7 +32,7 @@ function MessageBranches({ variants, index, onIndexChange, className, ...props }
32
32
  className: cn("flex max-w-sm flex-col gap-2", className),
33
33
  ...props,
34
34
  children: [/* @__PURE__ */ jsx("p", {
35
- className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in text-fg min-h-[4.25rem] text-(length:--cue-text-body) leading-relaxed duration-300 motion-reduce:animate-none",
35
+ className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in text-fg min-h-[4.25rem] text-(length:--cue-text-body) leading-(--cue-leading-ui) duration-300 motion-reduce:animate-none",
36
36
  children: message
37
37
  }, index), /* @__PURE__ */ jsxs("div", {
38
38
  className: "flex items-center gap-1",
@@ -30,7 +30,7 @@ function MessagePair({ userMessage, words, visibleWords, streaming, variant = "b
30
30
  }), /* @__PURE__ */ jsxs("div", {
31
31
  className: "group/message flex flex-col items-start",
32
32
  children: [/* @__PURE__ */ jsxs("p", {
33
- className: "min-h-[4.25rem] text-(length:--cue-text-body) leading-relaxed",
33
+ className: "min-h-[4.25rem] text-(length:--cue-text-body) leading-(--cue-leading-ui)",
34
34
  children: [shown.map((word, index) => {
35
35
  const fresh = streaming && shown.length - 1 - index < 2;
36
36
  return /* @__PURE__ */ jsxs("span", {
@@ -37,11 +37,11 @@ function Onboarding({ steps, index, onNext, onSkip, className, ...props }) {
37
37
  children: step.title
38
38
  }),
39
39
  /* @__PURE__ */ jsx("p", {
40
- className: "text-fg-muted text-(length:--cue-text-body) leading-relaxed break-words",
40
+ className: "text-fg-muted text-(length:--cue-text-body) leading-(--cue-leading-ui) break-words",
41
41
  children: step.body
42
42
  }),
43
43
  /* @__PURE__ */ jsx("span", {
44
- className: cn(field, "text-fg-muted rounded-(--radius-surface) px-3 py-2 text-(length:--cue-text-body) leading-relaxed"),
44
+ className: cn(field, "text-fg-muted rounded-(--radius-surface) px-3 py-2 text-(length:--cue-text-body) leading-(--cue-leading-ui)"),
45
45
  children: step.example
46
46
  })
47
47
  ]
@@ -100,7 +100,7 @@ function PromptLibrary({ prompts, query, selectedId, onQueryChange, onSelect, on
100
100
  selected && /* @__PURE__ */ jsxs("div", {
101
101
  className: cn("bg-fg/[0.06]", "cue-elements-fade-in cue-elements-animate-in flex flex-col gap-2 rounded-(--radius-surface) p-2.5 duration-200"),
102
102
  children: [/* @__PURE__ */ jsx("p", {
103
- className: "text-fg-muted text-(length:--cue-text-ui) leading-relaxed break-words",
103
+ className: "text-fg-muted text-(length:--cue-text-ui) leading-(--cue-leading-ui) break-words",
104
104
  children: selected.body
105
105
  }), selected.variables.length > 0 && /* @__PURE__ */ jsx("div", {
106
106
  className: "flex flex-wrap gap-1",
@@ -31,7 +31,7 @@ function QuoteReply({ before, selection, after, actions, toolbarVisible, quoted,
31
31
  ...props,
32
32
  children: [
33
33
  /* @__PURE__ */ jsxs("p", {
34
- className: "relative text-(length:--cue-text-body) leading-relaxed",
34
+ className: "relative text-(length:--cue-text-body) leading-(--cue-leading-ui)",
35
35
  children: [
36
36
  /* @__PURE__ */ jsx("span", {
37
37
  className: "text-fg-muted",
@@ -68,7 +68,7 @@ function QuoteReply({ before, selection, after, actions, toolbarVisible, quoted,
68
68
  className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle"),
69
69
  children: "replying to"
70
70
  }), /* @__PURE__ */ jsx("div", {
71
- className: "border-border-strong text-fg-muted border-s-2 ps-2.5 text-(length:--cue-text-ui) leading-relaxed",
71
+ className: "border-border-strong text-fg-muted border-s-2 ps-2.5 text-(length:--cue-text-ui) leading-(--cue-leading-ui)",
72
72
  children: quoted
73
73
  })]
74
74
  })
@@ -29,7 +29,7 @@ function ReadAloud({ words, spokenIndex, playing, rate, elapsed, duration, onTog
29
29
  className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-3.5", className),
30
30
  ...props,
31
31
  children: [/* @__PURE__ */ jsx("p", {
32
- className: "text-(length:--cue-text-body) leading-relaxed",
32
+ className: "text-(length:--cue-text-body) leading-(--cue-leading-ui)",
33
33
  children: words.map((word, i) => /* @__PURE__ */ jsxs("span", {
34
34
  className: cn("transition-colors duration-200 motion-reduce:transition-none", i < spokenIndex ? "text-fg-subtle" : i === spokenIndex ? "text-fg rounded-(--radius-control) bg-stream/15" : "text-fg-muted"),
35
35
  children: [word, " "]
@@ -61,7 +61,7 @@ function ReasoningPanel({ steps, visibleSteps, streaming, open, onOpenChange, re
61
61
  className: "text-fg text-(length:--cue-text-body) font-medium",
62
62
  children: step.title
63
63
  }), /* @__PURE__ */ jsx("p", {
64
- className: "text-fg-muted mt-0.5 text-(length:--cue-text-body) leading-relaxed break-words",
64
+ className: "text-fg-muted mt-0.5 text-(length:--cue-text-body) leading-(--cue-leading-ui) break-words",
65
65
  children: step.body
66
66
  })]
67
67
  })]
@@ -40,7 +40,7 @@ function RecommendationCard({ state, question, children, confidenceLabel, accept
40
40
  children: question
41
41
  }),
42
42
  /* @__PURE__ */ jsx("p", {
43
- className: "text-fg-muted text-(length:--cue-text-body) leading-relaxed",
43
+ className: "text-fg-muted text-(length:--cue-text-body) leading-(--cue-leading-ui)",
44
44
  children
45
45
  }),
46
46
  /* @__PURE__ */ jsx("div", {
@@ -58,7 +58,7 @@ function ResearchReport({ title, sections, sourcesRead, className, ...props }) {
58
58
  })
59
59
  ]
60
60
  }), section.preview && /* @__PURE__ */ jsx("p", {
61
- className: "text-fg-muted cue-elements-fade-in cue-elements-animate-in ps-5.5 text-(length:--cue-text-ui) leading-relaxed duration-300",
61
+ className: "text-fg-muted cue-elements-fade-in cue-elements-animate-in ps-5.5 text-(length:--cue-text-ui) leading-(--cue-leading-ui) duration-300",
62
62
  children: section.preview
63
63
  })]
64
64
  }, section.id))
@@ -61,7 +61,7 @@ function RetrievalChunks({ query, chunks, visibleCount, searching, className, ..
61
61
  ]
62
62
  }),
63
63
  /* @__PURE__ */ jsx("p", {
64
- className: "text-fg-muted line-clamp-2 text-(length:--cue-text-ui) leading-relaxed",
64
+ className: "text-fg-muted line-clamp-2 text-(length:--cue-text-ui) leading-(--cue-leading-ui)",
65
65
  children: chunk.text
66
66
  }),
67
67
  /* @__PURE__ */ jsx("span", {
@@ -80,7 +80,7 @@ function ReviewableDiff({ filename, hunks, onKeep, onDiscard, onApply, className
80
80
  children: /* @__PURE__ */ jsx("div", {
81
81
  className: codeSurface,
82
82
  children: hunk.lines.map((line, i) => /* @__PURE__ */ jsxs("div", {
83
- className: cn("flex px-4 py-0.5 leading-relaxed whitespace-pre", line.kind === "context" && "text-fg-subtle", line.kind === "added" && "bg-ok/10 text-ok", line.kind === "removed" && "bg-danger/10 text-danger"),
83
+ className: cn("flex px-4 py-0.5 leading-(--cue-leading-ui) whitespace-pre", line.kind === "context" && "text-fg-subtle", line.kind === "added" && "bg-ok/10 text-ok", line.kind === "removed" && "bg-danger/10 text-danger"),
84
84
  children: [/* @__PURE__ */ jsx("span", {
85
85
  className: "w-4 shrink-0 select-none",
86
86
  children: GUTTER[line.kind]