@supertype.ai/foundations 0.1.28 → 0.1.29

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 (45) hide show
  1. package/README.md +2 -2
  2. package/dist/blocks/badge.d.ts +24 -0
  3. package/dist/blocks/badge.js +80 -0
  4. package/dist/blocks/button.d.ts +24 -0
  5. package/dist/blocks/button.js +117 -0
  6. package/dist/blocks/callout.d.ts +2 -39
  7. package/dist/blocks/callout.js +13 -38
  8. package/dist/blocks/card.js +22 -2
  9. package/dist/blocks/focus.d.ts +9 -0
  10. package/dist/blocks/focus.js +9 -0
  11. package/dist/blocks/index.d.ts +3 -1
  12. package/dist/blocks/index.js +3 -1
  13. package/dist/blocks/interactive-accordion.js +2 -1
  14. package/dist/blocks/render-as.d.ts +11 -0
  15. package/dist/blocks/render-as.js +22 -0
  16. package/dist/blocks/segment.d.ts +22 -14
  17. package/dist/blocks/segment.js +23 -14
  18. package/dist/blocks/tabs.d.ts +52 -17
  19. package/dist/blocks/tabs.js +86 -37
  20. package/dist/cjs/eslint.js +17 -8
  21. package/dist/contrast.d.ts +29 -0
  22. package/dist/contrast.js +26 -8
  23. package/dist/eslint.d.ts +24 -6
  24. package/dist/eslint.js +16 -8
  25. package/dist/essay/essay.js +14 -6
  26. package/dist/essay/index.d.ts +1 -1
  27. package/dist/essay/index.js +1 -1
  28. package/dist/essay/layout.d.ts +36 -0
  29. package/dist/essay/layout.js +32 -0
  30. package/dist/essay/reading.d.ts +1 -1
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.js +5 -0
  33. package/dist/mdx.d.ts +26 -4
  34. package/dist/mdx.js +30 -4
  35. package/dist/tone.d.ts +101 -0
  36. package/dist/tone.js +111 -0
  37. package/dist/typography/header.d.ts +30 -0
  38. package/dist/typography/header.js +7 -2
  39. package/dist/typography/highlight.d.ts +4 -4
  40. package/dist/typography/highlight.js +4 -4
  41. package/dist/typography/paragraph.d.ts +3 -13
  42. package/dist/typography/paragraph.js +13 -9
  43. package/llms.txt +34 -12
  44. package/package.json +2 -1
  45. package/src/theme.css +70 -26
package/llms.txt CHANGED
@@ -41,13 +41,16 @@ reference: https://github.com/supertypeai/foundations
41
41
  | inline code | `TypographyInlineCode` | root |
42
42
  | a link | `TypographyLink` | root |
43
43
  | a highlighted phrase | `TypographyHighlight` | root |
44
+ | a button, or a link that looks like one | `Button` | `/blocks` |
45
+ | a status label, count or chip | `Badge` | `/blocks` |
44
46
  | a link card, or a grid of them | `Card`, `Cards` | `/blocks` |
45
47
  | an aside, warning or note | `Callout` | `/blocks` |
46
48
  | numbered instructions | `Steps`, `Step` | `/blocks` |
47
49
  | an FAQ or collapsible, no JS | `Disclosure`, `DisclosureGroup` | `/blocks` |
48
50
  | an animated accordion | `Accordion` (client) | `/blocks` |
49
- | tabbed content | `Tabs` or `TabGroup` (client) | `/blocks` |
51
+ | tabbed content | `TabGroup` when the tabs are data, `Tabs` to compose by hand (client) | `/blocks` |
50
52
  | a long-form article page | `EssayHeader` + `EssayLayout` + `EssaySection` | `/essay` |
53
+ | an article whose body is prose or MDX | `EssayHeader` + `ReadingLayout` | `/essay` |
51
54
  | a post meta row (date, read time, tags) | `PostMetaRow` and friends | `/essay` |
52
55
  | a table of contents | `TableOfContents`, `ReadingRail` | `/essay` |
53
56
  | page metadata and JSON-LD | `createSeo` | `/seo` |
@@ -58,15 +61,15 @@ reference: https://github.com/supertypeai/foundations
58
61
 
59
62
  | import | exports |
60
63
  |---|---|
