Skip to content

Refactor: consolidate focus outline tokens into component file#1344

Merged
lukasoppermann merged 7 commits intomainfrom
focus-outline-component-tokens
Apr 14, 2026
Merged

Refactor: consolidate focus outline tokens into component file#1344
lukasoppermann merged 7 commits intomainfrom
focus-outline-component-tokens

Conversation

@lukasoppermann
Copy link
Copy Markdown
Collaborator

@lukasoppermann lukasoppermann commented Apr 8, 2026

Summary

This implements changes from https://github.com/github/core-ux/issues/2051

Component-level focus tokens (new and improved):

  • Added a new focus object in src/tokens/component/focus.json5 that defines outline, outline-color, outline-width, and outline-offset tokens, with accessibility-focused descriptions, usage guidance, and Figma metadata. Deprecated legacy tokens and provided migration paths.

Deprecation and removal of old functional tokens:

  • Deprecate outline-focus-offset and outline-focus-width tokens.
  • Removed the previous focus outline border token from src/tokens/functional/border/border.json5, which is now replaced by the new component-level token.
  • Removed the old focus outline color token from src/tokens/functional/color/focus.json5, consolidating color definition under the new structure.
  • Removed the previous focus outline offset and width tokens from src/tokens/functional/size/border.json5, as these are now defined and managed in the new component token file.

CSS variable fallback updates:

  • Added a new CSS variable fallback for --focus-outline-color in src/tokens/fallback/color-fallbacks.json to align with the new token naming.

Move all focus outline tokens into src/tokens/component/focus.json5 with
consistent kebab-case naming (focus-outline-color, focus-outline-width,
focus-outline-offset). Keep focus-outline composite token. Add deprecated
aliases for old names (focus-outlineColor, outline-focus-width,
outline-focus-offset).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings April 8, 2026 10:57
@lukasoppermann lukasoppermann requested a review from a team as a code owner April 8, 2026 10:57
@lukasoppermann lukasoppermann requested a review from jonrohan April 8, 2026 10:57
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Apr 8, 2026

🦋 Changeset detected

Latest commit: 328a69e

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 8, 2026

Design Token Diff (CSS)

/css/functional/size/border.css

+++ /home/runner/work/primitives/primitives/dist/css/functional/size/border.css	2026-04-14 07:29:29.384501322 +0000
@@ -2,10 +2,12 @@
 --borderWidth-thick: 0.125rem; /** Thick 2px border for emphasis. Use for focus indicators, selected states, or to emphasize important boundaries */
 --borderWidth-thicker: 0.25rem; /** Extra thick 4px border for maximum emphasis. Use sparingly for high-contrast focus indicators or critical visual separators */
 --borderWidth-thin: 0.0625rem; /** Standard 1px border width. Use for most borders, dividers, and outlines throughout the interface */
-  --outline-focus-offset: -0.125rem; /** Focus outline offset (-2px). Negative value creates an inset outline for keyboard focus indicators, ensuring the focus ring stays within the element bounds */
-  --outline-focus-width: 0.125rem; /** Focus outline width (2px). Standard width for keyboard focus indicators to meet WCAG 2.4.7 accessibility requirements */
+  --focus-outline-offset: -0.125rem; /** Focus outline offset (-2px). Negative value creates an inset outline for keyboard focus indicators, ensuring the focus ring stays within the element bounds */
+  --focus-outline-width: 0.125rem; /** Focus outline width (2px). Standard width for keyboard focus indicators to meet WCAG 2.4.7 accessibility requirements */
 --borderWidth-default: var(--borderWidth-thin); /** Default border width for most UI elements. Alias of borderWidth.thin (1px) */
 --boxShadow-thick: inset 0 0 0 var(--borderWidth-thick); /** Thick shadow (2px) used instead of a border for emphasis without layout shift */
 --boxShadow-thicker: inset 0 0 0 var(--borderWidth-thicker); /** Thickest shadow (4px) used for high emphasis borders without layout shift. Use sparingly for maximum visual impact */
 --boxShadow-thin: inset 0 0 0 var(--borderWidth-thin); /** Thin shadow used instead of a border to prevent layout shift */
+  --outline-focus-offset: var(--focus-outline-offset); /** Deprecated. Use focus.outline-offset instead. */
+  --outline-focus-width: var(--focus-outline-width); /** Deprecated. Use focus.outline-width instead. */
}

/css/functional/themes/dark-colorblind-high-contrast.css

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/dark-colorblind-high-contrast.css	2026-04-14 07:29:30.459535914 +0000
@@ -765,7 +765,7 @@
 --fgColor-onEmphasis: #ffffff; /** Text color for use on emphasis backgrounds */
 --fgColor-onInverse: #010409; /** Text color for use on inverse backgrounds */
 --fgColor-white: #ffffff; /** Pure white text */
-  --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
 --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
 --label-blue-borderColor: var(--label-blue-fgColor-rest);
@@ -876,7 +876,8 @@
 --diffBlob-expander-iconColor: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
 --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-  --focus-outline: 2px solid #409eff; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #409eff; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --page-header-bgColor: var(--bgColor-default);
 --progressBar-track-bgColor: var(--bgColor-inverse);
 --shadow-floating-large: 0 0 0 1px #b7bdc8, 0 24px 48px 0 #010409; /** Large floating shadow for modals and dialogs */
@@ -1667,7 +1668,7 @@
   --fgColor-onEmphasis: #ffffff; /** Text color for use on emphasis backgrounds */
   --fgColor-onInverse: #010409; /** Text color for use on inverse backgrounds */
   --fgColor-white: #ffffff; /** Pure white text */
-    --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
   --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
   --label-blue-borderColor: var(--label-blue-fgColor-rest);
@@ -1778,7 +1779,8 @@
   --diffBlob-expander-iconColor: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
   --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-    --focus-outline: 2px solid #409eff; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #409eff; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --page-header-bgColor: var(--bgColor-default);
   --progressBar-track-bgColor: var(--bgColor-inverse);
   --shadow-floating-large: 0 0 0 1px #b7bdc8, 0 24px 48px 0 #010409; /** Large floating shadow for modals and dialogs */

/css/functional/themes/dark-colorblind.css

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/dark-colorblind.css	2026-04-14 07:29:30.460535946 +0000
@@ -804,7 +804,7 @@
 --fgColor-onInverse: #010409; /** Text color for use on inverse backgrounds */
 --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 */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
 --overlay-bgColor: #010409;
 --page-header-bgColor: var(--bgColor-default);
@@ -882,7 +882,8 @@
 --controlTrack-fgColor-disabled: var(--fgColor-onEmphasis);
 --dashboard-bgColor: var(--bgColor-inset);
 --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
-  --focus-outline: 2px solid #1f6feb; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #1f6feb; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --overlay-borderColor: var(--borderColor-muted);
 --tooltip-fgColor: var(--fgColor-onEmphasis);
 --border-draft-emphasis: 0.0625rem solid #656c76;
@@ -1706,7 +1707,7 @@
   --fgColor-onInverse: #010409; /** Text color for use on inverse backgrounds */
   --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 */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
   --overlay-bgColor: #010409;
   --page-header-bgColor: var(--bgColor-default);
@@ -1784,7 +1785,8 @@
   --controlTrack-fgColor-disabled: var(--fgColor-onEmphasis);
   --dashboard-bgColor: var(--bgColor-inset);
   --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
-    --focus-outline: 2px solid #1f6feb; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #1f6feb; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --overlay-borderColor: var(--borderColor-muted);
   --tooltip-fgColor: var(--fgColor-onEmphasis);
   --border-draft-emphasis: 0.0625rem solid #656c76;

/css/functional/themes/dark-dimmed-high-contrast.css

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/dark-dimmed-high-contrast.css	2026-04-14 07:29:30.461535979 +0000
@@ -796,7 +796,7 @@
 --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: #cdd9e5; /** Pure white text */
-  --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #cdd9e5b3;
 --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
 --label-blue-borderColor: var(--label-blue-fgColor-rest);
@@ -878,7 +878,8 @@
 --controlKnob-borderColor-checked: var(--control-checked-bgColor-rest);
 --controlKnob-borderColor-disabled: var(--control-bgColor-disabled);
 --controlTrack-borderColor-rest: var(--borderColor-emphasis);
-  --focus-outline: 2px solid #6cb6ff; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #6cb6ff; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --progressBar-track-bgColor: var(--bgColor-inverse);
 --reactionButton-selected-fgColor-rest: var(--fgColor-link);
 --shadow-floating-large: 0 0 0 1px #b7bdc8, 0 24px 48px 0 #010409; /** Large floating shadow for modals and dialogs */
@@ -1698,7 +1699,7 @@
   --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: #cdd9e5; /** Pure white text */
