@cueplusplus/ui 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +457 -0
- package/README.md +131 -0
- package/dist/chat/message-list.js +2 -1
- package/dist/configurator/_export.d.ts +1 -1
- package/dist/configurator/_export.js +53 -13
- package/dist/configurator/_overrides.d.ts +25 -6
- package/dist/configurator/_overrides.js +30 -17
- package/dist/configurator/configurator.js +8 -3
- package/dist/configurator/panel-sections.js +43 -13
- package/dist/elements/command-palette.js +1 -1
- package/dist/elements/flow-graph.js +2 -2
- package/dist/elements/markdown.js +1 -1
- package/dist/elements/surfaces.js +4 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +5 -2
- package/dist/instruments/meter.d.ts +5 -1
- package/dist/layout/bento.d.ts +144 -0
- package/dist/layout/bento.js +266 -0
- package/dist/layout/index.d.ts +3 -2
- package/dist/layout/index.js +3 -2
- package/dist/midi/piano-keyboard.js +5 -1
- package/dist/primitives/button.d.ts +12 -0
- package/dist/styles.css +23 -1
- package/dist/system/density.d.ts +17 -8
- package/dist/system/density.js +39 -16
- package/dist/system/index.d.ts +5 -2
- package/dist/system/index.js +3 -1
- package/dist/system/overrides.d.ts +80 -0
- package/dist/system/overrides.js +277 -0
- package/dist/system/portal.d.ts +4 -2
- package/dist/system/portal.js +34 -3
- package/dist/system/prepaint.d.ts +58 -7
- package/dist/system/prepaint.js +72 -20
- package/dist/system/theme-provider.d.ts +133 -8
- package/dist/system/theme-provider.js +203 -72
- package/dist/system/theme-registry.d.ts +53 -0
- package/dist/system/theme-registry.js +66 -0
- package/dist/system/use-density.d.ts +13 -5
- package/dist/system/use-density.js +142 -13
- package/dist/system/use-theme.d.ts +5 -3
- package/dist/system/use-theme.js +5 -3
- package/dist/system/vocabulary.d.ts +15 -0
- package/dist/system/vocabulary.js +111 -0
- package/dist/theming/contrast.d.ts +2 -122
- package/dist/theming/contrast.js +2 -194
- package/dist/theming/create-theme.d.ts +37 -11
- package/dist/theming/create-theme.js +54 -17
- package/dist/theming/index.d.ts +3 -4
- package/dist/theming/index.js +3 -4
- package/dist/theming/serialize.d.ts +24 -11
- package/dist/theming/serialize.js +16 -18
- package/manifest/components/accordion.json +24 -6
- package/manifest/components/activity-graph.json +20 -5
- package/manifest/components/agent-card.json +37 -9
- package/manifest/components/agent-handoff.json +21 -5
- package/manifest/components/agent-mode-badge.json +22 -4
- package/manifest/components/agent-pile.json +38 -8
- package/manifest/components/agent-plan.json +9 -2
- package/manifest/components/agent-status.json +17 -3
- package/manifest/components/agent-surface.json +26 -11
- package/manifest/components/alert-dialog.json +29 -5
- package/manifest/components/animated-number.json +14 -6
- package/manifest/components/app-bar.json +66 -13
- package/manifest/components/app-shell.json +133 -31
- package/manifest/components/app-window-frame.json +28 -6
- package/manifest/components/approval-card.json +37 -7
- package/manifest/components/artifact-card.json +16 -4
- package/manifest/components/ask-box.json +99 -21
- package/manifest/components/audience-icon.json +1 -7
- package/manifest/components/autocomplete.json +80 -18
- package/manifest/components/avatar-group.json +13 -2
- package/manifest/components/avatar.json +22 -4
- package/manifest/components/background-inbox.json +9 -2
- package/manifest/components/bento.json +306 -0
- package/manifest/components/branch-picker.json +29 -7
- package/manifest/components/breadcrumb.json +13 -3
- package/manifest/components/button-group.json +21 -4
- package/manifest/components/button.json +41 -4
- package/manifest/components/canvas-split-body.json +4 -1
- package/manifest/components/canvas-split-header.json +17 -4
- package/manifest/components/canvas-split-line.json +4 -1
- package/manifest/components/canvas-split-message.json +8 -1
- package/manifest/components/card.json +14 -3
- package/manifest/components/carousel.json +54 -12
- package/manifest/components/catalogue-icon.json +1 -7
- package/manifest/components/channel-beta-icon.json +1 -7
- package/manifest/components/channel-matrix.json +80 -15
- package/manifest/components/channel-released-icon.json +1 -7
- package/manifest/components/chart-container.json +26 -10
- package/manifest/components/chart-ramp.json +13 -3
- package/manifest/components/chart-swatch.json +9 -2
- package/manifest/components/chart-tooltip-content.json +31 -7
- package/manifest/components/chart.json +30 -6
- package/manifest/components/chat-panel-composer.json +9 -2
- package/manifest/components/checkbox-group.json +4 -2
- package/manifest/components/checkbox.json +17 -4
- package/manifest/components/checkpoint-history.json +13 -3
- package/manifest/components/chip.json +35 -5
- package/manifest/components/clamp.json +30 -7
- package/manifest/components/cli-tool-icon.json +1 -7
- package/manifest/components/code-diff.json +20 -5
- package/manifest/components/code-runner.json +32 -6
- package/manifest/components/collapsible.json +16 -4
- package/manifest/components/color-area.json +4 -1
- package/manifest/components/color-field.json +13 -3
- package/manifest/components/color-picker.json +75 -17
- package/manifest/components/color-slider.json +12 -3
- package/manifest/components/color-swatch.json +13 -2
- package/manifest/components/colors-section.json +10 -7
- package/manifest/components/combobox.json +81 -18
- package/manifest/components/command-palette.json +57 -13
- package/manifest/components/compaction-row.json +35 -7
- package/manifest/components/comparison-card.json +17 -4
- package/manifest/components/composer-attachment-chip.json +9 -2
- package/manifest/components/composer-bar.json +4 -1
- package/manifest/components/composer-command-item.json +8 -2
- package/manifest/components/composer-context.json +4 -1
- package/manifest/components/composer-input.json +5 -1
- package/manifest/components/composer-menu-item.json +4 -1
- package/manifest/components/composer-menu.json +12 -2
- package/manifest/components/composer-model-item.json +8 -2
- package/manifest/components/composer-model-trigger.json +8 -2
- package/manifest/components/composer-person-item.json +8 -2
- package/manifest/components/composer-send.json +8 -2
- package/manifest/components/composer-voice-button.json +4 -1
- package/manifest/components/composer-voice.json +8 -2
- package/manifest/components/composer.json +76 -17
- package/manifest/components/computer-use.json +17 -4
- package/manifest/components/confidence-marker.json +13 -3
- package/manifest/components/connection-state.json +23 -4
- package/manifest/components/container.json +14 -2
- package/manifest/components/context-breakdown.json +8 -2
- package/manifest/components/context-menu.json +16 -4
- package/manifest/components/context-usage.json +16 -4
- package/manifest/components/conversation-search.json +22 -5
- package/manifest/components/copy-button.json +32 -7
- package/manifest/components/cost-meter.json +12 -3
- package/manifest/components/cue-logotype.json +17 -3
- package/manifest/components/cue-mark.json +17 -3
- package/manifest/components/cue-portal-frame.json +14 -4
- package/manifest/components/data-row.json +21 -7
- package/manifest/components/data-table-pagination.json +18 -4
- package/manifest/components/data-table-toolbar.json +30 -7
- package/manifest/components/data-tree.json +42 -9
- package/manifest/components/date-field.json +13 -2
- package/manifest/components/date-picker.json +81 -19
- package/manifest/components/date-range-picker.json +81 -19
- package/manifest/components/day-separator.json +4 -1
- package/manifest/components/delegation-card.json +64 -12
- package/manifest/components/density.json +25 -5
- package/manifest/components/description-list.json +8 -1
- package/manifest/components/diagram.json +33 -7
- package/manifest/components/dialog.json +29 -6
- package/manifest/components/disclosure.json +31 -7
- package/manifest/components/dmx-bar.json +16 -4
- package/manifest/components/dmx-strip.json +20 -5
- package/manifest/components/document-reference.json +21 -5
- package/manifest/components/draft-restore.json +18 -4
- package/manifest/components/drawer.json +30 -6
- package/manifest/components/dropdown-menu.json +55 -10
- package/manifest/components/edit-message.json +32 -7
- package/manifest/components/elements-command-palette.json +27 -6
- package/manifest/components/elements-data-table.json +9 -2
- package/manifest/components/elements-timeline.json +8 -2
- package/manifest/components/elicitation-form.json +31 -6
- package/manifest/components/empty-state-composer.json +9 -2
- package/manifest/components/empty-state-suggestion.json +4 -1
- package/manifest/components/empty-state.json +25 -5
- package/manifest/components/end-of-turn-summary.json +16 -4
- package/manifest/components/env-var-input.json +54 -12
- package/manifest/components/error-state.json +17 -4
- package/manifest/components/export-dialog.json +27 -11
- package/manifest/components/eyebrow.json +4 -1
- package/manifest/components/feedback-dialog.json +33 -7
- package/manifest/components/field-description.json +4 -1
- package/manifest/components/field-error.json +13 -3
- package/manifest/components/field-label.json +4 -1
- package/manifest/components/field.json +4 -1
- package/manifest/components/file-tree.json +16 -4
- package/manifest/components/file-upload.json +58 -13
- package/manifest/components/flow-graph.json +12 -3
- package/manifest/components/folder-icon.json +1 -7
- package/manifest/components/footer.json +24 -4
- package/manifest/components/frac.json +10 -2
- package/manifest/components/generation-loader.json +17 -3
- package/manifest/components/generative-ui.json +39 -7
- package/manifest/components/grid.json +56 -5
- package/manifest/components/group-bar.json +25 -6
- package/manifest/components/guardrail-notice.json +22 -5
- package/manifest/components/hover-card.json +45 -8
- package/manifest/components/icon-button.json +22 -4
- package/manifest/components/image-generation.json +8 -2
- package/manifest/components/info-tip.json +42 -7
- package/manifest/components/inline-citation.json +14 -3
- package/manifest/components/input-group.json +24 -5
- package/manifest/components/input.json +13 -3
- package/manifest/components/item.json +42 -8
- package/manifest/components/job-progress.json +25 -6
- package/manifest/components/launcher-bubble.json +32 -7
- package/manifest/components/ledger.json +87 -19
- package/manifest/components/link.json +16 -3
- package/manifest/components/live-region-announcer.json +21 -5
- package/manifest/components/log-viewer.json +42 -10
- package/manifest/components/map-answer.json +17 -4
- package/manifest/components/markdown-text.json +36 -5
- package/manifest/components/math-block.json +12 -3
- package/manifest/components/mcp-server-icon.json +1 -7
- package/manifest/components/mcp-server-panel.json +18 -4
- package/manifest/components/memory-chips.json +9 -2
- package/manifest/components/menubar.json +33 -7
- package/manifest/components/message-actions.json +32 -7
- package/manifest/components/message-attachments.json +9 -2
- package/manifest/components/message-branches.json +14 -3
- package/manifest/components/message-list.json +27 -6
- package/manifest/components/message-pair.json +25 -5
- package/manifest/components/message-queue.json +13 -3
- package/manifest/components/message-timing.json +8 -2
- package/manifest/components/message.json +41 -9
- package/manifest/components/meter.json +43 -7
- package/manifest/components/mobile-composer.json +47 -10
- package/manifest/components/model-picker.json +13 -3
- package/manifest/components/multi-select.json +78 -17
- package/manifest/components/musical-time-input.json +34 -8
- package/manifest/components/navigation-menu.json +54 -12
- package/manifest/components/node-card.json +42 -7
- package/manifest/components/node-handle.json +17 -2
- package/manifest/components/number-field.json +28 -6
- package/manifest/components/number-ticker.json +8 -2
- package/manifest/components/onboarding.json +18 -4
- package/manifest/components/otp-field.json +43 -10
- package/manifest/components/page-shell.json +35 -6
- package/manifest/components/pagination.json +21 -5
- package/manifest/components/panel-header.json +15 -3
- package/manifest/components/password-input.json +38 -8
- package/manifest/components/permission-grant.json +28 -5
- package/manifest/components/permission-scopes.json +57 -12
- package/manifest/components/piano-keyboard.json +38 -9
- package/manifest/components/plussie.json +34 -5
- package/manifest/components/popover.json +45 -8
- package/manifest/components/preset-section.json +14 -8
- package/manifest/components/progress.json +25 -6
- package/manifest/components/prompt-library.json +27 -6
- package/manifest/components/queue-dock.json +36 -8
- package/manifest/components/quota-banner.json +25 -6
- package/manifest/components/quote-reply.json +29 -7
- package/manifest/components/radio-group.json +12 -2
- package/manifest/components/radio.json +17 -3
- package/manifest/components/rating.json +60 -13
- package/manifest/components/read-aloud.json +35 -8
- package/manifest/components/reasoning-effort.json +17 -4
- package/manifest/components/reasoning-panel.json +33 -8
- package/manifest/components/recommendation-card.json +35 -10
- package/manifest/components/regenerate-menu.json +22 -5
- package/manifest/components/replay-player.json +29 -7
- package/manifest/components/research-report.json +12 -3
- package/manifest/components/resizable.json +4 -1
- package/manifest/components/retrieval-chunks.json +16 -4
- package/manifest/components/revert-dock.json +61 -14
- package/manifest/components/reviewable-diff.json +23 -5
- package/manifest/components/risk-badge.json +18 -3
- package/manifest/components/row.json +17 -4
- package/manifest/components/schedule-card.json +25 -6
- package/manifest/components/score-breakdown.json +20 -5
- package/manifest/components/scroll-anchor.json +13 -3
- package/manifest/components/scroll-area.json +31 -8
- package/manifest/components/scrollable-tabs-list.json +12 -4
- package/manifest/components/scrub-input.json +84 -18
- package/manifest/components/seam-cell.json +19 -3
- package/manifest/components/seam-grid.json +12 -3
- package/manifest/components/search-input.json +49 -10
- package/manifest/components/section-header.json +36 -8
- package/manifest/components/segmented-control.json +50 -11
- package/manifest/components/select.json +74 -16
- package/manifest/components/separator.json +4 -1
- package/manifest/components/settings-panel.json +41 -9
- package/manifest/components/shape-section.json +10 -7
- package/manifest/components/shared-conversation.json +21 -5
- package/manifest/components/sheet.json +29 -6
- package/manifest/components/shimmer-label.json +4 -2
- package/manifest/components/sidebar.json +60 -13
- package/manifest/components/skill-icon.json +1 -7
- package/manifest/components/slider.json +22 -5
- package/manifest/components/sources.json +17 -4
- package/manifest/components/sparkline.json +17 -4
- package/manifest/components/speaker-identity.json +4 -1
- package/manifest/components/spec-sheet.json +16 -4
- package/manifest/components/spectrum-visualizer.json +41 -10
- package/manifest/components/spinner.json +12 -2
- package/manifest/components/stack-icon.json +1 -7
- package/manifest/components/stack.json +54 -7
- package/manifest/components/stacks-matrix-icon.json +1 -7
- package/manifest/components/stat.json +28 -4
- package/manifest/components/status-bar.json +50 -9
- package/manifest/components/status-dot.json +23 -4
- package/manifest/components/stepper.json +22 -5
- package/manifest/components/stopped-run.json +19 -4
- package/manifest/components/streaming-text.json +12 -3
- package/manifest/components/subagent-list.json +21 -5
- package/manifest/components/suggestions.json +27 -5
- package/manifest/components/swap-label.json +18 -4
- package/manifest/components/switch.json +18 -3
- package/manifest/components/table-scroll-region.json +4 -1
- package/manifest/components/table.json +54 -11
- package/manifest/components/tabs.json +16 -5
- package/manifest/components/tags-input.json +79 -17
- package/manifest/components/tail-status.json +37 -8
- package/manifest/components/terminal-block.json +25 -5
- package/manifest/components/terminal-frame.json +34 -8
- package/manifest/components/textarea.json +8 -3
- package/manifest/components/theme-configurator.json +47 -14
- package/manifest/components/theme-provider.json +97 -18
- package/manifest/components/thinking-indicator.json +8 -2
- package/manifest/components/thread-list.json +13 -3
- package/manifest/components/thread-search.json +22 -5
- package/manifest/components/threshold-rail.json +77 -14
- package/manifest/components/time-boundary.json +8 -2
- package/manifest/components/time-field.json +13 -2
- package/manifest/components/timeline-ruler.json +51 -12
- package/manifest/components/timeline.json +19 -3
- package/manifest/components/title-bar.json +19 -4
- package/manifest/components/toast.json +12 -3
- package/manifest/components/todo-list.json +8 -2
- package/manifest/components/toggle-group.json +33 -7
- package/manifest/components/toggle.json +23 -4
- package/manifest/components/token-editor.json +26 -10
- package/manifest/components/tool-call-card.json +83 -16
- package/manifest/components/tool-call.json +37 -9
- package/manifest/components/tool-error.json +34 -8
- package/manifest/components/tool-group.json +17 -4
- package/manifest/components/tool-timeline.json +37 -9
- package/manifest/components/toolbar.json +37 -8
- package/manifest/components/tooltip.json +41 -7
- package/manifest/components/trace-waterfall.json +12 -3
- package/manifest/components/tree-visibility-toggle.json +18 -3
- package/manifest/components/tree.json +52 -11
- package/manifest/components/turn-footer.json +36 -8
- package/manifest/components/two-step-button.json +46 -9
- package/manifest/components/typing-indicator.json +8 -1
- package/manifest/components/universe-grid.json +37 -10
- package/manifest/components/unread-divider.json +4 -1
- package/manifest/components/usage-chart.json +46 -9
- package/manifest/components/verdict-row.json +20 -5
- package/manifest/components/voice-conversation.json +37 -7
- package/manifest/components/web-preview.json +23 -5
- package/manifest/components/web-search.json +20 -5
- package/manifest/components/work-collapse.json +30 -7
- package/manifest/fixtures.json +106 -0
- package/manifest/manifest.json +449 -310
- package/manifest/tokens.json +122 -12
- package/package.json +16 -6
- package/dist/theming/_presets.d.ts +0 -11
- package/dist/theming/_presets.js +0 -678
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,443 @@
|
|
|
1
1
|
# @cueplusplus/ui
|
|
2
2
|
|
|
3
|
+
## 0.10.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- ddce99e: `@cueplusplus/ui/layout` — and the root barrel with it — now exports `Bento`, a grid of unequal
|
|
8
|
+
tiles whose span is a prop on the tile rather than a class you count out on the container.
|
|
9
|
+
|
|
10
|
+
**Nothing to do: it is a new export, and nothing that already compiled changed.** Adopt it where
|
|
11
|
+
you were writing a bare grid and hand-counting `col-span-*`:
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { Bento } from "@cueplusplus/ui/layout";
|
|
15
|
+
|
|
16
|
+
<Bento.Root cols={3} rows={2} gap={5}>
|
|
17
|
+
<Bento.Tile span={2} rowSpan={2} minHeight="hero" title="Kitchen sink">
|
|
18
|
+
Every component, on one page.
|
|
19
|
+
</Bento.Tile>
|
|
20
|
+
<Bento.Tile href="/docs/components" title="Components">
|
|
21
|
+
Props, variants and a live example.
|
|
22
|
+
</Bento.Tile>
|
|
23
|
+
</Bento.Root>;
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`Bento.Root` takes `cols` (2, 3 or 4; defaults to 3), `rows` (1–4), `dense`, and a `gap` off the
|
|
27
|
+
density space ladder (defaults to `4`). `Bento.Tile` takes a `span` (1–4) and a `rowSpan` (1–2)
|
|
28
|
+
from closed sets, plus `minHeight`, `eyebrow`, `title` and `meta`. The container clamps every span
|
|
29
|
+
to its own tracks on the way past — the columns always, and the rows wherever it declared any. The
|
|
30
|
+
column clamp is per breakpoint, because every bento is two tracks wide between 640 px and 1024 px
|
|
31
|
+
whatever it was asked for, and CSS Grid answers an over-wide span by growing an implicit track
|
|
32
|
+
rather than by refusing it.
|
|
33
|
+
|
|
34
|
+
Two things a props table cannot show you, both of them compile-time where a compiler can reach:
|
|
35
|
+
|
|
36
|
+
- **A tile is one thing or the other, in the type.** Either a **link** — `href`, optionally with
|
|
37
|
+
`render`, a router's own element which is cloned, keeps its own `href` because `next/link`
|
|
38
|
+
requires it to declare one, and has its `className` merged with the tile's rather than replaced
|
|
39
|
+
— whose whole surface is a single `<a>` and whose content is therefore static. Or a **panel**,
|
|
40
|
+
whose children may be live and whose link or control is a visible sibling in `action`. `href`
|
|
41
|
+
and `action` are mutually exclusive in the type, and a dev-time `console.error` names any tile
|
|
42
|
+
that puts an interactive child inside an anchor.
|
|
43
|
+
- **Static markup throughout** — no hooks and no `"use client"` — so a server component can draw a
|
|
44
|
+
bento without opening a client boundary. That is why the router escape hatch is an element to
|
|
45
|
+
clone rather than a render function: a directive is per module, and the hook that reads a render
|
|
46
|
+
function is a hook.
|
|
47
|
+
|
|
48
|
+
`manifest/manifest.json` and the new `manifest/components/bento.json` were regenerated with it.
|
|
49
|
+
|
|
50
|
+
- 16d2cae: `@cueplusplus/ui/system` now exports `isSafeTokenValue(value: string): boolean` — whether a string
|
|
51
|
+
may be written into the density stylesheet `ThemeProvider` builds from its `overrides` prop.
|
|
52
|
+
|
|
53
|
+
**Nothing to do.** Nothing about that stylesheet changed: this is the rule `overridesCss()` has
|
|
54
|
+
always applied, exported. Adopt it if you assemble a `TokenOverrides` out of anything a person or
|
|
55
|
+
an API supplies, so a value is refused at your own input rather than discovered from a
|
|
56
|
+
`console.warn` one render later, with half of what you built never having reached the sheet:
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import {
|
|
60
|
+
isSafeTokenValue,
|
|
61
|
+
type TokenOverrides,
|
|
62
|
+
} from "@cueplusplus/ui/system";
|
|
63
|
+
|
|
64
|
+
isSafeTokenValue("Iosevka, monospace"); // → true
|
|
65
|
+
isSafeTokenValue("red;}"); // → false
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
It lands against `./system`'s standing policy — that the prop's _shape_ is public while
|
|
69
|
+
`inlineOverrides()`, `overridesCss()` and `OverridesContext` stay internal, because a consumer
|
|
70
|
+
reaching for those would be writing the custom properties by hand — and it lands on the right side
|
|
71
|
+
of it: a _writer_ of custom properties is what the policy excludes, and a _reader_ that refuses a
|
|
72
|
+
value before it is ever written is the opposite of one. `@cueplusplus/ui/configurator`'s
|
|
73
|
+
`isSafeCssValue` is unchanged and unmoved; it is the same rule behind a subpath that also carries
|
|
74
|
+
`ThemeConfigurator`, `ExportDialog` and an optional `react-aria-components` peer, and a caller
|
|
75
|
+
that only wants the question answered should not have to take that graph to ask it.
|
|
76
|
+
|
|
77
|
+
- 88cf751: The component manifest's `schemaVersion` is now `2`, and every `PropDoc` in it — root props and
|
|
78
|
+
every compound part's props alike — carries a required `control`: `{ kind, members?, min?, max?,
|
|
79
|
+
nullable?, fixture? }`, where `kind` is one of `boolean`, `enum`, `number`, `string`, `node`,
|
|
80
|
+
`callback`, `array`, `object` or `opaque`. It answers the question `type` never could: _what edits
|
|
81
|
+
this prop_.
|
|
82
|
+
|
|
83
|
+
**What a reader of `manifest.json` must change: the version pin, and nothing else.** A consumer
|
|
84
|
+
that asserts `schemaVersion === 1` will reject every document this release publishes and has to
|
|
85
|
+
move to `2`; a consumer that ignores the field keeps working once the pin moves. Both published
|
|
86
|
+
manifests (`manifest/manifest.json` and every document under `manifest/components/`) were
|
|
87
|
+
regenerated, as was `manifest/tokens.json`, whose `schemaVersion` moves with them — so all three
|
|
88
|
+
have to be read at the same version.
|
|
89
|
+
|
|
90
|
+
A `variant` prop's `members` are its `cva` recipe's, in the recipe's order; a numeric literal union
|
|
91
|
+
carries its own `min`/`max`, and a prop whose JSDoc states a range with `@min`/`@max` carries that;
|
|
92
|
+
a union with an explicit `| null` is `nullable`.
|
|
93
|
+
|
|
94
|
+
## Migrating
|
|
95
|
+
- **`type` is unchanged.** It still prints the TypeScript type verbatim, literal unions included,
|
|
96
|
+
and it is still the field to render when a reader wants to know what a prop _is_. `control` is a
|
|
97
|
+
new field beside it, not a replacement for it: nothing was renamed and nothing was removed.
|
|
98
|
+
- **A consumer pinned to `schemaVersion === 1` must move to `2`.** The number changed because
|
|
99
|
+
`control` is _required_: a consumer that reads it needs to know whether the document it fetched
|
|
100
|
+
has one, and an optional field could never tell it — absent would mean both "no control" and
|
|
101
|
+
"an older manifest". A consumer that ignores the field keeps working after changing the pin.
|
|
102
|
+
|
|
103
|
+
### Patch Changes
|
|
104
|
+
|
|
105
|
+
- c469f49: `Button` now **declares** `children` in `ButtonProps`, so the published manifest documents it and
|
|
106
|
+
the props table has a row for it.
|
|
107
|
+
|
|
108
|
+
**Nothing to do.** The component did not change — it has always taken children, through
|
|
109
|
+
`React.ComponentPropsWithoutRef<"button">`. What changed is what the package says about itself:
|
|
110
|
+
docgen documents a prop only where the library declares it, so the system's most used control
|
|
111
|
+
published no `children` at all. The page did not list it, and a propSet could not name it, which
|
|
112
|
+
is how `/play/button` came to preview an unlabelled `<button>` behind a standing accessibility
|
|
113
|
+
exemption. Declaring it is what lets that exemption expire.
|
|
114
|
+
|
|
115
|
+
If you read `manifest/components/button.json` to generate code or to drive a playground,
|
|
116
|
+
`children` is now in `props` and can be set like any other prop.
|
|
117
|
+
|
|
118
|
+
- 481e8c5: `manifest/components/ledger.json` said `Ledger` could not fold. It can, and the note now says so.
|
|
119
|
+
|
|
120
|
+
**Nothing to do unless you read the manifest.** No API changed, no component moved, and nothing
|
|
121
|
+
you have written needs editing. The documentation that ships inside the package described the
|
|
122
|
+
plain bench as having "no disclosure anywhere — the ledger does not collapse", which was true
|
|
123
|
+
before 0.8.0 and false in it: `collapsible` puts a real
|
|
124
|
+
`button[aria-expanded aria-controls]` inside the `h2`/`h3` and folds the run of rows below it.
|
|
125
|
+
|
|
126
|
+
The corrected note says what shipped — folding is opt-in per heading, and a ledger nobody asks to
|
|
127
|
+
fold still emits no control and no expansion state at all. The manifest is the only published
|
|
128
|
+
surface this touches.
|
|
129
|
+
|
|
130
|
+
- 64b4bab: Every package manifest's `repository` field now names `cueplusplus/cue-ui`, following the
|
|
131
|
+
repository's rename from an earlier working title.
|
|
132
|
+
|
|
133
|
+
**Nothing to do.** No code, no exports, no types, and no package name: the scope is the
|
|
134
|
+
organisation, not the repository, so every specifier you already import is the one you keep
|
|
135
|
+
importing. What moves is metadata — GitHub Packages matches a package to a repository through that
|
|
136
|
+
field, so from this release the "source" link on each package's registry page, and the repository
|
|
137
|
+
the next publish is attributed to, name `cue-ui`. The `directory` beside it is unchanged, so each
|
|
138
|
+
link still lands on that package rather than on the monorepo root.
|
|
139
|
+
|
|
140
|
+
If you have a bookmark or a script pointing at the old URL, GitHub's rename redirect answers it;
|
|
141
|
+
updating it to `https://github.com/cueplusplus/cue-ui` is tidiness rather than repair.
|
|
142
|
+
|
|
143
|
+
- 3471a15: `tokensUsed` in the published component manifest is now scanned from code rather than from bytes,
|
|
144
|
+
so it stops attributing tokens to components that never resolve them.
|
|
145
|
+
|
|
146
|
+
**What to do: re-read the manifest before you trust a `tokensUsed` list you cached.** No API
|
|
147
|
+
changed and nothing you render moves, but the manifest says something different about 48 of 321
|
|
148
|
+
components, and the old answer was padded — in thirteen cases wholly wrong. If you read
|
|
149
|
+
`tokensUsed` to decide which tokens to define when restyling a component, the list you had was
|
|
150
|
+
too wide. It is narrower now, and true.
|
|
151
|
+
|
|
152
|
+
The scanner matched `--cue-*` anywhere in a file's text, comments included. A docblock sentence
|
|
153
|
+
naming a token published it as one the component uses, and a sentence arguing _against_ one
|
|
154
|
+
published the opposite of what it said: `forms/_chassis.ts` explains that the ring reads
|
|
155
|
+
`--cue-focus`, **not** `--cue-accent`, and eleven controls on that chassis published
|
|
156
|
+
`--cue-accent` because of it.
|
|
157
|
+
|
|
158
|
+
What moved, exactly:
|
|
159
|
+
|
|
160
|
+
- **Thirty-four components lose one to four tokens they never painted.**
|
|
161
|
+
- **Thirteen now correctly publish none** — `agent-surface`, `animated-number`,
|
|
162
|
+
`chart-container` and the ten container icons — because their lists were comment-derived in
|
|
163
|
+
their entirety: they paint through classes rather than resolving custom properties by name, and
|
|
164
|
+
the ten icons render no `className` at all. An empty array renders as no Tokens section rather
|
|
165
|
+
than an empty one, which is what the four components that already shipped one do.
|
|
166
|
+
- **One gains four.** `MarkdownText` painted `--cue-accent`, `--cue-fg`, `--cue-fg-muted` and
|
|
167
|
+
`--cue-fg-subtle` and published none of them: the literal pass pairs quotes across the whole
|
|
168
|
+
file, and the apostrophes in that file's prose desynced the pairing so the class strings below
|
|
169
|
+
were read as the insides of strings. Blanking the comments re-pairs them.
|
|
170
|
+
- **Two entries that were never tokens are gone**, `--cue-icon-` and `--cue-space-`: the regex had
|
|
171
|
+
been stopping at the `*` in `--cue-icon-*` and the `$` in `gap-(--cue-space-${n})`.
|
|
172
|
+
|
|
173
|
+
- Updated dependencies [64b4bab]
|
|
174
|
+
- Updated dependencies [362cdda]
|
|
175
|
+
- Updated dependencies [c2238cc]
|
|
176
|
+
- @cueplusplus/tokens@0.10.0
|
|
177
|
+
- @cueplusplus/theme-base@1.0.1
|
|
178
|
+
|
|
179
|
+
## 0.9.0
|
|
180
|
+
|
|
181
|
+
### Minor Changes
|
|
182
|
+
|
|
183
|
+
- 5eb0da2: The ten colour presets leave `@cueplusplus/tokens` and become packages of their
|
|
184
|
+
own. `@cueplusplus/ui/styles.css` now ships the blank base instead of a palette,
|
|
185
|
+
so a theme is something you install, import and register — the same way a
|
|
186
|
+
third-party theme always should have been, and now is.
|
|
187
|
+
|
|
188
|
+
`@cueplusplus/tokens` keeps the two axes it actually owns: the five density
|
|
189
|
+
rungs and the eight font pairings, plus the contracts, `base.json` and the
|
|
190
|
+
primitives a theme source aliases. It emits `axes.css` and no colour at all.
|
|
191
|
+
Each preset is `@cueplusplus/theme-<name>` — `cue`, `dusk`, `hivehub`, `luma`,
|
|
192
|
+
`quotamate`, `requestport`, `signal`, `snuffle`, `terminal`, `venu` — carrying
|
|
193
|
+
the stylesheet it always carried, byte for byte: nothing about any shipped
|
|
194
|
+
palette moved, and a frozen snapshot of what `tokens@0.8.0` emitted is committed
|
|
195
|
+
so that stays checkable rather than merely asserted.
|
|
196
|
+
|
|
197
|
+
## Migrating
|
|
198
|
+
|
|
199
|
+
**The unattributed default stops being `cue`.** An app that imports
|
|
200
|
+
`@cueplusplus/ui/styles.css` and registers nothing now paints the blank base.
|
|
201
|
+
Nothing errors and nothing falls back: a `data-theme` value is styled by
|
|
202
|
+
whichever stylesheet declares it, and with no theme package imported, none does.
|
|
203
|
+
|
|
204
|
+
Ten custom properties move in dark and seven in light. Measured on a root
|
|
205
|
+
stamped `data-theme="cue"`, which is what every `ThemeProvider` stamped before
|
|
206
|
+
this release and still stamps, so this is the delta for an app that changes
|
|
207
|
+
nothing:
|
|
208
|
+
|
|
209
|
+
| token | dark: `cue` → blank base | light: `cue` → blank base |
|
|
210
|
+
| ---------------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------ |
|
|
211
|
+
| `--cue-accent` | `#ffffff` → `#8a93a6` | `#0a0a0a` → `#3f4759` |
|
|
212
|
+
| `--cue-accent-hover` | `rgba(255,255,255,0.85)` → `#9aa3b6` | `rgba(0,0,0,0.85)` → `#333a4a` |
|
|
213
|
+
| `--cue-accent-soft` | follows `--cue-accent`: it is a 14% `color-mix` of it | same |
|
|
214
|
+
| `--cue-focus` | `#ffffff` → `#8a93a6` | `#0a0a0a` → `#3f4759` |
|
|
215
|
+
| `--cue-font-theme-mono` | JetBrains Mono → nothing; the base declares no theme mono | same as dark |
|
|
216
|
+
| `--cue-font-mono` | resolves through the line above, so JetBrains Mono → the platform stack | same as dark |
|
|
217
|
+
| `--cue-fg` | `#f5f5f7` → `#f5f5f5` | unchanged |
|
|
218
|
+
| `--cue-hair`, `--cue-hair-strong`, `--cue-row-hover` | follow `--cue-fg`: each is a `color-mix` of it (6%, 12%, 3.5%) | unchanged |
|
|
219
|
+
| `--cue-accent-fg` | unchanged | `#fcfcfc` → `#ffffff` |
|
|
220
|
+
|
|
221
|
+
The last four rows are the ones an eye catches and a list of "the accent and the
|
|
222
|
+
focus ring" would not have mentioned: four of the ten dark changes and the one
|
|
223
|
+
light change are tokens no theme file names directly, because they are mixes of
|
|
224
|
+
two that do.
|
|
225
|
+
|
|
226
|
+
To get `cue` back, exactly as it was:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
pnpm add @cueplusplus/theme-cue
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
```css
|
|
233
|
+
@import "@cueplusplus/ui/styles.css";
|
|
234
|
+
@import "@cueplusplus/theme-cue/theme.css";
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
```tsx
|
|
238
|
+
import cue from "@cueplusplus/theme-cue";
|
|
239
|
+
|
|
240
|
+
<ThemeProvider themes={[cue]} theme="cue">
|
|
241
|
+
{children}
|
|
242
|
+
</ThemeProvider>;
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
The import order is load-bearing: a `[data-theme]` block and the base's bare
|
|
246
|
+
`:root` tie at (0,1,0), so the one declared later wins. Importing the theme
|
|
247
|
+
before `styles.css` paints the blank base over it. Importing the package from
|
|
248
|
+
its root, rather than the `manifest.json` subpath, also closes `ThemeName` to
|
|
249
|
+
the themes you installed, so a misspelt `theme=` is a type error.
|
|
250
|
+
|
|
251
|
+
Then the rest:
|
|
252
|
+
|
|
253
|
+
- **`@cueplusplus/tokens/theme.css` is a deprecated alias** of `axes.css` for
|
|
254
|
+
one minor. It still resolves and still delivers the geometry and type axes, so
|
|
255
|
+
a stylesheet naming it keeps building — it simply carries no palette. Change
|
|
256
|
+
the line to `@cueplusplus/tokens/axes.css`, or drop it: `ui/styles.css` already
|
|
257
|
+
brings the axes in through `@cueplusplus/theme-base/base.css`.
|
|
258
|
+
- **Gone from `@cueplusplus/tokens`:** the `themes/*.css` and
|
|
259
|
+
`registry/theme-*.json` subpaths, and the `THEMES`, `ThemeName`,
|
|
260
|
+
`THEME_SUPPORTS_LIGHT` and `DEFAULT_THEME` exports. `ThemeName` now comes from
|
|
261
|
+
`@cueplusplus/theme-base` (re-exported by `@cueplusplus/ui`) and widens with
|
|
262
|
+
each theme package installed, rather than naming the ten that happened to be
|
|
263
|
+
compiled in; whether a theme ships a light block is `supportsLight` on its own
|
|
264
|
+
`manifest.json`; and there is no default palette to name, because the library
|
|
265
|
+
contains none.
|
|
266
|
+
- **`@cueplusplus/tokens`' root entry is now `dist/tokens.js`**, with
|
|
267
|
+
`dist/tokens.d.ts` beside it, where it used to be the TypeScript source
|
|
268
|
+
`dist/tokens.ts`. The import specifier, the exported names and their values
|
|
269
|
+
are unchanged — `import { DENSITIES } from "@cueplusplus/tokens"` is the same
|
|
270
|
+
line it was — but the file behind it is one Node can execute. It could not
|
|
271
|
+
before: Node refuses to strip types for anything under `node_modules`, so the
|
|
272
|
+
package worked in a workspace and failed from a registry install, taking
|
|
273
|
+
`@cueplusplus/theme-base` and the `cue-theme` CLI with it. If you added
|
|
274
|
+
`@cueplusplus/tokens` to your bundler's transpile list to work around that
|
|
275
|
+
(Next.js' `transpilePackages`, or the equivalent), take it out.
|
|
276
|
+
- **`@cueplusplus/tokens` gains `base.json`'s `fonts.handshake`**: the three
|
|
277
|
+
literals of the monospace resolution (`font-pairing-mono`, `font-theme-mono`,
|
|
278
|
+
and the `var()` that resolves them), published as data so a theme built
|
|
279
|
+
anywhere spells them the same way this build does.
|
|
280
|
+
- **`@cueplusplus/ui`'s `THEME_NAME_PATTERN` and `RESOLVED_MONO` are now
|
|
281
|
+
re-exports** of `@cueplusplus/theme-base`'s. Same names, same values, one
|
|
282
|
+
definition instead of three.
|
|
283
|
+
- **`/r/tokens.json`'s `themes` are objects**, not strings:
|
|
284
|
+
`{ name, package, supportsLight, densities }`. A consumer reading the registry
|
|
285
|
+
for a theme list wants to know which package delivers it.
|
|
286
|
+
- **Every published tarball now carries a `README.md`.** On a registry the
|
|
287
|
+
package page _is_ the README, and `tokens`, `ui` and `brand-tokens` shipped
|
|
288
|
+
without one; `packages/release/test/publishable-packages.test.mjs` holds all
|
|
289
|
+
fifteen to it now, beside the same check for `CHANGELOG.md`.
|
|
290
|
+
- **`@cueplusplus/ui` depends on `@cueplusplus/theme-base@^1`**, a range rather
|
|
291
|
+
than a pin, deliberately: two copies of `theme-base` in one tree would break
|
|
292
|
+
the type registry, because a theme's `declare module` augments one copy while
|
|
293
|
+
`ui`'s re-exported `ThemeName` resolves against the other, and neither errors.
|
|
294
|
+
|
|
295
|
+
- 1b98830: `ThemeProvider` takes `themes`, an ordered array of theme manifests, and the runtime reads
|
|
296
|
+
everything about a theme from its manifest instead of from a copy inside this package. Types open:
|
|
297
|
+
`ThemeName`, `DensityLevel` (`Density` on `@cueplusplus/theme-base`) and `FontName` are now `@cueplusplus/theme-base`'s, which a theme package
|
|
298
|
+
widens by declaration merging — `"foo"` is a valid theme in an app that installed
|
|
299
|
+
`@cueplusplus/theme-foo`, and `ThemeName` is `string` in one that installed none. Three hooks —
|
|
300
|
+
`useThemes()`, `useDensities()`, `useFonts()` — return what the active theme offers. Every place
|
|
301
|
+
that validated a persisted name against a frozen list validates against the registry. A typed
|
|
302
|
+
`overrides` prop layers colours, fonts and densities over the active theme, with a development
|
|
303
|
+
contrast report.
|
|
304
|
+
|
|
305
|
+
## Migrating
|
|
306
|
+
- **`themes` is optional for this release.** An app that passes none gets the blank base and the
|
|
307
|
+
base axes, with one development warning. Pass `themes={[cue]}` from `@cueplusplus/theme-cue`
|
|
308
|
+
when it publishes. With nothing registered there is no theme vocabulary to be out of, so
|
|
309
|
+
`ThemeProvider` and `prepaintScript` no longer reject a persisted or default theme name they do
|
|
310
|
+
not recognise: a well-formed name is stamped as-is. Pass `themes` to close the vocabulary again.
|
|
311
|
+
- **`createTheme({ base })` takes a manifest, not a name.** `createTheme({ name, base: "terminal" })`
|
|
312
|
+
becomes `createTheme({ name, base: terminal })` with `import terminal from "@cueplusplus/theme-terminal"`.
|
|
313
|
+
With no `base` it starts from the blank base. `DEFAULT_THEME_BASE` is removed.
|
|
314
|
+
- **`createTheme`'s radius rules now emit both selector forms** — `[data-theme="x"] [data-density="y"]`
|
|
315
|
+
beside `[data-theme="x"][data-density="y"]` — so a `<Density>` island and `useControlHeight`'s probe
|
|
316
|
+
get the crossed value too. A byte-comparison against the old output will differ on those lines.
|
|
317
|
+
- **`ThemeScope` from `@cueplusplus/ui/configurator` gains `manifest: ThemeManifest | null`.** Every
|
|
318
|
+
function that takes a scope needs it — `baseValue`, `resolveValue`, `resolvedTokens`, `setOverride`,
|
|
319
|
+
`clearOverride`, `isOverridden`, `scopeKey`, `exportName`, `buildExports({ scope })` and
|
|
320
|
+
`<ExportDialog scope>`. Pass the active manifest (`useTheme().manifest`) or `null` for the blank
|
|
321
|
+
base. The panel's `create-theme` export now emits an import of the base theme's manifest instead
|
|
322
|
+
of `base: "<name>"`.
|
|
323
|
+
- **`overrides` is typed `TokenOverrides`**, exported from `@cueplusplus/ui` and `@cueplusplus/ui/system`.
|
|
324
|
+
It is unrelated to `ThemeOverrides` on `@cueplusplus/ui/configurator`, which is still the
|
|
325
|
+
configurator's edit snapshot.
|
|
326
|
+
- `THEME_COLOR_TOKENS` is now exactly `COLOR_CONTRACT` from `@cueplusplus/tokens`: the same 26 names
|
|
327
|
+
in the same order.
|
|
328
|
+
- **`ThemeProvider` opens on the active theme's `densities.default` and `fontPairings.default`** when
|
|
329
|
+
you pass no `density` or `font` — the rung and pairing a theme declares it prefers. Pass one to
|
|
330
|
+
override it for every theme. No first-party theme declares either, so nothing shipped moves.
|
|
331
|
+
`prepaintScript` opens on the same tier: `defaults.density` and `defaults.font` are both optional
|
|
332
|
+
in the options form, and an absent one falls to that theme's declared preference rather than to the
|
|
333
|
+
library's base rung, so the blocking script stamps exactly what the provider is about to commit
|
|
334
|
+
with no work on your side. Passing `defaults.density` or `defaults.font` is the same statement as
|
|
335
|
+
passing the prop — do both, or neither. One consequence for the positional form: its fourth
|
|
336
|
+
argument is now validated like the other three, so `prepaintScript(key, theme, density, font)` with
|
|
337
|
+
a pairing outside the base eight throws the same `defaults.font … is not offered by theme …` the
|
|
338
|
+
options form gives, where before the script silently fell back to `system`.
|
|
339
|
+
- **Three types 16 public signatures name are now exported** from `@cueplusplus/ui` and
|
|
340
|
+
`@cueplusplus/ui/system`: `ThemeManifest`, `DensityEntry` and `FontEntry`. They appear in
|
|
341
|
+
`ThemeProviderProps.themes`, `PrepaintOptions.themes`, `ThemeContextValue.manifest`,
|
|
342
|
+
`ThemeRegistry`, `useThemes()`, `useDensities()`, `useFonts()` and `ThemeScope.manifest`, so
|
|
343
|
+
`@cueplusplus/ui` re-exports them: an app that names one of those types in a signature of its own
|
|
344
|
+
need not reach past the package it installed.
|
|
345
|
+
- **`ThemeRegistry` is exported** from `@cueplusplus/ui/system` — the shape the three registry hooks
|
|
346
|
+
read: the registered manifests, the first one's name, and the rungs and pairings the _active_ theme
|
|
347
|
+
offers.
|
|
348
|
+
- **`RESOLVED_MONO` is exported** from `@cueplusplus/ui/theming`: the `var()` chain every theme block
|
|
349
|
+
sets `--cue-font-mono` to, pairing first. A tool that writes theme CSS beside `serializeThemeCss`
|
|
350
|
+
needs the same string.
|
|
351
|
+
- **`themeSelector`'s options gain `pair?: boolean`**, which emits the descendant form
|
|
352
|
+
`[data-theme="x"] [data-density="y"]` beside the compound one, as more than one selector when
|
|
353
|
+
`density` is set. Neither a `<Density>` island nor `useControlHeight`'s `document.body` probe
|
|
354
|
+
carries `data-theme` beside its `data-density`, so this is what reaches them. This function, and
|
|
355
|
+
`@cueplusplus/theme-tools`' `cue-theme build`, now emit three forms per rung instead of two — an
|
|
356
|
+
exact match, a structural fallback, and the unchanged compound — so that a rung a theme adds or
|
|
357
|
+
retunes no longer applies inside a nested provider of another theme: not through a `<Density>`
|
|
358
|
+
island, not through the nested provider's own root opening on a rung the outer theme happens to
|
|
359
|
+
retune, and not even when that outer theme is _re-entered_ after a detour through a different one
|
|
360
|
+
several levels in, which an ancestor-only structural check cannot always tell apart from the
|
|
361
|
+
outer detour alone. **`<Density>` and the internal measuring probe now also render
|
|
362
|
+
`data-cue-theme`**, stamped from the nearest `<ThemeProvider>` (or omitted where there is none) —
|
|
363
|
+
an inert attribute nothing in this library reads back except the exact-match selector above, which
|
|
364
|
+
needs it to resolve "nearest theme" the way `useContext` already does, rather than the "does some
|
|
365
|
+
ancestor carry this theme" a pure CSS selector is limited to. All three forms are wrapped in
|
|
366
|
+
`:where()`, which contributes no specificity, so together they tie with the `overrides` prop's own
|
|
367
|
+
document-scoped density rule at (0,2,0) — as they always did — rather than outranking it.
|
|
368
|
+
|
|
369
|
+
- e587341: `contrastReport()` now measures the focus ring.
|
|
370
|
+
|
|
371
|
+
`CONTRAST_REQUIREMENTS` gains a second tier: nine **advisory** pairs holding
|
|
372
|
+
`--cue-focus` and `--cue-danger` — the two roles a form control paints as a
|
|
373
|
+
ring, and therefore WCAG 1.4.11 non-text contrast surfaces — to 3:1 against
|
|
374
|
+
every ground one can be painted over. `ContrastRequirement` carries
|
|
375
|
+
`advisory?: boolean`, `ContrastReport` carries `advisories` beside `failures`,
|
|
376
|
+
and `passes` still counts only the eleven required pairs. No theme that was
|
|
377
|
+
clean yesterday fails today; every theme now gets told about its ring.
|
|
378
|
+
|
|
379
|
+
The gap was known and the gate for it lived in a test file, which protected the
|
|
380
|
+
ten shipped presets and nobody who calls `createTheme()`. The dark block takes
|
|
381
|
+
the accent into `--cue-focus` verbatim, so
|
|
382
|
+
`createTheme({ name: "acme", base: snuffle, accent: "#3b3f8f" })` — the manifest
|
|
383
|
+
imported from `@cueplusplus/theme-snuffle`, and a brand colour straight into the
|
|
384
|
+
anchor, which is the documented use — came back
|
|
385
|
+
`passes: true` with twenty-two checks, none of which named `focus`, over a ring
|
|
386
|
+
measuring 2.01:1 down to 1.55:1 on the five grounds it can sit on. The same call
|
|
387
|
+
now returns those five pairs in `report.advisories`, each with its reason. It is
|
|
388
|
+
the failure 0.6.0 fixed in `luma`, `venu` and `hivehub` at 2.45:1, and a report
|
|
389
|
+
is the only place a consumer would ever meet it: an invisible focus ring is
|
|
390
|
+
invisible in code review and invisible in a screenshot taken with a mouse.
|
|
391
|
+
|
|
392
|
+
All ten shipped presets clear the new tier in both modes — two hundred ring
|
|
393
|
+
measurements, the tightest `terminal.dark --cue-danger` on `--cue-surface-3` at
|
|
394
|
+
3.13:1 — and the preset gate now runs through `contrastReport()` rather than
|
|
395
|
+
through its own copy of the same loop.
|
|
396
|
+
|
|
397
|
+
`danger/bg` is not restated in the ring tier: the status pairs have always held
|
|
398
|
+
the red against the page at this same floor, as a required pair, and one
|
|
399
|
+
measurement gets one id.
|
|
400
|
+
|
|
401
|
+
**If you iterate `CONTRAST_REQUIREMENTS` or render `report.checks`,** the array
|
|
402
|
+
goes from 11 entries to 20 and a two-block report from 22 checks to 40. Filter
|
|
403
|
+
on `advisory` to keep the old set.
|
|
404
|
+
|
|
405
|
+
### Patch Changes
|
|
406
|
+
|
|
407
|
+
- cf80a87: `FlowGraph` draws an edge faint until both of the nodes it joins have been
|
|
408
|
+
reached, which is what its `edges` prop has always said it does.
|
|
409
|
+
|
|
410
|
+
The behaviour was documented, published and unimplemented: the prop's
|
|
411
|
+
description — "An edge dims until both of its ends are visible" — ships in
|
|
412
|
+
`manifest/components/flow-graph.json` and in the type declarations, the
|
|
413
|
+
`transition-opacity duration-500` was already on the path, and the component
|
|
414
|
+
computed whether an edge was live and then never used the answer. Every edge
|
|
415
|
+
painted at full strength from the first frame, so a graph revealing itself
|
|
416
|
+
through `visibleCount` showed all of its connections before it had any of its
|
|
417
|
+
nodes.
|
|
418
|
+
|
|
419
|
+
Found by turning the lint gate on: the unused binding was the first thing it
|
|
420
|
+
reported.
|
|
421
|
+
|
|
422
|
+
- 2737aec: `@cueplusplus/tokens` exports the contracts and the axes as data, so a theme
|
|
423
|
+
built outside this repository can resolve over the same base: `COLOR_CONTRACT`,
|
|
424
|
+
`GEOMETRY_CONTRACT` and `FONT_TOKENS` as typed tuples, `base.json` (every
|
|
425
|
+
density's geometry, the pairings' stacks, the derived templates, the defaults),
|
|
426
|
+
`primitives.tokens.json` (the tier-1 file a theme source aliases), and
|
|
427
|
+
`axes.css` — `theme.css` with the theme axis removed. Nothing that exists today
|
|
428
|
+
moves; `theme.css` is unchanged.
|
|
429
|
+
|
|
430
|
+
`@cueplusplus/ui/theming` keeps every export it had. The contrast arithmetic now
|
|
431
|
+
lives in `@cueplusplus/theme-base` and is re-exported here; `ui` gains that
|
|
432
|
+
package as a dependency. No behaviour changes.
|
|
433
|
+
|
|
434
|
+
- Updated dependencies [cf80a87]
|
|
435
|
+
- Updated dependencies [5eb0da2]
|
|
436
|
+
- Updated dependencies [814c859]
|
|
437
|
+
- Updated dependencies [2737aec]
|
|
438
|
+
- @cueplusplus/tokens@0.9.0
|
|
439
|
+
- @cueplusplus/theme-base@1.0.0
|
|
440
|
+
|
|
3
441
|
## 0.8.0
|
|
4
442
|
|
|
5
443
|
### Minor Changes
|
|
@@ -27,6 +465,25 @@
|
|
|
27
465
|
|
|
28
466
|
### Patch Changes
|
|
29
467
|
|
|
468
|
+
- edb938d: `Table.Row interactive` draws a focus ring. The prop supplied the
|
|
469
|
+
pointer half — the row-hover wash and a pointer cursor — and nothing for
|
|
470
|
+
focus, while the row-activation reading above tells a caller to put `tabIndex`
|
|
471
|
+
on the `<tr>` so `activateRowFromKeyDown` has something to fire on. The two
|
|
472
|
+
together made a row a keyboard user could reach and activate with nothing on
|
|
473
|
+
screen changing. **This is a WCAG 2.4.7 (Focus Visible, AA) fix you inherit by
|
|
474
|
+
upgrading.**
|
|
475
|
+
|
|
476
|
+
The ring is the one `Row` already draws: 2px solid in `--cue-accent`, pulled
|
|
477
|
+
inside the row by `-outline-offset-2` rather than floating outside it, because
|
|
478
|
+
these tables live in clipped panes and scroll regions where an outset ring on
|
|
479
|
+
the first or last row is cut off by the pane's own rim. It is `focus-visible`,
|
|
480
|
+
so a pointer press still paints nothing, and it rides on `interactive` alone:
|
|
481
|
+
a static table of figures is untouched. Nothing to change — and if you drew a
|
|
482
|
+
ring of your own on a focusable row, the library's is now under it.
|
|
483
|
+
|
|
484
|
+
Added after the fact: this shipped in 0.7.0 with no changeset, and a late entry
|
|
485
|
+
beats a hole in the record.
|
|
486
|
+
|
|
30
487
|
- @cueplusplus/tokens@0.7.0
|
|
31
488
|
|
|
32
489
|
## 0.6.0
|
package/README.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# @cueplusplus/ui
|
|
2
|
+
|
|
3
|
+
Components for console software: dense, keyboard-first interfaces where a screen is mostly data.
|
|
4
|
+
Base UI underneath for behaviour and accessibility, Tailwind v4 on top for the paint.
|
|
5
|
+
|
|
6
|
+
## Install
|
|
7
|
+
|
|
8
|
+
The `@cueplusplus` scope is served by **GitHub Packages**, not npmjs.com, and GitHub Packages
|
|
9
|
+
authenticates *every* install. That is two settings, in two places, and the split is not
|
|
10
|
+
cosmetic — pnpm ignores an env-expanded credential in a project `.npmrc` and the install fails
|
|
11
|
+
with `401`.
|
|
12
|
+
|
|
13
|
+
Commit the scope routing, and nothing else, at the root of your project:
|
|
14
|
+
|
|
15
|
+
```ini
|
|
16
|
+
# .npmrc
|
|
17
|
+
@cueplusplus:registry=https://npm.pkg.github.com
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Then write the credential once, at the **user** level, where pnpm reads it from. It is a
|
|
21
|
+
**classic** personal access token with `read:packages` — GitHub Packages accepts neither
|
|
22
|
+
fine-grained PATs nor OIDC:
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
pnpm config set //npm.pkg.github.com/:_authToken ghp_…
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
pnpm add @cueplusplus/ui @cueplusplus/tokens @cueplusplus/theme-cue @base-ui/react
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Three peers are required and declared: `react` ^19, `react-dom` ^19 and `@base-ui/react` ^1.7.
|
|
33
|
+
`tailwindcss` ^4 is a declared peer too, but an optional one — needed for the default styling
|
|
34
|
+
lane, and without it you own the CSS. Every other peer is optional and scoped to a subpath.
|
|
35
|
+
`@cueplusplus/tokens` arrives as a dependency; installing it by name just makes the token
|
|
36
|
+
constants importable in your own code. The theme package is not a peer at all — see below.
|
|
37
|
+
|
|
38
|
+
CI, Vercel and the token's expiry are in
|
|
39
|
+
[`docs/CONSUMING.md` §1](https://github.com/cueplusplus/cue-ui/blob/main/docs/CONSUMING.md#1-registry-access).
|
|
40
|
+
|
|
41
|
+
## Quick start
|
|
42
|
+
|
|
43
|
+
```css
|
|
44
|
+
/* app/globals.css */
|
|
45
|
+
@import "tailwindcss";
|
|
46
|
+
@import "@cueplusplus/ui/styles.css";
|
|
47
|
+
@import "@cueplusplus/theme-cue/theme.css";
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
import cue from "@cueplusplus/theme-cue";
|
|
52
|
+
import { Button } from "@cueplusplus/ui";
|
|
53
|
+
import { ThemeProvider } from "@cueplusplus/ui/system";
|
|
54
|
+
|
|
55
|
+
export default function App() {
|
|
56
|
+
return (
|
|
57
|
+
<ThemeProvider themes={[cue]} theme="cue" density="compact" mode="system">
|
|
58
|
+
<Button variant="primary">Run cue</Button>
|
|
59
|
+
</ThemeProvider>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The order of those three `@import`s is load-bearing, and the `themes` prop is not optional in
|
|
65
|
+
practice: this library contains no palette. Install and register a `@cueplusplus/theme-*` package,
|
|
66
|
+
or every surface paints `@cueplusplus/theme-base`'s blank base — greys, one desaturated accent,
|
|
67
|
+
the platform monospace — with nothing erroring to tell you.
|
|
68
|
+
|
|
69
|
+
To stop the defaults flashing on first paint, add `prepaintScript()` beside the provider and hand
|
|
70
|
+
both the same array — [§4 of `CONSUMING.md`](https://github.com/cueplusplus/cue-ui/blob/main/docs/CONSUMING.md#4-the-provider)
|
|
71
|
+
is the whole layout.
|
|
72
|
+
|
|
73
|
+
## What it ships
|
|
74
|
+
|
|
75
|
+
Common components come from the root entry. Groups that need an optional peer have a subpath of
|
|
76
|
+
their own, so importing a button never pulls a charting library into your bundle.
|
|
77
|
+
|
|
78
|
+
| Import specifier | What is in it |
|
|
79
|
+
| --- | --- |
|
|
80
|
+
| `@cueplusplus/ui` | the root barrel: every component that costs no optional peer, the brand marks and the container icons included |
|
|
81
|
+
| `@cueplusplus/ui/primitives` | the leaves: buttons, chips, avatars, dots and the two loading shapes |
|
|
82
|
+
| `@cueplusplus/ui/forms` | everything a user types into, toggles, picks from or drags |
|
|
83
|
+
| `@cueplusplus/ui/overlays` | everything that floats: dialogs, sheets, menus, tooltips, the command palette |
|
|
84
|
+
| `@cueplusplus/ui/chrome` | console furniture: panels, rows, bars, tabs and the tree outline |
|
|
85
|
+
| `@cueplusplus/ui/layout` | page structure: cards, stacks, grids, `Bento`, disclosure and the navigation shapes |
|
|
86
|
+
| `@cueplusplus/ui/layout/carousel` | needs `embla-carousel-react` |
|
|
87
|
+
| `@cueplusplus/ui/layout/resizable` | needs `react-resizable-panels` |
|
|
88
|
+
| `@cueplusplus/ui/instruments` | the readouts: meters, sparklines, tables, logs and the two device frames |
|
|
89
|
+
| `@cueplusplus/ui/instruments/data-table` | needs `@tanstack/react-table` |
|
|
90
|
+
| `@cueplusplus/ui/instruments/log-viewer` | needs `@tanstack/react-virtual`, `anser` |
|
|
91
|
+
| `@cueplusplus/ui/charts` | Recharts in this system's tokens, plus the categorical palette and the ramps; needs `recharts` |
|
|
92
|
+
| `@cueplusplus/ui/date` | calendars, pickers and segmented date/time fields; needs `react-day-picker`, `date-fns`, `react-aria-components`, `@internationalized/date` |
|
|
93
|
+
| `@cueplusplus/ui/color` | the picker suite the configurator edits with, hex and oklch; needs `react-aria-components` |
|
|
94
|
+
| `@cueplusplus/ui/configurator` | the floating panel that edits the token layer live and exports what it edited; needs `react-aria-components` |
|
|
95
|
+
| `@cueplusplus/ui/flow` | React Flow wearing the tokens: node cards, handles, signal-carrying wires; needs `@xyflow/react` (+ `./flow.css`) |
|
|
96
|
+
| `@cueplusplus/ui/chat` | the multi-agent transcript: messages, composer, HITL questions, agent colour |
|
|
97
|
+
| `@cueplusplus/ui/agent-runtime` | the streaming layer under Chat; needs `@assistant-ui/react` |
|
|
98
|
+
| `@cueplusplus/ui/elements` | the agent's own surface, vendored from assistant-ui and repainted onto the tokens; needs `lucide-react` and `heat-graph` (+ `./elements.css`) |
|
|
99
|
+
| `@cueplusplus/ui/elements/markdown` | `MarkdownText`; needs `react-markdown`, `rehype-sanitize` |
|
|
100
|
+
| `@cueplusplus/ui/elements/generative` | the generative-UI renderer and its spec (+ `./elements/generative.css`) |
|
|
101
|
+
| `@cueplusplus/ui/elements/replay` | the scripted session-replay frame |
|
|
102
|
+
| `@cueplusplus/ui/dmx` | 512 bytes at wire rate: the bar, the strip, the patch bar, the channel grid |
|
|
103
|
+
| `@cueplusplus/ui/midi` | sequencer instruments: keyboard, musical clock, ruler, analyser, threshold rail |
|
|
104
|
+
| `@cueplusplus/ui/system` | `ThemeProvider`, `prepaintScript`, the `Density` island, the portal frame, `isSafeTokenValue` |
|
|
105
|
+
| `@cueplusplus/ui/theming` | `createTheme()`, `contrastReport()` and the `--cue-*` vocabulary as constants |
|
|
106
|
+
|
|
107
|
+
Four stylesheet exports. `@cueplusplus/ui/styles.css` is always imported; the other three are
|
|
108
|
+
imported only if you use what they paint — `@cueplusplus/ui/elements.css`,
|
|
109
|
+
`@cueplusplus/ui/flow.css` and `@cueplusplus/ui/elements/generative.css`.
|
|
110
|
+
|
|
111
|
+
## The machine-readable half
|
|
112
|
+
|
|
113
|
+
This package ships its own manifest: `@cueplusplus/ui/manifest.json` is an index of every
|
|
114
|
+
component with a SHA-256 for each companion document, and
|
|
115
|
+
`@cueplusplus/ui/manifest/components/<name>.json` is one component in full — props, variants, the
|
|
116
|
+
tokens it paints with, and the hand-written notes on when it is the wrong choice. Beside them,
|
|
117
|
+
`@cueplusplus/ui/manifest/tokens.json` is the token vocabulary and
|
|
118
|
+
`@cueplusplus/ui/manifest/fixtures.json` the playground fixture catalogue. An agent or a code
|
|
119
|
+
generator should read those rather than guess a prop name.
|
|
120
|
+
|
|
121
|
+
The same surfaces are published at <https://ui.cueplusplus.com>, with the docs site, the live
|
|
122
|
+
kitchen sink and the CUE++ agent skills beside them.
|
|
123
|
+
|
|
124
|
+
## Where the rest is
|
|
125
|
+
|
|
126
|
+
- Installing and using it from another project: [`docs/CONSUMING.md`](https://github.com/cueplusplus/cue-ui/blob/main/docs/CONSUMING.md)
|
|
127
|
+
- Every component, with props and a live example: <https://ui.cueplusplus.com/docs/components>
|
|
128
|
+
- Theming, density and the `--cue-*` contract: <https://ui.cueplusplus.com/docs/theming>
|
|
129
|
+
- The whole surface on one page: <https://ui.cueplusplus.com/kitchen-sink>
|
|
130
|
+
- Every machine-readable surface, with copy-paste snippets: <https://ui.cueplusplus.com/ai>
|
|
131
|
+
- What changed in the version you have: `node_modules/@cueplusplus/ui/CHANGELOG.md`
|
|
@@ -42,6 +42,7 @@ const MessageList = React.forwardRef(function MessageList({ className, children,
|
|
|
42
42
|
const [behind, setBehind] = React.useState(false);
|
|
43
43
|
const lastHeightRef = React.useRef(0);
|
|
44
44
|
const count = React.Children.count(children);
|
|
45
|
+
const isEmpty = count === 0;
|
|
45
46
|
const previousCountRef = React.useRef(count);
|
|
46
47
|
const jumpToLatest = React.useCallback(() => {
|
|
47
48
|
const element = scrollerRef.current;
|
|
@@ -90,7 +91,7 @@ const MessageList = React.forwardRef(function MessageList({ className, children,
|
|
|
90
91
|
}, [
|
|
91
92
|
follow,
|
|
92
93
|
pinned,
|
|
93
|
-
|
|
94
|
+
isEmpty
|
|
94
95
|
]);
|
|
95
96
|
const onScroll = React.useCallback(() => {
|
|
96
97
|
const element = scrollerRef.current;
|
|
@@ -61,7 +61,7 @@ interface BuildExportsOptions {
|
|
|
61
61
|
* @param name - What the user typed, if anything.
|
|
62
62
|
* @returns A usable CSS identifier.
|
|
63
63
|
* @example
|
|
64
|
-
* exportName({ theme: "terminal", mode: "dark" }); // → "terminal-custom"
|
|
64
|
+
* exportName({ theme: "terminal", mode: "dark", manifest: terminal }); // → "terminal-custom"
|
|
65
65
|
*/
|
|
66
66
|
declare function exportName(scope: ThemeScope, name?: string): string;
|
|
67
67
|
/**
|