@cueplusplus/ui 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +705 -0
- package/dist/brand/_chassis.d.ts +54 -0
- package/dist/brand/_chassis.js +81 -0
- package/dist/brand/_geometry.js +41 -0
- package/dist/brand/cue-logotype.d.ts +29 -0
- package/dist/brand/cue-logotype.js +60 -0
- package/dist/brand/cue-mark.d.ts +30 -0
- package/dist/brand/cue-mark.js +61 -0
- package/dist/brand/index.d.ts +5 -0
- package/dist/brand/plussie.d.ts +67 -0
- package/dist/brand/plussie.js +125 -0
- package/dist/chat/agent-pile.js +1 -1
- package/dist/chat/ask-box.js +2 -2
- package/dist/chat/delegation-card.js +1 -1
- package/dist/chat/message.js +2 -2
- package/dist/chrome/_edge-scroller.d.ts +45 -0
- package/dist/chrome/_edge-scroller.js +149 -0
- package/dist/chrome/_glyphs.js +19 -1
- package/dist/chrome/_tabs-scroll.d.ts +13 -8
- package/dist/chrome/_tabs-scroll.js +13 -8
- package/dist/chrome/app-bar.d.ts +103 -0
- package/dist/chrome/app-bar.js +175 -0
- package/dist/chrome/app-shell.d.ts +125 -0
- package/dist/chrome/app-shell.js +167 -0
- package/dist/chrome/footer.d.ts +75 -0
- package/dist/chrome/footer.js +68 -0
- package/dist/chrome/index.d.ts +5 -1
- package/dist/chrome/index.js +4 -1
- package/dist/chrome/navigation-menu.js +1 -1
- package/dist/chrome/page-shell.d.ts +1 -1
- package/dist/chrome/page-shell.js +15 -5
- package/dist/chrome/segmented-control.d.ts +19 -0
- package/dist/chrome/segmented-control.js +40 -21
- package/dist/chrome/tabs.js +21 -65
- package/dist/chrome/toolbar.d.ts +22 -0
- package/dist/chrome/toolbar.js +26 -5
- package/dist/configurator/_overrides.js +22 -8
- package/dist/configurator/configurator.js +1 -1
- package/dist/configurator/panel-sections.js +10 -4
- package/dist/dmx/channel-matrix.js +1 -1
- package/dist/forms/otp-field.js +1 -1
- package/dist/index.d.ts +18 -9
- package/dist/index.js +16 -10
- package/dist/instruments/data-table.js +1 -1
- package/dist/instruments/index.d.ts +2 -2
- package/dist/instruments/index.js +2 -2
- package/dist/instruments/table.d.ts +14 -1
- package/dist/instruments/table.js +20 -1
- package/dist/layout/carousel.js +1 -1
- package/dist/layout/container.d.ts +1 -1
- package/dist/layout/container.js +6 -3
- package/dist/layout/index.d.ts +3 -3
- package/dist/layout/index.js +3 -3
- package/dist/layout/pagination.js +1 -1
- package/dist/layout/sidebar.d.ts +23 -3
- package/dist/layout/sidebar.js +18 -7
- package/dist/midi/spectrum-visualizer.js +1 -1
- package/dist/midi/timeline-ruler.js +1 -1
- package/dist/overlays/command-palette.js +1 -1
- package/dist/overlays/dialog.js +1 -1
- package/dist/overlays/dropdown-menu.js +2 -2
- package/dist/overlays/hover-card.js +1 -1
- package/dist/overlays/index.js +1 -1
- package/dist/overlays/popover.js +1 -1
- package/dist/overlays/sheet.js +1 -1
- package/dist/overlays/toast.js +1 -1
- package/dist/primitives/chip.d.ts +1 -1
- package/dist/primitives/index.d.ts +1 -1
- package/dist/primitives/index.js +1 -1
- package/dist/primitives/status-dot.d.ts +7 -0
- package/dist/primitives/status-dot.js +8 -1
- package/dist/styles.css +58 -2
- package/dist/system/density.d.ts +4 -1
- package/dist/system/density.js +12 -4
- package/dist/system/index.d.ts +4 -4
- package/dist/system/portal.d.ts +5 -5
- package/dist/system/portal.js +30 -11
- package/dist/system/prepaint.d.ts +34 -9
- package/dist/system/prepaint.js +48 -25
- package/dist/system/theme-provider.d.ts +48 -11
- package/dist/system/theme-provider.js +109 -35
- package/dist/system/use-density.d.ts +3 -3
- package/dist/system/use-density.js +16 -6
- package/dist/system/use-theme.d.ts +4 -2
- package/dist/system/use-theme.js +4 -2
- package/dist/theming/_presets.js +133 -5
- package/dist/theming/create-theme.d.ts +2 -2
- package/dist/theming/create-theme.js +37 -19
- package/dist/theming/serialize.d.ts +1 -1
- package/dist/theming/serialize.js +25 -1
- package/manifest/components/accordion.json +154 -0
- package/manifest/components/agent-pile.json +116 -0
- package/manifest/components/alert-dialog.json +190 -0
- package/manifest/components/app-bar.json +244 -0
- package/manifest/components/app-shell.json +291 -0
- package/manifest/components/app-window-frame.json +102 -0
- package/manifest/components/ask-box.json +209 -0
- package/manifest/components/autocomplete.json +197 -0
- package/manifest/components/avatar-group.json +72 -0
- package/manifest/components/avatar.json +95 -0
- package/manifest/components/breadcrumb.json +74 -0
- package/manifest/components/button-group.json +74 -0
- package/manifest/components/button.json +125 -0
- package/manifest/components/calendar.json +65 -0
- package/manifest/components/card.json +140 -0
- package/manifest/components/carousel.json +200 -0
- package/manifest/components/channel-matrix.json +173 -0
- package/manifest/components/chart-container.json +111 -0
- package/manifest/components/chart-ramp.json +72 -0
- package/manifest/components/chart-swatch.json +65 -0
- package/manifest/components/chart-tooltip-content.json +114 -0
- package/manifest/components/checkbox-group.json +68 -0
- package/manifest/components/checkbox.json +93 -0
- package/manifest/components/chip.json +132 -0
- package/manifest/components/collapsible.json +120 -0
- package/manifest/components/color-area.json +59 -0
- package/manifest/components/color-field.json +79 -0
- package/manifest/components/color-picker.json +175 -0
- package/manifest/components/color-slider.json +75 -0
- package/manifest/components/color-swatch.json +68 -0
- package/manifest/components/colors-section.json +66 -0
- package/manifest/components/combobox.json +198 -0
- package/manifest/components/command-palette.json +177 -0
- package/manifest/components/composer.json +176 -0
- package/manifest/components/container.json +60 -0
- package/manifest/components/context-menu.json +121 -0
- package/manifest/components/copy-button.json +93 -0
- package/manifest/components/cue-logotype.json +96 -0
- package/manifest/components/cue-mark.json +97 -0
- package/manifest/components/cue-portal-frame.json +55 -0
- package/manifest/components/data-table-pagination.json +83 -0
- package/manifest/components/data-table-toolbar.json +104 -0
- package/manifest/components/date-field.json +80 -0
- package/manifest/components/date-picker.json +191 -0
- package/manifest/components/date-range-picker.json +191 -0
- package/manifest/components/delegation-card.json +144 -0
- package/manifest/components/density.json +58 -0
- package/manifest/components/description-list.json +84 -0
- package/manifest/components/dialog.json +198 -0
- package/manifest/components/disclosure.json +109 -0
- package/manifest/components/dmx-bar.json +94 -0
- package/manifest/components/dmx-strip.json +101 -0
- package/manifest/components/drawer.json +179 -0
- package/manifest/components/dropdown-menu.json +229 -0
- package/manifest/components/empty-state.json +90 -0
- package/manifest/components/env-var-input.json +150 -0
- package/manifest/components/export-dialog.json +84 -0
- package/manifest/components/eyebrow.json +56 -0
- package/manifest/components/field-description.json +63 -0
- package/manifest/components/field-error.json +77 -0
- package/manifest/components/field-label.json +63 -0
- package/manifest/components/field.json +79 -0
- package/manifest/components/file-upload.json +159 -0
- package/manifest/components/flow-background.json +50 -0
- package/manifest/components/flow-controls.json +50 -0
- package/manifest/components/footer.json +112 -0
- package/manifest/components/grid.json +81 -0
- package/manifest/components/group-bar.json +102 -0
- package/manifest/components/hover-card.json +151 -0
- package/manifest/components/icon-button.json +88 -0
- package/manifest/components/info-tip.json +98 -0
- package/manifest/components/input-group.json +91 -0
- package/manifest/components/input.json +89 -0
- package/manifest/components/item.json +129 -0
- package/manifest/components/kbd.json +52 -0
- package/manifest/components/link.json +81 -0
- package/manifest/components/log-viewer.json +139 -0
- package/manifest/components/menubar.json +157 -0
- package/manifest/components/message-list.json +100 -0
- package/manifest/components/message.json +116 -0
- package/manifest/components/meter.json +114 -0
- package/manifest/components/multi-select.json +190 -0
- package/manifest/components/musical-time-input.json +113 -0
- package/manifest/components/navigation-menu.json +226 -0
- package/manifest/components/node-card.json +109 -0
- package/manifest/components/node-handle.json +69 -0
- package/manifest/components/number-field.json +107 -0
- package/manifest/components/otp-field.json +128 -0
- package/manifest/components/page-shell.json +96 -0
- package/manifest/components/pagination.json +92 -0
- package/manifest/components/panel-header.json +77 -0
- package/manifest/components/panel.json +71 -0
- package/manifest/components/password-input.json +119 -0
- package/manifest/components/piano-keyboard.json +120 -0
- package/manifest/components/plussie.json +111 -0
- package/manifest/components/popover.json +193 -0
- package/manifest/components/preset-section.json +73 -0
- package/manifest/components/progress.json +95 -0
- package/manifest/components/radio-group.json +73 -0
- package/manifest/components/radio.json +80 -0
- package/manifest/components/rating.json +141 -0
- package/manifest/components/resizable.json +88 -0
- package/manifest/components/row.json +109 -0
- package/manifest/components/scroll-area.json +91 -0
- package/manifest/components/scrollable-tabs-list.json +83 -0
- package/manifest/components/scrub-input.json +200 -0
- package/manifest/components/seam-cell.json +75 -0
- package/manifest/components/seam-grid.json +75 -0
- package/manifest/components/seam-list.json +56 -0
- package/manifest/components/search-input.json +134 -0
- package/manifest/components/section-header.json +112 -0
- package/manifest/components/segmented-control.json +138 -0
- package/manifest/components/select.json +194 -0
- package/manifest/components/separator.json +53 -0
- package/manifest/components/shape-section.json +66 -0
- package/manifest/components/sheet.json +186 -0
- package/manifest/components/sidebar.json +198 -0
- package/manifest/components/signal-edge.json +56 -0
- package/manifest/components/skeleton.json +46 -0
- package/manifest/components/slider.json +89 -0
- package/manifest/components/sparkline.json +76 -0
- package/manifest/components/spectrum-visualizer.json +115 -0
- package/manifest/components/spinner.json +61 -0
- package/manifest/components/stack.json +96 -0
- package/manifest/components/stat.json +87 -0
- package/manifest/components/status-bar.json +58 -0
- package/manifest/components/status-dot.json +78 -0
- package/manifest/components/stepper.json +89 -0
- package/manifest/components/switch.json +87 -0
- package/manifest/components/table-scroll-region.json +69 -0
- package/manifest/components/table.json +155 -0
- package/manifest/components/tabs.json +145 -0
- package/manifest/components/tags-input.json +190 -0
- package/manifest/components/terminal-frame.json +119 -0
- package/manifest/components/textarea.json +76 -0
- package/manifest/components/theme-configurator.json +124 -0
- package/manifest/components/theme-provider.json +134 -0
- package/manifest/components/threshold-rail.json +160 -0
- package/manifest/components/time-field.json +80 -0
- package/manifest/components/timeline-ruler.json +139 -0
- package/manifest/components/timeline.json +115 -0
- package/manifest/components/title-bar.json +82 -0
- package/manifest/components/toast.json +130 -0
- package/manifest/components/toggle-group.json +106 -0
- package/manifest/components/toggle.json +109 -0
- package/manifest/components/token-editor.json +90 -0
- package/manifest/components/toolbar.json +163 -0
- package/manifest/components/tooltip.json +164 -0
- package/manifest/components/tree-visibility-toggle.json +84 -0
- package/manifest/components/tree.json +140 -0
- package/manifest/components/two-step-button.json +113 -0
- package/manifest/components/universe-grid.json +127 -0
- package/manifest/components/usage-chart.json +124 -0
- package/manifest/manifest.json +2142 -0
- package/manifest/tokens.json +138 -0
- package/package.json +13 -5
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Calendar",
|
|
3
|
+
"slug": "calendar",
|
|
4
|
+
"group": "date",
|
|
5
|
+
"importPath": "@cueplusplus/ui/date",
|
|
6
|
+
"peerDependencies": [
|
|
7
|
+
"react-day-picker"
|
|
8
|
+
],
|
|
9
|
+
"clientOnly": true,
|
|
10
|
+
"description": "A month grid, on react-day-picker v10.\n\nSelection modes, keyboard navigation, the ARIA grid wiring and the date maths\n(date-fns under the hood) are the library's; this layer supplies the token\nskin and nothing else, so upgrading the library never means re-deriving\nbehaviour. Every `classNames` slot the caller passes is merged *over* the\nskin rather than replacing it.\n\n`react-day-picker` and `date-fns` are **optional peers**: import this from\n`@cueplusplus/ui/date`, never from the core barrel.",
|
|
11
|
+
"props": [],
|
|
12
|
+
"typeReferences": [
|
|
13
|
+
"DayPickerProps"
|
|
14
|
+
],
|
|
15
|
+
"subcomponents": [],
|
|
16
|
+
"parts": [],
|
|
17
|
+
"variants": {},
|
|
18
|
+
"defaultVariants": {},
|
|
19
|
+
"tokensUsed": [
|
|
20
|
+
"--cue-accent",
|
|
21
|
+
"--cue-accent-fg",
|
|
22
|
+
"--cue-accent-hover",
|
|
23
|
+
"--cue-accent-soft",
|
|
24
|
+
"--cue-border",
|
|
25
|
+
"--cue-control-sm",
|
|
26
|
+
"--cue-fg",
|
|
27
|
+
"--cue-fg-muted",
|
|
28
|
+
"--cue-fg-subtle",
|
|
29
|
+
"--cue-font-mono",
|
|
30
|
+
"--cue-icon-sm",
|
|
31
|
+
"--cue-radius-control",
|
|
32
|
+
"--cue-space-2",
|
|
33
|
+
"--cue-space-5",
|
|
34
|
+
"--cue-sunken",
|
|
35
|
+
"--cue-surface-3",
|
|
36
|
+
"--cue-text-label",
|
|
37
|
+
"--cue-text-micro",
|
|
38
|
+
"--cue-text-ui"
|
|
39
|
+
],
|
|
40
|
+
"summary": "A month grid, on react-day-picker v10.",
|
|
41
|
+
"examples": [
|
|
42
|
+
{
|
|
43
|
+
"title": "Usage",
|
|
44
|
+
"code": "<Calendar mode=\"single\" selected={date} onSelect={setDate} />\n<Calendar mode=\"range\" numberOfMonths={2} selected={range} onSelect={setRange} />",
|
|
45
|
+
"language": "tsx"
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
"status": "todo-docs",
|
|
49
|
+
"url": "/docs/components/calendar",
|
|
50
|
+
"mdUrl": "/docs/components/calendar.md",
|
|
51
|
+
"jsonUrl": "/r/components/calendar.json",
|
|
52
|
+
"specimens": [
|
|
53
|
+
{
|
|
54
|
+
"title": "Calendar",
|
|
55
|
+
"group": "date",
|
|
56
|
+
"components": [
|
|
57
|
+
"Calendar"
|
|
58
|
+
],
|
|
59
|
+
"code": "<div className=\"flex flex-wrap gap-(--cue-space-6)\">\n <Specimen label=\"single\">\n <Calendar\n mode=\"single\"\n month={TODAY}\n selected={day}\n onSelect={setDay}\n aria-label=\"Go-live date\"\n />\n </Specimen>\n <Specimen label=\"range\">\n <Calendar\n mode=\"range\"\n month={TODAY}\n selected={range}\n onSelect={setRange}\n aria-label=\"Run of the show\"\n />\n </Specimen>\n <Specimen label=\"with disabled days\">\n <Calendar\n mode=\"single\"\n month={TODAY}\n disabled={{ dayOfWeek: [0, 6] }}\n aria-label=\"Weekdays only\"\n />\n </Specimen>\n</div>",
|
|
60
|
+
"note": "react-day-picker's month grid, restyled from tokens. Speaks plain `Date`, because that is what a show file holds.",
|
|
61
|
+
"interaction": "arrow keys walk the grid, Page Up and Page Down change month; the selected day is accent-soft, today is ringed."
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"todo": true
|
|
65
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Card",
|
|
3
|
+
"slug": "card",
|
|
4
|
+
"group": "layout",
|
|
5
|
+
"importPath": "@cueplusplus/ui",
|
|
6
|
+
"peerDependencies": [],
|
|
7
|
+
"clientOnly": false,
|
|
8
|
+
"description": "A padded container for one thing: a summary, a setting group, a preview.\n\nEvery section paints its own `surface-1` ground, which is what lets the root\nswitch to the seam idiom without any of the parts knowing.",
|
|
9
|
+
"props": [],
|
|
10
|
+
"typeReferences": [],
|
|
11
|
+
"subcomponents": [
|
|
12
|
+
"Root",
|
|
13
|
+
"Header",
|
|
14
|
+
"Title",
|
|
15
|
+
"Description",
|
|
16
|
+
"Content",
|
|
17
|
+
"Footer"
|
|
18
|
+
],
|
|
19
|
+
"parts": [
|
|
20
|
+
{
|
|
21
|
+
"name": "Root",
|
|
22
|
+
"usage": "Card.Root",
|
|
23
|
+
"description": "The card frame: one hairline rim, one raised surface, one radius.\n\nDeliberately the same shape as `Panel` — a console must not have two\ncompeting container languages. What differs is the inside: a `Panel` holds\nrows that reach its rim, a `Card` holds a padded block of prose, numbers or\ncontrols. Reach for `Panel` when the content is a list; reach for `Card` when\nthe content is a thing.\n\nStatic markup — no `\"use client\"`.",
|
|
24
|
+
"props": [
|
|
25
|
+
{
|
|
26
|
+
"name": "seam",
|
|
27
|
+
"type": "boolean",
|
|
28
|
+
"required": false,
|
|
29
|
+
"defaultValue": "false",
|
|
30
|
+
"description": "Separate the card's sections with hairline seams instead of whitespace.\n\nThe card is then filled with the border colour and its sections sit `1px`\napart, each painting its own opaque ground — the same idiom as `SeamList`,\nwhere the gap *is* the rule and can never double up with a border."
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"typeReferences": [
|
|
34
|
+
"React.ComponentPropsWithoutRef<\"div\">"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "Header",
|
|
39
|
+
"usage": "Card.Header",
|
|
40
|
+
"description": "The card's title block: heading column left, actions right.\n\nCarries no bottom padding of its own, so the body's own `p-(--cue-space-5)`\nis the whole gap between the two. Under `seam` it takes its full padding\nback, because the hairline — not the whitespace — is then the separator.",
|
|
41
|
+
"props": [
|
|
42
|
+
{
|
|
43
|
+
"name": "actions",
|
|
44
|
+
"type": "ReactNode",
|
|
45
|
+
"required": false,
|
|
46
|
+
"defaultValue": null,
|
|
47
|
+
"description": "Right-hand slot: the controls that act on the whole card (a menu, a status\nchip, a count)."
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "children",
|
|
51
|
+
"type": "ReactNode",
|
|
52
|
+
"required": false,
|
|
53
|
+
"defaultValue": null,
|
|
54
|
+
"description": "The leading cluster — normally a {@link CardTitle} and a description."
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"typeReferences": [
|
|
58
|
+
"React.ComponentPropsWithoutRef<\"div\">"
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "Title",
|
|
63
|
+
"usage": "Card.Title",
|
|
64
|
+
"description": "The card's name, one type rung above body text.\n\nAn `<h3>`, because a card is almost always nested under a page `<h1>` and a\nsection `<h2>`. Where that is wrong, style your own heading with these\nclasses rather than nesting the wrong level.",
|
|
65
|
+
"props": [],
|
|
66
|
+
"typeReferences": [
|
|
67
|
+
"React.ComponentPropsWithoutRef<\"h3\">"
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "Description",
|
|
72
|
+
"usage": "Card.Description",
|
|
73
|
+
"description": "One supporting line under a {@link CardTitle}.",
|
|
74
|
+
"props": [],
|
|
75
|
+
"typeReferences": [
|
|
76
|
+
"React.ComponentPropsWithoutRef<\"p\">"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "Content",
|
|
81
|
+
"usage": "Card.Content",
|
|
82
|
+
"description": "The card's body, on the card padding rung.",
|
|
83
|
+
"props": [],
|
|
84
|
+
"typeReferences": [
|
|
85
|
+
"React.ComponentPropsWithoutRef<\"div\">"
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "Footer",
|
|
90
|
+
"usage": "Card.Footer",
|
|
91
|
+
"description": "The action strip at the foot of a card. Right-aligned, like a dialog's.",
|
|
92
|
+
"props": [],
|
|
93
|
+
"typeReferences": [
|
|
94
|
+
"React.ComponentPropsWithoutRef<\"div\">"
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"variants": {},
|
|
99
|
+
"defaultVariants": {},
|
|
100
|
+
"tokensUsed": [
|
|
101
|
+
"--cue-border",
|
|
102
|
+
"--cue-fg",
|
|
103
|
+
"--cue-fg-muted",
|
|
104
|
+
"--cue-font-mono",
|
|
105
|
+
"--cue-radius-surface",
|
|
106
|
+
"--cue-space-1",
|
|
107
|
+
"--cue-space-2",
|
|
108
|
+
"--cue-space-3",
|
|
109
|
+
"--cue-space-4",
|
|
110
|
+
"--cue-space-5",
|
|
111
|
+
"--cue-surface-1",
|
|
112
|
+
"--cue-text-emphasis",
|
|
113
|
+
"--cue-text-ui"
|
|
114
|
+
],
|
|
115
|
+
"summary": "A padded container for one thing: a summary, a setting group, a preview.",
|
|
116
|
+
"examples": [
|
|
117
|
+
{
|
|
118
|
+
"title": "Usage",
|
|
119
|
+
"code": "<Card.Root seam>\n <Card.Header><Card.Title>Failover</Card.Title></Card.Header>\n <Card.Content>…</Card.Content>\n</Card.Root>",
|
|
120
|
+
"language": "tsx"
|
|
121
|
+
}
|
|
122
|
+
],
|
|
123
|
+
"status": "todo-docs",
|
|
124
|
+
"url": "/docs/components/card",
|
|
125
|
+
"mdUrl": "/docs/components/card.md",
|
|
126
|
+
"jsonUrl": "/r/components/card.json",
|
|
127
|
+
"specimens": [
|
|
128
|
+
{
|
|
129
|
+
"title": "Card",
|
|
130
|
+
"group": "layout",
|
|
131
|
+
"components": [
|
|
132
|
+
"Card"
|
|
133
|
+
],
|
|
134
|
+
"code": "<div className=\"grid w-full gap-(--cue-space-5) lg:grid-cols-2\">\n <Card.Root>\n <Card.Header actions={<Chip tone=\"ok\">patched</Chip>}>\n <Card.Title>Front truss</Card.Title>\n <Card.Description>6 fixtures, universe 1.</Card.Description>\n </Card.Header>\n <Card.Content>\n <DescriptionList.Root>\n <DescriptionList.Term>Type</DescriptionList.Term>\n <DescriptionList.Detail>Source Four 26°</DescriptionList.Detail>\n <DescriptionList.Term>Channels</DescriptionList.Term>\n <DescriptionList.Detail>1 to 48</DescriptionList.Detail>\n </DescriptionList.Root>\n </Card.Content>\n <Card.Footer>\n <Button size=\"sm\">Inspect</Button>\n </Card.Footer>\n </Card.Root>\n <Card.Root seam>\n <Card.Header>\n <Card.Title>Seam card</Card.Title>\n <Card.Description>Separated by gaps, not rules.</Card.Description>\n </Card.Header>\n <Card.Content>The 1px-gap idiom, at card scale.</Card.Content>\n </Card.Root>\n</div>",
|
|
135
|
+
"note": "A panel with body padding and a title family. `seam` swaps the hairline separation for the 1px-gap idiom.",
|
|
136
|
+
"interaction": "none by default; wrap the header in a button if the card is a link."
|
|
137
|
+
}
|
|
138
|
+
],
|
|
139
|
+
"todo": true
|
|
140
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Carousel",
|
|
3
|
+
"slug": "carousel",
|
|
4
|
+
"group": "layout",
|
|
5
|
+
"importPath": "@cueplusplus/ui/layout/carousel",
|
|
6
|
+
"peerDependencies": [
|
|
7
|
+
"embla-carousel-react"
|
|
8
|
+
],
|
|
9
|
+
"clientOnly": true,
|
|
10
|
+
"description": "A swipeable strip of slides, on embla.\n\n`embla-carousel-react` is an **optional peer**: import this from\n`@cueplusplus/ui/layout/carousel`, never from the core barrel, so an app that\nships no carousel never installs one.",
|
|
11
|
+
"props": [],
|
|
12
|
+
"typeReferences": [],
|
|
13
|
+
"subcomponents": [
|
|
14
|
+
"Root",
|
|
15
|
+
"Content",
|
|
16
|
+
"Slide",
|
|
17
|
+
"Previous",
|
|
18
|
+
"Next",
|
|
19
|
+
"Dots"
|
|
20
|
+
],
|
|
21
|
+
"parts": [
|
|
22
|
+
{
|
|
23
|
+
"name": "Root",
|
|
24
|
+
"usage": "Carousel.Root",
|
|
25
|
+
"description": "The carousel frame: sets up embla and publishes its state to the parts.\n\nFocusable and wired to the arrow keys, because a carousel a mouse can drive\nand a keyboard cannot is not a carousel (WCAG 2.1.1).",
|
|
26
|
+
"props": [
|
|
27
|
+
{
|
|
28
|
+
"name": "options",
|
|
29
|
+
"type": "Partial<OptionsType>",
|
|
30
|
+
"required": false,
|
|
31
|
+
"defaultValue": null,
|
|
32
|
+
"description": "embla options, merged over the axis this component derives from `orientation`."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "plugins",
|
|
36
|
+
"type": "CreatePluginType<LoosePluginType, {}>[]",
|
|
37
|
+
"required": false,
|
|
38
|
+
"defaultValue": null,
|
|
39
|
+
"description": "embla plugins (autoplay, class names, wheel gestures…)."
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"name": "orientation",
|
|
43
|
+
"type": "\"horizontal\" | \"vertical\"",
|
|
44
|
+
"required": false,
|
|
45
|
+
"defaultValue": "horizontal",
|
|
46
|
+
"description": "Which way the slides travel. Defaults to `\"horizontal\"`."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "label",
|
|
50
|
+
"type": "string",
|
|
51
|
+
"required": false,
|
|
52
|
+
"defaultValue": "Carousel",
|
|
53
|
+
"description": "The region's accessible name. Defaults to `\"Carousel\"`."
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "setApi",
|
|
57
|
+
"type": "((api: EmblaCarouselType) => void)",
|
|
58
|
+
"required": false,
|
|
59
|
+
"defaultValue": null,
|
|
60
|
+
"description": "Receives the embla instance once mounted — the escape hatch to its full API."
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"typeReferences": [
|
|
64
|
+
"Omit<React.ComponentPropsWithoutRef<\"div\">, \"onSelect\">"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"name": "Content",
|
|
69
|
+
"usage": "Carousel.Content",
|
|
70
|
+
"description": "The clipping viewport and the track inside it.\n\nTwo elements rather than one because embla measures the viewport and\ntranslates the track; giving one element both jobs makes the transform fight\nthe overflow. Each child is wrapped so `Carousel.Slide` can name itself\n\"Slide 2 of 5\" without the call site counting.",
|
|
71
|
+
"props": [
|
|
72
|
+
{
|
|
73
|
+
"name": "trackClassName",
|
|
74
|
+
"type": "string",
|
|
75
|
+
"required": false,
|
|
76
|
+
"defaultValue": null,
|
|
77
|
+
"description": "Extra classes for the flex track inside the viewport."
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"typeReferences": [
|
|
81
|
+
"React.ComponentPropsWithoutRef<\"div\">"
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"name": "Slide",
|
|
86
|
+
"usage": "Carousel.Slide",
|
|
87
|
+
"description": "One slide. `basis-full` by default, so a slide fills the viewport; override\nwith `className=\"basis-1/3\"` for a multi-up carousel.",
|
|
88
|
+
"props": [
|
|
89
|
+
{
|
|
90
|
+
"name": "label",
|
|
91
|
+
"type": "string",
|
|
92
|
+
"required": false,
|
|
93
|
+
"defaultValue": null,
|
|
94
|
+
"description": "Override the spoken name. Defaults to `\"Slide <n> of <total>\"`."
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
"typeReferences": [
|
|
98
|
+
"React.ComponentPropsWithoutRef<\"div\">"
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"name": "Previous",
|
|
103
|
+
"usage": "Carousel.Previous",
|
|
104
|
+
"description": "Step one slide back. Disabled at the start unless the carousel loops.",
|
|
105
|
+
"props": [
|
|
106
|
+
{
|
|
107
|
+
"name": "aria-label",
|
|
108
|
+
"type": "string",
|
|
109
|
+
"required": false,
|
|
110
|
+
"defaultValue": "Previous slide",
|
|
111
|
+
"description": "Override the spoken name."
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"name": "render",
|
|
115
|
+
"type": "RenderProp<Record<string, unknown>>",
|
|
116
|
+
"required": false,
|
|
117
|
+
"defaultValue": null,
|
|
118
|
+
"description": "Replace the rendered element (Base UI render prop)."
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
"typeReferences": [
|
|
122
|
+
"Omit<IconButtonProps, \"aria-label\" | \"icon\">"
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"name": "Next",
|
|
127
|
+
"usage": "Carousel.Next",
|
|
128
|
+
"description": "Step one slide forward. Disabled at the end unless the carousel loops.",
|
|
129
|
+
"props": [
|
|
130
|
+
{
|
|
131
|
+
"name": "aria-label",
|
|
132
|
+
"type": "string",
|
|
133
|
+
"required": false,
|
|
134
|
+
"defaultValue": "Next slide",
|
|
135
|
+
"description": "Override the spoken name."
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"name": "render",
|
|
139
|
+
"type": "RenderProp<Record<string, unknown>>",
|
|
140
|
+
"required": false,
|
|
141
|
+
"defaultValue": null,
|
|
142
|
+
"description": "Replace the rendered element (Base UI render prop)."
|
|
143
|
+
}
|
|
144
|
+
],
|
|
145
|
+
"typeReferences": [
|
|
146
|
+
"Omit<IconButtonProps, \"aria-label\" | \"icon\">"
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"name": "Dots",
|
|
151
|
+
"usage": "Carousel.Dots",
|
|
152
|
+
"description": "One dot per scroll snap: position, and a way to jump straight to it.",
|
|
153
|
+
"props": [
|
|
154
|
+
{
|
|
155
|
+
"name": "dotLabel",
|
|
156
|
+
"type": "((index: number) => string)",
|
|
157
|
+
"required": false,
|
|
158
|
+
"defaultValue": "(index) => `Go to slide ${index + 1}`",
|
|
159
|
+
"description": "Builds each dot's spoken name. Defaults to `\"Go to slide <n>\"`."
|
|
160
|
+
}
|
|
161
|
+
],
|
|
162
|
+
"typeReferences": [
|
|
163
|
+
"Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\">"
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
],
|
|
167
|
+
"variants": {},
|
|
168
|
+
"defaultVariants": {},
|
|
169
|
+
"tokensUsed": [
|
|
170
|
+
"--cue-accent",
|
|
171
|
+
"--cue-border-strong",
|
|
172
|
+
"--cue-space-2",
|
|
173
|
+
"--cue-space-4"
|
|
174
|
+
],
|
|
175
|
+
"summary": "A swipeable strip of slides, on embla.",
|
|
176
|
+
"examples": [
|
|
177
|
+
{
|
|
178
|
+
"title": "Usage",
|
|
179
|
+
"code": "<Carousel.Root label=\"Fixture gallery\" options={{ loop: true }}>\n <Carousel.Content>\n {shots.map((s) => <Carousel.Slide key={s.id}><img src={s.src} /></Carousel.Slide>)}\n </Carousel.Content>\n <Carousel.Previous />\n <Carousel.Next />\n <Carousel.Dots />\n</Carousel.Root>",
|
|
180
|
+
"language": "tsx"
|
|
181
|
+
}
|
|
182
|
+
],
|
|
183
|
+
"status": "todo-docs",
|
|
184
|
+
"url": "/docs/components/carousel",
|
|
185
|
+
"mdUrl": "/docs/components/carousel.md",
|
|
186
|
+
"jsonUrl": "/r/components/carousel.json",
|
|
187
|
+
"specimens": [
|
|
188
|
+
{
|
|
189
|
+
"title": "Carousel",
|
|
190
|
+
"group": "layout",
|
|
191
|
+
"components": [
|
|
192
|
+
"Carousel"
|
|
193
|
+
],
|
|
194
|
+
"code": "<Carousel.Root label=\"Fixture profiles\" className=\"w-full max-w-[32rem]\">\n <Carousel.Content>\n {[\"Source Four\", \"MAC Viper\", \"Sharpy Plus\"].map((name) => (\n <Carousel.Slide key={name} label={name} className=\"basis-1/2\">\n <Panel className=\"flex h-[6rem] items-center justify-center p-(--cue-space-4) font-mono text-(length:--cue-text-ui) text-fg-muted\">\n {name}\n </Panel>\n </Carousel.Slide>\n ))}\n </Carousel.Content>\n <div className=\"mt-(--cue-space-4) flex items-center gap-(--cue-space-3)\">\n <Carousel.Previous />\n <Carousel.Next />\n <Carousel.Dots />\n </div>\n</Carousel.Root>",
|
|
195
|
+
"note": "Embla, wearing the tokens. An optional peer, so it ships from @cueplusplus/ui/layout/carousel rather than the core barrel.",
|
|
196
|
+
"interaction": "drag or use the two controls; the dots are buttons and each says which slide it goes to."
|
|
197
|
+
}
|
|
198
|
+
],
|
|
199
|
+
"todo": true
|
|
200
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ChannelMatrix",
|
|
3
|
+
"slug": "channel-matrix",
|
|
4
|
+
"group": "dmx",
|
|
5
|
+
"importPath": "@cueplusplus/ui/dmx",
|
|
6
|
+
"peerDependencies": [],
|
|
7
|
+
"clientOnly": true,
|
|
8
|
+
"description": "The channel-by-channel view: 512 addressed cells, repainted imperatively.\n\nPorted from dmxhub's bridge debugger. The interesting part is not the grid —\nit is what happens between frames. Five hundred and twelve React elements\nre-rendered forty times a second is a locked tab, so this component renders\nthe grid *once* and then never re-renders it: an animation loop reads the\nbuffer, diffs each slot against a previous-value cache, and writes only the\ncells whose level actually moved. A typical lighting state changes a handful\nof channels per frame, so a typical frame touches a handful of nodes.\n\nThat is also why `data` is read through a ref rather than through props: a\ndecoder that writes into one buffer forever is the cheapest thing it can do,\nand this component is built to be pointed at exactly that.\n\nTwo things it keeps from the port, and one it fixes:\n\n- **Two ramps.** Grey answers \"how bright\", the status ramp answers \"which\n ones are hot\". Both are lookup tables, built once per theme (see `_ramp.ts`).\n- **Overview and drill-in.** Thirty-two universes as thumbnails, drawn through\n one 32×16 offscreen canvas and scaled up unsmoothed; clicking one opens it.\n- **It stops.** The original left `requestAnimationFrame` running forever. Here\n the loop is off under `prefers-reduced-motion` and off when `live` is\n `false`; a new `data` reference still repaints, so a paused stream is never\n a stale grid.",
|
|
9
|
+
"props": [
|
|
10
|
+
{
|
|
11
|
+
"name": "data",
|
|
12
|
+
"type": "Uint8Array<ArrayBufferLike>",
|
|
13
|
+
"required": false,
|
|
14
|
+
"defaultValue": null,
|
|
15
|
+
"description": "The frame buffer: `universes × 512` bytes, universe 0 first.\n\nRead on every animation frame rather than on every render, so mutating it\nin place is the intended usage — that is what makes a 40 Hz stream cost one\n`requestAnimationFrame` instead of one React render per packet. The one\nthing that does not follow an in-place write is the accessible summary,\nwhich is computed in render and so refreshes when a new reference arrives."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "universes",
|
|
19
|
+
"type": "number",
|
|
20
|
+
"required": false,
|
|
21
|
+
"defaultValue": "1",
|
|
22
|
+
"description": "How many universes the buffer holds. Defaults to `1`."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "universe",
|
|
26
|
+
"type": "number",
|
|
27
|
+
"required": false,
|
|
28
|
+
"defaultValue": null,
|
|
29
|
+
"description": "Selected universe, 0-based. Use with `onUniverseChange` for a controlled widget."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "defaultUniverse",
|
|
33
|
+
"type": "number",
|
|
34
|
+
"required": false,
|
|
35
|
+
"defaultValue": "0",
|
|
36
|
+
"description": "Initially selected universe for an uncontrolled widget. Defaults to `0`."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "onUniverseChange",
|
|
40
|
+
"type": "((universe: number) => void)",
|
|
41
|
+
"required": false,
|
|
42
|
+
"defaultValue": null,
|
|
43
|
+
"description": "Called with the universe a drill-in selected."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "mode",
|
|
47
|
+
"type": "\"detail\" | \"overview\"",
|
|
48
|
+
"required": false,
|
|
49
|
+
"defaultValue": null,
|
|
50
|
+
"description": "Current view. Use with `onModeChange` for a controlled widget."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "defaultMode",
|
|
54
|
+
"type": "\"detail\" | \"overview\"",
|
|
55
|
+
"required": false,
|
|
56
|
+
"defaultValue": "detail",
|
|
57
|
+
"description": "Initial view for an uncontrolled widget. Defaults to `\"detail\"`."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "onModeChange",
|
|
61
|
+
"type": "((mode: ChannelMatrixMode) => void)",
|
|
62
|
+
"required": false,
|
|
63
|
+
"defaultValue": null,
|
|
64
|
+
"description": "Called when the view changes, including on a drill-in."
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"name": "ramp",
|
|
68
|
+
"type": "\"value\" | \"mono\"",
|
|
69
|
+
"required": false,
|
|
70
|
+
"defaultValue": null,
|
|
71
|
+
"description": "Cell colouring. Use with `onRampChange` for a controlled widget."
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"name": "defaultRamp",
|
|
75
|
+
"type": "\"value\" | \"mono\"",
|
|
76
|
+
"required": false,
|
|
77
|
+
"defaultValue": "mono",
|
|
78
|
+
"description": "Initial cell colouring for an uncontrolled widget. Defaults to `\"mono\"`."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"name": "onRampChange",
|
|
82
|
+
"type": "((ramp: \"value\" | \"mono\") => void)",
|
|
83
|
+
"required": false,
|
|
84
|
+
"defaultValue": null,
|
|
85
|
+
"description": "Called when the colouring changes."
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"name": "live",
|
|
89
|
+
"type": "boolean",
|
|
90
|
+
"required": false,
|
|
91
|
+
"defaultValue": "true",
|
|
92
|
+
"description": "Whether frames are still arriving. Defaults to `true`; `false` stops the repaint loop."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "controls",
|
|
96
|
+
"type": "boolean",
|
|
97
|
+
"required": false,
|
|
98
|
+
"defaultValue": "true",
|
|
99
|
+
"description": "Show the view and colouring buttons. Defaults to `true`."
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"name": "label",
|
|
103
|
+
"type": "string",
|
|
104
|
+
"required": false,
|
|
105
|
+
"defaultValue": null,
|
|
106
|
+
"description": "What this output is. Defaults to `\"DMX output\"`."
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"name": "formatUniverse",
|
|
110
|
+
"type": "((universe: number) => string)",
|
|
111
|
+
"required": false,
|
|
112
|
+
"defaultValue": "(value) => `Universe ${value}`",
|
|
113
|
+
"description": "Name a universe for its button and card. Defaults to `\"Universe 3\"` / `U03`."
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
"typeReferences": [
|
|
117
|
+
"Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\">"
|
|
118
|
+
],
|
|
119
|
+
"subcomponents": [],
|
|
120
|
+
"parts": [],
|
|
121
|
+
"variants": {},
|
|
122
|
+
"defaultVariants": {},
|
|
123
|
+
"tokensUsed": [
|
|
124
|
+
"--cue-accent",
|
|
125
|
+
"--cue-accent-soft",
|
|
126
|
+
"--cue-border",
|
|
127
|
+
"--cue-border-overlay",
|
|
128
|
+
"--cue-control-sm",
|
|
129
|
+
"--cue-data-ground",
|
|
130
|
+
"--cue-fg",
|
|
131
|
+
"--cue-fg-muted",
|
|
132
|
+
"--cue-fg-subtle",
|
|
133
|
+
"--cue-font-mono",
|
|
134
|
+
"--cue-radius-control",
|
|
135
|
+
"--cue-radius-overlay",
|
|
136
|
+
"--cue-scrim",
|
|
137
|
+
"--cue-space-1",
|
|
138
|
+
"--cue-space-2",
|
|
139
|
+
"--cue-space-3",
|
|
140
|
+
"--cue-space-4",
|
|
141
|
+
"--cue-surface-1",
|
|
142
|
+
"--cue-surface-2",
|
|
143
|
+
"--cue-text-emphasis",
|
|
144
|
+
"--cue-text-label",
|
|
145
|
+
"--cue-text-micro",
|
|
146
|
+
"--cue-text-ui"
|
|
147
|
+
],
|
|
148
|
+
"summary": "The channel-by-channel view: 512 addressed cells, repainted imperatively.",
|
|
149
|
+
"examples": [
|
|
150
|
+
{
|
|
151
|
+
"title": "Usage",
|
|
152
|
+
"code": "<ChannelMatrix label=\"Output\" data={buffer} universes={32} />",
|
|
153
|
+
"language": "tsx"
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
"status": "todo-docs",
|
|
157
|
+
"url": "/docs/components/channel-matrix",
|
|
158
|
+
"mdUrl": "/docs/components/channel-matrix.md",
|
|
159
|
+
"jsonUrl": "/r/components/channel-matrix.json",
|
|
160
|
+
"specimens": [
|
|
161
|
+
{
|
|
162
|
+
"title": "ChannelMatrix",
|
|
163
|
+
"group": "dmx",
|
|
164
|
+
"components": [
|
|
165
|
+
"ChannelMatrix"
|
|
166
|
+
],
|
|
167
|
+
"code": "<div className=\"flex w-full flex-col gap-(--cue-space-5)\">\n <ChannelMatrix data={data} universes={4} label=\"Universe 1 channels\" />\n <ChannelMatrix\n data={data}\n universes={4}\n defaultMode=\"overview\"\n defaultRamp=\"value\"\n label=\"All universes, value ramp\"\n />\n <ChannelMatrix data={data} controls={false} label=\"Universe 1 channels, no controls\" />\n</div>",
|
|
168
|
+
"note": "A 32×16 grid repainted inside an animation frame against a previous-value cache, with the colour ramps precomputed to a Uint8Array. Two ramps, and an overview mode that drills into one universe.",
|
|
169
|
+
"interaction": "the controls switch universe, mode and ramp; the grid itself reports its occupancy in words."
|
|
170
|
+
}
|
|
171
|
+
],
|
|
172
|
+
"todo": true
|
|
173
|
+
}
|