Skip to content

Update light-high-contrast fgColor tokens to custom hex values between scale levels 5 and 6#1346

Merged
janmaarten-a11y merged 9 commits intomainfrom
copilot/update-fgcolor-tokens-level-5
Apr 10, 2026
Merged

Update light-high-contrast fgColor tokens to custom hex values between scale levels 5 and 6#1346
janmaarten-a11y merged 9 commits intomainfrom
copilot/update-fgcolor-tokens-level-5

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 8, 2026

Summary

In the light-high-contrast theme, the three PR/issue status foreground color tokens (fgColor.success, fgColor.danger, fgColor.done) resolved to base color scale level 6. At this level, the colors are so dark that they lose chromatic distinction and become hard to tell apart. This is most visible on PR/issue list pages, where the open (green), closed (red), and done/merged (purple) status icons appear side by side.

No single scale step satisfies both requirements: level 5 is too light to clear the 7:1 high-contrast minimum against bgColor-muted (#e6eaef), while level 6 is too dark to preserve chromatic distinction between status colors. Following the precedent established by @langermank on the dark high-contrast themes (e.g. fgColor.accent in dark HC uses #74B9FF, between blue.2 and blue.3), custom hex values interpolated between scale levels 5 and 6 are used instead. These are as close to level 5 as possible (preserving saturation) while clearing 7:1 against all required background pairings.

How we got here

The initial approach was to move all seven light-high-contrast fgColor overrides from {base.color.*.6} to {base.color.*.5}. Contrast validation revealed that level 5 narrowly fails 7:1 against bgColor-muted, landing between 6.43:1 and 6.70:1 for all seven colors. Rather than changing background tokens (which are used broadly across the UI), we followed the dark HC precedent of hand-picking hex values between scale steps. With that shift, the scope was also narrowed to the three tokens that directly address the reported issue (success, danger, done), reverting the other four (accent, attention, severe, sponsors) to their original level-6 references. If those turn out to need the same treatment later, that can be a separate PR with its own justification.

List of notable changes

In src/tokens/functional/color/fgColor.json5, updated the light-high-contrast override for three status tokens from base color scale level 6 references to custom hex values between levels 5 and 6:

Token Before (level 6) After (custom hex) vs bgColor-muted (#e6eaef)
fgColor.success {base.color.green.6} (#024c1a) #04591f 7.08:1
fgColor.danger {base.color.red.6} (#86061d) #960d1e 7.32:1
fgColor.done {base.color.purple.6} (#512598) #5e2bb4 7.01:1

The fgColor.danger value also clears 7.03:1 against button-danger-bgColor-rest (#e0e6eb), resolving the button-danger-fgColor-rest and button-danger-iconColor-rest contrast failures that were encountered when we attempted to switch to {base.color.red.5}.

The following tokens are not directly edited but inherit from the changed tokens:

  • fgColor.open inherits from fgColor.success
  • fgColor.closed inherits from fgColor.danger
  • fgColor.upsell inherits from fgColor.done

No background tokens were changed. No other themes, base scales, or token categories are affected. The remaining four light-high-contrast fgColor tokens (accent, attention, severe, sponsors) stay at their existing {base.color.*.6} values.

What should reviewers focus on?

  • Confirm only the three light-high-contrast overrides for success, danger, and done changed in fgColor.json5. No other theme, base scale, or background token values should differ
  • Verify the custom hex values are visually distinguishable from one another on the PR/issue list page with the light high-contrast theme enabled
  • Confirm the custom hex values look visually close to scale level 5 (saturated and chromatic) while clearly passing 7:1

Steps to test

  1. Apply the light-high-contrast theme on a repo with a mix of open, closed, and merged PRs
  2. Confirm that fgColor-open (green), fgColor-closed (red), and fgColor-done (purple) status icons are visually distinct from one another
  3. Confirm that the draft (neutral) icon is also distinguishable from the other three states
  4. Run npm run validate:contrast to confirm all contrast pairs pass at 7:1+

Supporting resources

Contributor checklist

  • All new and existing CI checks pass
  • Tests prove that the feature works and covers both happy and unhappy paths
  • Any drop in coverage, breaking changes or regressions have been documented above
  • All developer debugging and non-functional logging has been removed
  • Related issues have been referenced in the PR description

Reviewer checklist

  • Check that pull request and proposed changes adhere to our contribution guidelines and code of conduct
  • Check that tests prove the feature works and covers both happy and unhappy paths
  • Check that there aren't other open Pull Requests for the same update/change
  • Verify the design tokens changed in this PR are expected using the diffing results in this PR

@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Apr 8, 2026

🦋 Changeset detected

Latest commit: bc084ef

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@primer/primitives Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Copilot AI changed the title [WIP] Update fgColor tokens to level 5 for better contrast Update light-high-contrast fgColor tokens from scale level 6 to level 5 Apr 8, 2026
Copilot AI requested a review from janmaarten-a11y April 8, 2026 19:54
@janmaarten-a11y janmaarten-a11y marked this pull request as ready for review April 9, 2026 02:30
@janmaarten-a11y janmaarten-a11y requested a review from a team as a code owner April 9, 2026 02:30
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adjusts light-high-contrast semantic foreground status colors to improve chromatic distinction between statuses (e.g., open/closed/done) while keeping high-contrast compliance.

Changes:

  • Updated seven fgColor.* token overrides for light-high-contrast from base scale level 6 to 5.
  • Added a changeset to publish the token update as a patch release.
Show a summary per file
File Description
src/tokens/functional/color/fgColor.json5 Moves light-high-contrast overrides for the seven semantic fgColor tokens from *.6*.5.
.changeset/fgcolor-light-high-contrast-level-5.md Declares a patch changeset describing the token adjustments and links the related issue.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 2/2 changed files
  • Comments generated: 0

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 9, 2026

Design Token Diff (CSS)

/css/functional/themes/light-high-contrast.css

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/light-high-contrast.css	2026-04-10 19:28:18.295019583 +0000
@@ -16,6 +16,9 @@
 --control-checked-borderColor-active: #033f9d;
 --control-checked-borderColor-hover: #0344a8;
 --control-danger-bgColor-active: #8c0b1d;
+  --fgColor-danger: #960d1e; /** Danger text for errors and destructive actions */
+  --fgColor-done: #5e2bb4; /** Text color for completed/done state indicators */
+  --fgColor-success: #04591f; /** Success text for positive feedback and completed states */
 --reactionButton-selected-bgColor-hover: #c7e9ff;
 --avatarStack-fade-bgColor-default: #c8d1da;
 --avatarStack-fade-bgColor-muted: #dae0e7;
@@ -62,6 +65,8 @@
 --borderColor-transparent: #ffffff00; /** Fully transparent border */
 --button-danger-bgColor-active: #86061d;
 --button-danger-borderColor-hover: #6e011a;
+  --button-danger-fgColor-disabled: #960d1e80;
+  --button-danger-fgColor-rest: var(--fgColor-danger);
 --button-danger-shadow-selected: inset 0 1px 0 0 #43001133;
 --button-inactive-fgColor: #454c54;
 --button-invisible-bgColor-disabled: #ffffff00;
@@ -74,6 +79,8 @@
 --button-primary-borderColor-rest: #013d14;
 --button-primary-shadow-selected: inset 0 1px 0 0 #00230b4d;
 --button-star-iconColor: #d5a824;
+  --buttonCounter-danger-fgColor-disabled: #960d1e80;
+  --buttonCounter-danger-fgColor-rest: var(--fgColor-danger);
 --buttonCounter-default-bgColor-rest: #c8d1da;
 --buttonCounter-outline-fgColor-rest: #023b95;
 --buttonCounter-primary-bgColor-rest: #00230b33;
@@ -113,6 +120,7 @@
 --color-prettylights-syntax-constant-other-reference-link: #032563;
 --color-prettylights-syntax-entity: #512598;
 --color-prettylights-syntax-entity-tag: #023b95;
+  --color-prettylights-syntax-invalid-illegal-text: var(--fgColor-danger);
 --color-prettylights-syntax-keyword: #a0111f;
 --color-prettylights-syntax-markup-changed-bg: #ffc67b;
 --color-prettylights-syntax-markup-changed-text: #702c00;
@@ -145,6 +153,7 @@
 --control-bgColor-active: #d1d9e0;
 --control-bgColor-hover: #dae0e7;
 --control-bgColor-rest: #e0e6eb;
+  --control-danger-fgColor-rest: var(--fgColor-danger);
 --control-fgColor-placeholder: #454c54;
 --control-fgColor-rest: #25292e;
 --control-transparent-bgColor-active: #d1d9e0;
@@ -482,14 +491,14 @@
 --display-yellow-scale-9: #422b00;
 --fgColor-accent: #023b95; /** Accent text for links and interactive elements */
 --fgColor-attention: #603700; /** Attention text for warnings and caution states */
-  --fgColor-danger: #86061d; /** Danger text for errors and destructive actions */
+  --fgColor-closed: var(--fgColor-danger); /** Text color for closed state indicators (issues, PRs) */
 --fgColor-disabled: #59636e; /** Text color for disabled interactive elements */
-  --fgColor-done: #512598; /** Text color for completed/done state indicators */
 --fgColor-muted: #454c54; /** Muted text for secondary content and less important information */
 --fgColor-neutral: #393f46; /** Neutral semantic text for icons and secondary elements */
+  --fgColor-open: var(--fgColor-success); /** Text color for open state indicators (issues, PRs) */
 --fgColor-severe: #702c00; /** Severe text for high-priority warnings */
 --fgColor-sponsors: #7d0c57; /** Text color for GitHub Sponsors content */
-  --fgColor-success: #024c1a; /** Success text for positive feedback and completed states */
+  --fgColor-upsell: var(--fgColor-done); /** Text color for upsell and promotional content */
 --header-bgColor: #25292e;
 --header-borderColor-divider: #c8d1da;
 --headerSearch-bgColor: #25292e;
@@ -666,10 +675,10 @@
 --button-danger-bgColor-rest: var(--control-bgColor-rest);
 --button-danger-borderColor-active: var(--button-danger-borderColor-hover);
 --button-danger-fgColor-active: #ffffff;
-  --button-danger-fgColor-disabled: #86061d80;
 --button-danger-fgColor-hover: #ffffff;
-  --button-danger-fgColor-rest: var(--fgColor-danger);
+  --button-danger-iconColor-disabled: var(--button-danger-fgColor-disabled);
 --button-danger-iconColor-hover: #ffffff;
+  --button-danger-iconColor-rest: var(--button-danger-fgColor-rest);
 --button-default-bgColor-active: var(--control-bgColor-active);
 --button-default-bgColor-hover: var(--control-bgColor-hover);
 --button-default-bgColor-rest: var(--control-bgColor-rest);
@@ -697,9 +706,7 @@
 --buttonCounter-danger-bgColor-disabled: #a0111f0d;
 --buttonCounter-danger-bgColor-hover: #ffffff33;
 --buttonCounter-danger-bgColor-rest: #a0111f1a;
-  --buttonCounter-danger-fgColor-disabled: #86061d80;
 --buttonCounter-danger-fgColor-hover: #ffffff;
-  --buttonCounter-danger-fgColor-rest: var(--fgColor-danger);
 --buttonCounter-invisible-bgColor-rest: var(--bgColor-neutral-muted);
 --buttonCounter-outline-bgColor-disabled: #0349b40d;
 --buttonCounter-outline-bgColor-hover: #ffffff33;
@@ -725,7 +732,6 @@
 --codeMirror-syntax-fgColor-comment: #010409;
 --color-ansi-black: #010409;
 --color-prettylights-syntax-invalid-illegal-bg: var(--bgColor-danger-muted);
-  --color-prettylights-syntax-invalid-illegal-text: var(--fgColor-danger);
 --color-prettylights-syntax-markup-bold: #010409;
 --color-prettylights-syntax-markup-italic: #010409;
 --color-prettylights-syntax-storage-modifier-import: #010409;
@@ -744,7 +750,6 @@
 --control-checked-bgColor-disabled: var(--fgColor-disabled);
 --control-checked-bgColor-rest: var(--bgColor-accent-emphasis);
 --control-danger-bgColor-hover: var(--bgColor-danger-emphasis);
-  --control-danger-fgColor-rest: var(--fgColor-danger);
 --control-fgColor-disabled: var(--fgColor-disabled);
 --control-iconColor-rest: var(--fgColor-muted);
 --control-transparent-bgColor-disabled: var(--bgColor-disabled);
@@ -765,14 +770,11 @@
 --diffBlob-hunkLine-fgColor: var(--fgColor-muted);
 --diffBlob-hunkNum-bgColor-hover: var(--bgColor-accent-emphasis);
 --fgColor-black: #010409; /** Pure black text */
-  --fgColor-closed: var(--fgColor-danger); /** Text color for closed state indicators (issues, PRs) */
 --fgColor-default: #010409; /** Default text color for primary content and headings */
 --fgColor-draft: var(--fgColor-neutral); /** Text color for draft state indicators */
 --fgColor-link: var(--fgColor-accent); /** Text color for hyperlinks */
 --fgColor-onEmphasis: #ffffff; /** Text color for use on emphasis backgrounds */
 --fgColor-onInverse: #ffffff; /** Text color for use on inverse backgrounds */
-  --fgColor-open: var(--fgColor-success); /** Text color for open state indicators (issues, PRs) */
-  --fgColor-upsell: var(--fgColor-done); /** Text color for upsell and promotional content */
 --fgColor-white: #ffffff; /** Pure white text */
 --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
@@ -828,8 +830,6 @@
 --borderColor-neutral-muted: var(--borderColor-muted); /** Subtle neutral semantic border */
 --button-danger-bgColor-disabled: var(--control-bgColor-disabled);
 --button-danger-borderColor-rest: var(--control-borderColor-rest);
-  --button-danger-iconColor-disabled: var(--button-danger-fgColor-disabled);
-  --button-danger-iconColor-rest: var(--button-danger-fgColor-rest);
 --button-default-bgColor-disabled: var(--control-bgColor-disabled);
 --button-default-borderColor-active: var(--control-borderColor-rest);
 --button-default-borderColor-disabled: var(--control-borderColor-disabled);
@@ -918,6 +918,9 @@
   --control-checked-borderColor-active: #033f9d;
   --control-checked-borderColor-hover: #0344a8;
   --control-danger-bgColor-active: #8c0b1d;
+    --fgColor-danger: #960d1e; /** Danger text for errors and destructive actions */
+    --fgColor-done: #5e2bb4; /** Text color for completed/done state indicators */
+    --fgColor-success: #04591f; /** Success text for positive feedback and completed states */
   --reactionButton-selected-bgColor-hover: #c7e9ff;
   --avatarStack-fade-bgColor-default: #c8d1da;
   --avatarStack-fade-bgColor-muted: #dae0e7;
@@ -964,6 +967,8 @@
   --borderColor-transparent: #ffffff00; /** Fully transparent border */
   --button-danger-bgColor-active: #86061d;
   --button-danger-borderColor-hover: #6e011a;
+    --button-danger-fgColor-disabled: #960d1e80;
+    --button-danger-fgColor-rest: var(--fgColor-danger);
   --button-danger-shadow-selected: inset 0 1px 0 0 #43001133;
   --button-inactive-fgColor: #454c54;
   --button-invisible-bgColor-disabled: #ffffff00;
@@ -976,6 +981,8 @@
   --button-primary-borderColor-rest: #013d14;
   --button-primary-shadow-selected: inset 0 1px 0 0 #00230b4d;
   --button-star-iconColor: #d5a824;
+    --buttonCounter-danger-fgColor-disabled: #960d1e80;
+    --buttonCounter-danger-fgColor-rest: var(--fgColor-danger);
   --buttonCounter-default-bgColor-rest: #c8d1da;
   --buttonCounter-outline-fgColor-rest: #023b95;
   --buttonCounter-primary-bgColor-rest: #00230b33;
@@ -1015,6 +1022,7 @@
   --color-prettylights-syntax-constant-other-reference-link: #032563;
   --color-prettylights-syntax-entity: #512598;
   --color-prettylights-syntax-entity-tag: #023b95;
+    --color-prettylights-syntax-invalid-illegal-text: var(--fgColor-danger);
   --color-prettylights-syntax-keyword: #a0111f;
   --color-prettylights-syntax-markup-changed-bg: #ffc67b;
   --color-prettylights-syntax-markup-changed-text: #702c00;
@@ -1047,6 +1055,7 @@
   --control-bgColor-active: #d1d9e0;
   --control-bgColor-hover: #dae0e7;
   --control-bgColor-rest: #e0e6eb;
+    --control-danger-fgColor-rest: var(--fgColor-danger);
   --control-fgColor-placeholder: #454c54;
   --control-fgColor-rest: #25292e;
   --control-transparent-bgColor-active: #d1d9e0;
@@ -1384,14 +1393,14 @@
   --display-yellow-scale-9: #422b00;
   --fgColor-accent: #023b95; /** Accent text for links and interactive elements */
   --fgColor-attention: #603700; /** Attention text for warnings and caution states */
-    --fgColor-danger: #86061d; /** Danger text for errors and destructive actions */
+    --fgColor-closed: var(--fgColor-danger); /** Text color for closed state indicators (issues, PRs) */
   --fgColor-disabled: #59636e; /** Text color for disabled interactive elements */
-    --fgColor-done: #512598; /** Text color for completed/done state indicators */
   --fgColor-muted: #454c54; /** Muted text for secondary content and less important information */
   --fgColor-neutral: #393f46; /** Neutral semantic text for icons and secondary elements */
+    --fgColor-open: var(--fgColor-success); /** Text color for open state indicators (issues, PRs) */
   --fgColor-severe: #702c00; /** Severe text for high-priority warnings */
   --fgColor-sponsors: #7d0c57; /** Text color for GitHub Sponsors content */
-    --fgColor-success: #024c1a; /** Success text for positive feedback and completed states */
+    --fgColor-upsell: var(--fgColor-done); /** Text color for upsell and promotional content */
   --header-bgColor: #25292e;
   --header-borderColor-divider: #c8d1da;
   --headerSearch-bgColor: #25292e;
@@ -1568,10 +1577,10 @@
   --button-danger-bgColor-rest: var(--control-bgColor-rest);
   --button-danger-borderColor-active: var(--button-danger-borderColor-hover);
   --button-danger-fgColor-active: #ffffff;
-    --button-danger-fgColor-disabled: #86061d80;
   --button-danger-fgColor-hover: #ffffff;
-    --button-danger-fgColor-rest: var(--fgColor-danger);
+    --button-danger-iconColor-disabled: var(--button-danger-fgColor-disabled);
   --button-danger-iconColor-hover: #ffffff;
+    --button-danger-iconColor-rest: var(--button-danger-fgColor-rest);
   --button-default-bgColor-active: var(--control-bgColor-active);
   --button-default-bgColor-hover: var(--control-bgColor-hover);
   --button-default-bgColor-rest: var(--control-bgColor-rest);
@@ -1599,9 +1608,7 @@
   --buttonCounter-danger-bgColor-disabled: #a0111f0d;
   --buttonCounter-danger-bgColor-hover: #ffffff33;
   --buttonCounter-danger-bgColor-rest: #a0111f1a;
-    --buttonCounter-danger-fgColor-disabled: #86061d80;
   --buttonCounter-danger-fgColor-hover: #ffffff;
-    --buttonCounter-danger-fgColor-rest: var(--fgColor-danger);
   --buttonCounter-invisible-bgColor-rest: var(--bgColor-neutral-muted);
   --buttonCounter-outline-bgColor-disabled: #0349b40d;
   --buttonCounter-outline-bgColor-hover: #ffffff33;
@@ -1627,7 +1634,6 @@
   --codeMirror-syntax-fgColor-comment: #010409;
   --color-ansi-black: #010409;
   --color-prettylights-syntax-invalid-illegal-bg: var(--bgColor-danger-muted);
-    --color-prettylights-syntax-invalid-illegal-text: var(--fgColor-danger);
   --color-prettylights-syntax-markup-bold: #010409;
   --color-prettylights-syntax-markup-italic: #010409;
   --color-prettylights-syntax-storage-modifier-import: #010409;
@@ -1646,7 +1652,6 @@
   --control-checked-bgColor-disabled: var(--fgColor-disabled);
   --control-checked-bgColor-rest: var(--bgColor-accent-emphasis);
   --control-danger-bgColor-hover: var(--bgColor-danger-emphasis);
-    --control-danger-fgColor-rest: var(--fgColor-danger);
   --control-fgColor-disabled: var(--fgColor-disabled);
   --control-iconColor-rest: var(--fgColor-muted);
   --control-transparent-bgColor-disabled: var(--bgColor-disabled);
@@ -1667,14 +1672,11 @@
   --diffBlob-hunkLine-fgColor: var(--fgColor-muted);
   --diffBlob-hunkNum-bgColor-hover: var(--bgColor-accent-emphasis);
   --fgColor-black: #010409; /** Pure black text */
-    --fgColor-closed: var(--fgColor-danger); /** Text color for closed state indicators (issues, PRs) */
   --fgColor-default: #010409; /** Default text color for primary content and headings */
   --fgColor-draft: var(--fgColor-neutral); /** Text color for draft state indicators */
   --fgColor-link: var(--fgColor-accent); /** Text color for hyperlinks */
   --fgColor-onEmphasis: #ffffff; /** Text color for use on emphasis backgrounds */
   --fgColor-onInverse: #ffffff; /** Text color for use on inverse backgrounds */
-    --fgColor-open: var(--fgColor-success); /** Text color for open state indicators (issues, PRs) */
-    --fgColor-upsell: var(--fgColor-done); /** Text color for upsell and promotional content */
   --fgColor-white: #ffffff; /** Pure white text */
   --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
@@ -1730,8 +1732,6 @@
   --borderColor-neutral-muted: var(--borderColor-muted); /** Subtle neutral semantic border */
   --button-danger-bgColor-disabled: var(--control-bgColor-disabled);
   --button-danger-borderColor-rest: var(--control-borderColor-rest);
-    --button-danger-iconColor-disabled: var(--button-danger-fgColor-disabled);
-    --button-danger-iconColor-rest: var(--button-danger-fgColor-rest);
   --button-default-bgColor-disabled: var(--control-bgColor-disabled);
   --button-default-borderColor-active: var(--control-borderColor-rest);
   --button-default-borderColor-disabled: var(--control-borderColor-disabled);

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 9, 2026

Design Token Diff (StyleLint)

/styleLint/functional/themes/dark-colorblind-high-contrast.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-colorblind-high-contrast.json	2026-04-10 19:28:15.268037807 +0000
@@ -38708,7 +38708,7 @@
       "dark-high-contrast": "#ff9492",
       "dark-dimmed-high-contrast": "#ffc9c7",
       "dark-tritanopia-high-contrast": "#ff9492",
-        "light-high-contrast": "#ff4445",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#ff4445"
     },
     "org.primer.llm": {
@@ -38740,7 +38740,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38906,7 +38906,7 @@
       "dark-dimmed-high-contrast": "#e6ccff",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#a66bff",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#a66bff",
       "light-tritanopia-high-contrast": "#a66bff"
     },
@@ -38936,7 +38936,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39472,7 +39472,7 @@
       "dark": "#28d751",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#acf7b6",
-        "light-high-contrast": "#02a232",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#71b7ff",
       "dark-protanopia-deuteranopia-high-contrast": "#addcff",
       "light-protanopia-deuteranopia": "#409eff",
@@ -39506,7 +39506,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

/styleLint/functional/themes/dark-colorblind.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-colorblind.json	2026-04-10 19:28:13.551048121 +0000
@@ -38700,7 +38700,7 @@
       "dark-high-contrast": "#ff7b72",
       "dark-dimmed-high-contrast": "#ffc1ba",
       "dark-tritanopia-high-contrast": "#ff7b72",
-        "light-high-contrast": "#b62324",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#b62324"
     },
     "org.primer.llm": {
@@ -38732,7 +38732,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38898,7 +38898,7 @@
       "dark-dimmed-high-contrast": "#e2c5ff",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#6e40c9",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#6e40c9",
       "light-tritanopia-high-contrast": "#6e40c9"
     },
@@ -38928,7 +38928,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39464,7 +39464,7 @@
       "dark": "#3fb950",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#aff5b4",
-        "light-high-contrast": "#196c2e",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#58a6ff",
       "dark-protanopia-deuteranopia-high-contrast": "#a5d6ff",
       "light-protanopia-deuteranopia": "#1f6feb",
@@ -39498,7 +39498,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

/styleLint/functional/themes/dark-dimmed-high-contrast.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-dimmed-high-contrast.json	2026-04-10 19:28:08.310078886 +0000
@@ -38718,7 +38718,7 @@
       "dark-high-contrast": "#f47067",
       "dark-dimmed-high-contrast": "#ffb8b0",
       "dark-tritanopia-high-contrast": "#f47067",
-        "light-high-contrast": "#ad2e2c",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#ad2e2c"
     },
     "org.primer.llm": {
@@ -38750,7 +38750,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38916,7 +38916,7 @@
       "dark-dimmed-high-contrast": "#dcbdfb",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#6b44bc",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#6b44bc",
       "light-tritanopia-high-contrast": "#6b44bc"
     },
@@ -38946,7 +38946,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39482,7 +39482,7 @@
       "dark": "#57ab5a",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#b4f1b4",
-        "light-high-contrast": "#2b6a30",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#539bf5",
       "dark-protanopia-deuteranopia-high-contrast": "#96d0ff",
       "light-protanopia-deuteranopia": "#316dca",
@@ -39516,7 +39516,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

/styleLint/functional/themes/dark-dimmed.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-dimmed.json	2026-04-10 19:28:06.392089565 +0000
@@ -38738,7 +38738,7 @@
       "dark-high-contrast": "#f47067",
       "dark-dimmed-high-contrast": "#ffb8b0",
       "dark-tritanopia-high-contrast": "#f47067",
-        "light-high-contrast": "#ad2e2c",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#ad2e2c"
     },
     "org.primer.llm": {
@@ -38770,7 +38770,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38936,7 +38936,7 @@
       "dark-dimmed-high-contrast": "#dcbdfb",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#6b44bc",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#6b44bc",
       "light-tritanopia-high-contrast": "#6b44bc"
     },
@@ -38966,7 +38966,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39502,7 +39502,7 @@
       "dark": "#57ab5a",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#b4f1b4",
-        "light-high-contrast": "#2b6a30",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#539bf5",
       "dark-protanopia-deuteranopia-high-contrast": "#96d0ff",
       "light-protanopia-deuteranopia": "#316dca",
@@ -39536,7 +39536,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

/styleLint/functional/themes/dark-high-contrast.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-high-contrast.json	2026-04-10 19:28:16.962027632 +0000
@@ -38708,7 +38708,7 @@
       "dark-high-contrast": "#ff9492",
       "dark-dimmed-high-contrast": "#ffc9c7",
       "dark-tritanopia-high-contrast": "#ff9492",
-        "light-high-contrast": "#ff4445",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#ff4445"
     },
     "org.primer.llm": {
@@ -38740,7 +38740,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38906,7 +38906,7 @@
       "dark-dimmed-high-contrast": "#e6ccff",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#a66bff",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#a66bff",
       "light-tritanopia-high-contrast": "#a66bff"
     },
@@ -38936,7 +38936,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39472,7 +39472,7 @@
       "dark": "#28d751",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#acf7b6",
-        "light-high-contrast": "#02a232",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#71b7ff",
       "dark-protanopia-deuteranopia-high-contrast": "#addcff",
       "light-protanopia-deuteranopia": "#409eff",
@@ -39506,7 +39506,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

/styleLint/functional/themes/dark-tritanopia-high-contrast.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-tritanopia-high-contrast.json	2026-04-10 19:28:11.747058958 +0000
@@ -38716,7 +38716,7 @@
       "dark-high-contrast": "#ff9492",
       "dark-dimmed-high-contrast": "#ffc9c7",
       "dark-tritanopia-high-contrast": "#ff9492",
-        "light-high-contrast": "#ff4445",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#ff4445"
     },
     "org.primer.llm": {
@@ -38748,7 +38748,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38914,7 +38914,7 @@
       "dark-dimmed-high-contrast": "#e6ccff",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#a66bff",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#a66bff",
       "light-tritanopia-high-contrast": "#a66bff"
     },
