Skip to content

feat(tokens): add gray and text colors#30981

Open
thetaPC wants to merge 6 commits intoionic-modularfrom
FW-6751-pt2
Open

feat(tokens): add gray and text colors#30981
thetaPC wants to merge 6 commits intoionic-modularfrom
FW-6751-pt2

Conversation

@thetaPC
Copy link
Contributor

@thetaPC thetaPC commented Feb 27, 2026

Issue number: internal


What is the current behavior?

ios and md themes are still using the stepped color variables.

What is the new behavior?

The CSS variable --ion-background-color-step-{number} is no longer recommended for use and has been replaced by a more intuitive and standardized naming convention as part of Ionic's new theming structure. The functionality provided by the old variable has been replaced with a new set of CSS variables that use the same color values but are named: --ion-color-gray-{number}.

This new structure aligns with how other popular design systems and frameworks are setting up their color palettes (e.g., using names like gray, red, blue, followed by a number to denote the shade). Additionally, it follows the proposal agreed upon within the design doc.

  • Added gray tokens based on themes and palettes
  • Replaced background stepped color variables with gray tokens

The CSS variable --ion-text-color-step-* is being replaced by --ion-color-text-* to adhere to the standardized naming convention for Ionic's new theming structure (--ion-color-*-*). This change aims for greater clarity and consistency within the framework's color palette.

  • Added text tokens based on themes and palettes
  • Replaced text stepped color variables with text tokens

The original thought was to use only the --ion-color-gray-* variables for all purposes (backgrounds, text, icons, etc.). However, it was quickly determined that text color requirements are not a 1:1 match with the gray steps designed for backgrounds and other elements. Text often requires a different shade to maintain proper contrast and readability across various theme palettes (especially between high contrast and high contrast dark modes). Introducing the dedicated functional variable --ion-color-text-* solves this issue by allowing text color to be defined independently based on the current palette's needs.

Also the --ion-color-step-* variables were removed since they were deprecated in v7.

Does this introduce a breaking change?

  • Yes
  • No

You simply need to swap the wording of the background stepped variables with the new gray variables. The number suffix remains exactly the same:

Old Variable (Deprecated) New Variable
--ion-background-color-step-50 --ion-color-gray-50
--ion-background-color-step-900 --ion-color-gray-900

You simply need to swap the wording of the text stepped variables with the new text variables. The number suffix remains exactly the same:

Old Variable (Deprecated) New Variable
--ion-text-color-step-50 --ion-color-text-50
--ion-text-color-step-900 --ion-color-text-900

Other information

Preview

@vercel
Copy link

vercel bot commented Feb 27, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ionic-framework Ready Ready Preview, Comment Feb 28, 2026 0:37am

Request Review

@github-actions github-actions bot added the package: react @ionic/react package label Feb 27, 2026
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Deleted it because we've moved to using core/src/themes/test/color/index.html

@thetaPC thetaPC marked this pull request as ready for review March 2, 2026 17:42
@thetaPC thetaPC requested a review from a team as a code owner March 2, 2026 17:42
@thetaPC thetaPC requested a review from OS-jacobbell March 2, 2026 17:42
@thetaPC thetaPC requested review from brandyscarney and removed request for OS-jacobbell March 2, 2026 17:43
Copy link
Member

@brandyscarney brandyscarney left a comment

Choose a reason for hiding this comment

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

Looking good so far! Left some comments with questions and a few issues.

--ion-color-step-150,
var(--ion-background-color-step-150, $background-color)
);
$action-sheet-ios-button-background-selected: var(--ion-color-gray-150, $background-color);
Copy link
Member

Choose a reason for hiding this comment

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

We need to update the breaking change document to reflect the removal of --ion-color-step-*, --ion-text-color-step-*, and --ion-background-color-step-*, etc. if we are not going to keep them as fallbacks because these have been used in the docs for awhile:


/// @prop - Color of the breadcrumb
$breadcrumb-ios-color: var(--ion-color-step-850, var(--ion-text-color-step-150, #2d4665));
$breadcrumb-ios-color: var(--ion-color-text-150, #2d4665);
Copy link
Member

Choose a reason for hiding this comment

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

Maybe document in the breaking changes that they should change text overrides from:

- --ion-text-color-step-150
+ --ion-color-text-150

?


/// @prop - Color of the item paragraph
$item-ios-paragraph-text-color: var(--ion-text-color-step-550, #a3a3a3);
$item-ios-paragraph-text-color: var(--ion-color-text-550, #a3a3a3);
Copy link
Member

Choose a reason for hiding this comment

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

We can probably remove these fallbacks when we define the tokens for the default theme.

$overlay-ios-background-color: var(
--ion-overlay-background-color,
var(--ion-color-step-100, #f9f9f9)
#f9f9f9
Copy link
Member

Choose a reason for hiding this comment

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

Shouldn't this fall back to --ion-color-gray-900?

Copy link
Member

Choose a reason for hiding this comment

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

Am I supposed to see this on this preview?

Image

};

// Primitive color keys
export type PrimitiveColors = 'gray' | 'black' | 'white' | 'gray-contrast';
Copy link
Member

Choose a reason for hiding this comment

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

Do we plan to add the other colors? Where would gray-contrast be used?


// Number string keys structure
export type NumberStringKeys = {
// Enforce keys are strings of numbers (like 50, '50', etc.)
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
// Enforce keys are strings of numbers (like 50, '50', etc.)
// Enforce keys as strings of numbers (like 50, '50', etc.)

export type PrimitiveColors = 'gray' | 'black' | 'white' | 'gray-contrast';

// Functional color keys
export type FunctionalColors = 'text' | 'overlay-background';
Copy link
Member

Choose a reason for hiding this comment

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

What is the goal with this?

@@ -1,4 +1,5 @@
import type { IonChipRecipe, IonChipConfig } from '../components/chip/chip.interfaces';
import type { PredefinedColors } from '../interface';
Copy link
Member

Choose a reason for hiding this comment

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

Should we move this interface to core/src/themes/themes.interfaces.ts?

--ion-color-step-50,
var(--ion-text-color-step-950, mix($background-color-value, $text-color-value, 95%))
);
$gray-color-0: var(--ion-color-gray-0, mix($text-color-value, $background-color-value, 0%));
Copy link
Member

Choose a reason for hiding this comment

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

Shouldn't we be able to remove these by defining them for the default theme?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

package: angular @ionic/angular package package: core @ionic/core package package: react @ionic/react package

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants