@cloudgrid-io/ui 0.39.0 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +9 -5
  2. package/dist/badge/palette.d.ts +1 -1
  3. package/dist/badge/palette.d.ts.map +1 -1
  4. package/dist/badge/palette.js +2 -2
  5. package/dist/badge/palette.js.map +1 -1
  6. package/dist/blocks/icons.d.ts +28 -0
  7. package/dist/blocks/icons.d.ts.map +1 -1
  8. package/dist/blocks/icons.js +28 -0
  9. package/dist/blocks/icons.js.map +1 -1
  10. package/dist/blocks/phosphor-marks.d.ts +40 -0
  11. package/dist/blocks/phosphor-marks.d.ts.map +1 -1
  12. package/dist/blocks/phosphor-marks.js +60 -0
  13. package/dist/blocks/phosphor-marks.js.map +1 -1
  14. package/dist/blocks/plugged-dialog.d.ts +102 -0
  15. package/dist/blocks/plugged-dialog.d.ts.map +1 -0
  16. package/dist/blocks/plugged-dialog.js +93 -0
  17. package/dist/blocks/plugged-dialog.js.map +1 -0
  18. package/dist/blocks/side-nav.d.ts +12 -2
  19. package/dist/blocks/side-nav.d.ts.map +1 -1
  20. package/dist/blocks/side-nav.js +49 -15
  21. package/dist/blocks/side-nav.js.map +1 -1
  22. package/dist/console.css +55 -19
  23. package/dist/index.d.ts +1 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/theme.css +34 -0
  28. package/dist/tokens/base.json +13 -3
  29. package/dist/tokens.css +28 -10
  30. package/dist/tokens.json +2 -1
  31. package/dist/ui/button.d.ts +1 -1
  32. package/dist/ui/button.d.ts.map +1 -1
  33. package/dist/ui/button.js +16 -0
  34. package/dist/ui/button.js.map +1 -1
  35. package/dist/ui/dialog.d.ts +6 -0
  36. package/dist/ui/dialog.d.ts.map +1 -1
  37. package/dist/ui/dialog.js +7 -1
  38. package/dist/ui/dialog.js.map +1 -1
  39. package/dist/ui/drawer.d.ts +6 -4
  40. package/dist/ui/drawer.d.ts.map +1 -1
  41. package/dist/ui/drawer.js +7 -5
  42. package/dist/ui/drawer.js.map +1 -1
  43. package/package.json +1 -1
@@ -0,0 +1,93 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../lib/cloudgrid-cn.js";
5
+ import { Button } from "../ui/button.js";
6
+ import { Dialog, DialogClose, DialogContent, DialogDescription, DialogTitle, } from "../ui/dialog.js";
7
+ import { EntityCard } from "./entity-card.js";
8
+ /**
9
+ * The success popup after a plug (#370), from the CloudGrid 2026 Figma, node
10
+ * 11324:93350 on frame "Home". The Console opens it after a drop
11
+ * (cloudgrid-console#949).
12
+ *
13
+ * ```
14
+ * .--------------------------------------------.
15
+ * | PLUGGED |
16
+ * | This app is plugged to Design grid |
17
+ * | .------------------. |
18
+ * | | [picture] [App]| |
19
+ * | | orbit-deck * | |
20
+ * | '------------------' |
21
+ * | [ Share ] |
22
+ * | [ Close ] |
23
+ * '--------------------------------------------'
24
+ * ```
25
+ *
26
+ * ## The headline
27
+ *
28
+ * "Plugged", not the frame's "Published" with its mark. "Publish" is a never-say verb in the
29
+ * canon (#366 took it out of the Shelf), and the canon bans the exclamation mark
30
+ * too (product rule 23; Nataly's review on #375). The caller can pass its own
31
+ * through `title`.
32
+ *
33
+ * The frame sets it at Tanker 46 / 1.2 / -1%. The display ramp has no 46 rung;
34
+ * this uses the nearest one, `display-48`, with the 1.2 heading leading and the
35
+ * title tracking (0). A 46 rung is a tokens change, which is the design owner's
36
+ * call, not this block's.
37
+ *
38
+ * ## The line
39
+ *
40
+ * "This app is plugged to **Design** grid". The block owns the shape (the grid
41
+ * name in semibold) and the caller owns the words around it, because they
42
+ * differ by kind: `lineBefore` / `lineAfter`. A caller with a different shape
43
+ * passes `description`, which replaces the whole line.
44
+ *
45
+ * ## The tile
46
+ *
47
+ * `EntityCard`, the frame's "Tile", given the caller's props as they are: the
48
+ * picture, the name, the live dot, the count, the kind badge, and its building
49
+ * state and fallback picture for an app that is not live yet. Nothing about the
50
+ * card is re-drawn here.
51
+ *
52
+ * ## The buttons
53
+ *
54
+ * Share is `cta` (the filled tertiary) with its hairline drawn in the tertiary;
55
+ * Close is `tertiary-soft`. Share calls `onShare` and nothing else: no network,
56
+ * no `navigator.share`, and it does not close the popup. The Console decides
57
+ * what sharing means (the share sheet where there is one, the clipboard where
58
+ * there is not).
59
+ *
60
+ * ## Closing
61
+ *
62
+ * Controlled. Close, Escape and a click on the scrim all reach `onOpenChange`
63
+ * with `false`, through Base UI. Focus moves to the popup itself on open, so a
64
+ * reader hears the title and no button draws its ring before the keyboard
65
+ * reaches it; it returns to what had it, the trigger, on close.
66
+ *
67
+ * The card is white on every page because it portals to the document root,
68
+ * outside any panel or ink scope. Those scopes DO redeclare `--cg-surface-card`
69
+ * (transparent on the panel, a 4% white wash on ink; tokens.css), so the card is
70
+ * white only while it renders at the root, which is Base UI's default portal.
71
+ *
72
+ * On a short window (a phone on its side, 812x375) the card is taller than the
73
+ * viewport. It is capped at the window's height less 2rem and scrolls inside, so
74
+ * the headline and Close stay reachable.
75
+ */
76
+ /** The default copy. Every string passes the canon. */
77
+ export const PLUGGED_DIALOG_DEFAULTS = {
78
+ title: "Plugged",
79
+ lineBefore: "This app is plugged to",
80
+ lineAfter: "grid",
81
+ shareLabel: "Share",
82
+ closeLabel: "Close",
83
+ };
84
+ /** The 330px column the frame gives the tile and Share. */
85
+ const COLUMN = "w-full max-w-82.5";
86
+ /** The frame's two buttons: 48 tall at least, radius 16, 14/32, the UI face, Bold 15. */
87
+ const ACTION = "h-auto min-h-12 rounded-xl px-8 py-3.5 font-ui text-body-sm font-bold";
88
+ function PluggedDialog({ open, onOpenChange, onShare, grid, entity, title = PLUGGED_DIALOG_DEFAULTS.title, lineBefore = PLUGGED_DIALOG_DEFAULTS.lineBefore, lineAfter = PLUGGED_DIALOG_DEFAULTS.lineAfter, description, shareLabel = PLUGGED_DIALOG_DEFAULTS.shareLabel, closeLabel = PLUGGED_DIALOG_DEFAULTS.closeLabel, className, }) {
89
+ const popup = React.useRef(null);
90
+ return (_jsx(Dialog, { open: open, onOpenChange: (next) => onOpenChange(next), children: _jsxs(DialogContent, { ref: popup, "data-slot": "plugged-dialog", initialFocus: popup, showCloseButton: false, className: cn("max-h-[calc(100svh-2rem)] w-full gap-6 overflow-y-auto rounded-2xl border border-hairline bg-card px-8 py-6 text-ink ring-0 sm:max-w-158", className), children: [_jsx(DialogTitle, { className: "m-0 text-center font-display font-heavy text-display-48 leading-heading tracking-title text-balance text-brand", children: title }), _jsxs("div", { className: "grid justify-items-center gap-5", children: [_jsx(DialogDescription, { className: "m-0 text-center text-body-sm leading-body text-ink", children: description ?? (_jsxs(_Fragment, { children: [lineBefore, " ", _jsx("strong", { className: "font-semibold", children: grid }), " ", lineAfter] })) }), _jsx("div", { "data-slot": "plugged-dialog-tile", className: COLUMN, children: _jsx(EntityCard, { ...entity }) }), _jsx(Button, { type: "button", variant: "cta", "data-slot": "plugged-dialog-share", className: cn(COLUMN, ACTION, "border-cyan"), onClick: () => onShare(), children: shareLabel })] }), _jsx("div", { className: "flex justify-end", children: _jsx(DialogClose, { "data-slot": "plugged-dialog-close", render: _jsx(Button, { type: "button", variant: "tertiary-soft", className: ACTION }), children: closeLabel }) })] }) }));
91
+ }
92
+ export { PluggedDialog };
93
+ //# sourceMappingURL=plugged-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugged-dialog.js","sourceRoot":"","sources":["../../src/blocks/plugged-dialog.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AAEH,uDAAuD;AACvD,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE,wBAAwB;IACpC,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,OAAO;IACnB,UAAU,EAAE,OAAO;CACX,CAAA;AAEV,2DAA2D;AAC3D,MAAM,MAAM,GAAG,mBAAmB,CAAA;AAElC,yFAAyF;AACzF,MAAM,MAAM,GAAG,uEAAuE,CAAA;AAwBtF,SAAS,aAAa,CAAC,EACrB,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,IAAI,EACJ,MAAM,EACN,KAAK,GAAG,uBAAuB,CAAC,KAAK,EACrC,UAAU,GAAG,uBAAuB,CAAC,UAAU,EAC/C,SAAS,GAAG,uBAAuB,CAAC,SAAS,EAC7C,WAAW,EACX,UAAU,GAAG,uBAAuB,CAAC,UAAU,EAC/C,UAAU,GAAG,uBAAuB,CAAC,UAAU,EAC/C,SAAS,GACU;IACnB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAwB,IAAI,CAAC,CAAA;IAEvD,OAAO,CACL,KAAC,MAAM,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,YAC5D,MAAC,aAAa,IACZ,GAAG,EAAE,KAAK,eACA,gBAAgB,EAC1B,YAAY,EAAE,KAAK,EACnB,eAAe,EAAE,KAAK,EACtB,SAAS,EAAE,EAAE,CACX,0IAA0I,EAC1I,SAAS,CACV,aAED,KAAC,WAAW,IAAC,SAAS,EAAC,gHAAgH,YACpI,KAAK,GACM,EAEd,eAAK,SAAS,EAAC,iCAAiC,aAC9C,KAAC,iBAAiB,IAAC,SAAS,EAAC,oDAAoD,YAC9E,WAAW,IAAI,CACd,8BACG,UAAU,OAAE,iBAAQ,SAAS,EAAC,eAAe,YAAE,IAAI,GAAU,OAAE,SAAS,IACxE,CACJ,GACiB,EAEpB,2BAAe,qBAAqB,EAAC,SAAS,EAAE,MAAM,YACpD,KAAC,UAAU,OAAK,MAAM,GAAI,GACtB,EAEN,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,KAAK,eACH,sBAAsB,EAChC,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAC5C,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,YAEvB,UAAU,GACJ,IACL,EAEN,cAAK,SAAS,EAAC,kBAAkB,YAC/B,KAAC,WAAW,iBACA,sBAAsB,EAChC,MAAM,EAAE,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAC,eAAe,EAAC,SAAS,EAAE,MAAM,GAAI,YAE1E,UAAU,GACC,GACV,IACQ,GACT,CACV,CAAA;AACH,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAA"}
@@ -30,10 +30,20 @@ declare function SideNavGroup({ label, icon, collapsible, open, defaultOpen, onO
30
30
  onOpenChange?: (open: boolean) => void;
31
31
  children?: React.ReactNode;
32
32
  }): React.JSX.Element;