61
- | `@supertype.ai/foundations` | `cn`, `TypographyH1`, `TypographyH2`, `TypographyH3`, `TypographyH4`, `TypographyEyebrow`, `TypographyP`, `TypographyMuted`, `TypographyProse`, `TypographyList`, `TypographyProseList`, `TypographyCaption`, `TypographySmall`, `TypographyLabel`, `TypographyStat`, `TypographyInlineCode`, `TypographyLink`, `TypographyHighlight`, `headingClass`, `eyebrowClass`. Types: `TypographyTag`, `ParagraphVariants`, `ListProps`, `CaptionVariants`, `LabelVariants`, `StatVariants`, `LinkTone`, `HighlightTone` |
62
- | `@supertype.ai/foundations/blocks` | `Cards`, `Card`, `CardHeader`, `CardTitle`, `CardDescription`, `CardContent`, `Callout`, `Steps`, `Step`, `Disclosure`, `DisclosureGroup`, `Accordion`, `AccordionItem`, `AccordionTrigger`, `AccordionContent`, `Tabs`, `TabsList`, `TabsTrigger`, `TabsContent`, `TabGroup`, `Tab`, `SEGMENT` |
64
+ | `@supertype.ai/foundations` | `cn`, `TypographyH1`, `TypographyH2`, `TypographyH3`, `TypographyH4`, `TypographyEyebrow`, `TypographyP`, `TypographyMuted`, `TypographyProse`, `TypographyList`, `TypographyProseList`, `TypographyCaption`, `TypographySmall`, `TypographyLabel`, `TypographyStat`, `TypographyInlineCode`, `TypographyLink`, `TypographyHighlight`, `headingClass`, `headingFace`, `eyebrowClass`, `toneClass`, `impliedTone`. Types: `TypographyTag`, `ParagraphVariants`, `ListProps`, `CaptionVariants`, `LabelVariants`, `StatVariants`, `Tone`, `HighlightTone` |
65
+ | `@supertype.ai/foundations/blocks` | `Cards`, `Card`, `CardHeader`, `CardTitle`, `CardDescription`, `CardContent`, `Callout`, `Button`, `buttonVariants`, `Badge`, `badgeVariants`, `Steps`, `Step`, `Disclosure`, `DisclosureGroup`, `Accordion`, `AccordionItem`, `AccordionTrigger`, `AccordionContent`, `Tabs`, `TabsList`, `TabsTrigger`, `TabsContent`, `TabGroup`, `SEGMENT`. Types: `ButtonLook`, `BadgeLook`, `TabItem` |
63
66
  | `@supertype.ai/foundations/mdx` | `proseMdxComponents` |
64
- | `@supertype.ai/foundations/essay` | `createEssay`, `EssayHeader`, `EssayLayout`, `EssaySection`, `EssayPullQuote`, `EssayFigure`, `EssayMovements`, `EssayDocument`, `EssayColumns`, `TableOfContents`, `ReadingRail`, `ReadingProgressBar`, `Rail`, `RailLink`, `PostMetaRow`, `PostDate`, `ReadTime`, `TagPills`, `MetaDot`, `formatPostDate`, `extractHeadings`, `readingTime`, `createSlugger`, `useReadingProgress`, `useScrollSpy`. Types: `TocHeading`, `EssayDecorations`, `EssayIndexEntry`, `EssayDocSection`, `EssayMovement`, `PostDateFormat` |
67
+ | `@supertype.ai/foundations/essay` | `createEssay`, `EssayHeader`, `EssayLayout`, `EssaySection`, `EssayPullQuote`, `EssayFigure`, `EssayMovements`, `EssayDocument`, `EssayColumns`, `EssayAside`, `EssayBody`, `ReadingLayout`, `TableOfContents`, `ReadingRail`, `ReadingProgressBar`, `Rail`, `RailLink`, `PostMetaRow`, `PostDate`, `ReadTime`, `TagPills`, `MetaDot`, `formatPostDate`, `extractHeadings`, `readingTime`, `createSlugger`, `useReadingProgress`, `useScrollSpy`. Types: `TocHeading`, `EssayDecorations`, `EssayIndexEntry`, `EssayDocSection`, `EssayMovement`, `PostDateFormat` |
65
68
  | `@supertype.ai/foundations/seo` | `createSeo`. Types: `SeoConfig`, `ArticleAuthor`, `ArticleOptions`, `PageMetadata` |
66
69
  | `@supertype.ai/foundations/og` | `ogCard`, `OG_SIZE`. Types: `OgCardOptions` |