@@ -38944,7 +38944,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39480,7 +39480,7 @@
       "dark": "#28d751",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#acf7b6",
-        "light-high-contrast": "#02a232",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#71b7ff",
       "dark-protanopia-deuteranopia-high-contrast": "#addcff",
       "light-protanopia-deuteranopia": "#409eff",
@@ -39514,7 +39514,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

/styleLint/functional/themes/dark-tritanopia.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-tritanopia.json	2026-04-10 19:28:10.040069212 +0000
@@ -38722,7 +38722,7 @@
       "dark-high-contrast": "#ff7b72",
       "dark-dimmed-high-contrast": "#ffc1ba",
       "dark-tritanopia-high-contrast": "#ff7b72",
-        "light-high-contrast": "#b62324",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#b62324"
     },
     "org.primer.llm": {
@@ -38754,7 +38754,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38920,7 +38920,7 @@
       "dark-dimmed-high-contrast": "#e2c5ff",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#6e40c9",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#6e40c9",
       "light-tritanopia-high-contrast": "#6e40c9"
     },
@@ -38950,7 +38950,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39486,7 +39486,7 @@
       "dark": "#3fb950",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#aff5b4",
-        "light-high-contrast": "#196c2e",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#58a6ff",
       "dark-protanopia-deuteranopia-high-contrast": "#a5d6ff",
       "light-protanopia-deuteranopia": "#1f6feb",