33
- declare function SideNavItem({ label, icon, count, active, render, className, onKeyDown, ...props }: Omit<useRender.ComponentProps<"button">, "children"> & {
33
+ declare function SideNavItem({ label, icon, activeIcon, count, active, render, className, onKeyDown, ...props }: Omit<useRender.ComponentProps<"button">, "children"> & {
34
34
  label: React.ReactNode;
35
- /** 14 to 16px. The row's label is what gets announced, so the glyph carries no name. */
35
+ /**
36
+ * The row's glyph, drawn at 20px. The label is what gets announced, so the
37
+ * glyph carries no name.
38
+ */
36
39
  icon?: React.ReactNode;
40
+ /**
41
+ * The same glyph, filled, for when this row is the page you are on (#377).
42
+ * Pass the pair once, `icon={<PeopleIcon />} activeIcon={<PeopleFilledIcon />}`,
43
+ * and the row draws the right one for its state. Without it the row draws
44
+ * `icon` in both states.
45
+ */
46
+ activeIcon?: React.ReactNode;
37
47
  /**
38
48
  * The trailing pill. The frame's Feedback row wears a `0`.
39
49
  *
@@ -1 +1 @@
1
- {"version":3,"file":"side-nav.d.ts","sourceRoot":"","sources":["../../src/blocks/side-nav.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AA0GrD,iBAAS,OAAO,CAAC,EACf,KAAK,EACL,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG;IAC5C;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,qBAsCA;AAED,iBAAS,YAAY,CAAC,EACpB,KAAK,EACL,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,WAAmB,EACnB,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,GAAG;IACzD,6DAA6D;IAC7D,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B,qBAgGA;AAED,iBAAS,WAAW,CAAC,EACnB,KAAK,EACL,IAAI,EACJ,KAAK,EACL,MAAM,EACN,MAAM,EACN,SAAS,EACT,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,GAAG;IACxD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,wFAAwF;IACxF,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,0EAmEA;AAED,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,CAAA"}
1
+ {"version":3,"file":"side-nav.d.ts","sourceRoot":"","sources":["../../src/blocks/side-nav.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AA2IrD,iBAAS,OAAO,CAAC,EACf,KAAK,EACL,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG;IAC5C;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,qBAsCA;AAED,iBAAS,YAAY,CAAC,EACpB,KAAK,EACL,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,WAAmB,EACnB,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,GAAG;IACzD,6DAA6D;IAC7D,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B,qBAkGA;AAED,iBAAS,WAAW,CAAC,EACnB,KAAK,EACL,IAAI,EACJ,UAAU,EACV,KAAK,EACL,MAAM,EACN,MAAM,EACN,SAAS,EACT,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,GAAG;IACxD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB;;;OAGG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC5B;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,0EA4EA;AAED,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,CAAA"}
@@ -56,18 +56,28 @@ import { cn } from "../lib/cloudgrid-cn.js";
56
56
  *
57
57
  * ## The active row does not flip, and that is the decision
58
58
  *
59
- * The frame's active row is a pale lavender chip carrying purple text:
60
- * `--cg-primary-tint` under `--cg-primary`. Both are declared at `:root` only,
61
- * so the row paints the same two values on the page, on the purple panel and on
62
- * ink — and that is the point rather than an oversight.
59
+ * The active row is a pale lavender chip, `--cg-primary-tint`, with the glyph
60
+ * FILLED in `--cg-primary` and the label in ink (#377, the 2026 Admin menu,
61
+ * Figma 7414:5979; before that the label was purple too). The tint is primary
62
+ * at 10% over white to within one unit per channel, so the opaque token is the
63
+ * frame's ground. The tint, the purple and the label's ink
64
+ * (`--cg-neutral-900`, read from the ramp, NOT `text-ink`) are all declared at
65
+ * `:root` only, so the row paints the same three values on the page, on the
66
+ * purple panel and on ink — and that is the point rather than an oversight.
63
67
  *
64
68
  * It is the kind badge's rule (#196) applied to a row: the chip brings its own
65
- * ground, so it does not need the surface's answer for one. The pair measures
66
- * 5.02:1, which clears AA for its 15px label everywhere, and the chip measures
69
+ * ground, so it does not need the surface's answer for one. The ink label
70
+ * measures 13.69:1 on it and the purple glyph 5.02:1, and the chip measures
67
71
  * 1.16:1 against the white card, 5.02:1 against the panel and 13.68:1 on ink.
68
72
  * `packages/ui/test/contrast-guardrail.test.mjs` holds every one of those
69
73
  * numbers, and says why the chip's own floor is not 3:1.
70
74
  *
75
+ * The state is said three ways: the chip, the glyph's SHAPE (filled, when the
76
+ * caller hands `activeIcon`), and `aria-current`. An inactive row's glyph is
77
+ * N3 (`--cg-slate-500`, the `steel` utility) on the light page; N3 is a :root
78
+ * ramp value that measures 1.71:1 on the panel, so on the panel and on ink the
79
+ * glyph takes that surface's own `--cg-text-muted` instead.
80
+ *
71
81
  * The alternative was a surface-scoped `--cg-primary-tint`, and it fails on the
72
82
  * panel for a measured reason the token file already records: a white wash over
73
83
  * the brand purple gives white text 4.31:1, under the floor, and white is the
@@ -87,6 +97,24 @@ import { cn } from "../lib/cloudgrid-cn.js";
87
97
  * the obvious reach and it is lavender at `:root` only, so a hovered row on the
88
98
  * purple panel would have been white text on near-white.
89
99
  */
100
+ /**
101
+ * A row's box, and a collapsible group's header, which sits in the column and
102
+ * looks like one. Figma 7414:5979 (#377): 12 vertical and 20 horizontal, a 12px
103
+ * gap, radius 12, Manrope Medium 15; with the 20px glyph that makes a 44px row.
104
+ *
105
+ * The frame's `leading-none` stays on the row, but the LABEL span sets a 20px
106
+ * line box (`leading-5`). It is `truncate`, which is `overflow: hidden`, and a
107
+ * 15px box clips Manrope's descenders: the g in Billing, the y in Activity
108
+ * (measured scrollHeight 18 against clientHeight 15 on #380). The Figma text
109
+ * node does not clip, so its `leading-none` does not carry over to the label.
110
+ */
111
+ const ROW = cn("flex w-full items-center gap-3 rounded-md px-5 py-3 text-left font-ui text-body-sm leading-none font-medium no-underline", "transition-colors focus-visible:ring-3 focus-visible:ring-ring focus-visible:outline-none");
112
+ /**
113
+ * The 20px glyph box. It sizes the caller's svg as well as itself, so a mark
114
+ * passed with a `size-4` of its own (the Console's, today) still draws at the
115
+ * frame's 20px rather than sitting small inside a 20px box.
116
+ */
117
+ const GLYPH = "flex size-5 shrink-0 items-center justify-center [&>svg]:size-5";
90
118
  /** Rows and group headers, in the order the column draws them. */
91
119
  const ROW_SELECTOR = '[data-slot="side-nav-item"],[data-slot="side-nav-group-header"]';
92
120
  /**
@@ -123,7 +151,7 @@ function SideNav({ label, context, className, children, onKeyDown, ...props }) {
123
151
  // text-ink because text does not flip by inheritance: without it every
124
152
  // row inside a panel would inherit the page's dark ink and stay dark on
125
153
  // purple.
126
- className: cn("flex w-full flex-col gap-6 text-ink", className), ...props, children: [context ? (_jsx("div", { "data-slot": "side-nav-context", className: "px-3 text-caption text-faint", children: context })) : null, children] }));
154
+ className: cn("flex w-full flex-col gap-6 text-ink", className), ...props, children: [context ? (_jsx("div", { "data-slot": "side-nav-context", className: "px-5 text-caption text-faint", children: context })) : null, children] }));
127
155
  }
128
156
  function SideNavGroup({ label, icon, collapsible, open, defaultOpen = false, onOpenChange, className, children, ...props }) {
129
157
  const panelId = React.useId();
@@ -157,9 +185,9 @@ function SideNavGroup({ label, icon, collapsible, open, defaultOpen = false, onO
157
185
  // step is one edit in eyebrow.tsx. Caps and the caption size are this
158
186
  // frame's treatment of it, which is what `className` is for — see the
159
187
  // eyebrow's own note on not being uppercase by default.
160
- _jsx(Eyebrow, { className: "px-3 text-caption uppercase", children: label })) : null, rows] }));
188
+ _jsx(Eyebrow, { className: "px-5 text-caption uppercase", children: label })) : null, rows] }));
161
189
  }
162
- return (_jsxs("div", { "data-slot": "side-nav-group", "data-collapsible": "", "data-open": isOpen ? "" : undefined, className: cn("flex flex-col gap-0.5", className), ...props, children: [_jsxs("button", { type: "button", "data-slot": "side-nav-group-header", "aria-expanded": isOpen, "aria-controls": panelId, onClick: toggle, className: cn("flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-body-sm text-body", "transition-colors hover:bg-(--cg-hover) hover:text-ink", "focus-visible:ring-3 focus-visible:ring-ring focus-visible:outline-none"), children: [icon ? (_jsx("span", { "data-slot": "side-nav-icon", className: "flex size-4 shrink-0 items-center justify-center", children: icon })) : null, _jsx("span", { className: "min-w-0 flex-1 truncate", children: label }), _jsx(ChevronDownIcon
190
+ return (_jsxs("div", { "data-slot": "side-nav-group", "data-collapsible": "", "data-open": isOpen ? "" : undefined, className: cn("flex flex-col gap-0.5", className), ...props, children: [_jsxs("button", { type: "button", "data-slot": "side-nav-group-header", "aria-expanded": isOpen, "aria-controls": panelId, onClick: toggle, className: cn(ROW, "text-ink hover:bg-(--cg-hover)"), children: [icon ? (_jsx("span", { "data-slot": "side-nav-icon", className: cn(GLYPH, "text-steel in-data-[cg-surface=panel]:text-faint in-data-[cg-surface=ink]:text-faint"), children: icon })) : null, _jsx("span", { className: "min-w-0 flex-1 truncate leading-5", children: label }), _jsx(ChevronDownIcon
163
191
  // The caret is the only thing in this block that moves. It rotates
164
192
  // rather than swapping to a second glyph, so the direction it points
165
193
  // is continuous with the panel opening under it.
@@ -169,7 +197,7 @@ function SideNavGroup({ label, icon, collapsible, open, defaultOpen = false, onO
169
197
  // is continuous with the panel opening under it.
170
198
  className: cn("size-4 shrink-0 transition-transform duration-[var(--cg-duration)] ease-out", isOpen ? "rotate-0" : "-rotate-90") })] }), _jsx("div", { id: panelId, hidden: !isOpen, className: isOpen ? "pl-3" : undefined, children: rows })] }));
171
199
  }
172
- function SideNavItem({ label, icon, count, active, render, className, onKeyDown, ...props }) {
200
+ function SideNavItem({ label, icon, activeIcon, count, active, render, className, onKeyDown, ...props }) {
173
201
  function handleKeyDown(event) {
174
202
  onKeyDown?.(event);
175
203
  if (event.defaultPrevented)
@@ -184,6 +212,7 @@ function SideNavItem({ label, icon, count, active, render, className, onKeyDown,
184
212
  event.preventDefault();
185
213
  el.click();
186
214
  }
215
+ const glyph = active && activeIcon ? activeIcon : icon;
187
216
  return useRender({
188
217
  render,
189
218
  defaultTagName: "button",
@@ -197,16 +226,21 @@ function SideNavItem({ label, icon, count, active, render, className, onKeyDown,
197
226
  // and `render={<Link />}` is the common case.
198
227
  ...(render ? {} : { type: "button" }),
199
228
  onKeyDown: handleKeyDown,
200
- className: cn("flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-body-sm no-underline", "transition-colors focus-visible:ring-3 focus-visible:ring-ring focus-visible:outline-none", active
229
+ className: cn(ROW, active
201
230
  ? // The self-contained chip. See the module note for the numbers and
202
- // for why it is the same two values on all three surfaces.
203
- "bg-brand-tint font-medium text-brand"
204
- : "text-body hover:bg-(--cg-hover) hover:text-ink", className),
231
+ // for why it is the same two values on all three surfaces. The
232
+ // label is the :root ink, not `text-ink`, which flips to white
233
+ // inside a panel while the chip under it does not.
234
+ "bg-brand-tint text-(--cg-neutral-900)"
235
+ : "text-ink hover:bg-(--cg-hover)", className),
205
236
  // The row's content is composed from the three slots rather than taken as
206
237
  // `children`, which is why `children` is omitted from the props type: a
207
238
  // caller who could pass both would have two ways to fill one row and no
208
239
  // rule about which wins.
209
- children: (_jsxs(_Fragment, { children: [icon ? (_jsx("span", { "data-slot": "side-nav-icon", className: "flex size-4 shrink-0 items-center justify-center", children: icon })) : null, _jsx("span", { className: "min-w-0 flex-1 truncate", children: label }), count === undefined ? null : (_jsx("span", { "data-slot": "side-nav-count",
240
+ children: (_jsxs(_Fragment, { children: [glyph ? (_jsx("span", { "data-slot": "side-nav-icon", className: cn(GLYPH, active
241
+ ? "text-brand"
242
+ : // N3, and the surface's own muted text where N3 vanishes.
243
+ "text-steel in-data-[cg-surface=panel]:text-faint in-data-[cg-surface=ink]:text-faint"), children: glyph })) : null, _jsx("span", { className: "min-w-0 flex-1 truncate leading-5", children: label }), count === undefined ? null : (_jsx("span", { "data-slot": "side-nav-count",
210
244
  // The wash again, for the reason the hover uses it: a pale grey
211
245
  // pill named `bg-raised` is neutral-50 at :root only, so it would
212
246
  // be a near-white pill on the purple panel.
@@ -1 +1 @@
1
- {"version":3,"file":"side-nav.js","sourceRoot":"","sources":["../../src/blocks/side-nav.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"side-nav.js","sourceRoot":"","sources":["../../src/blocks/side-nav.tsx"],"names":[],"mappings":"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"}
package/dist/console.css CHANGED
@@ -1,28 +1,69 @@
1
1
  /*
2
2
  A PRODUCT PRESET, not a theme and not a second brand.
3
3
 
4
- The Console's type is the UI face, Manrope, for body and for display. This
5
- file states that in the library, so the Console does not carry a font stack of
6
- its own. ui#250, 2026-09-20.
4
+ The Console's body type is the UI face, Manrope; its headlines are the
5
+ display face, Tanker. This file states that in the library, so the Console
6
+ does not carry a font stack of its own. ui#250, 2026-09-20; revised by ui#371,
7
+ 2026-11-01.
7
8
 
8
- Two declarations, and deliberately nothing else: no colour, no spacing, no
9
+ One declaration, and deliberately nothing else: no colour, no spacing, no
9
10
  size, no component. A preset that grew a second concern would become a theme,
10
11
  and this package has one brand.
11
12
 
13
+ THE SOURCE. The CloudGrid 2026 Figma (file 5ouhISIL0mwYGHurvCGoEO), its text
14
+ variables as read on 2026-11-01:
15
+
16
+ Body Manrope Regular 15 / 1.46
17
+ Body Bold Manrope SemiBold 15 / 1.46
18
+ Small Manrope Regular 13 / 1.46
19
+ H4 Manrope Medium 22 / 1.2
20
+ fontHeadline Tanker (the Profile name; the Plugged popup's
21
+ headline, node 11324:93350, 46 / 1.2)
22
+
12
23
  WHY IT EXISTS. #243 moved --cg-font-body to Space Grotesk and --cg-font-display
13
24
  to Tanker, measured against the six canonical marketing frames, and that is
14
- correct for the marketing site. The Console deleted its own @theme font
15
- forwards (console#652) and inherits every family from here, so installing
16
- 0.28.0 changed every face in it at once. The marketing default is untouched by
17
- this file; the Console imports it and gets back exactly the two values both
18
- tokens held before ef8dc00.
25
+ correct for the marketing site. The Console inherits every family from here
26
+ (its own @theme font forwards were deleted in console#652), so without this
27
+ file every Console paragraph renders in Space Grotesk. The marketing default
28
+ in tokens.css is untouched by this file.
29
+
30
+ WHAT CHANGED IN #371, AND WHY. #250 re-declared BOTH faces as Manrope. Its
31
+ reason for the display half was StatTile: Tanker is an all-caps face, so a
32
+ value such as `15s` or `Coming soon` rendered as `15S` or `COMING SOON`. The
33
+ 2026 Figma settles the display role the other way: its `fontHeadline` is
34
+ Tanker, in the Console as on the site. So this preset no longer touches
35
+ --cg-font-display, and headlines stay Tanker. The StatTile case is now the
36
+ caller's choice of role, not the preset's: a stat value that must read as
37
+ typed uses the body or UI face (`text-stat`, Manrope Medium 32), not the
38
+ display face. Repointing the display role to fix one component would have
39
+ taken every Console headline off the design with it.
40
+
41
+ THE FIVE ROLES, as tokens. A Console page picks a role, not a size. Every
42
+ role below already has a token and a utility; nothing new was added for them.
43
+
44
+ Body text-body-sm --cg-body-sm 15, --cg-body-line 1.46,
45
+ on the body face (this file: Manrope)
46
+ Body Bold text-body-sm font-bold the same, at --cg-weight-bold 600
47
+ Small text-caption --cg-caption 13, --cg-body-line 1.46
48
+ H4 text-heading-lg --cg-heading-lg 22, --cg-heading-line
49
+ font-medium 1.2, at --cg-weight-medium 500, on the
50
+ body face
51
+ Headline font-display the display face, Tanker. The face is
52
+ the role; the size is the page's
53
+ (the title-* and display-* rungs).
54
+ 46 has no rung of its own today.
55
+
56
+ THE TANKER FILE. tokens.css names Tanker in the display stack, but this
57
+ package does not ship the font (ITF Free Font Licence, see fonts.css). A
58
+ consumer that has not declared its own @font-face for Tanker falls through to
59
+ the Manrope stack behind it. The Console declares Tanker itself.
19
60
 
20
61
  WHY var(--cg-font-ui) RATHER THAN THE STACK. --cg-font-ui is already the
21
62
  Manrope stack, and its docblock in tokens.css records that its value is
22
63
  --cg-font-body's previous value byte for byte. Aliasing keeps one copy of the
23
64
  fallback chain in the package. A consumer that spelled the stack out instead
24
- went stale the moment the library's fallbacks moved — cloudgrid-landing PR
25
- #132 did exactly that with the display stack — and a copy one repo further
65
+ went stale the moment the library's fallbacks moved (cloudgrid-landing PR
66
+ #132 did exactly that with the display stack), and a copy one repo further
26
67
  away goes stale the same way.
27
68
 
28
69
  IMPORT ORDER. After tokens.css, which is what it re-declares. Where it sits
@@ -50,18 +91,13 @@
50
91
  Three selectors is a cheaper price than that failure, and
51
92
  test/console-preset.test.mjs pins it.
52
93
 
53
- WHO IMPORTS IT. The Console first. Any product whose type is the UI face
54
- rather than the display face imports the same file; nothing here is named for
55
- the Console except this sentence.
56
-
57
- SIDE EFFECT WORTH KNOWING. StatTile values read as typed again. Tanker is an
58
- all-caps face, so `15s` and `Coming soon` rendered as `15S` and `COMING SOON`
59
- under the marketing display token. No component changed to fix that.
94
+ WHO IMPORTS IT. The Console first. Any product whose body type is the UI face
95
+ imports the same file; nothing here is named for the Console except this
96
+ sentence.
60
97
  */
61
98
 
62
99
  :root,
63
100
  [data-cg-surface='panel'],
64
101
  [data-cg-surface='ink'] {
65
102
  --cg-font-body: var(--cg-font-ui);
66
- --cg-font-display: var(--cg-font-ui);
67
103
  }
package/dist/index.d.ts CHANGED
@@ -65,6 +65,7 @@ export * from "./blocks/option-card.js";
65
65
  export * from "./blocks/page-heading.js";
66
66
  export * from "./blocks/pager.js";
67
67
  export * from "./blocks/phosphor-marks.js";
68
+ export * from "./blocks/plugged-dialog.js";
68
69
  export * from "./blocks/pricing-tier-cards.js";
69
70
  export * from "./blocks/pricing-tiers.js";
70
71
  export * from "./blocks/prompt-block.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -82,6 +82,7 @@ export * from "./blocks/option-card.js";
82
82
  export * from "./blocks/page-heading.js";
83
83
  export * from "./blocks/pager.js";
84
84
  export * from "./blocks/phosphor-marks.js";
85
+ export * from "./blocks/plugged-dialog.js";
85
86
  export * from "./blocks/pricing-tier-cards.js";
86
87
  export * from "./blocks/pricing-tiers.js";
87
88
  export * from "./blocks/prompt-block.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/theme.css CHANGED
@@ -247,6 +247,13 @@
247
247
  --color-scrim: var(--cg-scrim);
248
248
  --color-scrim-strong: var(--cg-scrim-strong);
249
249
 
250
+ /* ---- the scrim's blur ----
251
+ Tailwind's --blur-* namespace, so this is `backdrop-blur-scrim` (and
252
+ `blur-scrim`). The blur alone, for a caller composing its own overlay; a
253
+ modal backdrop uses `scrim-overlay` below, which carries the wash, the blur,
254
+ the @supports guard and the reduced-transparency fallback in one class. */
255
+ --blur-scrim: var(--cg-scrim-blur);
256
+
250
257
  /* ---- type families ----
251
258
  --font-sans points at the body face so the stock font-sans utility is
252
259
  correct rather than something to remember not to use. */
@@ -528,3 +535,30 @@
528
535
  --ease-out: var(--cg-ease-out);
529
536
  --ease-in-out: var(--cg-ease-in-out);
530
537
  }
538
+
539
+ /*
540
+ The popup overlay (ui#368): the Style Guide's purple wash with the page behind
541
+ it blurred. CloudGrid 2026 Figma, the "Overlay" component (node 11324:93744).
542
+
543
+ One class, so no modal backdrop hand-codes the pair: `Dialog` and `Drawer` both
544
+ draw their scrim with it, and a product's own overlay should too.
545
+
546
+ - The wash is --cg-scrim, always.
547
+ - The blur is --cg-scrim-blur, only where the browser has backdrop-filter, so
548
+ an old engine keeps the wash and nothing else.
549
+ - Under prefers-reduced-transparency: reduce the blur goes and the wash stays.
550
+ Written as an override of the blur rather than a `no-preference` guard,
551
+ because an engine that does not know the media feature would read
552
+ `no-preference` as false and drop the blur for everyone.
553
+ */
554
+ @utility scrim-overlay {
555
+ background-color: var(--cg-scrim);
556
+
557
+ @supports (backdrop-filter: blur(0)) {
558
+ backdrop-filter: blur(var(--cg-scrim-blur));
559
+ }
560
+
561
+ @media (prefers-reduced-transparency: reduce) {
562
+ backdrop-filter: none;
563
+ }
564
+ }
@@ -1959,19 +1959,29 @@
1959
1959
  }
1960
1960
  },
1961
1961
  "scrim": {
1962
- "$value": "rgba(34, 34, 34, 0.4)",
1962
+ "$value": "rgba(46, 30, 172, 0.46)",
1963
1963
  "$type": "color",
1964
- "$description": "The wash behind a modal or overlay. Uses the BRAND ink (#222222) rather than the\nConsole's (#16181d) — a scrim sits above content and belongs to the system, not\nto one surface's ink scale.\n\nDoes NOT flip per surface, deliberately: it composites over whatever is beneath\nit, so a panel-scoped override would darken a scrim that is already dark.",
1964
+ "$description": "The wash behind every modal popup: the Style Guide overlay, a light purple wash,\n#2E1EAC at 46% (#2E1EAC75). SOURCE: CloudGrid 2026 Figma, the \"Overlay\"\ncomponent on the Published dialog (node 11324:93744, frame 11324:92589), fill\n#2E1EAC at fill-opacity 0.46 (ui#368). Until then it was the brand ink at 40%,\nrgba(34, 34, 34, 0.4), and Dialog did not read it at all.\n\nIt always travels with --cg-scrim-blur, the page behind it blurred. Apply the\npair with the `scrim-overlay` utility (theme.css), never by hand.\n\nDoes NOT flip per surface, deliberately: it composites over whatever is beneath\nit, so a panel-scoped override would tint a wash that is already tinted.",
1965
1965
  "$extensions": {
1966
1966
  "io.cloudgrid": {
1967
1967
  "css": "--cg-scrim"
1968
1968
  }
1969
1969
  }
1970
1970
  },
1971
+ "scrim-blur": {
1972
+ "$value": "6.8px",
1973
+ "$type": "dimension",
1974
+ "$description": "The blur of the page behind a modal popup, the other half of --cg-scrim. SOURCE:\nthe same Figma \"Overlay\" (node 11324:93744): a background blur of radius 13.59,\nwhich is CSS backdrop-filter: blur(6.8px), since Figma's radius is twice the CSS\nstandard deviation (ui#368).\n\nApplied through the `scrim-overlay` utility, which guards it with\n@supports (backdrop-filter) and drops it under prefers-reduced-transparency:\nreduce, keeping the wash. `backdrop-blur-scrim` is the blur alone.\n\nDeclared at :root only, like --cg-scrim.",
1975
+ "$extensions": {
1976
+ "io.cloudgrid": {
1977
+ "css": "--cg-scrim-blur"
1978
+ }
1979
+ }
1980
+ },
1971
1981
  "scrim-strong": {
1972
1982
  "$value": "rgba(34, 34, 34, 0.82)",
1973
1983
  "$type": "color",
1974
- "$description": "The wash under TEXT laid over a picture, e.g. the entity card's hover reveal.\n\nA second scrim rather than a heavier --cg-scrim, because the two carry different\nobligations. --cg-scrim sits behind a modal and only has to separate two layers,\nso 0.4 is a mood. This one has words on it, and the picture underneath is an\narbitrary screenshot: the worst case is a white capture, where the composite is\nthe lightest this token ever gets and every foreground on it is at its least\nreadable.\n\nMEASURED against that worst case, over --cg-neutral-0: 8.89:1 for the ink\nsurface's own #ffffff and 6.18:1 for its rgba(255,255,255,0.78) secondary, both\nclear of the 4.5:1 AA floor for normal text. At 0.6 the white would measure\n4.26:1 and fail, which is why this is not a rounder number. Asserted in\ntest/contrast-guardrail.test.mjs, so lightening it goes red rather than shipping\na caption nobody can read.\n\nDoes NOT flip per surface, for the same reason --cg-scrim does not: it\ncomposites over whatever is beneath it, and what is beneath it is a picture that\ndoes not flip either.",
1984
+ "$description": "The wash under TEXT laid over a picture, e.g. the entity card's hover reveal.\n\nA second scrim rather than a heavier --cg-scrim, because the two carry different\nobligations. --cg-scrim is the purple wash behind a modal popup (#2E1EAC at 0.46,\nui#368): it only has to separate two layers, and the blur behind it does half\nof that, so its weight is the Style Guide's call. This one has words on it,\nand the picture underneath is an arbitrary screenshot: the worst case is a\nwhite capture, where the composite is the lightest this token ever gets and\nevery foreground on it is at its least readable.\n\nMEASURED against that worst case, over --cg-neutral-0: 8.89:1 for the ink\nsurface's own #ffffff and 6.18:1 for its rgba(255,255,255,0.78) secondary, both\nclear of the 4.5:1 AA floor for normal text. At 0.6 the white would measure\n4.26:1 and fail, which is why this is not a rounder number. Asserted in\ntest/contrast-guardrail.test.mjs, so lightening it goes red rather than shipping\na caption nobody can read.\n\nDoes NOT flip per surface, for the same reason --cg-scrim does not: it\ncomposites over whatever is beneath it, and what is beneath it is a picture that\ndoes not flip either.",
1975
1985
  "$extensions": {
1976
1986
  "io.cloudgrid": {
1977
1987
  "css": "--cg-scrim-strong"
package/dist/tokens.css CHANGED
@@ -1548,22 +1548,40 @@
1548
1548
  brand mark is not a state and does not flip per surface. */
1549
1549
  --cg-live-halo: color-mix(in srgb, var(--cg-volt) 32%, transparent);
1550
1550
  /*
1551
- The wash behind a modal or overlay. Uses the BRAND ink (#222222) rather than the
1552
- Console's (#16181d) — a scrim sits above content and belongs to the system, not
1553
- to one surface's ink scale.
1551
+ The wash behind every modal popup: the Style Guide overlay, a light purple wash,
1552
+ #2E1EAC at 46% (#2E1EAC75). SOURCE: CloudGrid 2026 Figma, the "Overlay"
1553
+ component on the Published dialog (node 11324:93744, frame 11324:92589), fill
1554
+ #2E1EAC at fill-opacity 0.46 (ui#368). Until then it was the brand ink at 40%,
1555
+ rgba(34, 34, 34, 0.4), and Dialog did not read it at all.
1556
+
1557
+ It always travels with --cg-scrim-blur, the page behind it blurred. Apply the
1558
+ pair with the `scrim-overlay` utility (theme.css), never by hand.
1554
1559
 
1555
1560
  Does NOT flip per surface, deliberately: it composites over whatever is beneath
1556
- it, so a panel-scoped override would darken a scrim that is already dark. */
1557
- --cg-scrim: rgba(34, 34, 34, 0.4);
1561
+ it, so a panel-scoped override would tint a wash that is already tinted. */
1562
+ --cg-scrim: rgba(46, 30, 172, 0.46);
1563
+ /*
1564
+ The blur of the page behind a modal popup, the other half of --cg-scrim. SOURCE:
1565
+ the same Figma "Overlay" (node 11324:93744): a background blur of radius 13.59,
1566
+ which is CSS backdrop-filter: blur(6.8px), since Figma's radius is twice the CSS
1567
+ standard deviation (ui#368).
1568
+
1569
+ Applied through the `scrim-overlay` utility, which guards it with
1570
+ @supports (backdrop-filter) and drops it under prefers-reduced-transparency:
1571
+ reduce, keeping the wash. `backdrop-blur-scrim` is the blur alone.
1572
+
1573
+ Declared at :root only, like --cg-scrim. */
1574
+ --cg-scrim-blur: 6.8px;
1558
1575
  /*
1559
1576
  The wash under TEXT laid over a picture, e.g. the entity card's hover reveal.
1560
1577
 
1561
1578
  A second scrim rather than a heavier --cg-scrim, because the two carry different
1562
- obligations. --cg-scrim sits behind a modal and only has to separate two layers,
1563
- so 0.4 is a mood. This one has words on it, and the picture underneath is an
1564
- arbitrary screenshot: the worst case is a white capture, where the composite is
1565
- the lightest this token ever gets and every foreground on it is at its least
1566
- readable.
1579
+ obligations. --cg-scrim is the purple wash behind a modal popup (#2E1EAC at 0.46,
1580
+ ui#368): it only has to separate two layers, and the blur behind it does half
1581
+ of that, so its weight is the Style Guide's call. This one has words on it,
1582
+ and the picture underneath is an arbitrary screenshot: the worst case is a
1583
+ white capture, where the composite is the lightest this token ever gets and
1584
+ every foreground on it is at its least readable.
1567
1585
 
1568
1586
  MEASURED against that worst case, over --cg-neutral-0: 8.89:1 for the ink
1569
1587
  surface's own #ffffff and 6.18:1 for its rgba(255,255,255,0.78) secondary, both
package/dist/tokens.json CHANGED
@@ -206,7 +206,8 @@
206
206
  "--cg-volt": "var(--cg-secondary)",
207
207
  "--cg-volt-ink": "#243d00",
208
208
  "--cg-live-halo": "color-mix(in srgb, var(--cg-volt) 32%, transparent)",
209
- "--cg-scrim": "rgba(34, 34, 34, 0.4)",
209
+ "--cg-scrim": "rgba(46, 30, 172, 0.46)",
210
+ "--cg-scrim-blur": "6.8px",
210
211
  "--cg-scrim-strong": "rgba(34, 34, 34, 0.82)",
211
212
  "--cg-hover": "rgba(34, 34, 34, 0.045)",
212
213
  "--cg-kind-inspiration": "#fae4b3",
@@ -1,7 +1,7 @@
1
1
  import { Button as ButtonPrimitive } from "@base-ui/react/button";
2
2
  import { type VariantProps } from "class-variance-authority";
3
3
  declare const buttonVariants: (props?: ({
4
- variant?: "link" | "ghost" | "default" | "secondary" | "destructive" | "outline" | "cta" | null | undefined;
4
+ variant?: "link" | "ghost" | "default" | "secondary" | "destructive" | "outline" | "cta" | "tertiary-soft" | null | undefined;
5
5
  size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  declare function Button({ className, variant, size, ...props }: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/ui/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIjE,QAAA,MAAM,cAAc;;;8EA+DnB,CAAA;AAED,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,eAAe,CAAC,KAAK,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,+BAQ7D;AAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/ui/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIjE,QAAA,MAAM,cAAc;;;8EAgFnB,CAAA;AAED,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,eAAe,CAAC,KAAK,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,+BAQ7D;AAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA"}