-    --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #cdd9e5b3;
   --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
   --label-blue-borderColor: var(--label-blue-fgColor-rest);
@@ -1780,7 +1781,8 @@
   --controlKnob-borderColor-checked: var(--control-checked-bgColor-rest);
   --controlKnob-borderColor-disabled: var(--control-bgColor-disabled);
   --controlTrack-borderColor-rest: var(--borderColor-emphasis);
-    --focus-outline: 2px solid #6cb6ff; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #6cb6ff; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --progressBar-track-bgColor: var(--bgColor-inverse);
   --reactionButton-selected-fgColor-rest: var(--fgColor-link);
   --shadow-floating-large: 0 0 0 1px #b7bdc8, 0 24px 48px 0 #010409; /** Large floating shadow for modals and dialogs */

/css/functional/themes/dark-dimmed.css

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/dark-dimmed.css	2026-04-14 07:29:30.461535979 +0000
@@ -830,7 +830,7 @@
 --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: #cdd9e5; /** Pure white text */
-  --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #cdd9e5b3;
 --page-header-bgColor: var(--bgColor-default);
 --progressBar-bgColor-accent: var(--bgColor-accent-emphasis);
@@ -895,7 +895,8 @@
 --controlKnob-bgColor-disabled: var(--control-bgColor-disabled);
 --controlKnob-borderColor-checked: var(--control-checked-bgColor-rest);
 --controlKnob-borderColor-disabled: var(--control-bgColor-disabled);
-  --focus-outline: 2px solid #316dca; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #316dca; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --border-draft-emphasis: 0.0625rem solid #656c76;
 --button-danger-borderColor-hover: var(--button-primary-borderColor-rest);
 --button-outline-borderColor-active: var(--button-outline-borderColor-hover);
@@ -1732,7 +1733,7 @@
   --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: #cdd9e5; /** Pure white text */
-    --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #cdd9e5b3;
   --page-header-bgColor: var(--bgColor-default);
   --progressBar-bgColor-accent: var(--bgColor-accent-emphasis);
@@ -1797,7 +1798,8 @@
   --controlKnob-bgColor-disabled: var(--control-bgColor-disabled);
   --controlKnob-borderColor-checked: var(--control-checked-bgColor-rest);
   --controlKnob-borderColor-disabled: var(--control-bgColor-disabled);
-    --focus-outline: 2px solid #316dca; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #316dca; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --border-draft-emphasis: 0.0625rem solid #656c76;
   --button-danger-borderColor-hover: var(--button-primary-borderColor-rest);
   --button-outline-borderColor-active: var(--button-outline-borderColor-hover);

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

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/dark-high-contrast.css	2026-04-14 07:29:30.462536010 +0000
@@ -765,7 +765,7 @@
 --fgColor-onEmphasis: #ffffff; /** Text color for use on emphasis backgrounds */
 --fgColor-onInverse: #010409; /** Text color for use on inverse backgrounds */
 --fgColor-white: #ffffff; /** Pure white text */
-  --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
 --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
 --label-blue-borderColor: var(--label-blue-fgColor-rest);
@@ -874,7 +874,8 @@
 --diffBlob-expander-iconColor: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
 --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-  --focus-outline: 2px solid #409eff; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #409eff; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --page-header-bgColor: var(--bgColor-default);
 --progressBar-track-bgColor: var(--bgColor-inverse);
 --shadow-floating-large: 0 0 0 1px #b7bdc8, 0 24px 48px 0 #010409; /** Large floating shadow for modals and dialogs */
@@ -1667,7 +1668,7 @@
   --fgColor-onEmphasis: #ffffff; /** Text color for use on emphasis backgrounds */
   --fgColor-onInverse: #010409; /** Text color for use on inverse backgrounds */
   --fgColor-white: #ffffff; /** Pure white text */
-    --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
   --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
   --label-blue-borderColor: var(--label-blue-fgColor-rest);
@@ -1776,7 +1777,8 @@
   --diffBlob-expander-iconColor: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
   --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-    --focus-outline: 2px solid #409eff; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #409eff; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --page-header-bgColor: var(--bgColor-default);
   --progressBar-track-bgColor: var(--bgColor-inverse);
   --shadow-floating-large: 0 0 0 1px #b7bdc8, 0 24px 48px 0 #010409; /** Large floating shadow for modals and dialogs */

/css/functional/themes/dark-tritanopia-high-contrast.css

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/dark-tritanopia-high-contrast.css	2026-04-14 07:29:30.462536010 +0000
@@ -765,7 +765,7 @@
 --fgColor-onEmphasis: #ffffff; /** Text color for use on emphasis backgrounds */
 --fgColor-onInverse: #010409; /** Text color for use on inverse backgrounds */
 --fgColor-white: #ffffff; /** Pure white text */
-  --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
 --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
 --label-blue-borderColor: var(--label-blue-fgColor-rest);
@@ -876,7 +876,8 @@
 --diffBlob-expander-iconColor: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
 --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-  --focus-outline: 2px solid #409eff; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #409eff; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --page-header-bgColor: var(--bgColor-default);
 --progressBar-track-bgColor: var(--bgColor-inverse);
 --shadow-floating-large: 0 0 0 1px #b7bdc8, 0 24px 48px 0 #010409; /** Large floating shadow for modals and dialogs */
@@ -1667,7 +1668,7 @@
   --fgColor-onEmphasis: #ffffff; /** Text color for use on emphasis backgrounds */
   --fgColor-onInverse: #010409; /** Text color for use on inverse backgrounds */
   --fgColor-white: #ffffff; /** Pure white text */
-    --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
   --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
   --label-blue-borderColor: var(--label-blue-fgColor-rest);
@@ -1778,7 +1779,8 @@
   --diffBlob-expander-iconColor: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
   --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-    --focus-outline: 2px solid #409eff; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #409eff; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --page-header-bgColor: var(--bgColor-default);
   --progressBar-track-bgColor: var(--bgColor-inverse);
   --shadow-floating-large: 0 0 0 1px #b7bdc8, 0 24px 48px 0 #010409; /** Large floating shadow for modals and dialogs */

/css/functional/themes/dark-tritanopia.css

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/dark-tritanopia.css	2026-04-14 07:29:30.463536043 +0000
@@ -806,7 +806,7 @@
 --fgColor-onInverse: #010409; /** Text color for use on inverse backgrounds */
 --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 */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
 --overlay-bgColor: #010409;
 --page-header-bgColor: var(--bgColor-default);
@@ -882,7 +882,8 @@
 --controlTrack-fgColor-disabled: var(--fgColor-onEmphasis);
 --dashboard-bgColor: var(--bgColor-inset);
 --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
-  --focus-outline: 2px solid #1f6feb; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #1f6feb; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --overlay-borderColor: var(--borderColor-muted);
 --tooltip-fgColor: var(--fgColor-onEmphasis);
 --border-draft-emphasis: 0.0625rem solid #656c76;
@@ -1708,7 +1709,7 @@
   --fgColor-onInverse: #010409; /** Text color for use on inverse backgrounds */
   --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 */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
   --overlay-bgColor: #010409;
   --page-header-bgColor: var(--bgColor-default);
@@ -1784,7 +1785,8 @@
   --controlTrack-fgColor-disabled: var(--fgColor-onEmphasis);
   --dashboard-bgColor: var(--bgColor-inset);
   --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
-    --focus-outline: 2px solid #1f6feb; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #1f6feb; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --overlay-borderColor: var(--borderColor-muted);
   --tooltip-fgColor: var(--fgColor-onEmphasis);
   --border-draft-emphasis: 0.0625rem solid #656c76;

/css/functional/themes/dark.css

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/dark.css	2026-04-14 07:29:30.464536075 +0000
@@ -804,7 +804,7 @@
 --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 */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
 --overlay-bgColor: #010409;
 --page-header-bgColor: var(--bgColor-default);
@@ -880,7 +880,8 @@
 --controlTrack-fgColor-disabled: var(--fgColor-onEmphasis);
 --dashboard-bgColor: var(--bgColor-inset);
 --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
-  --focus-outline: 2px solid #1f6feb; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #1f6feb; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --overlay-borderColor: var(--borderColor-muted);
 --tooltip-fgColor: var(--fgColor-onEmphasis);
 --border-draft-emphasis: 0.0625rem solid #656c76;
@@ -1706,7 +1707,7 @@
   --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 */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
   --overlay-bgColor: #010409;
   --page-header-bgColor: var(--bgColor-default);
@@ -1782,7 +1783,8 @@
   --controlTrack-fgColor-disabled: var(--fgColor-onEmphasis);
   --dashboard-bgColor: var(--bgColor-inset);
   --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
