Skip to content

[Colors] Create text-ink and text-ghost tokens#9379

Merged
weronikaolejniczak merged 18 commits intoelastic:mainfrom
weronikaolejniczak:feat/text-ink-ghost
Feb 13, 2026
Merged

[Colors] Create text-ink and text-ghost tokens#9379
weronikaolejniczak merged 18 commits intoelastic:mainfrom
weronikaolejniczak:feat/text-ink-ghost

Conversation

@weronikaolejniczak
Copy link
Copy Markdown
Contributor

@weronikaolejniczak weronikaolejniczak commented Feb 12, 2026

Summary

  • Added textInk and textGhost color tokens.
  • Removed ink and ghost color tokens and euiColorInk and euiColorGhost Sass variables.
  • Replaced all references of ink and ghost with textInk and textGhost for text and icon color, otherwise plainDark and plainLight.
  • Updated documentation.

Why are we making this change?

Resolves #8968

ink and ghost color tokens are Amsterdam remnants. We want to remove them in favor of:

  • textInk and textGhost color tokens used specifically for text and icon color,
  • plainDark and plainLight in all other cases.

Screenshots # (WIP)

There are no visual changes. No regression. Verified with VRT.

Impact to users

🔴 This is a breaking change. Even though the usage on consumer side is minimal.

Kibana

Usages:

Update commit: elastic/kibana@b17eb9e

Cloud UI

Usages:

Update commit: https://github.com/weronikaolejniczak/cloud-ui/commit/6e111016ae9fc2b830aa0438daab7d24454bc733

QA

Specific checklist

  • Verify textInk and textGhost are available and ink and ghost are not
  • Run VRT locally and verify there is no visual regression: yarn workspace @elastic/eui test-visual-regression
  • Verify the documentation changes make sense, see staging
  • Double-check all Kibana and Cloud UI usages have been addressed in ☝🏻 commits

General checklist

  • Browser QA
    • Checked in both light and dark modes
    • Checked in both MacOS and Windows high contrast modes
    • Checked in mobile
    • Checked in Chrome, Safari, Edge, and Firefox
    • Checked for accessibility including keyboard-only and screenreader modes
  • Docs site QA
  • Code quality checklist
  • Release checklist
    • A changelog entry exists and is marked appropriately
    • If applicable, added the breaking change issue label (and filled out the breaking change checklist)
    • If the changes unblock an issue in a different repo, smoke tested carefully (see Testing EUI features in Kibana ahead of time)
  • Designer checklist
    • If applicable, file an issue to update EUI's Figma library with any corresponding UI changes. (This is an internal repo, if you are external to Elastic, ask a maintainer to submit this request)

@weronikaolejniczak weronikaolejniczak self-assigned this Feb 12, 2026
@weronikaolejniczak weronikaolejniczak added the breaking change PRs with breaking changes. (Don't delete - used for automation) label Feb 12, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Feb 12, 2026

This PR contains breaking changes. The opener of this pull request is asked to perform the following due diligence steps below, to assist EUI in our next Kibana upgrade:

  • If this PR contains prop/API changes:
    • Search through Kibana for <EuiComponent usages (example search)
    • In the PR description or in a PR comment, include a count or list with the number of component usages in Kibana that will need to be updated (if that amount is "none", include that information as well)
  • If this PR contains CSS changes:
    • Search through Kibana for the changed EUI selectors, e.g. .euiComponent (example search)
    • In the PR description or in a PR comment, include a count or list with the number of custom CSS overrides in Kibana that will need to be updated (if that amount is "none", include that information as well)
  • 🔍 Tip: When searching through Kibana, consider excluding **/target, **/*.snap, **/*.storyshot files to reduce noise and only look at source code usages
  • ⚠️ For extremely risky changes, the EUI team should potentially consider the following precautions:
    • Using a pre-release release candidate to test Kibana CI ahead of time
    • Using kibana-a-la-carte for manual QA, and to give other Kibana teams a staging server to quickly test against

@weronikaolejniczak weronikaolejniczak force-pushed the feat/text-ink-ghost branch 2 times, most recently from df1d2d9 to 75f0774 Compare February 12, 2026 13:15
Comment on lines +188 to +189
color: ${euiTheme.colors.disabledText};
background-color: ${euiTheme.colors.disabled};
Copy link
Copy Markdown
Contributor Author

@weronikaolejniczak weronikaolejniczak Feb 12, 2026

Choose a reason for hiding this comment

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

context:

This is not a 1:1 replacement. textInk and textGhost are meant to be used solely with texts and icons (as indicated by the text prefix), so it only makes sense to keep them grouped with the text colors (which is also how they’re organized in Figma), even if they are color-mode-independent. Using them here (or the constants plainDark / plainLight) would be confusing given the current topology.

This means we need to use other “special colors” here. disabledText and disabled work well enough.

@weronikaolejniczak weronikaolejniczak added the skip-changelog-eui Use on PRs to skip changelog requirement (for @elastic/eui) label Feb 12, 2026
Copy link
Copy Markdown
Contributor

@ek-so ek-so left a comment

Choose a reason for hiding this comment

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

Thank you! Looks good to me, and I also wanted to tag @JoseLuisGJ for awareness

@JoseLuisGJ
Copy link
Copy Markdown
Contributor

Thanks for making this work. Confirming that in Figma we are now only using Text/Ghost and Text/Ink color variable tokens, so that we will be in sync.

CleanShot 2026-02-13 at 10 12 10@2x CleanShot 2026-02-13 at 10 12 57@2x

@mgadewoll mgadewoll self-requested a review February 13, 2026 09:45
"euiColorChartLines": "#7186A8",
"euiColorChartBand": "#243147",
"euiColorGhost": "#FFFFFF",
"euiColorInk": "#000000",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Blocking: We'll need to add the new tokens textInk and textGhost as JSON tokens euiColorTextInk and euiColorTextGhost since we still support the usage of those.

If I see it correctly, then these should use the text JSON tokens?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I treated the JSON in a similar way like Sass but you are absolutely right we should add them here. I will go through the Kibana usage again and correct as needed.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Just as additional context: JSON tokens used to be mapped from Sass and the original intention was to remove them as well but while rolling out Borealis we noticed that we need to support them for static use cases where the react theme is not available 🫠

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@mgadewoll
Copy link
Copy Markdown
Contributor

ℹ️ Note for transparency: We have a tiny regression in the A11y color contrast for badges with mid-tone custom colors (e.g. #777777, as #07101F provides a slightly shorter range.

before after
Screenshot 2026-02-13 at 10 36 40 Screenshot 2026-02-13 at 10 36 53

That being said, I think the update is fine as is anyway.
The perceived difference is not noticeable and it's difficult to match all possible colors with a sufficient color contrast anyway. Additionally, we provide High Contrast Mode which does use true black. 👍

@weronikaolejniczak
Copy link
Copy Markdown
Contributor Author

@mgadewoll thank you for the review, I addressed your feedback 😄

@elasticmachine
Copy link
Copy Markdown
Collaborator

💚 Build Succeeded

History

cc @weronikaolejniczak

@elasticmachine
Copy link
Copy Markdown
Collaborator

💚 Build Succeeded

History

cc @weronikaolejniczak

Copy link
Copy Markdown
Contributor

@mgadewoll mgadewoll left a comment

Choose a reason for hiding this comment

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

🟢 Thanks for the additional updates! All changes are LGTM and look/work as expected. Nice work! 🎉

@weronikaolejniczak weronikaolejniczak merged commit eb3e12e into elastic:main Feb 13, 2026
5 checks passed
@@ -0,0 +1,5 @@
- Added `textInk` and `textGhost` color tokens for text and icon colors that should always remain dark or light regardless of color mode.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ℹ️ I just realized that this PR had the skip-changelog-eui label. I missed that in the review 🫠

We should add a changelog for this on eui as well as the tokens are consumed through the theme from eui.
I added a PR for it here.

mgadewoll added a commit that referenced this pull request Feb 16, 2026
mgadewoll added a commit to elastic/kibana that referenced this pull request Feb 23, 2026
## Dependency updates

- `@elastic/eui` - v112.3.0 ⏩ v113.0.0
- `@elastic/eui-theme-borealis` - v5.4.0 ⏩ v6.0.0
- `@elastic/eslint-plugin-eui` - v2.8.0 ⏩ v2.9.0

---

## Changes

1. EUI component update: API and Design updates to form layout
append/prepend by using the new components `EuiFormPrepend` and
`EuiFormAppend` (EUI [#9308](elastic/eui#9308))

>[!important]
❗ This upgrade PR includes all changes previously made in the specific
QA PR #248805.
Please see the description in that PR for detailed information about the
specific changes.

2. Additional changes related to the form layout changes

>[!note]
🔗 Please see the [section "Additional
changes"](#248805 (comment))
in #248805 for an overview of
additional changes.

3. Removed token update: Replaced `ghost` and `ink` token usages with
`textInk` or `plainDark` and `textGhost` or `plainLight` respectively
(EUI [#9379](elastic/eui#9379))

## Package updates

### `@elastic/eui`
[v113.0.0](https://github.com/elastic/eui/releases/tag/v113.0.0)

- Updated `EuiFlyout` manager to close all flyouts when a parent flyout
is closed. ([#9378](elastic/eui#9378))
- Added `textInk` and `textGhost` color tokens for text and icon colors
that should always remain dark or light regardless of color mode.
([#9379](elastic/eui#9379))
- Added `EuiFormAppend` and `EuiFormPrepend` components
([#9014](elastic/eui#9014))
- Added support for `type="span"` on `EuiFormLabel` for visual-only form
labels ([#9014](elastic/eui#9014))
- Updated `EuiFormLabel` to render a `span` if no `htmlFor` is passed
([#9014](elastic/eui#9014))
- Updated `EuiFormControlLayout` to use `EuiFormAppend` and
`EuiFormPrepend` ([#9014](elastic/eui#9014))
- Updated `EuiAutoRefresh` and `EuiColorPicker` to use `EuiFormPrepend`
([#9014](elastic/eui#9014))
- Updated `EuiFormAppend`/`EuiFormPrepend` styling
([#9305](elastic/eui#9305))
- Updated `EuiFormAppend`/`EuiFormPrepend` to inherit `isDisabled` state
from `EuiFormControlLayout`
([#9305](elastic/eui#9305))
- Updated `EuiFormControlLayout` hover, disabled and readonly styling
([#9305](elastic/eui#9305))
- Updated `EuiFormControlButton` to inherit `isDisabled`, `readOnly` and
`isInvalid` states from `EuiFormControlLayout`
([#9305](elastic/eui#9305))
- Added `iconSide` prop on `EuiDatePickerRange`
([#9305](elastic/eui#9305))
- Updated `EuiSuperDatePicker` valid state styling
([#9305](elastic/eui#9305))
- Removed background color transition on `EuiButtonEmpty` (other button
variants don't have a transition anymore either)
([#9305](elastic/eui#9305))
- Added `isLoading` prop on `EuiFormControlButton`
([#9328](elastic/eui#9328))
- Updated paddings for `EuiButton`, `EuiButtonEmpty`, `EuiFilterButton`
([#8948](elastic/eui#8948))
- Updated paddings for `append`/`prepend` on `EuiFormControlLayout`
([#8948](elastic/eui#8948))
- Added optional `scrollContainerRef` prop to `EuiFlyoutBody` for
accessing the flyout's internal scroll container.
([#9373](elastic/eui#9373))

**Bug fixes**

- Updated `EuiColorPicker` to ensure `id` is correctly passed onto the
internal `EuiFormControlLayout`
([#9014](elastic/eui#9014))

**Breaking changes**

- Removed `ink` and `ghost` theme tokens. Use `textInk` / `textGhost`
for text and icon colors or `plainDark` /`plainLight` for non-text use
cases. ([#9379](elastic/eui#9379))
- Updated `EuiQuickSelectPopover` in `EuiSuperDatePicker` to use
`EuiFormPrepend`. This results in more restricted `buttonProps` as they
reflect `EuiFormPrepend` instead of generic `EuiButtonEmpty` props.
([#9014](elastic/eui#9014))
- Removed `components.superDatePickerBackgroundSuccees` token
([#9305](elastic/eui#9305))

### `@elastic/eui-theme-borealis` v6.0.0

- Added `textInk` and `textGhost` color tokens for text and icon colors
that should always remain dark or light regardless of color mode.
([#9379](elastic/eui#9379))

### `@elastic/eslint-plugin-eui` v2.9.0

- Prevented `badge-accessibility-rules` rule autofix from duplicating
`aria-hidden` attributes.
([#9366](elastic/eui#9366))
- Skip `badge-accessibility-rules` rule validation when a spread
operator is used in a component.
([#9366](elastic/eui#9366))

---------

Co-authored-by: Weronika Olejniczak <weronika.olejniczak@elastic.co>
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking change PRs with breaking changes. (Don't delete - used for automation) skip-changelog-eui Use on PRs to skip changelog requirement (for @elastic/eui)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Colors] Create text-ink and text-ghost tokens and replace respective old tokens in the code

5 participants