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