-    --focus-outline: 2px solid #1f6feb; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #1f6feb; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --overlay-borderColor: var(--borderColor-muted);
   --tooltip-fgColor: var(--fgColor-onEmphasis);
   --border-draft-emphasis: 0.0625rem solid #656c76;

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

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/light-colorblind-high-contrast.css	2026-04-14 07:29:30.464536075 +0000
@@ -774,7 +774,7 @@
 --fgColor-onInverse: #ffffff; /** Text color for use on inverse backgrounds */
 --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 */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
 --header-fgColor-logo: #ffffff;
 --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
@@ -888,7 +888,8 @@
 --diffBlob-expander-iconColor: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-hover: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-  --focus-outline: 2px solid #0349b4; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #0349b4; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --progressBar-track-bgColor: var(--bgColor-default);
 --reactionButton-selected-fgColor-rest: var(--fgColor-link);
 --shadow-floating-large: 0 0 0 1px #454c54, 0 40px 80px 0 #25292e3d; /** Large floating shadow for modals and dialogs */
@@ -1676,7 +1677,7 @@
   --fgColor-onInverse: #ffffff; /** Text color for use on inverse backgrounds */
   --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 */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
   --header-fgColor-logo: #ffffff;
   --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
@@ -1790,7 +1791,8 @@
   --diffBlob-expander-iconColor: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-hover: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-    --focus-outline: 2px solid #0349b4; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #0349b4; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --progressBar-track-bgColor: var(--bgColor-default);
   --reactionButton-selected-fgColor-rest: var(--fgColor-link);
   --shadow-floating-large: 0 0 0 1px #454c54, 0 40px 80px 0 #25292e3d; /** Large floating shadow for modals and dialogs */

/css/functional/themes/light-colorblind.css

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/light-colorblind.css	2026-04-14 07:29:30.465536107 +0000
@@ -790,7 +790,7 @@
 --fgColor-onInverse: #ffffff; /** Text color for use on inverse backgrounds */
 --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 */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
 --header-fgColor-logo: #ffffff;
 --overlay-bgColor: #ffffff;
@@ -882,7 +882,8 @@
 --diffBlob-deletionWord-fgColor: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-hover: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-  --focus-outline: 2px solid #0969da; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #0969da; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --overlay-borderColor: #d1d9e080;
 --reactionButton-selected-fgColor-rest: var(--fgColor-link);
 --tooltip-fgColor: var(--fgColor-onEmphasis);
@@ -1692,7 +1693,7 @@
   --fgColor-onInverse: #ffffff; /** Text color for use on inverse backgrounds */
   --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 */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
   --header-fgColor-logo: #ffffff;
   --overlay-bgColor: #ffffff;
@@ -1784,7 +1785,8 @@
   --diffBlob-deletionWord-fgColor: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-hover: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-    --focus-outline: 2px solid #0969da; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #0969da; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --overlay-borderColor: #d1d9e080;
   --reactionButton-selected-fgColor-rest: var(--fgColor-link);
   --tooltip-fgColor: var(--fgColor-onEmphasis);

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

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/light-high-contrast.css	2026-04-14 07:29:30.465536107 +0000
@@ -776,7 +776,7 @@
 --fgColor-onEmphasis: #ffffff; /** Text color for use on emphasis backgrounds */
 --fgColor-onInverse: #ffffff; /** Text color for use on inverse backgrounds */
 --fgColor-white: #ffffff; /** Pure white text */
-  --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
 --header-fgColor-logo: #ffffff;
 --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
@@ -886,7 +886,8 @@
 --diffBlob-expander-iconColor: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
 --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-  --focus-outline: 2px solid #0349b4; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #0349b4; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --progressBar-track-bgColor: var(--bgColor-default);
 --reactionButton-selected-fgColor-rest: var(--fgColor-link);
 --shadow-floating-large: 0 0 0 1px #454c54, 0 40px 80px 0 #25292e3d; /** Large floating shadow for modals and dialogs */
@@ -1678,7 +1679,7 @@
   --fgColor-onEmphasis: #ffffff; /** Text color for use on emphasis backgrounds */
   --fgColor-onInverse: #ffffff; /** Text color for use on inverse backgrounds */
   --fgColor-white: #ffffff; /** Pure white text */
-    --focus-outlineColor: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
   --header-fgColor-logo: #ffffff;
   --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
@@ -1788,7 +1789,8 @@
   --diffBlob-expander-iconColor: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
   --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-    --focus-outline: 2px solid #0349b4; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #0349b4; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --progressBar-track-bgColor: var(--bgColor-default);
   --reactionButton-selected-fgColor-rest: var(--fgColor-link);
   --shadow-floating-large: 0 0 0 1px #454c54, 0 40px 80px 0 #25292e3d; /** Large floating shadow for modals and dialogs */

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

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/light-tritanopia-high-contrast.css	2026-04-14 07:29:30.466536139 +0000
@@ -774,7 +774,7 @@
 --fgColor-onInverse: #ffffff; /** Text color for use on inverse backgrounds */
 --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 */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
 --header-fgColor-logo: #ffffff;
 --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
@@ -888,7 +888,8 @@
 --diffBlob-expander-iconColor: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-hover: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-  --focus-outline: 2px solid #0349b4; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #0349b4; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --progressBar-track-bgColor: var(--bgColor-default);
 --reactionButton-selected-fgColor-rest: var(--fgColor-link);
 --shadow-floating-large: 0 0 0 1px #454c54, 0 40px 80px 0 #25292e3d; /** Large floating shadow for modals and dialogs */
@@ -1676,7 +1677,7 @@
   --fgColor-onInverse: #ffffff; /** Text color for use on inverse backgrounds */
   --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 */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
   --header-fgColor-logo: #ffffff;
   --label-auburn-borderColor: var(--label-auburn-fgColor-rest);
@@ -1790,7 +1791,8 @@
   --diffBlob-expander-iconColor: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-hover: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-    --focus-outline: 2px solid #0349b4; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #0349b4; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --progressBar-track-bgColor: var(--bgColor-default);
   --reactionButton-selected-fgColor-rest: var(--fgColor-link);
   --shadow-floating-large: 0 0 0 1px #454c54, 0 40px 80px 0 #25292e3d; /** Large floating shadow for modals and dialogs */

/css/functional/themes/light-tritanopia.css

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/light-tritanopia.css	2026-04-14 07:29:30.466536139 +0000
@@ -792,7 +792,7 @@
 --fgColor-onInverse: #ffffff; /** Text color for use on inverse backgrounds */
 --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 */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
 --header-fgColor-logo: #ffffff;
 --overlay-bgColor: #ffffff;
@@ -882,7 +882,8 @@
 --diffBlob-deletionWord-fgColor: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-hover: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-  --focus-outline: 2px solid #0969da; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #0969da; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --overlay-borderColor: #d1d9e080;
 --reactionButton-selected-fgColor-rest: var(--fgColor-link);
 --tooltip-fgColor: var(--fgColor-onEmphasis);
@@ -1694,7 +1695,7 @@
   --fgColor-onInverse: #ffffff; /** Text color for use on inverse backgrounds */
   --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 */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
   --header-fgColor-logo: #ffffff;
   --overlay-bgColor: #ffffff;
@@ -1784,7 +1785,8 @@
   --diffBlob-deletionWord-fgColor: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-hover: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-    --focus-outline: 2px solid #0969da; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #0969da; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --overlay-borderColor: #d1d9e080;
   --reactionButton-selected-fgColor-rest: var(--fgColor-link);
   --tooltip-fgColor: var(--fgColor-onEmphasis);

/css/functional/themes/light.css

+++ /home/runner/work/primitives/primitives/dist/css/functional/themes/light.css	2026-04-14 07:29:30.467536172 +0000
@@ -792,7 +792,7 @@
 --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 */
+  --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
 --header-fgColor-default: #ffffffb3;
 --header-fgColor-logo: #ffffff;
 --overlay-bgColor: #ffffff;
@@ -880,7 +880,8 @@
 --diffBlob-deletionWord-fgColor: var(--fgColor-default);
 --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
 --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-  --focus-outline: 2px solid #0969da; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outline: 0.125rem solid #0969da; /** Focus ring outline for keyboard navigation and accessibility. */
+  --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
 --overlay-borderColor: #d1d9e080;
 --reactionButton-selected-fgColor-rest: var(--fgColor-link);
 --tooltip-fgColor: var(--fgColor-onEmphasis);
@@ -1694,7 +1695,7 @@
   --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 */
+    --focus-outline-color: var(--borderColor-accent-emphasis); /** Outline color for focus states on interactive elements */
   --header-fgColor-default: #ffffffb3;
   --header-fgColor-logo: #ffffff;
   --overlay-bgColor: #ffffff;
@@ -1782,7 +1783,8 @@
   --diffBlob-deletionWord-fgColor: var(--fgColor-default);
   --diffBlob-hunkNum-fgColor-hover: var(--fgColor-onEmphasis);
   --diffBlob-hunkNum-fgColor-rest: var(--fgColor-default);
