@cloudgrid-io/ui 0.27.2 → 0.29.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/README.md CHANGED
@@ -35,6 +35,7 @@ component tree.
35
35
 
36
36
  @import "@cloudgrid-io/ui/fonts.css";
37
37
  @import "@cloudgrid-io/ui/tokens.css";
38
+ @import "@cloudgrid-io/ui/console.css"; /* optional, see below */
38
39
  @import "@cloudgrid-io/ui/theme.css";
39
40
  @import "@cloudgrid-io/ui/shadcn.css";
40
41
  ```
@@ -44,10 +45,15 @@ The order matters, and getting it wrong fails quietly rather than loudly.
44
45
  - `theme.css` maps Tailwind utilities onto the tokens. Before `tokens.css` has run there is
45
46
  nothing to map, so every utility resolves to nothing and the page renders unstyled
46
47
  instead of erroring.
48
+ - `console.css` is a **product preset**, not part of the base. It re-declares the body and
49
+ display faces as the UI face, Manrope. The CloudGrid Console imports it; so should any
50
+ product whose type is the UI face rather than the display face. Everyone else leaves the
51
+ line out and keeps the default. It has to sit after `tokens.css`, which is what it
52
+ re-declares, and before `theme.css`, which maps the utilities onto the result.
47
53
  - `shadcn.css` must come after whatever `:root` your own `shadcn init` wrote, because it
48
54
  overrides those values. Put it earlier and the stock grey palette wins.
49
55
 
50
- Not using shadcn: skip the last line. Not using Tailwind: `tokens.css` alone gives you every
56
+ Not using the Console's face: skip the `console.css` line. Not using shadcn: skip the last line. Not using Tailwind: `tokens.css` alone gives you every
51
57
  value as a custom property.
52
58
 
53
59
  ## Point Tailwind at the package
@@ -92,6 +98,7 @@ property of a container, never a page-level theme.
92
98
  | | |
93
99
  |---|---|
94
100
  | `@cloudgrid-io/ui/tokens.css` | every value as a CSS custom property |
101
+ | `@cloudgrid-io/ui/console.css` | product preset: body and display type set to Manrope |
95
102
  | `@cloudgrid-io/ui/theme.css` | maps Tailwind utilities onto the tokens |
96
103
  | `@cloudgrid-io/ui/shadcn.css` | maps shadcn's variables onto the tokens |
97
104
  | `@cloudgrid-io/ui/fonts.css` | the three self-hosted families |
@@ -92,17 +92,23 @@ export type AvatarDiameter = (typeof AVATAR_DIAMETERS)[number];
92
92
  * The 0.26 letter names, and what each one was worth in pixels.
93
93
  *
94
94
  * @deprecated Pass the diameter instead: `18`, `24`, `38`. Kept working through
95
- * 0.27 so a consumer's 23 call sites do not all have to move on the same bump;
95
+ * 0.28 so a consumer's 23 call sites do not all have to move on the same bump;
96
96
  * the shape is unchanged, so `AVATAR_SIZES[size]` still returns the pixels.
97
- * Removed in 0.28. There is deliberately no letter for 32: a name added the same
97
+ * Removed in 0.29. There is deliberately no letter for 32: a name added the same
98
98
  * release it was deprecated would be a rung nobody should start using.
99
+ *
100
+ * The target moved from 0.28 to 0.29 in #216: 0.28.0 shipped without the
101
+ * removal because the consumer sweep it is gated on has not happened, and a
102
+ * published version is immutable, so the date had to move rather than the
103
+ * promise. The reason is recorded on #216, which stays open until the removal
104
+ * lands.
99
105
  */
100
106
  export declare const AVATAR_SIZES: {
101
107
  readonly s: 18;
102
108
  readonly m: 24;
103
109
  readonly l: 38;
104
110
  };
105
- /** @deprecated Use `AvatarDiameter`. Removed in 0.28. */
111
+ /** @deprecated Use `AvatarDiameter`. Removed in 0.29. See #216. */
106
112
  export type AvatarSize = keyof typeof AVATAR_SIZES;
107
113
  declare function Avatar({ name, seed, src, alt, size, monogram, className, style, ...props }: Omit<React.ComponentProps<"span">, "children"> & {
108
114
  /** Whose mark this is. Read for the initials, and for the hue unless `seed` is given. */
@@ -126,7 +132,7 @@ declare function Avatar({ name, seed, src, alt, size, monogram, className, style
126
132
  * The diameter: `18`, `24`, `32` or `38`.
127
133
  *
128
134
  * The 0.26 letters — `'s'`, `'m'`, `'l'` — still resolve to 18, 24 and 38
129
- * through 0.27. They are deprecated; see `AVATAR_DIAMETERS`.
135
+ * through 0.28. They are deprecated; see `AVATAR_DIAMETERS`.
130
136
  */
131
137
  size?: AvatarDiameter | AvatarSize;
132
138
  /** Overrides the derived initials, for a name they read badly from. */
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/blocks/avatar.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,gBAAgB,2BAA4B,CAAA;AAEzD,+BAA+B;AAC/B,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9D;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY;;;;CAIf,CAAA;AAEV,yDAAyD;AACzD,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,YAAY,CAAA;AAgBlD,iBAAS,MAAM,CAAC,EACd,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,GAAG,EACH,IAAS,EACT,QAAQ,EACR,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG;IAClD,yFAAyF;IACzF,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,IAAI,CAAC,EAAE,cAAc,GAAG,UAAU,CAAA;IAClC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,+BA2DA;AAED,OAAO,EAAE,MAAM,EAAE,CAAA"}
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/blocks/avatar.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,gBAAgB,2BAA4B,CAAA;AAEzD,+BAA+B;AAC/B,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY;;;;CAIf,CAAA;AAEV,mEAAmE;AACnE,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,YAAY,CAAA;AAgBlD,iBAAS,MAAM,CAAC,EACd,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,GAAG,EACH,IAAS,EACT,QAAQ,EACR,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG;IAClD,yFAAyF;IACzF,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,IAAI,CAAC,EAAE,cAAc,GAAG,UAAU,CAAA;IAClC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,+BA2DA;AAED,OAAO,EAAE,MAAM,EAAE,CAAA"}
@@ -93,10 +93,16 @@ export const AVATAR_DIAMETERS = [18, 24, 32, 38];
93
93
  * The 0.26 letter names, and what each one was worth in pixels.
94
94
  *
95
95
  * @deprecated Pass the diameter instead: `18`, `24`, `38`. Kept working through
96
- * 0.27 so a consumer's 23 call sites do not all have to move on the same bump;
96
+ * 0.28 so a consumer's 23 call sites do not all have to move on the same bump;
97
97
  * the shape is unchanged, so `AVATAR_SIZES[size]` still returns the pixels.
98
- * Removed in 0.28. There is deliberately no letter for 32: a name added the same
98
+ * Removed in 0.29. There is deliberately no letter for 32: a name added the same
99
99
  * release it was deprecated would be a rung nobody should start using.
100
+ *
101
+ * The target moved from 0.28 to 0.29 in #216: 0.28.0 shipped without the
102
+ * removal because the consumer sweep it is gated on has not happened, and a
103
+ * published version is immutable, so the date had to move rather than the
104
+ * promise. The reason is recorded on #216, which stays open until the removal
105
+ * lands.
100
106
  */
101
107
  export const AVATAR_SIZES = {
102
108
  s: 18,
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/blocks/avatar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAElF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAU,CAAA;AAKzD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;CACG,CAAA;AAKV;;;;;;;;;;;GAWG;AACH,MAAM,cAAc,GAAG,IAAI,CAAA;AAE3B,SAAS,MAAM,CAAC,EACd,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,GAAG,EACH,IAAI,GAAG,EAAE,EACT,QAAQ,EACR,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EA4BT;IACC,4EAA4E;IAC5E,gEAAgE;IAChE,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;IAChE,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,CAAA;IAEhD,6EAA6E;IAC7E,uEAAuE;IACvE,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,CAAA;IAEhC,OAAO,CACL,6BACY,QAAQ,eASP,GAAG,eACH,IAAI,CAAC,IAAI,KAChB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAC3E,SAAS,EAAE,EAAE,CACX,wHAAwH,EACxH,SAAS,CACV,EACD,KAAK,EAAE;YACL,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,cAAc,GAAG,EAAE,CAAC,GAAG,EAAE;YACpD,UAAU,EAAE,CAAC;YACb,yEAAyE;YACzE,wEAAwE;YACxE,mEAAmE;YACnE,4CAA4C;YAC5C,UAAU,EAAE,0BAA0B,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,kBAAkB;YAC9E,KAAK,EAAE,2BAA2B;YAClC,GAAG,KAAK;SACT,KACG,KAAK,aAET,4BAAgB,iBAAiB,iBAAa,MAAM,YACjD,OAAO,GACH,EACN,GAAG,CAAC,CAAC,CAAC;YACL,sEAAsE;YACtE,+DAA+D;YAC/D,2BACY,cAAc,EACxB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EACtB,SAAS,EAAC,yCAAyC,GACnD,CACH,CAAC,CAAC,CAAC,IAAI,IACH,CACR,CAAA;AACH,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,CAAA"}
1
+ {"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/blocks/avatar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAElF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAU,CAAA;AAKzD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;CACG,CAAA;AAKV;;;;;;;;;;;GAWG;AACH,MAAM,cAAc,GAAG,IAAI,CAAA;AAE3B,SAAS,MAAM,CAAC,EACd,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,GAAG,EACH,IAAI,GAAG,EAAE,EACT,QAAQ,EACR,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EA4BT;IACC,4EAA4E;IAC5E,gEAAgE;IAChE,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;IAChE,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,CAAA;IAEhD,6EAA6E;IAC7E,uEAAuE;IACvE,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,CAAA;IAEhC,OAAO,CACL,6BACY,QAAQ,eASP,GAAG,eACH,IAAI,CAAC,IAAI,KAChB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAC3E,SAAS,EAAE,EAAE,CACX,wHAAwH,EACxH,SAAS,CACV,EACD,KAAK,EAAE;YACL,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,cAAc,GAAG,EAAE,CAAC,GAAG,EAAE;YACpD,UAAU,EAAE,CAAC;YACb,yEAAyE;YACzE,wEAAwE;YACxE,mEAAmE;YACnE,4CAA4C;YAC5C,UAAU,EAAE,0BAA0B,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,kBAAkB;YAC9E,KAAK,EAAE,2BAA2B;YAClC,GAAG,KAAK;SACT,KACG,KAAK,aAET,4BAAgB,iBAAiB,iBAAa,MAAM,YACjD,OAAO,GACH,EACN,GAAG,CAAC,CAAC,CAAC;YACL,sEAAsE;YACtE,+DAA+D;YAC/D,2BACY,cAAc,EACxB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EACtB,SAAS,EAAC,yCAAyC,GACnD,CACH,CAAC,CAAC,CAAC,IAAI,IACH,CACR,CAAA;AACH,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,CAAA"}
@@ -0,0 +1,65 @@
1
+ /*
2
+ A PRODUCT PRESET, not a theme and not a second brand.
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.
7
+
8
+ Two declarations, and deliberately nothing else: no colour, no spacing, no
9
+ size, no component. A preset that grew a second concern would become a theme,
10
+ and this package has one brand.
11
+
12
+ WHY IT EXISTS. #243 moved --cg-font-body to Space Grotesk and --cg-font-display
13
+ 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.
19
+
20
+ WHY var(--cg-font-ui) RATHER THAN THE STACK. --cg-font-ui is already the
21
+ Manrope stack, and its docblock in tokens.css records that its value is
22
+ --cg-font-body's previous value byte for byte. Aliasing keeps one copy of the
23
+ 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
26
+ away goes stale the same way.
27
+
28
+ IMPORT ORDER. After tokens.css, which is what it re-declares, and before
29
+ theme.css, which maps the Tailwind utilities onto the result:
30
+
31
+ @import "tailwindcss";
32
+ @import "@cloudgrid-io/ui/fonts.css";
33
+ @import "@cloudgrid-io/ui/tokens.css";
34
+ @import "@cloudgrid-io/ui/console.css"; <- here
35
+ @import "@cloudgrid-io/ui/theme.css";
36
+ @import "@cloudgrid-io/ui/shadcn.css";
37
+
38
+ Import it before tokens.css and tokens.css wins: same specificity, later
39
+ declaration, and the page renders Space Grotesk with no error anywhere.
40
+
41
+ THE SELECTOR LIST IS LOAD-BEARING, for the reason shadcn.css states at length.
42
+ A custom property that references another is substituted where it is DECLARED,
43
+ and descendants inherit the already-resolved value. tokens.css declares the
44
+ font families only at :root today, because a family has no on-purple value, so
45
+ a :root-only preset would render correctly as things stand. It is repeated on
46
+ both surface selectors anyway: the day --cg-font-ui gains a per-surface value,
47
+ a :root-only alias freezes to the root stack and silently stops following it.
48
+ Three selectors is a cheaper price than that failure, and
49
+ test/console-preset.test.mjs pins it.
50
+
51
+ WHO IMPORTS IT. The Console first. Any product whose type is the UI face
52
+ rather than the display face imports the same file; nothing here is named for
53
+ the Console except this sentence.
54
+
55
+ SIDE EFFECT WORTH KNOWING. StatTile values read as typed again. Tanker is an
56
+ all-caps face, so `15s` and `Coming soon` rendered as `15S` and `COMING SOON`
57
+ under the marketing display token. No component changed to fix that.
58
+ */
59
+
60
+ :root,
61
+ [data-cg-surface='panel'],
62
+ [data-cg-surface='ink'] {
63
+ --cg-font-body: var(--cg-font-ui);
64
+ --cg-font-display: var(--cg-font-ui);
65
+ }
package/dist/fonts.css CHANGED
@@ -2,27 +2,56 @@
2
2
  Self-hosted webfonts, not a font CDN: a third-party request in the critical
3
3
  path is both a latency cost and a privacy one.
4
4
 
5
- Two faces. Manrope carries everything a reader sees — body, headings and the
6
- display rung alike, since the 2026-09-10 re-skin (#197) set the whole system in
7
- it — and JetBrains Mono is used only inside prompt and terminal surfaces. Both
8
- are VARIABLE faces, so the brand's four weights (400 regular, 500 medium, 600
9
- semibold, 700 display) are one file each rather than four.
5
+ Three faces ship here, and a fourth is named but deliberately absent.
6
+
7
+ Space Grotesk carries everything a reader reads. Every body string on all six
8
+ canonical Figma frames is set in it, at 20/1.46 for a lede and 15/1.46 for card
9
+ copy and nav, and it arrives as @fontsource-variable/space-grotesk under
10
+ OFL-1.1, which permits redistribution — the same mechanism Manrope already uses,
11
+ one more line. cloudgrid-landing#145 has the frame-by-frame evidence.
12
+
13
+ Manrope stays, and not as a fallback. The frames keep it for exactly two jobs,
14
+ the eyebrow above a heading and the label inside a button, and that pair is now
15
+ --cg-font-ui rather than --cg-font-body. Nothing about how those two render
16
+ changed; only which token spells them.
17
+
18
+ JetBrains Mono is used only inside prompt and terminal surfaces. Worth knowing:
19
+ NO monospace face appears anywhere in the six frames. What reads as a terminal
20
+ there is Space Grotesk at 22px (thegrid 8364:4510) or Manrope at 15px (builders
21
+ 6916:8104), so the mono rung is this package's own idea and the design does not
22
+ contradict it or confirm it.
23
+
24
+ All three are VARIABLE faces, so the brand's four weights (400 regular, 500
25
+ medium, 600 semibold, 700 display) are one file each rather than four.
26
+
27
+ TANKER IS THE DISPLAY FACE AND IT CANNOT SHIP HERE. The frames set every
28
+ headline in it; the ITF Free Font Licence section 02 forbids redistributing the
29
+ Font Software through "a repository, download service, application or platform",
30
+ and this package is public on registry.npmjs.org. So tokens.css names the stack
31
+ and each consumer fetches its own copy from Fontshare, bound by section 03 in
32
+ its own right. --cg-font-display's note carries the full reasoning; ui#240 is
33
+ the issue, and its open question — whether naming a display face at all
34
+ reverses the 2026-09-10 re-skin (#197) — is the founder's, not this file's.
10
35
 
11
36
  Saira Semi Condensed 800 was here as the self-hosted stand-in for the licensed
12
37
  Futura Condensed Extra Bold, and both are gone with the condensed display rung.
13
- A consumer that wants a display face back puts it in front of --cg-font-display
14
- in its own :root; nothing here has to change.
38
+ The escape hatch that note described — a consumer putting its own display face
39
+ in front of --cg-font-display in its own :root — is what cloudgrid-landing PR
40
+ #132 used, and it is what naming Tanker in the stack retires. A consumer still
41
+ has to @font-face its own Tanker files; it no longer has to copy this package's
42
+ fallback chain verbatim to do it, and that copy is what went stale.
15
43
 
16
44
  The family stacks live in tokens.css.
17
45
 
18
46
  These are bare package specifiers: Vite (Astro) and Next's css-loader both
19
- resolve them. A pipeline that cannot should import the two fontsource packages
47
+ resolve them. A pipeline that cannot should import the three fontsource packages
20
48
  directly.
21
49
 
22
- Both packages are real dependencies of @cloudgrid-io/ui, so installing this
50
+ All three are real dependencies of @cloudgrid-io/ui, so installing this
23
51
  package is enough. v0 also shipped a '@cloudgrid/ui/fonts' JS entry for
24
52
  pipelines that cannot resolve bare CSS specifiers; it was not ported. Add it
25
53
  if a consumer turns out to need it rather than on speculation.
26
54
  */
55
+ @import '@fontsource-variable/space-grotesk';
27
56
  @import '@fontsource-variable/manrope';
28
57
  @import '@fontsource-variable/jetbrains-mono';
package/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@ export * from "./ui/checkbox.js";
7
7
  export * from "./ui/code-block.js";
8
8
  export * from "./ui/combobox.js";
9
9
  export * from "./ui/dialog.js";
10
+ export * from "./ui/drawer.js";
10
11
  export * from "./ui/dropdown-menu.js";
11
12
  export * from "./ui/input-group.js";
12
13
  export * from "./ui/input.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAG/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AAGtC,cAAc,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAG/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AAGtC,cAAc,uBAAuB,CAAA"}
package/dist/index.js CHANGED
@@ -23,6 +23,7 @@ export * from "./ui/checkbox.js";
23
23
  export * from "./ui/code-block.js";
24
24
  export * from "./ui/combobox.js";
25
25
  export * from "./ui/dialog.js";
26
+ export * from "./ui/drawer.js";
26
27
  export * from "./ui/dropdown-menu.js";
27
28
  export * from "./ui/input-group.js";
28
29
  export * from "./ui/input.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,oEAAoE;AACpE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,yEAAyE;AACzE,gFAAgF;AAChF,4EAA4E;AAC5E,EAAE;AACF,kEAAkE;AAClE,8EAA8E;AAC9E,uEAAuE;AAEvE,cAAc;AACd,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAE/B,mBAAmB;AACnB,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AAEtC,0EAA0E;AAC1E,cAAc,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,oEAAoE;AACpE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,yEAAyE;AACzE,gFAAgF;AAChF,4EAA4E;AAC5E,EAAE;AACF,kEAAkE;AAClE,8EAA8E;AAC9E,uEAAuE;AAEvE,cAAc;AACd,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAE/B,mBAAmB;AACnB,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AAEtC,0EAA0E;AAC1E,cAAc,uBAAuB,CAAA"}
@@ -60,6 +60,6 @@ import { type ClassValue } from "clsx";
60
60
  * to write `font-regular` rediscovers this.
61
61
  */
62
62
  export declare const BRAND_FONT_WEIGHTS: readonly ["heavy", "regular"];
63
- export declare const BRAND_FONT_SIZES: readonly ["display-xl", "display-lg", "display-md", "display-sm", "heading-lg", "heading-md", "heading-sm", "body-lg", "body-md", "body-sm", "caption", "mono", "label"];
63
+ export declare const BRAND_FONT_SIZES: readonly ["display-3xl", "display-2xl", "display-xl", "display-48", "display-lg", "display-md", "display-sm", "title-lg", "title-36", "title-32", "title-md", "title-24", "title-sm", "heading-lg", "heading-md", "heading-sm", "body-xl", "body-lg", "body-18", "body-md", "body-sm", "caption", "mono", "label", "eyebrow", "stat"];
64
64
  export declare function cn(...inputs: ClassValue[]): string;
65
65
  //# sourceMappingURL=cloudgrid-cn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloudgrid-cn.d.ts","sourceRoot":"","sources":["../../src/lib/cloudgrid-cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAG5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,kBAAkB,+BAAgC,CAAA;AAE/D,eAAO,MAAM,gBAAgB,0KAcnB,CAAA;AAWV,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
1
+ {"version":3,"file":"cloudgrid-cn.d.ts","sourceRoot":"","sources":["../../src/lib/cloudgrid-cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAG5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,kBAAkB,+BAAgC,CAAA;AAE/D,eAAO,MAAM,gBAAgB,uUA+BnB,CAAA;AAWV,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
@@ -62,19 +62,36 @@ import { extendTailwindMerge } from "tailwind-merge";
62
62
  */
63
63
  export const BRAND_FONT_WEIGHTS = ["heavy", "regular"];
64
64
  export const BRAND_FONT_SIZES = [
65
+ "display-3xl",
66
+ "display-2xl",
65
67
  "display-xl",
68
+ // Px-named rungs (#248). They do not match tailwind-merge's t-shirt size
69
+ // regex either -- `^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$` anchors on a t-shirt
70
+ // word, and "48" has none -- so they fall through to text-color exactly the
71
+ // way the role names do, and belong here for the same reason.
72
+ "display-48",
66
73
  "display-lg",
67
74
  "display-md",
68
75
  "display-sm",
76
+ "title-lg",
77
+ "title-36",
78
+ "title-32",
79
+ "title-md",
80
+ "title-24",
81
+ "title-sm",
69
82
  "heading-lg",
70
83
  "heading-md",
71
84
  "heading-sm",
85
+ "body-xl",
72
86
  "body-lg",
87
+ "body-18",
73
88
  "body-md",
74
89
  "body-sm",
75
90
  "caption",
76
91
  "mono",
77
92
  "label",
93
+ "eyebrow",
94
+ "stat",
78
95
  ];
79
96
  const twMerge = extendTailwindMerge({
80
97
  extend: {
@@ -1 +1 @@
1
- {"version":3,"file":"cloudgrid-cn.js","sourceRoot":"","sources":["../../src/lib/cloudgrid-cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,MAAM,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,SAAS,CAAU,CAAA;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,MAAM;IACN,OAAO;CACC,CAAA;AAEV,MAAM,OAAO,GAAG,mBAAmB,CAAC;IAClC,MAAM,EAAE;QACN,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC;YAC9C,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,kBAAkB,CAAC,EAAE,CAAC;SACnD;KACF;CACF,CAAC,CAAA;AAEF,MAAM,UAAU,EAAE,CAAC,GAAG,MAAoB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AAC9B,CAAC"}
1
+ {"version":3,"file":"cloudgrid-cn.js","sourceRoot":"","sources":["../../src/lib/cloudgrid-cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,MAAM,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,SAAS,CAAU,CAAA;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,aAAa;IACb,aAAa;IACb,YAAY;IACZ,yEAAyE;IACzE,0EAA0E;IAC1E,4EAA4E;IAC5E,8DAA8D;IAC9D,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;CACE,CAAA;AAEV,MAAM,OAAO,GAAG,mBAAmB,CAAC;IAClC,MAAM,EAAE;QACN,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC;YAC9C,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,kBAAkB,CAAC,EAAE,CAAC;SACnD;KACF;CACF,CAAC,CAAA;AAEF,MAAM,UAAU,EAAE,CAAC,GAAG,MAAoB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AAC9B,CAAC"}
package/dist/theme.css CHANGED
@@ -81,6 +81,10 @@
81
81
  --color-ink: var(--cg-text-primary);
82
82
  --color-body: var(--cg-text-secondary);
83
83
  --color-faint: var(--cg-text-muted);
84
+ /* The muted rung that clears the 4.5:1 body-text floor on all four grounds
85
+ (#232). text-faint is large-text-legal only; this is what a caption a reader
86
+ has to read should use. */
87
+ --color-faint-strong: var(--cg-text-muted-strong);
84
88
  --color-placeholder: var(--cg-text-placeholder);
85
89
  --color-inverse: var(--cg-text-inverse);
86
90
  --color-on-primary: var(--cg-text-on-primary);
@@ -95,6 +99,50 @@
95
99
  --color-lime-press: var(--cg-secondary-press);
96
100
  --color-cyan: var(--cg-tertiary);
97
101
  --color-cyan-press: var(--cg-tertiary-press);
102
+
103
+ /* ---- the hue ramps (#239) ----
104
+ The rungs the canonical Figma frames spend on chips, badges, avatar strokes,
105
+ step diagrams and the enterprise button. tokens.css's `hue-ramps` note has
106
+ the provenance of each value; this block is only about the NAMES.
107
+
108
+ Violet takes numbered rungs under `brand`, because brand is already this
109
+ package's word for the hue and Tailwind ships no `brand` scale to collide
110
+ with. --color-brand stays the 900, so bg-brand and bg-brand-200 coexist.
111
+
112
+ Cyan and lime take SUFFIXED names rather than their Figma rung numbers.
113
+ --color-cyan-200 and --color-lime-700 would be legal here and would silently
114
+ repaint every bg-cyan-200 and bg-lime-700 in a consumer's own markup, since
115
+ Tailwind ships both of those scales. That is rule 4's failure pointed at
116
+ Tailwind instead of shadcn, and it is worse: shadcn's names arrive with this
117
+ package, Tailwind's were already there and the consumer never opted in.
118
+
119
+ The cool neutral family takes `steel` for the same reason twice over: Figma
120
+ calls it color/neutral/*, this package's neutral ramp is a different hue
121
+ family at those numbers, and Tailwind ships `slate`. */
122
+ --color-brand-100: var(--cg-violet-100);
123
+ --color-brand-150: var(--cg-violet-150);
124
+ --color-brand-200: var(--cg-violet-200);
125
+ --color-brand-300: var(--cg-violet-300);
126
+ --color-brand-400: var(--cg-violet-400);
127
+ --color-brand-500: var(--cg-violet-500);
128
+ --color-brand-600: var(--cg-violet-600);
129
+ --color-brand-700: var(--cg-violet-700);
130
+ --color-brand-900: var(--cg-violet-900);
131
+ --color-cyan-tint: var(--cg-cyan-200);
132
+ --color-cyan-wash: var(--cg-cyan-300);
133
+ --color-cyan-fill: var(--cg-cyan-400);
134
+ --color-lime-tint: var(--cg-lime-200);
135
+ --color-lime-wash: var(--cg-lime-600);
136
+ --color-lime-edge: var(--cg-lime-700);
137
+ /* The design's cool neutrals. `steel` is the quiet-text tone the frames put on
138
+ every footer link; `steel-strong` is the rung that actually clears 4.5:1 on a
139
+ light ground, and the one to reach for when the text is content. */
140
+ --color-steel: var(--cg-slate-500);
141
+ --color-steel-strong: var(--cg-slate-600);
142
+ --color-steel-quiet: var(--cg-slate-300);
143
+ /* Figma's "stone". A warm near-black beside --color-ink's flat #222222. Its
144
+ role in the design is not yet known; see the token's own note. */
145
+ --color-stone: var(--cg-stone-800);
98
146
  /* The fourth brand hue (#197). NOT `--color-accent`: rule 4 again — shadcn
99
147
  owns `accent` and it is a background there, which is the collision that
100
148
  once rendered a badge invisible. `azure` is the hue name, alongside brand /
@@ -205,6 +253,9 @@
205
253
  --font-sans: var(--cg-font-body);
206
254
  --font-body: var(--cg-font-body);
207
255
  --font-display: var(--cg-font-display);
256
+ /* The eyebrow-and-button face (#240). Not a fallback: the frames use Manrope
257
+ for exactly those two jobs while the body face is Space Grotesk. */
258
+ --font-ui: var(--cg-font-ui);
208
259
  --font-mono: var(--cg-font-mono);
209
260
 
210
261
  /* ---- type scale ----
@@ -229,9 +280,29 @@
229
280
  tracking or weight, so they get none: a companion that invents a value is
230
281
  worse than an absent one, since it forces a weight where a component expected
231
282
  to inherit. Closes the gap noted in notes.md after #30. */
283
+ --text-display-3xl: var(--cg-display-3xl);
284
+ --text-display-3xl--line-height: var(--cg-display-line-tight);
285
+ --text-display-3xl--letter-spacing: var(--cg-title-tracking);
286
+ --text-display-2xl: var(--cg-display-2xl);
287
+ --text-display-2xl--line-height: var(--cg-display-line-tight);
288
+ --text-display-2xl--letter-spacing: var(--cg-title-tracking);
232
289
  --text-display-xl: var(--cg-display-xl);
233
290
  --text-display-xl--line-height: var(--cg-display-line);
234
291
  --text-display-xl--letter-spacing: var(--cg-display-tracking);
292
+ /* Like 2xl and 3xl, and unlike the four rungs below it, this one is
293
+ leading-none with no tracking because its node is (#248). The legacy
294
+ --cg-display-line 1.06 and --cg-display-tracking 0.012em were tuned for a
295
+ condensed face this package no longer ships and are kept only for the rungs
296
+ that already rendered with them. */
297
+ --text-display-48: var(--cg-display-48);
298
+ --text-display-48--line-height: var(--cg-display-line-tight);
299
+ --text-display-48--letter-spacing: var(--cg-title-tracking);
300
+ /* --cg-display-64 has NO utility here, deliberately. Its two nodes disagree on
301
+ a leading -- thegrid sets 70px, home leaves Figma's Auto -- and a --text-*
302
+ entry cannot exist without a --line-height companion, so the utility could
303
+ only be built by inventing one. Same reasoning as --cg-body-14, and the same
304
+ reasoning that keeps 96px out of the ramp entirely. Spell it as
305
+ `[font-size:var(--cg-display-64)]` with the leading the page wants. */
235
306
  --text-display-lg: var(--cg-display-lg);
236
307
  --text-display-lg--line-height: var(--cg-display-line);
237
308
  --text-display-lg--letter-spacing: var(--cg-display-tracking);
@@ -241,18 +312,58 @@
241
312
  --text-display-sm: var(--cg-display-sm);
242
313
  --text-display-sm--line-height: var(--cg-display-line);
243
314
  --text-display-sm--letter-spacing: var(--cg-display-tracking);
315
+ /* The display face at card scale (#239). A separate ramp from display-*
316
+ because the two disagree everywhere they overlap; tokens.css's
317
+ `tanker-title-ramp` note has the table. --text-title-sm and
318
+ --text-heading-md are both 20px and differ in face and leading, which is
319
+ the whole reason the ramp is separate. */
320
+ --text-title-lg: var(--cg-title-lg);
321
+ --text-title-lg--line-height: var(--cg-title-line);
322
+ --text-title-lg--letter-spacing: var(--cg-title-tracking);
323
+ /* Three rungs named by pixel value (#248): every size this round falls
324
+ strictly between two shipped ones, so there is no free t-shirt name in the
325
+ right place. tokens.css's --cg-display-64 note has the reasoning. */
326
+ --text-title-36: var(--cg-title-36);
327
+ --text-title-36--line-height: var(--cg-title-line);
328
+ --text-title-36--letter-spacing: var(--cg-title-tracking);
329
+ --text-title-32: var(--cg-title-32);
330
+ --text-title-32--line-height: var(--cg-title-line);
331
+ --text-title-32--letter-spacing: var(--cg-title-tracking);
332
+ --text-title-md: var(--cg-title-md);
333
+ --text-title-md--line-height: var(--cg-title-line);
334
+ --text-title-md--letter-spacing: var(--cg-title-tracking);
335
+ --text-title-24: var(--cg-title-24);
336
+ --text-title-24--line-height: var(--cg-title-line);
337
+ --text-title-24--letter-spacing: var(--cg-title-tracking);
338
+ --text-title-sm: var(--cg-title-sm);
339
+ --text-title-sm--line-height: var(--cg-title-line);
340
+ --text-title-sm--letter-spacing: var(--cg-title-tracking);
244
341
  --text-heading-lg: var(--cg-heading-lg);
245
342
  --text-heading-lg--line-height: var(--cg-heading-line);
246
343
  --text-heading-md: var(--cg-heading-md);
247
344
  --text-heading-md--line-height: var(--cg-heading-line);
248
345
  --text-heading-sm: var(--cg-heading-sm);
249
346
  --text-heading-sm--line-height: var(--cg-heading-line);
347
+ /* The lede size on all six canonical frames, and the size this ramp could not
348
+ spell: body-lg is 19 and heading-md is 20 with the wrong leading. */
349
+ --text-body-xl: var(--cg-body-xl);
350
+ --text-body-xl--line-height: var(--cg-body-line);
250
351
  --text-body-lg: var(--cg-body-lg);
251
352
  --text-body-lg--line-height: var(--cg-body-line);
353
+ /* pricing's three plan names, at --cg-body-line exactly. A body rung and not a
354
+ heading one: nothing at 18 in six frames is near --cg-heading-line's 1.2
355
+ (#248). */
356
+ --text-body-18: var(--cg-body-18);
357
+ --text-body-18--line-height: var(--cg-body-line);
252
358
  --text-body-md: var(--cg-body-md);
253
359
  --text-body-md--line-height: var(--cg-body-line);
254
360
  --text-body-sm: var(--cg-body-sm);
255
361
  --text-body-sm--line-height: var(--cg-body-line);
362
+ /* --cg-body-14 has NO utility, for the same reason as --cg-display-64: its
363
+ three non-eyebrow runs read 1.295 and 1.55 and there is no leading to ship.
364
+ Sixteen of the nineteen 14px runs in the frames are the eyebrow, which is
365
+ --text-eyebrow below and already carries its own leading, tracking and
366
+ weight. */
256
367
  --text-caption: var(--cg-caption);
257
368
  --text-caption--line-height: var(--cg-body-line);
258
369
  --text-mono: var(--cg-mono-size);
@@ -260,6 +371,23 @@
260
371
  --text-label: var(--cg-label-size);
261
372
  --text-label--line-height: var(--cg-body-line);
262
373
  --text-label--font-weight: var(--cg-label-weight);
374
+ /* The eyebrow, as Figma's own bound text variable declares it: 14px, 600,
375
+ 1.2, 0.1em. `uppercase` stays the caller's, the way Eyebrow's docblock
376
+ already says. Note --cg-eyebrow-weight is 600 and --cg-label-weight is 500;
377
+ they are different rungs and the one-pixel size difference is not the
378
+ point. */
379
+ --text-eyebrow: var(--cg-eyebrow-size);
380
+ --text-eyebrow--line-height: var(--cg-eyebrow-line);
381
+ --text-eyebrow--letter-spacing: var(--cg-eyebrow-tracking);
382
+ --text-eyebrow--font-weight: var(--cg-eyebrow-weight);
383
+ /* The big figure in a stat block: the UI face at leading-none, which no other
384
+ rung on this ramp is (heading is 1.2, body is 1.46). Ten nodes on home and
385
+ enterprise, all Manrope Medium 32 (#248). A role set rather than a bare
386
+ size, on the eyebrow's pattern, so the leading and the weight cannot drift
387
+ into a component inline. */
388
+ --text-stat: var(--cg-stat-size);
389
+ --text-stat--line-height: var(--cg-stat-line);
390
+ --text-stat--font-weight: var(--cg-stat-weight);
263
391
 
264
392
  /* ---- weights ----
265
393
  `--font-weight-display` is unreachable and kept only for completeness. Both
@@ -284,11 +412,18 @@
284
412
 
285
413
  /* ---- leading and tracking ---- */
286
414
  --leading-display: var(--cg-display-line);
415
+ /* leading-none, which is what every Tanker node in every frame actually uses.
416
+ --leading-display stays 1.06; it was tuned for a condensed face nothing
417
+ ships any more and retuning it moves text that exists today (#240). */
418
+ --leading-display-tight: var(--cg-display-line-tight);
419
+ --leading-title: var(--cg-title-line);
287
420
  --leading-heading: var(--cg-heading-line);
288
421
  --leading-body: var(--cg-body-line);
289
422
  --leading-mono: var(--cg-mono-line);
290
423
  --tracking-display: var(--cg-display-tracking);
291
424
  --tracking-body: var(--cg-body-tracking);
425
+ --tracking-title: var(--cg-title-tracking);
426
+ --tracking-eyebrow: var(--cg-eyebrow-tracking);
292
427
 
293
428
  /* ---- corners ---- */
294
429
  /* The smallest corner in the system, added for the entity card's 20px kind
@@ -299,7 +434,11 @@
299
434
  --radius-md: var(--cg-radius-md);
300
435
  --radius-lg: var(--cg-radius-lg);
301
436
  --radius-xl: var(--cg-radius-xl);
437
+ /* The container corner. In these frames 16 is what a CONTROL is rounded to and
438
+ 20 is what a CONTAINER is rounded to, consistently, on all six. */
439
+ --radius-container: var(--cg-radius-container);
302
440
  --radius-2xl: var(--cg-radius-2xl);
441
+ --radius-3xl: var(--cg-radius-3xl);
303
442
  --radius-pill: var(--cg-radius-pill);
304
443
 
305
444
  /* ---- elevation ----