67
- | `@supertype.ai/foundations/eslint` | `designConfig` (the whole set as one flat-config entry), plus `colourRules`, `typographyRules`, `themeOverrideRules`, `surfaceAsInkRules`, `renamedTokenRules` for building your own. Types: `FlatConfigEntry`, `DesignConfigOptions`, `RestrictedSyntax`, `ColourOptions`, `TypographyOptions` |
70
+ | `@supertype.ai/foundations/eslint` | `designRules` (every rule as one array — spread this), `designConfig` (the same set wrapped as a flat-config entry). The five builders `colourRules`, `typographyRules`, `themeOverrideRules`, `surfaceAsInkRules`, `renamedTokenRules` are still exported, but spreading them by hand is how a consumer ends up missing one. Types: `FlatConfigEntry`, `DesignRuleOptions`, `DesignConfigOptions`, `RestrictedSyntax`, `ColourOptions`, `TypographyOptions` |
68
71
  | `@supertype.ai/foundations/rehype` | `rehypeProseCode`, `proseCodeOptions`, `PROSE_LANGS`, `PROSE_THEMES`. Build-time only, must not resolve React |
69
- | `@supertype.ai/foundations/contrast` | `checkLegibility` (inks at 4.5:1), `checkSignals` (fills at 3:1, tinted inks at 4.5:1, labels against their own fill), `resolveTokens`, `formatFailures`, `specificity`, `parseColor`, `luminance`, `contrast`. Types: `Rgb`, `Theme`, `LegibilityFailure`. Build-time only |
72
+ | `@supertype.ai/foundations/contrast` | `checkLegibility` (inks at 4.5:1), `checkSignals` (fills at 3:1, tinted inks at 4.5:1, labels against their own fill), `resolveTokens`, `formatFailures`, `specificity`, `parseColor`, `luminance`, `contrast`, `tokenCuts` (which cuts a token ships — fill, the label printed on it, the hue as words; the taxonomy `checkSignals` measures). Types: `Rgb`, `Theme`, `LegibilityFailure`, `TokenCuts`. Build-time only |
70
73
 
71
74
  ## Props worth knowing
72
75
 
@@ -78,20 +81,39 @@ reference: https://github.com/supertypeai/foundations
78
81
  - `TypographyCaption`, `TypographyLabel`, `TypographySmall`: `size?: "sm" | "xs" | "2xs" | "inherit"`, `as?`.
79
82
  - `TypographyEyebrow`: `tone?: "heading" | "label"`, `as?`.
80
83
  - `TypographyStat`: `size?: "inherit" | "card" | "panel" | "page" | "display"`, `figures?: "tabular" | "proportional"`. Keep tabular where a value updates in place.
81
- - `TypographyLink`: `href` (required), `tone?: "foreground" | "primary" | "secondary"`, `addArrow?`, `newTab?`. Internal versus external is decided from the href.
82
- - `TypographyHighlight`: `tone?: "primary" | "success" | "ochre" | "terracotta" | "sage" | "fig"`, `seed?: number`.
84
+ - `TypographyLink`: `href` (required), `tone?: Tone` (default `muted`), `addArrow?`, `newTab?`. Internal versus external is decided from the href.
85
+ - `TypographyHighlight`: `tone?: HighlightTone` — `"primary" | "success" | "ochre" | "terracotta" | "sage" | "fig"`, `seed?: number`. Deliberately NOT `Tone`: this axis is categorical (which one it is), not semantic (what it means), which is the same split theme.css draws between the earth swatches and the status tokens.
83
86
  - `Card`: `href`, `title`, `description`, `icon`, `external`. An href makes the whole card a link.
84
- - `Callout`: `tone?: "muted" | "destructive" | "warn" | "accent"`, `density?: "compact" | "editorial"`, `title`, `icon`, `action`.
87
+ - `Tone` — the one semantic colour vocabulary, shared by `Button`, `Callout` and `TypographyLink`: `"muted" | "primary" | "secondary" | "brand" | "success" | "warn" | "destructive"`, defaulting to `muted` everywhere except a solid `Button`. Seven tones, seven tokens, one to one — that is the bar for adding one. There is no `neutral` (that is `muted`, the word the rest of the package uses), no `foreground` (also `muted`), no `accent` (that is `--primary`'s hover tint, so a washed `primary` renders the same thing) and no `info` (`success | warn | destructive` is already the whole triad). `brand` falls back to `--primary` in an app that defines no `--brand`.
88
+ - `Button`: `variant?: "solid" | "soft" | "outline" | "ghost" | "link"` (default `solid`), `tone?: Tone` (defaults to `primary` on a solid button and `muted` on every other variant — filling a button in is how a page says this is the action), `size?: "xs" | "sm" | "md" | "lg" | "xl"` (default `md`), `icon?: boolean` for a square glyph box, `pill?: boolean` for full-round corners, `render` for the element to become. Variant is how much ink it spends; tone is what the ink means — separate axes, so a quiet delete is `variant="ghost" tone="destructive"`, not a `destructive` variant.
89
+ - `Badge`: `variant?: "solid" | "soft" | "outline" | "ghost"` (default `solid`), `tone?: Tone`, `size?: "xs" | "sm"` (default `sm`), `pill?: boolean`. Same axes and same spellings as `Button`, minus `link` — a badge is not a link. There is no `warning` or `supertype` variant; those were `tone="warn"` and `tone="brand"` under invented names.
90
+ - `Callout`: `tone?: Tone`, `density?: "compact" | "editorial"`, `title`, `icon`, `action`.
85
91
  - `DisclosureGroup`: `type?: "multiple" | "single"`, `defaultValue` (matches the title string).
86
- - `TabsList`: `variant?: "default" | "line"`.
92
+ - `TabsList`: `variant?: "default" | "line"`, `tone?: Tone` (default `primary`) — the tone
93
+ inks the marker only: on `line` the underline and the active icon. The boxed track's
94
+ marker is deliberately flat, so a tone there paints nothing.
95
+ - `TabGroup`: `tabs: readonly TabItem[]` (`{ value, label, icon?, content }`), `defaultValue?`,
96
+ `value?`, `onValueChange?`, `variant?`, `tone?`, `iconPosition?: "inline-start" | "inline-end"`.
97
+ `icon` is an element (`<Icons.Mic />`); the trigger sizes and inks it. Reach for it
98
+ whenever the tabs are data — do not rebuild it over `Tabs`/`TabsTrigger`.
87
99
 
88
100
  ## Common mistakes
89
101
 
90
102
  - `<p className="text-sm text-muted-foreground">` — use `<TypographyMuted>`.
91
103
  - `<h2 className="text-lg font-semibold">` — use `<TypographyH2>`, or
92
104
  `headingClass()` if you must pass classes to someone else's component.
93
- - Importing `Card` or `Callout` from `@supertype.ai/foundations`. They live in
94
- `@supertype.ai/foundations/blocks`.
105
+ - Importing `Card`, `Callout` or `Button` from `@supertype.ai/foundations`. They
106
+ live in `@supertype.ai/foundations/blocks`.
107
+ - `<Button variant="destructive">` or `variant="secondary"` — those are tones, not
108
+ variants. Write `variant="soft" tone="destructive"`, `variant="solid" tone="secondary"`.
109
+ - `<Button size="icon-sm">` — there is one size ladder. Write `size="sm" icon`.
110
+ - `<Badge variant="warning">` / `variant="supertype"` — tones, and misspelled ones.
111
+ Write `variant="outline" tone="warn"` and `variant="solid" tone="brand"`.
112
+ - `tone="neutral"`, `tone="foreground"` or `tone="accent"` — all three were
113
+ removed when the tone lists merged. Write `tone="muted"` for the first two and
114
+ `tone="primary"` for the third.
115
+ - An `<a>` or `<Link>` styled by hand to look like a button. Pass it as
116
+ `render={<Link href="/x" />}`; the anchor keeps its link semantics.
95
117
  - `<TypographyMuted tone="default">` — a type error. Use `TypographyP`.
96
118
  - Binding fonts with `font.className` instead of `font.variable`. The className
97
119
  form sets `font-family` on the element and leaves the roles unresolved.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supertype.ai/foundations",
3
- "version": "0.1.28",
3
+ "version": "0.1.29",
4
4
  "license": "MIT",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -117,6 +117,7 @@
117
117
  "next": "^15.5.7",
118
118
  "next-view-transitions": "^0.3.5",
119
119
  "react": "^19.0.0",
120
+ "react-dom": "^19.0.0",
120
121
  "typescript": "^5.7.0",
121
122
  "vitest": "4.1.11"
122
123
  },
package/src/theme.css CHANGED
@@ -18,20 +18,31 @@
18
18
  other's, so the ink is what tells two swatches apart. checkSignals holds the
19
19
  fill to 3:1 and the ink to 4.5:1. */
20
20
  --color-terracotta: var(--terracotta);
21
- --color-terracotta-foreground: var(--terracotta-foreground);
21
+ --color-terracotta-ink: var(--terracotta-ink);
22
22
  --color-ochre: var(--ochre);
23
- --color-ochre-foreground: var(--ochre-foreground);
23
+ --color-ochre-ink: var(--ochre-ink);
24
24
  --color-moss: var(--moss);
25
- --color-moss-foreground: var(--moss-foreground);
25
+ --color-moss-ink: var(--moss-ink);
26
26
  --color-fern: var(--fern);
27
- --color-fern-foreground: var(--fern-foreground);
27
+ --color-fern-ink: var(--fern-ink);
28
28
  --color-sage: var(--sage);
29
- --color-sage-foreground: var(--sage-foreground);
29
+ --color-sage-ink: var(--sage-ink);
30
30
  --color-stone: var(--stone);
31
- --color-stone-foreground: var(--stone-foreground);
31
+ --color-stone-ink: var(--stone-ink);
32
32
  --color-fig: var(--fig);
33
- --color-fig-foreground: var(--fig-foreground);
33
+ --color-fig-ink: var(--fig-ink);
34
34
  --color-cocoa: var(--cocoa);
35
+ --color-cocoa-ink: var(--cocoa-ink);
36
+
37
+ /* Deprecated aliases. Registered so an unmigrated call site keeps rendering;
38
+ the ESLint rules flag it so it does not stay unmigrated. */
39
+ --color-terracotta-foreground: var(--terracotta-foreground);
40
+ --color-ochre-foreground: var(--ochre-foreground);
41
+ --color-moss-foreground: var(--moss-foreground);
42
+ --color-fern-foreground: var(--fern-foreground);
43
+ --color-sage-foreground: var(--sage-foreground);
44
+ --color-stone-foreground: var(--stone-foreground);
45
+ --color-fig-foreground: var(--fig-foreground);
35
46
  --color-cocoa-foreground: var(--cocoa-foreground);
36
47
 
37
48
  --color-chart-1: var(--chart-1);
@@ -57,11 +68,19 @@
57
68
  --shadow-recessed: var(--elevation-recessed);
58
69
 
59
70
  /* Additive scale off a 10px `lg` — fixed pixel offsets, so no oddball values a
60
- multiplicative scale would produce. `rounded-full` stays a pill. */
71
+ multiplicative scale would produce. `rounded-full` stays a pill.
72
+
73
+ The container rung was +4px, the one step in the run that was not 2, and 14px
74
+ on a card read softer than anything else the package draws — a panel rounder
75
+ than the button sitting inside it. At +2 the run below the marketing sizes is
76
+ 6 / 8 / 10 / 12, evenly spaced, and the jump to `2xl` is left to say what it
77
+ was always meant to: this one is a feature card, not a container. Card,
78
+ Accordion, and the MDX pre/img/table frames all step down together, which is
79
+ the point of moving the token rather than the five call sites. */
61
80
  --radius-sm: calc(var(--radius) - 4px); /* 6px */
62
81
  --radius-md: calc(var(--radius) - 2px); /* 8px — inputs, menus, small controls */
63
82
  --radius-lg: var(--radius); /* 10px — buttons, default control */
64
- --radius-xl: calc(var(--radius) + 4px); /* 14px — cards */
83
+ --radius-xl: calc(var(--radius) + 2px); /* 12px — cards, panels, framed blocks */
65
84
  --radius-2xl: calc(var(--radius) + 8px); /* 18px — marketing feature cards */
66
85
  --radius-3xl: calc(var(--radius) + 12px); /* 22px */
67
86
  --radius-4xl: calc(var(--radius) + 16px); /* 26px */
@@ -89,23 +108,40 @@
89
108
  /* Danger ships as an ink only: a vivid brick red harmonised toward terracotta. */
90
109
  --danger: hsl(5 72% 43%);
91
110
 
92
- /* Latte-warm greens, clays and stone. Both cuts of each hue, light theme. */
111
+ /* Latte-warm greens, clays and stone. Both cuts of each hue, light theme.
112
+ `-ink`, not `-foreground`: in this package `-foreground` is the label printed
113
+ on a fill and `-ink` is the hue used as words, and these are the latter —
114
+ `checkSignals` holds them to 4.5:1 against the page, and printing one on its
115
+ own fill measures about 1.2:1. They shipped under the wrong suffix for long
116
+ enough that a docs page believed it and rendered them as bare squares. The
117
+ old names are kept below as aliases; the ESLint rules flag them. */
93
118
  --terracotta: hsl(10 54% 60%);