-    --focus-outline: 2px solid #0969da; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outline: 0.125rem solid #0969da; /** Focus ring outline for keyboard navigation and accessibility. */
+    --focus-outlineColor: var(--focus-outline-color); /** Deprecated. Use focus.outline-color instead. */
   --overlay-borderColor: #d1d9e080;
   --reactionButton-selected-fgColor-rest: var(--fgColor-link);
   --tooltip-fgColor: var(--fgColor-onEmphasis);

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 8, 2026

Design Token Diff (StyleLint)

/styleLint/functional/size/border.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/size/border.json	2026-04-14 07:29:29.384501322 +0000
@@ -183,43 +183,43 @@
   "attributes": {},
   "path": ["boxShadow", "thin"]
 },
-  "outline-focus-offset": {
-    "key": "{outline.focus.offset}",
+  "focus-outline-offset": {
+    "key": "{focus.outline-offset}",
   "$value": ["-0.125rem", "-2px"],
-    "$description": "Focus outline offset (-2px). Negative value creates an inset outline for keyboard focus indicators, ensuring the focus ring stays within the element bounds",
   "$type": "dimension",
+    "$description": "Focus outline offset (-2px). Negative value creates an inset outline for keyboard focus indicators, ensuring the focus ring stays within the element bounds",
   "$extensions": {
     "org.primer.figma": {
       "collection": "functional/size",
       "scopes": ["borderWidth", "effectFloat"]
     }
   },
-    "filePath": "src/tokens/functional/size/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
       "value": -2,
       "unit": "px"
     },
-      "$description": "Focus outline offset (-2px). Negative value creates an inset outline for keyboard focus indicators, ensuring the focus ring stays within the element bounds",
     "$type": "dimension",
+      "$description": "Focus outline offset (-2px). Negative value creates an inset outline for keyboard focus indicators, ensuring the focus ring stays within the element bounds",
     "$extensions": {
       "org.primer.figma": {
         "collection": "functional/size",
         "scopes": ["borderWidth", "effectFloat"]
       }
     },
-      "key": "{outline.focus.offset}"
+      "key": "{focus.outline-offset}"
   },
-    "name": "outline-focus-offset",
+    "name": "focus-outline-offset",
   "attributes": {},
-    "path": ["outline", "focus", "offset"]
+    "path": ["focus", "outline-offset"]
 },