@@ -39520,7 +39520,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

/styleLint/functional/themes/dark.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark.json	2026-04-10 19:28:04.659103395 +0000
@@ -38694,7 +38694,7 @@
       "dark-high-contrast": "#ff7b72",
       "dark-dimmed-high-contrast": "#ffc1ba",
       "dark-tritanopia-high-contrast": "#ff7b72",
-        "light-high-contrast": "#b62324",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#b62324"
     },
     "org.primer.llm": {
@@ -38726,7 +38726,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38892,7 +38892,7 @@
       "dark-dimmed-high-contrast": "#e2c5ff",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#6e40c9",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#6e40c9",
       "light-tritanopia-high-contrast": "#6e40c9"
     },
@@ -38922,7 +38922,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39458,7 +39458,7 @@
       "dark": "#3fb950",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#aff5b4",
-        "light-high-contrast": "#196c2e",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#58a6ff",
       "dark-protanopia-deuteranopia-high-contrast": "#a5d6ff",
       "light-protanopia-deuteranopia": "#1f6feb",
@@ -39492,7 +39492,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

/styleLint/functional/themes/light-colorblind-high-contrast.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/light-colorblind-high-contrast.json	2026-04-10 19:28:01.183128907 +0000
@@ -38694,7 +38694,7 @@
       "dark-high-contrast": "#ee5a5d",
       "dark-dimmed-high-contrast": "#ffc1bc",
       "dark-tritanopia-high-contrast": "#ee5a5d",