94
- --terracotta-foreground: hsl(10 72% 40%);
119
+ --terracotta-ink: hsl(10 72% 40%);
95
120
  --ochre: hsl(44 60% 42%);
96
- --ochre-foreground: hsl(44 78% 27%);
121
+ --ochre-ink: hsl(44 78% 27%);
97
122
  --moss: hsl(68 42% 41%);
98
- --moss-foreground: hsl(68 60% 26%);
123
+ --moss-ink: hsl(68 60% 26%);
99
124
  --fern: hsl(133 30% 47%);
100
- --fern-foreground: hsl(133 48% 30%);
125
+ --fern-ink: hsl(133 48% 30%);
101
126
  --sage: hsl(168 28% 47%);
102
- --sage-foreground: hsl(168 46% 29%);
127
+ --sage-ink: hsl(168 46% 29%);
103
128
  --stone: hsl(202 24% 55%);
104
- --stone-foreground: hsl(202 42% 36%);
129
+ --stone-ink: hsl(202 42% 36%);
105
130
  --fig: hsl(332 32% 61%);
106
- --fig-foreground: hsl(332 50% 43%);
131
+ --fig-ink: hsl(332 50% 43%);
107
132
  --cocoa: hsl(20 16% 56%);
108
- --cocoa-foreground: hsl(20 34% 39%);
133
+ --cocoa-ink: hsl(20 34% 39%);
134
+
135
+ /* Deprecated: these were always the ink, under shadcn's name for the opposite
136
+ thing. Use `-ink`; the ESLint rules flag the old name. */
137
+ --terracotta-foreground: var(--terracotta-ink);
138
+ --ochre-foreground: var(--ochre-ink);
139
+ --moss-foreground: var(--moss-ink);
140
+ --fern-foreground: var(--fern-ink);
141
+ --sage-foreground: var(--sage-ink);
142
+ --stone-foreground: var(--stone-ink);
143
+ --fig-foreground: var(--fig-ink);
144
+ --cocoa-foreground: var(--cocoa-ink);
109
145
 
110
146
  --background: hsl(43 33% 96%); /* #FAF8F3 */
111
147
  /* Near-black keyed to the latte hue, not a neutral #333: grey reads cold over
@@ -177,21 +213,29 @@
177
213
 
178
214
  /* Espresso twins: fills darken and inks lift to hold the same two bars. */
179
215
  --terracotta: hsl(10 54% 47%);
180
- --terracotta-foreground: hsl(10 66% 66%);
216
+ --terracotta-ink: hsl(10 66% 66%);
181
217
  --ochre: hsl(44 60% 33%);
182
- --ochre-foreground: hsl(44 72% 45%);
218
+ --ochre-ink: hsl(44 72% 45%);
183
219
  --moss: hsl(68 42% 32%);
184
- --moss-foreground: hsl(68 54% 43%);
220
+ --moss-ink: hsl(68 54% 43%);
185
221
  --fern: hsl(133 30% 37%);
186
- --fern-foreground: hsl(133 42% 49%);
222
+ --fern-ink: hsl(133 42% 49%);
187
223
  --sage: hsl(168 28% 37%);
188
- --sage-foreground: hsl(168 40% 49%);
224
+ --sage-ink: hsl(168 40% 49%);
189
225
  --stone: hsl(202 24% 42%);
190
- --stone-foreground: hsl(202 36% 60%);
226
+ --stone-ink: hsl(202 36% 60%);
191
227
  --fig: hsl(332 32% 49%);
192
- --fig-foreground: hsl(332 44% 67%);
228
+ --fig-ink: hsl(332 44% 67%);
193
229
  --cocoa: hsl(20 16% 44%);
194
- --cocoa-foreground: hsl(20 28% 62%);
230
+ --cocoa-ink: hsl(20 28% 62%);
231
+ --terracotta-foreground: var(--terracotta-ink);
232
+ --ochre-foreground: var(--ochre-ink);
233
+ --moss-foreground: var(--moss-ink);
234
+ --fern-foreground: var(--fern-ink);
235
+ --sage-foreground: var(--sage-ink);
236
+ --stone-foreground: var(--stone-ink);
237
+ --fig-foreground: var(--fig-ink);
238
+ --cocoa-foreground: var(--cocoa-ink);
195
239
 
196
240
  /* 4 points of lightness at L10 reads flat where the same 4 at L96 reads raised;
197
241
  ssite wrote `bg-card dark:bg-muted` at 109 sites before the ground dropped.