-  "outline-focus-width": {
-    "key": "{outline.focus.width}",
+  "focus-outline-width": {
+    "key": "{focus.outline-width}",
   "$value": ["0.125rem", "2px"],
-    "$description": "Focus outline width (2px). Standard width for keyboard focus indicators to meet WCAG 2.4.7 accessibility requirements",
   "$type": "dimension",
+    "$description": "Focus outline width (2px). Standard width for keyboard focus indicators to meet WCAG 2.4.7 accessibility requirements",
   "$extensions": {
     "org.primer.figma": {
       "collection": "functional/size",
@@ -230,15 +230,15 @@
       "rules": "MUST use for all keyboard focus indicators. Required for WCAG 2.4.7 compliance."
     }
   },
-    "filePath": "src/tokens/functional/size/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
       "value": 2,
       "unit": "px"
     },
-      "$description": "Focus outline width (2px). Standard width for keyboard focus indicators to meet WCAG 2.4.7 accessibility requirements",
     "$type": "dimension",
+      "$description": "Focus outline width (2px). Standard width for keyboard focus indicators to meet WCAG 2.4.7 accessibility requirements",
     "$extensions": {
       "org.primer.figma": {
         "collection": "functional/size",
@@ -249,6 +249,68 @@
         "rules": "MUST use for all keyboard focus indicators. Required for WCAG 2.4.7 compliance."
       }
     },
+      "key": "{focus.outline-width}"
+    },
+    "name": "focus-outline-width",
+    "attributes": {},
+    "path": ["focus", "outline-width"]
+  },
+  "outline-focus-offset": {
+    "key": "{outline.focus.offset}",
+    "$value": ["-0.125rem", "-2px"],
+    "$type": "dimension",
+    "$deprecated": ["-0.125rem", "-2px"],
+    "$description": "Deprecated. Use focus.outline-offset instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "functional/size",
+        "scopes": ["borderWidth", "effectFloat"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-offset}",
+      "$type": "dimension",
+      "$deprecated": "{focus.outline-offset}",
+      "$description": "Deprecated. Use focus.outline-offset instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "functional/size",
+          "scopes": ["borderWidth", "effectFloat"]
+        }
+      },
+      "key": "{outline.focus.offset}"
+    },
+    "name": "outline-focus-offset",
+    "attributes": {},
+    "path": ["outline", "focus", "offset"]
+  },
+  "outline-focus-width": {
+    "key": "{outline.focus.width}",
+    "$value": ["0.125rem", "2px"],
+    "$type": "dimension",
+    "$deprecated": ["0.125rem", "2px"],
+    "$description": "Deprecated. Use focus.outline-width instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "functional/size",
+        "scopes": ["borderWidth", "effectFloat"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-width}",
+      "$type": "dimension",
+      "$deprecated": "{focus.outline-width}",
+      "$description": "Deprecated. Use focus.outline-width instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "functional/size",
+          "scopes": ["borderWidth", "effectFloat"]
+        }
+      },
     "key": "{outline.focus.width}"
   },
   "name": "outline-focus-width",

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

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-colorblind-high-contrast.json	2026-04-14 07:29:27.386437414 +0000
@@ -39619,7 +39619,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #409eff",
+    "$value": {
+      "color": "#409eff",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39628,16 +39632,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39653,8 +39654,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#409eff",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39669,7 +39670,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39686,6 +39687,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#409eff",
+    "$type": "color",
+    "$deprecated": "#409eff",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

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

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-colorblind.json	2026-04-14 07:29:25.679382945 +0000
@@ -39611,7 +39611,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #1f6feb",
+    "$value": {
+      "color": "#1f6feb",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39620,16 +39624,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39645,8 +39646,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#1f6feb",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39661,7 +39662,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39678,6 +39679,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#1f6feb",
+    "$type": "color",
+    "$deprecated": "#1f6feb",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

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

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-dimmed-high-contrast.json	2026-04-14 07:29:20.598239618 +0000
@@ -39629,7 +39629,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #6cb6ff",
+    "$value": {
+      "color": "#6cb6ff",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39638,16 +39642,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39663,8 +39664,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#6cb6ff",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39679,7 +39680,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39696,6 +39697,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#6cb6ff",
+    "$type": "color",
+    "$deprecated": "#6cb6ff",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

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

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-dimmed.json	2026-04-14 07:29:18.879183979 +0000
@@ -39649,7 +39649,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #316dca",
+    "$value": {
+      "color": "#316dca",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39658,16 +39662,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39683,8 +39684,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#316dca",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39699,7 +39700,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39716,6 +39717,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#316dca",
+    "$type": "color",
+    "$deprecated": "#316dca",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

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

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-high-contrast.json	2026-04-14 07:29:29.241496721 +0000
@@ -39619,7 +39619,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #409eff",
+    "$value": {
+      "color": "#409eff",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39628,16 +39632,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39653,8 +39654,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#409eff",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39669,7 +39670,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39686,6 +39687,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#409eff",
+    "$type": "color",
+    "$deprecated": "#409eff",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

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

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-tritanopia-high-contrast.json	2026-04-14 07:29:23.981333565 +0000
@@ -39627,7 +39627,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #409eff",
+    "$value": {
+      "color": "#409eff",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39636,16 +39640,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39661,8 +39662,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#409eff",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39677,7 +39678,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39694,6 +39695,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#409eff",
+    "$type": "color",
+    "$deprecated": "#409eff",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

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

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark-tritanopia.json	2026-04-14 07:29:22.300287377 +0000
@@ -39633,7 +39633,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #1f6feb",
+    "$value": {
+      "color": "#1f6feb",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39642,16 +39646,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39667,8 +39668,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#1f6feb",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39683,7 +39684,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39700,6 +39701,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#1f6feb",
+    "$type": "color",
+    "$deprecated": "#1f6feb",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

/styleLint/functional/themes/dark.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/dark.json	2026-04-14 07:29:17.229130573 +0000
@@ -39605,7 +39605,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #1f6feb",
+    "$value": {
+      "color": "#1f6feb",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39614,16 +39618,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39639,8 +39640,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#1f6feb",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39655,7 +39656,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39672,6 +39673,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#1f6feb",
+    "$type": "color",
+    "$deprecated": "#1f6feb",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

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

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/light-colorblind-high-contrast.json	2026-04-14 07:29:13.751011538 +0000
@@ -39605,7 +39605,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #0349b4",
+    "$value": {
+      "color": "#0349b4",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39614,16 +39618,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39639,8 +39640,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#0349b4",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39655,7 +39656,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39672,6 +39673,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#0349b4",
+    "$type": "color",
+    "$deprecated": "#0349b4",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

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

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/light-colorblind.json	2026-04-14 07:29:12.034817017 +0000
@@ -39595,7 +39595,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #0969da",
+    "$value": {
+      "color": "#0969da",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39604,16 +39608,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39629,8 +39630,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#0969da",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39645,7 +39646,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39662,6 +39663,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#0969da",
+    "$type": "color",
+    "$deprecated": "#0969da",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

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

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/light-high-contrast.json	2026-04-14 07:29:15.559076520 +0000
@@ -39607,7 +39607,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #0349b4",
+    "$value": {
+      "color": "#0349b4",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39616,16 +39620,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39641,8 +39642,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#0349b4",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39657,7 +39658,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39674,6 +39675,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#0349b4",
+    "$type": "color",
+    "$deprecated": "#0349b4",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

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

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/light-tritanopia-high-contrast.json	2026-04-14 07:29:10.373793102 +0000
@@ -39609,7 +39609,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #0349b4",
+    "$value": {
+      "color": "#0349b4",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39618,16 +39622,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39643,8 +39644,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#0349b4",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39659,7 +39660,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39676,6 +39677,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#0349b4",
+    "$type": "color",
+    "$deprecated": "#0349b4",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

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

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/light-tritanopia.json	2026-04-14 07:29:08.610767718 +0000
@@ -39603,7 +39603,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #0969da",
+    "$value": {
+      "color": "#0969da",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39612,16 +39616,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39637,8 +39638,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#0969da",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39653,7 +39654,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39670,6 +39671,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#0969da",
+    "$type": "color",
+    "$deprecated": "#0969da",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

/styleLint/functional/themes/light.json

+++ /home/runner/work/primitives/primitives/dist/styleLint/functional/themes/light.json	2026-04-14 07:29:06.855742450 +0000
@@ -39601,7 +39601,11 @@
 },
 "focus-outline": {
   "key": "{focus.outline}",
-    "$value": "2px solid #0969da",
+    "$value": {
+      "color": "#0969da",
+      "style": "solid",
+      "width": ["0.125rem", "2px"]
+    },
   "$type": "border",
   "$description": "Focus ring outline for keyboard navigation and accessibility.",
   "$extensions": {
@@ -39610,16 +39614,13 @@
       "rules": "Always ensure focus states are visible. Do not override with custom focus styles that reduce visibility. Use for interactive elements like buttons, links, and form controls."
     }
   },
-    "filePath": "src/tokens/functional/border/border.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": {
-        "color": "{focus.outlineColor}",
+        "color": "{focus.outline-color}",
       "style": "solid",
-        "width": {
-          "value": 2,
-          "unit": "px"
-        }
+        "width": "{focus.outline-width}"
     },
     "$type": "border",
     "$description": "Focus ring outline for keyboard navigation and accessibility.",
@@ -39635,8 +39636,8 @@
   "attributes": {},
   "path": ["focus", "outline"]
 },
-  "focus-outlineColor": {
-    "key": "{focus.outlineColor}",
+  "focus-outline-color": {
+    "key": "{focus.outline-color}",
   "$value": "#0969da",
   "$type": "color",
   "$description": "Outline color for focus states on interactive elements",
@@ -39651,7 +39652,7 @@
       "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
     }
   },
-    "filePath": "src/tokens/functional/color/focus.json5",
+    "filePath": "src/tokens/component/focus.json5",
   "isSource": true,
   "original": {
     "$value": "{borderColor.accent.emphasis}",
@@ -39668,6 +39669,39 @@
         "rules": "Use for focus outlines on interactive elements like buttons, links, and form controls. MUST be visible for keyboard navigation accessibility. Do NOT use for decorative borders or non-interactive elements."
       }
     },
+      "key": "{focus.outline-color}"
+    },
+    "name": "focus-outline-color",
+    "attributes": {},
+    "path": ["focus", "outline-color"]
+  },
+  "focus-outlineColor": {
+    "key": "{focus.outlineColor}",
+    "$value": "#0969da",
+    "$type": "color",
+    "$deprecated": "#0969da",
+    "$description": "Deprecated. Use focus.outline-color instead.",
+    "$extensions": {
+      "org.primer.figma": {
+        "collection": "mode",
+        "group": "component (internal)",
+        "scopes": ["borderColor", "effectColor"]
+      }
+    },
+    "filePath": "src/tokens/component/focus.json5",
+    "isSource": true,
+    "original": {
+      "$value": "{focus.outline-color}",
+      "$type": "color",
+      "$deprecated": "{focus.outline-color}",
+      "$description": "Deprecated. Use focus.outline-color instead.",
+      "$extensions": {
+        "org.primer.figma": {
+          "collection": "mode",
+          "group": "component (internal)",
+          "scopes": ["borderColor", "effectColor"]
+        }
+      },
     "key": "{focus.outlineColor}"
   },
   "name": "focus-outlineColor",

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 8, 2026

Design Token Diff (Figma)

/figma/dimension/dimension.json

+++ /home/runner/work/primitives/primitives/dist/figma/dimension/dimension.json	2026-04-14 07:29:35.970713249 +0000
@@ -1014,28 +1014,6 @@
   "scopes": ["STROKE_FLOAT", "EFFECT_FLOAT"]
 },
 {
-    "name": "outline/focus/offset",
-    "value": -2,
-    "type": "FLOAT",
-    "description": "Focus outline offset (-2px). Negative value creates an inset outline for keyboard focus indicators, ensuring the focus ring stays within the element bounds",
-    "refId": "functional/size/outline/focus/offset",
-    "collection": "functional/size",
-    "mode": "default",
-    "group": "functional/size",
-    "scopes": ["STROKE_FLOAT", "EFFECT_FLOAT"]
-  },
-  {
-    "name": "outline/focus/width",
-    "value": 2,
-    "type": "FLOAT",
-    "description": "Focus outline width (2px). Standard width for keyboard focus indicators to meet WCAG 2.4.7 accessibility requirements",
-    "refId": "functional/size/outline/focus/width",
-    "collection": "functional/size",
-    "mode": "default",
-    "group": "functional/size",
-    "scopes": ["STROKE_FLOAT", "EFFECT_FLOAT"]
-  },
-  {
   "name": "borderRadius/small",
   "value": 3,
   "type": "FLOAT",
@@ -1105,5 +1083,51 @@
   "codeSyntax": {
     "web": "var(--borderRadius-default) /* utility class: .rounded-2 */"
   }
+  },
+  {
+    "name": "focus/outline-width",
+    "value": 2,
+    "type": "FLOAT",
+    "description": "Focus outline width (2px). Standard width for keyboard focus indicators to meet WCAG 2.4.7 accessibility requirements",
+    "refId": "functional/size/focus/outline-width",
+    "collection": "functional/size",
+    "mode": "default",
+    "group": "functional/size",
+    "scopes": ["STROKE_FLOAT", "EFFECT_FLOAT"]
+  },
+  {
+    "name": "focus/outline-offset",
+    "value": -2,
+    "type": "FLOAT",
+    "description": "Focus outline offset (-2px). Negative value creates an inset outline for keyboard focus indicators, ensuring the focus ring stays within the element bounds",
+    "refId": "functional/size/focus/outline-offset",
+    "collection": "functional/size",
+    "mode": "default",
+    "group": "functional/size",
+    "scopes": ["STROKE_FLOAT", "EFFECT_FLOAT"]
+  },
+  {
+    "name": "outline/focus/offset",
+    "value": -2,
+    "type": "FLOAT",
+    "description": "Deprecated. Use focus.outline-offset instead.",
+    "refId": "functional/size/outline/focus/offset",
+    "reference": "functional/size/focus/outline-offset",
+    "collection": "functional/size",
+    "mode": "default",
+    "group": "functional/size",
+    "scopes": ["STROKE_FLOAT", "EFFECT_FLOAT"]
+  },
+  {
+    "name": "outline/focus/width",
+    "value": 2,
+    "type": "FLOAT",
+    "description": "Deprecated. Use focus.outline-width instead.",
+    "refId": "functional/size/outline/focus/width",
+    "reference": "functional/size/focus/outline-width",
+    "collection": "functional/size",
+    "mode": "default",
+    "group": "functional/size",
+    "scopes": ["STROKE_FLOAT", "EFFECT_FLOAT"]
 }
]

/figma/figma.json

+++ /home/runner/work/primitives/primitives/dist/figma/figma.json	2026-04-14 07:29:37.586765174 +0000
@@ -79,9 +79,9 @@
     ],
     "groups": [
       "shadow",
-        "component (internal)",
       "semantic",
       "component",
+        "component (internal)",
       "syntax",
       "component shadow"
     ]

/figma/themes/dark-colorblind.json

+++ /home/runner/work/primitives/primitives/dist/figma/themes/dark-colorblind.json	2026-04-14 07:29:35.539699380 +0000
@@ -900,23 +900,6 @@
   "group": "shadow"
 },
 {
-    "name": "focus/outlineColor",
-    "value": {
-      "r": 0.12156862745098039,
-      "g": 0.43529411764705883,
-      "b": 0.9215686274509803,
-      "a": 1
-    },
-    "type": "COLOR",
-    "description": "Outline color for focus states on interactive elements",
-    "refId": "mode/focus/outlineColor",
-    "reference": "mode/borderColor/accent-emphasis",
-    "collection": "mode",
-    "mode": "dark protanopia deuteranopia",
-    "group": "component (internal)",
-    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
-  },
-  {
   "name": "bgColor/default",
   "value": {
     "r": 0.050980392156862744,
@@ -12407,6 +12390,40 @@
   "scopes": ["TEXT_FILL", "SHAPE_FILL"]
 },
 {
+    "name": "focus/outline-color",
+    "value": {
+      "r": 0.12156862745098039,
+      "g": 0.43529411764705883,
+      "b": 0.9215686274509803,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Outline color for focus states on interactive elements",
+    "refId": "mode/focus/outline-color",
+    "reference": "mode/borderColor/accent-emphasis",
+    "collection": "mode",
+    "mode": "dark protanopia deuteranopia",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
+    "name": "focus/outlineColor",
+    "value": {
+      "r": 0.12156862745098039,
+      "g": 0.43529411764705883,
+      "b": 0.9215686274509803,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Deprecated. Use focus.outline-color instead.",
+    "refId": "mode/focus/outlineColor",
+    "reference": "mode/focus/outline-color",
+    "collection": "mode",
+    "mode": "dark protanopia deuteranopia",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
   "name": "header/bgColor",
   "value": {
     "r": 0.08235294117647059,

/figma/themes/dark-dimmed.json

+++ /home/runner/work/primitives/primitives/dist/figma/themes/dark-dimmed.json	2026-04-14 07:29:34.810675922 +0000
@@ -900,23 +900,6 @@
   "group": "shadow"
 },
 {
-    "name": "focus/outlineColor",
-    "value": {
-      "r": 0.19215686274509805,
-      "g": 0.42745098039215684,
-      "b": 0.792156862745098,
-      "a": 1
-    },
-    "type": "COLOR",
-    "description": "Outline color for focus states on interactive elements",
-    "refId": "mode/focus/outlineColor",
-    "reference": "mode/borderColor/accent-emphasis",
-    "collection": "mode",
-    "mode": "dark dimmed",
-    "group": "component (internal)",
-    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
-  },
-  {
   "name": "bgColor/default",
   "value": {
     "r": 0.12941176470588237,
@@ -12392,6 +12375,40 @@
   "scopes": ["TEXT_FILL", "SHAPE_FILL"]
 },
 {
+    "name": "focus/outline-color",
+    "value": {
+      "r": 0.19215686274509805,
+      "g": 0.42745098039215684,
+      "b": 0.792156862745098,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Outline color for focus states on interactive elements",
+    "refId": "mode/focus/outline-color",
+    "reference": "mode/borderColor/accent-emphasis",
+    "collection": "mode",
+    "mode": "dark dimmed",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
+    "name": "focus/outlineColor",
+    "value": {
+      "r": 0.19215686274509805,
+      "g": 0.42745098039215684,
+      "b": 0.792156862745098,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Deprecated. Use focus.outline-color instead.",
+    "refId": "mode/focus/outlineColor",
+    "reference": "mode/focus/outline-color",
+    "collection": "mode",
+    "mode": "dark dimmed",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
   "name": "header/bgColor",
   "value": {
     "r": 0.08235294117647059,

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

+++ /home/runner/work/primitives/primitives/dist/figma/themes/dark-high-contrast.json	2026-04-14 07:29:35.904711125 +0000
@@ -900,23 +900,6 @@
   "group": "shadow"
 },
 {
-    "name": "focus/outlineColor",
-    "value": {
-      "r": 0.25098039215686274,
-      "g": 0.6196078431372549,
-      "b": 1,
-      "a": 1
-    },
-    "type": "COLOR",
-    "description": "Outline color for focus states on interactive elements",
-    "refId": "mode/focus/outlineColor",
-    "reference": "mode/borderColor/accent-emphasis",
-    "collection": "mode",
-    "mode": "dark high contrast",
-    "group": "component (internal)",
-    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
-  },
-  {
   "name": "bgColor/default",
   "value": {
     "r": 0.00392156862745098,
@@ -12401,6 +12384,40 @@
   "scopes": ["TEXT_FILL", "SHAPE_FILL"]
 },
 {
+    "name": "focus/outline-color",
+    "value": {
+      "r": 0.25098039215686274,
+      "g": 0.6196078431372549,
+      "b": 1,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Outline color for focus states on interactive elements",
+    "refId": "mode/focus/outline-color",
+    "reference": "mode/borderColor/accent-emphasis",
+    "collection": "mode",
+    "mode": "dark high contrast",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
+    "name": "focus/outlineColor",
+    "value": {
+      "r": 0.25098039215686274,
+      "g": 0.6196078431372549,
+      "b": 1,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Deprecated. Use focus.outline-color instead.",
+    "refId": "mode/focus/outlineColor",
+    "reference": "mode/focus/outline-color",
+    "collection": "mode",
+    "mode": "dark high contrast",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
   "name": "header/bgColor",
   "value": {
     "r": 0.08235294117647059,

/figma/themes/dark-tritanopia.json

+++ /home/runner/work/primitives/primitives/dist/figma/themes/dark-tritanopia.json	2026-04-14 07:29:35.165687345 +0000
@@ -900,23 +900,6 @@
   "group": "shadow"
 },
 {
-    "name": "focus/outlineColor",
-    "value": {
-      "r": 0.12156862745098039,
-      "g": 0.43529411764705883,
-      "b": 0.9215686274509803,
-      "a": 1
-    },
-    "type": "COLOR",
-    "description": "Outline color for focus states on interactive elements",
-    "refId": "mode/focus/outlineColor",
-    "reference": "mode/borderColor/accent-emphasis",
-    "collection": "mode",
-    "mode": "dark tritanopia",
-    "group": "component (internal)",
-    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
-  },
-  {
   "name": "bgColor/default",
   "value": {
     "r": 0.050980392156862744,
@@ -12400,6 +12383,40 @@
   "scopes": ["TEXT_FILL", "SHAPE_FILL"]
 },
 {
+    "name": "focus/outline-color",
+    "value": {
+      "r": 0.12156862745098039,
+      "g": 0.43529411764705883,
+      "b": 0.9215686274509803,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Outline color for focus states on interactive elements",
+    "refId": "mode/focus/outline-color",
+    "reference": "mode/borderColor/accent-emphasis",
+    "collection": "mode",
+    "mode": "dark tritanopia",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
+    "name": "focus/outlineColor",
+    "value": {
+      "r": 0.12156862745098039,
+      "g": 0.43529411764705883,
+      "b": 0.9215686274509803,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Deprecated. Use focus.outline-color instead.",
+    "refId": "mode/focus/outlineColor",
+    "reference": "mode/focus/outline-color",
+    "collection": "mode",
+    "mode": "dark tritanopia",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
   "name": "header/bgColor",
   "value": {
     "r": 0.08235294117647059,

/figma/themes/dark.json

+++ /home/runner/work/primitives/primitives/dist/figma/themes/dark.json	2026-04-14 07:29:34.459664628 +0000
@@ -900,23 +900,6 @@
   "group": "shadow"
 },
 {
-    "name": "focus/outlineColor",
-    "value": {
-      "r": 0.12156862745098039,
-      "g": 0.43529411764705883,
-      "b": 0.9215686274509803,
-      "a": 1
-    },
-    "type": "COLOR",
-    "description": "Outline color for focus states on interactive elements",
-    "refId": "mode/focus/outlineColor",
-    "reference": "mode/borderColor/accent-emphasis",
-    "collection": "mode",
-    "mode": "dark",
-    "group": "component (internal)",
-    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
-  },
-  {
   "name": "bgColor/default",
   "value": {
     "r": 0.050980392156862744,
@@ -12398,6 +12381,40 @@
   "scopes": ["TEXT_FILL", "SHAPE_FILL"]
 },
 {
+    "name": "focus/outline-color",
+    "value": {
+      "r": 0.12156862745098039,
+      "g": 0.43529411764705883,
+      "b": 0.9215686274509803,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Outline color for focus states on interactive elements",
+    "refId": "mode/focus/outline-color",
+    "reference": "mode/borderColor/accent-emphasis",
+    "collection": "mode",
+    "mode": "dark",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
+    "name": "focus/outlineColor",
+    "value": {
+      "r": 0.12156862745098039,
+      "g": 0.43529411764705883,
+      "b": 0.9215686274509803,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Deprecated. Use focus.outline-color instead.",
+    "refId": "mode/focus/outlineColor",
+    "reference": "mode/focus/outline-color",
+    "collection": "mode",
+    "mode": "dark",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
   "name": "header/bgColor",
   "value": {
     "r": 0.08235294117647059,

/figma/themes/light-colorblind.json

+++ /home/runner/work/primitives/primitives/dist/figma/themes/light-colorblind.json	2026-04-14 07:29:33.678639496 +0000
@@ -900,23 +900,6 @@
   "group": "shadow"
 },
 {
-    "name": "focus/outlineColor",
-    "value": {
-      "r": 0.03529411764705882,
-      "g": 0.4117647058823529,
-      "b": 0.8549019607843137,
-      "a": 1
-    },
-    "type": "COLOR",
-    "description": "Outline color for focus states on interactive elements",
-    "refId": "mode/focus/outlineColor",
-    "reference": "mode/borderColor/accent-emphasis",
-    "collection": "mode",
-    "mode": "light protanopia deuteranopia",
-    "group": "component (internal)",
-    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
-  },
-  {
   "name": "bgColor/default",
   "value": {
     "r": 1,
@@ -12389,6 +12372,40 @@
   "scopes": ["TEXT_FILL", "SHAPE_FILL"]
 },
 {
+    "name": "focus/outline-color",
+    "value": {
+      "r": 0.03529411764705882,
+      "g": 0.4117647058823529,
+      "b": 0.8549019607843137,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Outline color for focus states on interactive elements",
+    "refId": "mode/focus/outline-color",
+    "reference": "mode/borderColor/accent-emphasis",
+    "collection": "mode",
+    "mode": "light protanopia deuteranopia",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
+    "name": "focus/outlineColor",
+    "value": {
+      "r": 0.03529411764705882,
+      "g": 0.4117647058823529,
+      "b": 0.8549019607843137,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Deprecated. Use focus.outline-color instead.",
+    "refId": "mode/focus/outlineColor",
+    "reference": "mode/focus/outline-color",
+    "collection": "mode",
+    "mode": "light protanopia deuteranopia",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
   "name": "header/bgColor",
   "value": {
     "r": 0.1450980392156863,

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

+++ /home/runner/work/primitives/primitives/dist/figma/themes/light-high-contrast.json	2026-04-14 07:29:34.058651724 +0000
@@ -900,23 +900,6 @@
   "group": "shadow"
 },
 {
-    "name": "focus/outlineColor",
-    "value": {
-      "r": 0.011764705882352941,
-      "g": 0.28627450980392155,
-      "b": 0.7058823529411765,
-      "a": 1
-    },
-    "type": "COLOR",
-    "description": "Outline color for focus states on interactive elements",
-    "refId": "mode/focus/outlineColor",
-    "reference": "mode/borderColor/accent-emphasis",
-    "collection": "mode",
-    "mode": "light high contrast",
-    "group": "component (internal)",
-    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
-  },
-  {
   "name": "bgColor/default",
   "value": {
     "r": 1,
@@ -12380,6 +12363,40 @@
   "scopes": ["TEXT_FILL", "SHAPE_FILL"]
 },
 {
+    "name": "focus/outline-color",
+    "value": {
+      "r": 0.011764705882352941,
+      "g": 0.28627450980392155,
+      "b": 0.7058823529411765,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Outline color for focus states on interactive elements",
+    "refId": "mode/focus/outline-color",
+    "reference": "mode/borderColor/accent-emphasis",
+    "collection": "mode",
+    "mode": "light high contrast",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
+    "name": "focus/outlineColor",
+    "value": {
+      "r": 0.011764705882352941,
+      "g": 0.28627450980392155,
+      "b": 0.7058823529411765,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Deprecated. Use focus.outline-color instead.",
+    "refId": "mode/focus/outlineColor",
+    "reference": "mode/focus/outline-color",
+    "collection": "mode",
+    "mode": "light high contrast",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
   "name": "header/bgColor",
   "value": {
     "r": 0.1450980392156863,

/figma/themes/light-tritanopia.json

+++ /home/runner/work/primitives/primitives/dist/figma/themes/light-tritanopia.json	2026-04-14 07:29:33.317627880 +0000
@@ -900,23 +900,6 @@
   "group": "shadow"
 },
 {
-    "name": "focus/outlineColor",
-    "value": {
-      "r": 0.03529411764705882,
-      "g": 0.4117647058823529,
-      "b": 0.8549019607843137,
-      "a": 1
-    },
-    "type": "COLOR",
-    "description": "Outline color for focus states on interactive elements",
-    "refId": "mode/focus/outlineColor",
-    "reference": "mode/borderColor/accent-emphasis",
-    "collection": "mode",
-    "mode": "light tritanopia",
-    "group": "component (internal)",
-    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
-  },
-  {
   "name": "bgColor/default",
   "value": {
     "r": 1,
@@ -12387,6 +12370,40 @@
   "scopes": ["TEXT_FILL", "SHAPE_FILL"]
 },
 {
+    "name": "focus/outline-color",
+    "value": {
+      "r": 0.03529411764705882,
+      "g": 0.4117647058823529,
+      "b": 0.8549019607843137,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Outline color for focus states on interactive elements",
+    "refId": "mode/focus/outline-color",
+    "reference": "mode/borderColor/accent-emphasis",
+    "collection": "mode",
+    "mode": "light tritanopia",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
+    "name": "focus/outlineColor",
+    "value": {
+      "r": 0.03529411764705882,
+      "g": 0.4117647058823529,
+      "b": 0.8549019607843137,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Deprecated. Use focus.outline-color instead.",
+    "refId": "mode/focus/outlineColor",
+    "reference": "mode/focus/outline-color",
+    "collection": "mode",
+    "mode": "light tritanopia",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
   "name": "header/bgColor",
   "value": {
     "r": 0.1450980392156863,

/figma/themes/light.json

+++ /home/runner/work/primitives/primitives/dist/figma/themes/light.json	2026-04-14 07:29:32.897614365 +0000
@@ -900,23 +900,6 @@
   "group": "shadow"
 },
 {
-    "name": "focus/outlineColor",
-    "value": {
-      "r": 0.03529411764705882,
-      "g": 0.4117647058823529,
-      "b": 0.8549019607843137,
-      "a": 1
-    },
-    "type": "COLOR",
-    "description": "Outline color for focus states on interactive elements",
-    "refId": "mode/focus/outlineColor",
-    "reference": "mode/borderColor/accent-emphasis",
-    "collection": "mode",
-    "mode": "light",
-    "group": "component (internal)",
-    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
-  },
-  {
   "name": "bgColor/default",
   "value": {
     "r": 1,
@@ -12383,6 +12366,40 @@
   "scopes": ["TEXT_FILL", "SHAPE_FILL"]
 },
 {
+    "name": "focus/outline-color",
+    "value": {
+      "r": 0.03529411764705882,
+      "g": 0.4117647058823529,
+      "b": 0.8549019607843137,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Outline color for focus states on interactive elements",
+    "refId": "mode/focus/outline-color",
+    "reference": "mode/borderColor/accent-emphasis",
+    "collection": "mode",
+    "mode": "light",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
+    "name": "focus/outlineColor",
+    "value": {
+      "r": 0.03529411764705882,
+      "g": 0.4117647058823529,
+      "b": 0.8549019607843137,
+      "a": 1
+    },
+    "type": "COLOR",
+    "description": "Deprecated. Use focus.outline-color instead.",
+    "refId": "mode/focus/outlineColor",
+    "reference": "mode/focus/outline-color",
+    "collection": "mode",
+    "mode": "light",
+    "group": "component (internal)",
+    "scopes": ["STROKE_COLOR", "EFFECT_COLOR"]
+  },
+  {
   "name": "header/bgColor",
   "value": {
     "r": 0.1450980392156863,

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 8, 2026

Design Token Diff (Fallbacks)

/fallbacks/color-fallbacks.json

+++ /home/runner/work/primitives/primitives/dist/fallbacks/color-fallbacks.json	2026-04-14 07:29:30.925550909 +0000
@@ -172,6 +172,7 @@
 "--buttonCounter-danger-fgColor-hover": "var(--color-btn-danger-hover-counter-fg)",
 "--buttonCounter-danger-fgColor-disabled": "var(--color-btn-danger-disabled-counter-fg)",
 "--focus-outlineColor": "var(--color-accent-fg)",
+  "--focus-outline-color": "var(--color-accent-fg)",
 "--focus-outline": "var(--color-accent-fg solid 2px)",
 "--menu-bgColor-active": "var(--color-menu-bg-active)",
 "--overlay-bgColor": "var(--color-canvas-overlay)",

/fallbacks/functional/size/border.json

+++ /home/runner/work/primitives/primitives/dist/fallbacks/functional/size/border.json	2026-04-14 07:29:29.386501387 +0000
@@ -6,6 +6,8 @@
 "--borderWidth-thin": "0.0625rem",
 "--borderWidth-thick": "0.125rem",
 "--borderWidth-thicker": "0.25rem",
+  "--focus-outline-width": "0.125rem",
+  "--focus-outline-offset": "-0.125rem",
 "--outline-focus-offset": "-0.125rem",
 "--outline-focus-width": "0.125rem"
}

@github-actions github-actions bot temporarily deployed to Preview (Storybook) April 8, 2026 11:00 Inactive
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

This PR consolidates focus outline-related design tokens into a single component token file (src/tokens/component/focus.json5), standardizing naming (kebab-case) while providing deprecated aliases for legacy names and updating CSS variable fallbacks.

Changes:

  • Added component-level focus.* tokens (including focus.outline composite) with standardized kebab-case names and deprecation aliases.
  • Removed legacy focus outline tokens from functional token files (border/color/size) as part of the consolidation.
  • Added a new fallback mapping for the kebab-case CSS variable --focus-outline-color.
Show a summary per file
File Description
src/tokens/component/focus.json5 Introduces consolidated focus outline tokens + deprecated aliases
src/tokens/functional/size/border.json5 Removes legacy outline.focus.* size tokens
src/tokens/functional/color/focus.json5 Removes legacy focus.outlineColor functional color token file
src/tokens/functional/border/border.json5 Removes legacy focus.outline border composite token definition
src/tokens/fallback/color-fallbacks.json Adds fallback entry for --focus-outline-color

Copilot's findings

Tip

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

  • Files reviewed: 5/5 changed files
  • Comments generated: 3

@@ -66,34 +66,4 @@
},
},
},
Copy link

Copilot AI Apr 8, 2026

Choose a reason for hiding this comment

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

Removing outline.focus.offset and outline.focus.width from this functional size file means the legacy --outline-focus-offset / --outline-focus-width variables will no longer be emitted in the functional/size/* CSS build (the size build only sources src/tokens/base/size/*.json5 + src/tokens/functional/size/*.json5, and does not include src/tokens/component/*.json5). If these are meant to remain available as deprecated aliases, keep deprecated token stubs here (with the old names) or update the size build sources/includes to pull in the component focus tokens.

Suggested change
},
},
outline: {
focus: {
offset: {
$value: '{borderWidth.thin}',
$description: 'Deprecated alias for the legacy focus outline offset token. Kept here so --outline-focus-offset continues to be emitted in functional size builds',
$type: 'dimension',
},
width: {
$value: '{borderWidth.thick}',
$description: 'Deprecated alias for the legacy focus outline width token. Kept here so --outline-focus-width continues to be emitted in functional size builds',
$type: 'dimension',
},
},
},

Copilot uses AI. Check for mistakes.
Comment on lines 173 to 176
"--buttonCounter-danger-fgColor-disabled": "var(--color-btn-danger-disabled-counter-fg)",
"--focus-outlineColor": "var(--color-accent-fg)",
"--focus-outline-color": "var(--color-accent-fg)",
"--focus-outline": "var(--color-accent-fg solid 2px)",
Copy link

Copilot AI Apr 8, 2026

Choose a reason for hiding this comment

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

--focus-outline-color was added here, but the Storybook migration fallback map (docs/storybook/stories/Migration/v8/static-fallbacks.json) still only lists --focus-outlineColor and --focus-outline. If that file is intended to mirror this fallback list for the migration tables, it should be updated to include the new kebab-case variable as well to avoid inconsistent migration guidance.

Copilot uses AI. Check for mistakes.
Comment on lines +75 to +103
// Deprecated: use focus.outline-offset and focus.outline-width instead
outline: {
focus: {
offset: {
$value: '{focus.outline-offset}',
$type: 'dimension',
$deprecated: '{focus.outline-offset}',
$description: 'Deprecated. Use focus.outline-offset instead.',
$extensions: {
'org.primer.figma': {
collection: 'functional/size',
scopes: ['borderWidth', 'effectFloat'],
},
},
},
width: {
$value: '{focus.outline-width}',
$type: 'dimension',
$deprecated: '{focus.outline-width}',
$description: 'Deprecated. Use focus.outline-width instead.',
$extensions: {
'org.primer.figma': {
collection: 'functional/size',
scopes: ['borderWidth', 'effectFloat'],
},
},
},
},
},
Copy link

Copilot AI Apr 8, 2026

Choose a reason for hiding this comment

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

The deprecated legacy aliases outline.focus.offset / outline.focus.width are defined in this component token file, but the build for functional/size/* outputs (and deprecated/size.json) only sources src/tokens/base/size/*.json5 + src/tokens/functional/size/*.json5. As a result, these legacy size tokens likely won’t be present in the size outputs anymore. If backward compatibility for the legacy size token names is required, consider keeping these deprecated aliases in src/tokens/functional/size/border.json5 (or adjust the size build config to include src/tokens/component/*.json5).

Suggested change
// Deprecated: use focus.outline-offset and focus.outline-width instead
outline: {
focus: {
offset: {
$value: '{focus.outline-offset}',
$type: 'dimension',
$deprecated: '{focus.outline-offset}',
$description: 'Deprecated. Use focus.outline-offset instead.',
$extensions: {
'org.primer.figma': {
collection: 'functional/size',
scopes: ['borderWidth', 'effectFloat'],
},
},
},
width: {
$value: '{focus.outline-width}',
$type: 'dimension',
$deprecated: '{focus.outline-width}',
$description: 'Deprecated. Use focus.outline-width instead.',
$extensions: {
'org.primer.figma': {
collection: 'functional/size',
scopes: ['borderWidth', 'effectFloat'],
},
},
},
},
},

Copilot uses AI. Check for mistakes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Focus dimension tokens (--focus-outline-width, --focus-outline-offset,
--outline-focus-offset, --outline-focus-width) were being output in every
theme CSS file because component/focus.json5 is sourced in theme builds.
These values are static and don't vary by theme, so they belong in
css/functional/size/border.css.

Changes:
- src/platforms/css.ts: exclude dimension tokens from themed CSS output
  by adding token.$type !== 'dimension' to the themed file filter
- scripts/buildTokens.ts: special-case the border size build to also
  source component/focus.json5, with a type filter (dimension +
  custom-string) so only size-related tokens are output in border.css.
  Uses a two-step build: standard build for doc/styleLint/fallbacks,
  then CSS-only build for the combined border + focus dimensions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…Lint, figma)

Extends the dimension token routing fix to non-CSS outputs.

Previously, only the CSS themed filter excluded dimension tokens (via
css.ts). The docJson, styleLint, and figma theme builds still included
focus dimension tokens (--focus-outline-offset, --focus-outline-width,
--outline-focus-offset, --outline-focus-width) in their themed output.

Changes:
- buildTokens.ts: Override docJson and styleLint platform filters for
  theme builds to exclude tokens with $type === 'dimension'
- buildFigma.ts: Override figma platform filter for theme builds to
  exclude dimension tokens; add focus.json5 as source to the dimension
  build so focus dimension tokens appear in figma/dimension/dimension.json
  (with color/border type exclusion to prevent color token leakage, and
  borderColor.json5 + light.json5 in includes for reference resolution)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…nt border outputs

The previous border build used a two-step approach: step 1 built
doc/styleLint/fallbacks from border.json5 only, step 2 built CSS
with focus.json5 added. This meant fallback/docJson/styleLint border
outputs were missing the focus dimension tokens.

Replaced with a single unified build that sources both border.json5
and focus.json5, with all platform filters overridden to only emit
dimension + custom-string tokens (excluding color/border types from
focus.json5).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions github-actions bot temporarily deployed to Preview (Storybook) April 13, 2026 15:50 Inactive
@lukasoppermann lukasoppermann added the update snapshots Update visual regression test snapshots label Apr 14, 2026
@github-actions github-actions bot removed the update snapshots Update visual regression test snapshots label Apr 14, 2026
@primer primer bot temporarily deployed to github-pages April 14, 2026 07:30 Inactive
@github-actions github-actions bot temporarily deployed to Preview (Storybook) April 14, 2026 07:30 Inactive
@lukasoppermann lukasoppermann merged commit cb7c706 into main Apr 14, 2026
31 checks passed
@lukasoppermann lukasoppermann deleted the focus-outline-component-tokens branch April 14, 2026 10:48
@primer primer bot mentioned this pull request Apr 13, 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.

2 participants