-        "light-high-contrast": "#86061d",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#86061d"
     },
     "org.primer.llm": {
@@ -38726,7 +38726,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38892,7 +38892,7 @@
       "dark-dimmed-high-contrast": "#e0c5ff",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#512598",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#512598",
       "light-tritanopia-high-contrast": "#512598"
     },
@@ -38922,7 +38922,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39458,7 +39458,7 @@
       "dark": "#26a148",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#d2fedb",
-        "light-high-contrast": "#024c1a",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#368cf9",
       "dark-protanopia-deuteranopia-high-contrast": "#9cd7ff",
       "light-protanopia-deuteranopia": "#0349b4",
@@ -39492,7 +39492,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

/styleLint/functional/themes/light-colorblind.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/light-colorblind.json	2026-04-10 19:27:59.413135091 +0000
@@ -38684,7 +38684,7 @@
       "dark-high-contrast": "#ff8182",
       "dark-dimmed-high-contrast": "#ffcecb",
       "dark-tritanopia-high-contrast": "#ff8182",
-        "light-high-contrast": "#a40e26",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#a40e26"
     },
     "org.primer.llm": {
@@ -38716,7 +38716,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38882,7 +38882,7 @@
       "dark-dimmed-high-contrast": "#ecd8ff",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#6639ba",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#6639ba",
       "light-tritanopia-high-contrast": "#6639ba"
     },
@@ -38912,7 +38912,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39448,7 +39448,7 @@
       "dark": "#4ac26b",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#dafbe1",
-        "light-high-contrast": "#116329",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#54aeff",
       "dark-protanopia-deuteranopia-high-contrast": "#b6e3ff",
       "light-protanopia-deuteranopia": "#0969da",
@@ -39482,7 +39482,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

/styleLint/functional/themes/light-high-contrast.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/light-high-contrast.json	2026-04-10 19:28:02.941117833 +0000
@@ -6862,7 +6862,7 @@
 },
 "button-danger-fgColor-disabled": {
   "key": "{button.danger.fgColor.disabled}",
-    "$value": "#86061d80",
+    "$value": "#960d1e80",
   "$type": "color",
   "$extensions": {
     "org.primer.figma": {
@@ -6872,7 +6872,7 @@
     },
     "org.primer.overrides": {
       "dark": {
-          "$value": "#86061d",
+          "$value": "#960d1e",
         "alpha": 0.5,
         "filePath": "src/tokens/component/button.json5",
         "isSource": true,
@@ -6996,7 +6996,7 @@
 },
 "button-danger-fgColor-rest": {
   "key": "{button.danger.fgColor.rest}",
-    "$value": "#86061d",
+    "$value": "#960d1e",
   "$type": "color",
   "$extensions": {
     "org.primer.figma": {
@@ -7032,7 +7032,7 @@
         "$type": "color"
       },
       "dark-protanopia-deuteranopia": {
-          "$value": "#86061d",
+          "$value": "#960d1e",
         "filePath": "src/tokens/component/button.json5",
         "isSource": true,
         "$type": "color"
@@ -7129,7 +7129,7 @@
 },
 "button-danger-iconColor-disabled": {
   "key": "{button.danger.iconColor.disabled}",
-    "$value": "#86061d80",
+    "$value": "#960d1e80",
   "$type": "color",
   "$extensions": {
     "org.primer.figma": {
@@ -7223,7 +7223,7 @@
 },
 "button-danger-iconColor-rest": {
   "key": "{button.danger.iconColor.rest}",
-    "$value": "#86061d",
+    "$value": "#960d1e",
   "$type": "color",
   "$extensions": {
     "org.primer.figma": {
@@ -11817,7 +11817,7 @@
 },
 "buttonCounter-danger-fgColor-disabled": {
   "key": "{buttonCounter.danger.fgColor.disabled}",
-    "$value": "#86061d80",
+    "$value": "#960d1e80",
   "$type": "color",
   "$extensions": {
     "org.primer.figma": {
@@ -11827,7 +11827,7 @@
     },
     "org.primer.overrides": {
       "dark": {
-          "$value": "#86061d",
+          "$value": "#960d1e",
         "alpha": 0.5,
         "filePath": "src/tokens/component/button.json5",
         "isSource": true,
@@ -11911,7 +11911,7 @@
 },
 "buttonCounter-danger-fgColor-rest": {
   "key": "{buttonCounter.danger.fgColor.rest}",
-    "$value": "#86061d",
+    "$value": "#960d1e",
   "$type": "color",
   "$extensions": {
     "org.primer.figma": {
@@ -11921,19 +11921,19 @@
     },
     "org.primer.overrides": {
       "dark": {
-          "$value": "#86061d",
+          "$value": "#960d1e",
         "filePath": "src/tokens/component/button.json5",
         "isSource": true,
         "$type": "color"
       },
       "light-high-contrast": {
-          "$value": "#86061d",
+          "$value": "#960d1e",
         "filePath": "src/tokens/component/button.json5",
         "isSource": true,
         "$type": "color"
       },
       "light-tritanopia-high-contrast": {
-          "$value": "#86061d",
+          "$value": "#960d1e",
         "filePath": "src/tokens/component/button.json5",
         "isSource": true,
         "$type": "color"
@@ -11945,7 +11945,7 @@
         "$type": "color"
       },
       "light-protanopia-deuteranopia-high-contrast": {
-          "$value": "#86061d",
+          "$value": "#960d1e",
         "filePath": "src/tokens/component/button.json5",
         "isSource": true,
         "$type": "color"
@@ -15595,7 +15595,7 @@
 },
 "color-prettylights-syntax-invalid-illegal-text": {
   "key": "{color.prettylights.syntax.invalid.illegal.text}",
-    "$value": "#86061d",
+    "$value": "#960d1e",
   "$type": "color",
   "$extensions": {
     "org.primer.figma": {
@@ -19264,7 +19264,7 @@
 },
 "control-danger-fgColor-rest": {
   "key": "{control.danger.fgColor.rest}",
-    "$value": "#86061d",
+    "$value": "#960d1e",
   "$type": "color",
   "$extensions": {
     "org.primer.figma": {
@@ -19273,7 +19273,7 @@
       "scopes": ["fgColor"]
     },
     "org.primer.overrides": {
-        "dark": "#86061d"
+        "dark": "#960d1e"
     }
   },
   "filePath": "src/tokens/functional/color/control.json5",
@@ -38610,7 +38610,7 @@
 },
 "fgColor-closed": {
   "key": "{fgColor.closed}",
-    "$value": "#86061d",
+    "$value": "#960d1e",
   "$type": "color",
   "$description": "Text color for closed state indicators (issues, PRs)",
   "$extensions": {
@@ -38675,7 +38675,7 @@
 },
 "fgColor-danger": {
   "key": "{fgColor.danger}",
-    "$value": "#86061d",
+    "$value": "#960d1e",
   "$type": "color",
   "$description": "Danger text for errors and destructive actions",
   "$extensions": {
@@ -38696,7 +38696,7 @@
       "dark-high-contrast": "#ee5a5d",
       "dark-dimmed-high-contrast": "#ffc1bc",
       "dark-tritanopia-high-contrast": "#ee5a5d",
-        "light-high-contrast": "#86061d",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#86061d"
     },
     "org.primer.llm": {
@@ -38707,7 +38707,7 @@
   "filePath": "src/tokens/functional/color/fgColor.json5",
   "isSource": true,
   "original": {
-      "$value": "{base.color.red.6}",
+      "$value": "#960d1e",
     "$type": "color",
     "$description": "Danger text for errors and destructive actions",
     "$extensions": {
@@ -38728,7 +38728,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38876,7 +38876,7 @@
 },
 "fgColor-done": {
   "key": "{fgColor.done}",
-    "$value": "#512598",
+    "$value": "#5e2bb4",
   "$type": "color",
   "$description": "Text color for completed/done state indicators",
   "$extensions": {
@@ -38894,7 +38894,7 @@
       "dark-dimmed-high-contrast": "#e0c5ff",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#512598",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#512598",
       "light-tritanopia-high-contrast": "#512598"
     },
@@ -38906,7 +38906,7 @@
   "filePath": "src/tokens/functional/color/fgColor.json5",
   "isSource": true,
   "original": {
-      "$value": "{base.color.purple.6}",
+      "$value": "#5e2bb4",
     "$type": "color",
     "$description": "Text color for completed/done state indicators",
     "$extensions": {
@@ -38924,7 +38924,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39245,7 +39245,7 @@
 },
 "fgColor-open": {
   "key": "{fgColor.open}",
-    "$value": "#024c1a",
+    "$value": "#04591f",
   "$type": "color",
   "$description": "Text color for open state indicators (issues, PRs)",
   "$extensions": {
@@ -39444,7 +39444,7 @@
 },
 "fgColor-success": {
   "key": "{fgColor.success}",
-    "$value": "#024c1a",
+    "$value": "#04591f",
   "$type": "color",
   "$description": "Success text for positive feedback and completed states",
   "$extensions": {
@@ -39460,7 +39460,7 @@
       "dark": "#26a148",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#d2fedb",
-        "light-high-contrast": "#024c1a",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#368cf9",
       "dark-protanopia-deuteranopia-high-contrast": "#9cd7ff",
       "light-protanopia-deuteranopia": "#0349b4",
@@ -39478,7 +39478,7 @@
   "filePath": "src/tokens/functional/color/fgColor.json5",
   "isSource": true,
   "original": {
-      "$value": "{base.color.green.6}",
+      "$value": "#04591f",
     "$type": "color",
     "$description": "Success text for positive feedback and completed states",
     "$extensions": {
@@ -39494,7 +39494,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",
@@ -39517,7 +39517,7 @@
 },
 "fgColor-upsell": {
   "key": "{fgColor.upsell}",
-    "$value": "#512598",
+    "$value": "#5e2bb4",
   "$type": "color",
   "$description": "Text color for upsell and promotional content",
   "$extensions": {

/styleLint/functional/themes/light-tritanopia-high-contrast.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/light-tritanopia-high-contrast.json	2026-04-10 19:27:57.625141339 +0000
@@ -38698,7 +38698,7 @@
       "dark-high-contrast": "#ee5a5d",
       "dark-dimmed-high-contrast": "#ffc1bc",
       "dark-tritanopia-high-contrast": "#ee5a5d",
-        "light-high-contrast": "#86061d",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#86061d"
     },
     "org.primer.llm": {
@@ -38730,7 +38730,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38896,7 +38896,7 @@
       "dark-dimmed-high-contrast": "#e0c5ff",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#512598",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#512598",
       "light-tritanopia-high-contrast": "#512598"
     },
@@ -38926,7 +38926,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39462,7 +39462,7 @@
       "dark": "#26a148",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#d2fedb",
-        "light-high-contrast": "#024c1a",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#368cf9",
       "dark-protanopia-deuteranopia-high-contrast": "#9cd7ff",
       "light-protanopia-deuteranopia": "#0349b4",
@@ -39496,7 +39496,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

/styleLint/functional/themes/light-tritanopia.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/light-tritanopia.json	2026-04-10 19:27:55.844152880 +0000
@@ -38688,7 +38688,7 @@
       "dark-high-contrast": "#ff8182",
       "dark-dimmed-high-contrast": "#ffcecb",
       "dark-tritanopia-high-contrast": "#ff8182",
-        "light-high-contrast": "#a40e26",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#a40e26"
     },
     "org.primer.llm": {
@@ -38724,7 +38724,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38890,7 +38890,7 @@
       "dark-dimmed-high-contrast": "#ecd8ff",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#6639ba",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#6639ba",
       "light-tritanopia-high-contrast": "#6639ba"
     },
@@ -38920,7 +38920,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39456,7 +39456,7 @@
       "dark": "#4ac26b",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#dafbe1",
-        "light-high-contrast": "#116329",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#54aeff",
       "dark-protanopia-deuteranopia-high-contrast": "#b6e3ff",
       "light-protanopia-deuteranopia": "#0969da",
@@ -39490,7 +39490,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

/styleLint/functional/themes/light.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/light.json	2026-04-10 19:27:53.998177168 +0000
@@ -38686,7 +38686,7 @@
       "dark-high-contrast": "#ff8182",
       "dark-dimmed-high-contrast": "#ffcecb",
       "dark-tritanopia-high-contrast": "#ff8182",
-        "light-high-contrast": "#a40e26",
+        "light-high-contrast": "#960d1e",
       "light-tritanopia-high-contrast": "#a40e26"
     },
     "org.primer.llm": {
@@ -38722,7 +38722,7 @@
         "dark-high-contrast": "{base.color.red.3}",
         "dark-dimmed-high-contrast": "{base.color.red.1}",
         "dark-tritanopia-high-contrast": "{base.color.red.3}",
-          "light-high-contrast": "{base.color.red.6}",
+          "light-high-contrast": "#960d1e",
         "light-tritanopia-high-contrast": "{base.color.red.6}"
       },
       "org.primer.llm": {
@@ -38888,7 +38888,7 @@
       "dark-dimmed-high-contrast": "#ecd8ff",
       "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
       "dark-tritanopia-high-contrast": "#D3ABFF",
-        "light-high-contrast": "#6639ba",
+        "light-high-contrast": "#5e2bb4",
       "light-protanopia-deuteranopia-high-contrast": "#6639ba",
       "light-tritanopia-high-contrast": "#6639ba"
     },
@@ -38918,7 +38918,7 @@
         "dark-dimmed-high-contrast": "{base.color.purple.1}",
         "dark-protanopia-deuteranopia-high-contrast": "#D3ABFF",
         "dark-tritanopia-high-contrast": "#D3ABFF",
-          "light-high-contrast": "{base.color.purple.6}",
+          "light-high-contrast": "#5e2bb4",
         "light-protanopia-deuteranopia-high-contrast": "{base.color.purple.6}",
         "light-tritanopia-high-contrast": "{base.color.purple.6}"
       },
@@ -39454,7 +39454,7 @@
       "dark": "#4ac26b",
       "dark-high-contrast": "#2BD853",
       "dark-dimmed-high-contrast": "#dafbe1",
-        "light-high-contrast": "#116329",
+        "light-high-contrast": "#04591f",
       "dark-protanopia-deuteranopia": "#54aeff",
       "dark-protanopia-deuteranopia-high-contrast": "#b6e3ff",
       "light-protanopia-deuteranopia": "#0969da",
@@ -39488,7 +39488,7 @@
         "dark": "{base.color.green.3}",
         "dark-high-contrast": "#2BD853",
         "dark-dimmed-high-contrast": "{base.color.green.0}",
-          "light-high-contrast": "{base.color.green.6}",
+          "light-high-contrast": "#04591f",
         "dark-protanopia-deuteranopia": "{base.color.blue.3}",
         "dark-protanopia-deuteranopia-high-contrast": "{base.color.blue.1}",
         "light-protanopia-deuteranopia": "{base.color.blue.5}",

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 9, 2026

Design Token Diff (Figma)

/figma/themes/light-high-contrast.json

+++ /home/runner/work/primitives/primitives/dist/figma/themes/light-high-contrast.json	2026-04-10 19:28:22.206995602 +0000
@@ -2540,9 +2540,9 @@
 {
   "name": "control/danger/fgColor/rest",
   "value": {
-      "r": 0.5254901960784314,
-      "g": 0.023529411764705882,
-      "b": 0.11372549019607843,
+      "r": 0.5882352941176471,
+      "g": 0.050980392156862744,
+      "b": 0.11764705882352941,
     "a": 1
   },
   "type": "COLOR",
@@ -8273,15 +8273,14 @@
 {
   "name": "fgColor/success",
   "value": {
-      "r": 0.00784313725490196,
-      "g": 0.2980392156862745,
-      "b": 0.10196078431372549,
+      "r": 0.01568627450980392,
+      "g": 0.34901960784313724,
+      "b": 0.12156862745098039,
     "a": 1
   },
   "type": "COLOR",
   "description": "Success text for positive feedback and completed states",
   "refId": "mode/fgColor/success",
-    "reference": "base/color/light-high-contrast/base/color/green/6",
   "collection": "mode",
   "mode": "light high contrast",
   "group": "semantic",
@@ -8293,9 +8292,9 @@
 {
   "name": "fgColor/open",
   "value": {
-      "r": 0.00784313725490196,
-      "g": 0.2980392156862745,
-      "b": 0.10196078431372549,
+      "r": 0.01568627450980392,
+      "g": 0.34901960784313724,
+      "b": 0.12156862745098039,
     "a": 1
   },
   "type": "COLOR",
@@ -8353,15 +8352,14 @@
 {
   "name": "fgColor/danger",
   "value": {
-      "r": 0.5254901960784314,
-      "g": 0.023529411764705882,
-      "b": 0.11372549019607843,
+      "r": 0.5882352941176471,
+      "g": 0.050980392156862744,
+      "b": 0.11764705882352941,
     "a": 1
   },
   "type": "COLOR",
   "description": "Danger text for errors and destructive actions",
   "refId": "mode/fgColor/danger",
-    "reference": "base/color/light-high-contrast/base/color/red/6",
   "collection": "mode",
   "mode": "light high contrast",
   "group": "semantic",
@@ -8373,9 +8371,9 @@
 {
   "name": "fgColor/closed",
   "value": {
-      "r": 0.5254901960784314,
-      "g": 0.023529411764705882,
-      "b": 0.11372549019607843,
+      "r": 0.5882352941176471,
+      "g": 0.050980392156862744,
+      "b": 0.11764705882352941,
     "a": 1
   },
   "type": "COLOR",
@@ -8413,15 +8411,14 @@
 {
   "name": "fgColor/done",
   "value": {
-      "r": 0.3176470588235294,
-      "g": 0.1450980392156863,
-      "b": 0.596078431372549,
+      "r": 0.3686274509803922,
+      "g": 0.16862745098039217,
+      "b": 0.7058823529411765,
     "a": 1
   },
   "type": "COLOR",
   "description": "Text color for completed/done state indicators",
   "refId": "mode/fgColor/done",
-    "reference": "base/color/light-high-contrast/base/color/purple/6",
   "collection": "mode",
   "mode": "light high contrast",
   "group": "semantic",
@@ -8433,9 +8430,9 @@
 {
   "name": "fgColor/upsell",
   "value": {
-      "r": 0.3176470588235294,
-      "g": 0.1450980392156863,
-      "b": 0.596078431372549,
+      "r": 0.3686274509803922,
+      "g": 0.16862745098039217,
+      "b": 0.7058823529411765,
     "a": 1
   },
   "type": "COLOR",
@@ -8937,9 +8934,9 @@
 {
   "name": "color/prettylights/syntax/invalid/illegal/text",
   "value": {
-      "r": 0.5254901960784314,
-      "g": 0.023529411764705882,
-      "b": 0.11372549019607843,
+      "r": 0.5882352941176471,
+      "g": 0.050980392156862744,
+      "b": 0.11764705882352941,
     "a": 1
   },
   "type": "COLOR",
@@ -10240,9 +10237,9 @@
 {
   "name": "button/danger/fgColor/rest",
   "value": {
-      "r": 0.5254901960784314,
-      "g": 0.023529411764705882,
-      "b": 0.11372549019607843,
+      "r": 0.5882352941176471,
+      "g": 0.050980392156862744,
+      "b": 0.11764705882352941,
     "a": 1
   },
   "type": "COLOR",
@@ -10288,9 +10285,9 @@
 {
   "name": "button/danger/fgColor/disabled",
   "value": {
-      "r": 0.5254901960784314,
-      "g": 0.023529411764705882,
-      "b": 0.11372549019607843,
+      "r": 0.5882352941176471,
+      "g": 0.050980392156862744,
+      "b": 0.11764705882352941,
     "a": 0.5
   },
   "type": "COLOR",
@@ -10305,9 +10302,9 @@
 {
   "name": "button/danger/iconColor/rest",
   "value": {
-      "r": 0.5254901960784314,
-      "g": 0.023529411764705882,
-      "b": 0.11372549019607843,
+      "r": 0.5882352941176471,
+      "g": 0.050980392156862744,
+      "b": 0.11764705882352941,
     "a": 1
   },
   "type": "COLOR",
@@ -10337,9 +10334,9 @@
 {
   "name": "button/danger/iconColor/disabled",
   "value": {
-      "r": 0.5254901960784314,
-      "g": 0.023529411764705882,
-      "b": 0.11372549019607843,
+      "r": 0.5882352941176471,
+      "g": 0.050980392156862744,
+      "b": 0.11764705882352941,
     "a": 0.5
   },
   "type": "COLOR",
@@ -10764,9 +10761,9 @@
 {
   "name": "buttonCounter/danger/fgColor/rest",
   "value": {
-      "r": 0.5254901960784314,
-      "g": 0.023529411764705882,
-      "b": 0.11372549019607843,
+      "r": 0.5882352941176471,
+      "g": 0.050980392156862744,
+      "b": 0.11764705882352941,
     "a": 1
   },
   "type": "COLOR",
@@ -10796,9 +10793,9 @@
 {
   "name": "buttonCounter/danger/fgColor/disabled",
   "value": {
-      "r": 0.5254901960784314,
-      "g": 0.023529411764705882,
-      "b": 0.11372549019607843,
+      "r": 0.5882352941176471,
+      "g": 0.050980392156862744,
+      "b": 0.11764705882352941,
     "a": 0.5
   },
   "type": "COLOR",

@github-actions github-actions bot temporarily deployed to Preview (Storybook) April 9, 2026 03:49 Inactive
@janmaarten-a11y janmaarten-a11y marked this pull request as draft April 9, 2026 03:53
@janmaarten-a11y
Copy link
Copy Markdown
Contributor

janmaarten-a11y commented Apr 9, 2026

@copilot I'm getting a failing contrast check, as we tested the 7:1 contrast radio successfully on bgColor.default, but not bgColor.muted.

How should we resolve this?

contrastPair pass contrastRatio minimumContrastRatio
button-danger-fgColor-rest (#a0111f) vs. button-danger-bgColor-rest (#e0e6eb) 6.43:1 7:1
button-danger-iconColor-rest (#a0111f) vs. button-danger-bgColor-rest (#e0e6eb) 6.43:1 7:1
fgColor-accent (#0349b4) vs. bgColor-muted (#e6eaef) 6.64:1 7:1
fgColor-success (#055d20) vs. bgColor-muted (#e6eaef) 6.7:1 7:1
fgColor-open (#055d20) vs. bgColor-muted (#e6eaef) 6.7:1 7:1
fgColor-danger (#a0111f) vs. bgColor-muted (#e6eaef) 6.69:1 7:1
fgColor-closed (#a0111f) vs. bgColor-muted (#e6eaef) 6.69:1 7:1
fgColor-attention (#744500) vs. bgColor-muted (#e6eaef) 6.7:1 7:1
fgColor-severe (#873800) vs. bgColor-muted (#e6eaef) 6.69:1 7:1
fgColor-done (#622cbc) vs. bgColor-muted (#e6eaef) 6.66:1 7:1
fgColor-upsell (#622cbc) vs. bgColor-muted (#e6eaef) 6.66:1 7:1
fgColor-sponsors (#971368) vs. bgColor-muted (#e6eaef) 6.66:1 7:1

… in light-high-contrast

Agent-Logs-Url: https://github.com/primer/primitives/sessions/04c22cdb-0f77-450f-84d2-cfe42dc64578

Co-authored-by: janmaarten-a11y <83665577+janmaarten-a11y@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 9, 2026

@copilot I'm getting a failing contrast check, as we tested the 7:1 contrast radio successfully on bgColor.default, but not bgColor.muted.

How should we resolve this?
...

The failures were caused by the level 5 fgColors (less dark, more saturated) no longer meeting 7:1 against the light-high-contrast backgrounds that had been tuned for the darker level 6 values.

Fixed in f2cc524 by lightening two background tokens in light-high-contrast:

  • bgColor.muted: neutral.3 (#E6EAEF) → neutral.2 (#EFF2F5) — fixes all fgColor-* vs bgColor-muted failures
  • control.bgColor.rest: neutral.4 (#E0E6EB) → neutral.2 (#EFF2F5) — fixes the button-danger-fgColor-rest vs button-danger-bgColor-rest failures

Both changes only make backgrounds lighter, so no existing passing pairs can regress. All 12 previously failing pairs now pass at 7:1+ (ranging from 7.14:1 to 7.21:1).

@janmaarten-a11y
Copy link
Copy Markdown
Contributor

@copilot The 12 failures are all foreground colors narrowly missing the 7:1 high-contrast threshold against bgColor-muted. Every one lands between 6.43:1 and 6.70:1.

The issue is that level 5 (this PR) is too light for 7:1, but level 6 (the original) was too dark to tell the status colors apart. We can't just change bgColor-muted either since it's used all over the place.

There's precedent for this situation. When @langermank built the dark high-contrast themes in #1190, several fgColor overrides were set to hand-picked hex values between scale steps because no single step satisfied both contrast and visual quality. For example, fgColor.accent in dark HC is #74B9FF, which sits between blue.2 and blue.3 in that scale.

Token Override Nearest scale steps
fgColor.accent (dark HC) #74B9FF Between blue.2 (#91cbff) and blue.3 (#71b7ff)
fgColor.done (dark HC) #D3ABFF Between purple.2 (#dbb7ff) and purple.3 (#cb9eff)
fgColor.sponsors (dark HC) #FF90C8 Between pink.3 (#ff8dc7) and pink.4 (#F87CBD)

Let's follow the same approach here: pick custom hex values between level 5 and level 6 for each color in light-high-contrast that clear 7:1 while staying as saturated as possible. The two button-danger failures share the same red foreground color, so fixing that value covers those too.

  1. Clear 7:1 contrast against bgColor-muted (#e6eaef, relative luminance ~0.834), which means the foreground relative luminance must be at most ~0.069
  2. Stay as close to level 5 as possible to preserve the saturation and color differentiation that motivated this PR
  3. Use the inline hex override style already established by the dark HC theme overrides

For reference, the HSL lightness targets are roughly 55-60% of the way from level 5 toward level 6 for each color. Here are the level 5 and level 6 bounds to interpolate between:

Color Level 5 Level 6 Level 5 contrast Level 6 contrast
blue #0349b4 #023b95 6.64:1 8.12:1
green #055d20 #024c1a 6.70:1 8.04:1
yellow #744500 #603700 6.70:1 8.08:1
orange #873800 #702c00 6.69:1 8.09:1
red #a0111f #86061d 6.69:1 8.11:1
purple #622cbc #512598 6.66:1 8.00:1
pink #971368 #7d0c57 6.66:1 8.06:1

The two button-danger failures (button-danger-fgColor-rest and button-danger-iconColor-rest) both use fgColor.danger (#a0111f) against button-danger-bgColor-rest (#e0e6eb). Fixing the red fgColor value should resolve those as well, since #e0e6eb is even lighter than bgColor-muted and will produce a higher contrast ratio for any given foreground color.

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 9, 2026

@copilot The 12 failures are all foreground colors narrowly missing the 7:1 high-contrast threshold against bgColor-muted. Every one lands between 6.43:1 and 6.70:1.

The issue is that level 5 (this...

Done in b24544d. Reverted the background token changes and instead applied custom hex values for each light-high-contrast fgColor, interpolated between scale levels 5 and 6 in RGB space (closest point that clears 7:1), following the dark HC precedent.

For red (fgColor.danger), the target was the stricter button-danger-bgColor-rest (#e0e6eb, neutral.4) since it's slightly darker than bgColor-muted — fixing fgColor.danger automatically resolves the two button-danger failures.

Token Old (level 5) New hex vs bgColor-muted vs button-bg
fgColor.accent #0349b4 6.64:1 #0346ac ✅ 7.02:1
fgColor.success #055d20 6.70:1 #04591f ✅ 7.08:1
fgColor.attention #744500 6.70:1 #704200 ✅ 7.04:1
fgColor.severe #873800 6.70:1 #823600 ✅ 7.02:1
fgColor.danger #a0111f 6.69:1 #960d1e ✅ 7.32:1 ✅ 7.03:1
fgColor.done #622cbc 6.66:1 #5e2bb4 ✅ 7.01:1
fgColor.sponsors #971368 6.66:1 #911264 ✅ 7.02:1

Copilot AI changed the title Update light-high-contrast fgColor tokens from scale level 6 to level 5 Update light-high-contrast fgColor tokens to custom hex values between scale levels 5 and 6 Apr 9, 2026
@janmaarten-a11y
Copy link
Copy Markdown
Contributor

@copilot Thanks for that. This has become a more complex problem than originally thought. Each custom hex override is a deviation from the scale system that needs to be individually justified and maintained. There's a meaningful difference between three targeted overrides for a specific accessibility issue and seven overrides that "round out" the change. The extra four add maintenance cost without a clear user-facing problem driving them.

Reverting accent, attention, severe, and sponsors back to their original {base.color.*.6} references would keep the PR focused on the reported problem, reduce the number of off-scale values to maintain, and make the rationale clearer for future contributors reading the git history. If those four colors turn out to need the same treatment later, that can be a separate PR with its own justification.

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 9, 2026

@janmaarten-a11y I've opened a new pull request, #1347, to work on those changes. Once the pull request is ready, I'll request review from you.

…success, danger, and done (#1347)

* Initial plan

* Revert accent, attention, severe, sponsors to base.color.*.6 in light-high-contrast

Agent-Logs-Url: https://github.com/primer/primitives/sessions/233af47e-2c0a-4412-8864-f9fbc12605b7

Co-authored-by: janmaarten-a11y <83665577+janmaarten-a11y@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: janmaarten-a11y <83665577+janmaarten-a11y@users.noreply.github.com>
@github-actions github-actions bot temporarily deployed to Preview (Storybook) April 9, 2026 04:52 Inactive
@janmaarten-a11y janmaarten-a11y marked this pull request as ready for review April 9, 2026 05:31
@lukasoppermann
Copy link
Copy Markdown
Collaborator

@janmaarten-a11y can we avoid custom hex colors and use an even stronger contrast in the scale? I'd like to avoid adding complexity through custom colors.

@janmaarten-a11y
Copy link
Copy Markdown
Contributor

@lukasoppermann I didn't want to use custom hex values here, but I didn't see another option.

Currently, we're using base-color-{scale}-6 which is dark enough that it prompted the original report.

I tried bumping it to base-color-{scale}-5, but that only works against bgColor.default (white). It fails the high contrast requirement of 7:1 when using muted (gray) backgrounds.

That's where I found @langermank had run into the same issue with Dark High Contrast and ended up using custom hex values on a few colors for the same reason.

If we really want to avoid that, we have a few options:

  1. We go down to base-color-{scale}-5 to avoid custom hex values, and then we drop the bgColor.muted values down to a lighter neutral color.
  2. We change the actual color values of base-color-{red/green/purple}-6 to these lighter hex values
  3. We don't fix this as all and close the PR

I tried the first one, but worried that it would have a lot of other downstream effects throughout the site and generally make it more difficult to differentiate default and muted backgrounds when using Light High Contrast.

What do you think?

@lukasoppermann
Copy link
Copy Markdown
Collaborator

@janmaarten-a11y okay, now I get it. Makes sense. I guess, less use hex for now.

Since this is json5, can you try adding a comment to the colors with a short mention why they use custom colors for later?

Improves visual differentiation between status colors (open/closed/done) in the light high-contrast theme by updating fgColor tokens to custom hex values between scale levels 5 and 6.
@janmaarten-a11y janmaarten-a11y merged commit 7728903 into main Apr 10, 2026
30 checks passed
@janmaarten-a11y janmaarten-a11y deleted the copilot/update-fgcolor-tokens-level-5 branch April 10, 2026 19:37
@primer primer bot mentioned this pull request Apr 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants