Skip to content

[Bug]: Internal and external design token hashes don't match #5117

Open

Description

@rix0rrr

Browser

Chrome

Package version

3.0.1330

React version

Description

I fully admit I may not be understanding something here about how this is supposed to be used, but I'm going by (as far as I can tell) official documentation.

I'm trying to implement dark mode in my application, and I have had to override some color somewhere in one of my controls (you may already feel where this is going).

As per the design token documentation, I am doing the following:

import * as awsui from '@cloudscape-design/design-tokens';

return (
          <div style={{ backgroundColor: awsui.colorBackgroundContainerContent }}></div>
  );

The dark mode documentation says that I should be using design tokens everywhere, which I'm doing, so I'm feeling good.

By the way, that page has 0 context on how to actually apply dark mode itself, which I've had to Google to come out to something like this:

import { applyMode, Mode } from "@cloudscape-design/global-styles";

export type LightDarkPreference = 'system' | 'dark' | 'light';

let userPreference = localStorage.getItem('light-dark-preference') as LightDarkPreference | null ?? 'system';
const systemDarkMode = window.matchMedia('(prefers-color-scheme: dark)');

// Initialize color mode based on user's OS preference and stay in sync if the preference changes.
systemDarkMode.addEventListener('change', () => refreshDarkMode());
refreshDarkMode();

function refreshDarkMode() {
  if (userPreference === 'system') {
    applyMode(systemDarkMode.matches ? Mode.Dark : Mode.Light);
  } else if (userPreference === 'dark') {
    applyMode(Mode.Dark);
  } else {
    applyMode(Mode.Light);
  }
}

The symptom

But of course, when I switch to Dark Mode my background is still bright white. The design token didn't do anything:

Image

The promixate cause

When I look at the CSS it's because the variable names don't match:

// Variable consumed by the design-tokens library
background-color: var(--color-background-container-content-mjfil9, #ffffff);

// Variable set by the <body> element
.awsui-dark-mode:not(#\ ) {
   --color-background-container-content-6u8rvp: var(--color-neutral-850-3f0gro);
}

The root cause?

Because mjfil9 != 6u8rvp, the variable that is set is not the variable that is read.

But my question is: why? I'm following documentation (as far as I can tell).

I'm consuming the following packages... they're not all the same major version but they are all the same major version line as the most recent packges (v3 for components and design-tokens, v1 for global-styles). I could perhaps expect incompatibilities between major version lines, but not inside a major version line.

@cloudscape-design/components 3.0.1330
@cloudscape-design/design-tokens 3.0.114
@cloudscape-design/global-styles 1.0.62

As far as I can tell I also only have one copy of each, so it's not multiple copies of the same package at slightly different versions, which should have been deduplicated but weren't.

What is the contract here?

Please tell me the it isn't "I have to go hunt for the exact patch version of components that was used to build design-tokens (or the other way around), and any time I upgrade one of the packages I have to go hunt for the patch version again" ?

Source code

No response

Reproduction

No response

Code of Conduct

Activity

  1. rix0rrr commented on Oct 7, 2026

    @rix0rrr
    Author

    After upgrading components to a recent version, the hashes do match again.

    Which means that the contract does turn out to be: whenever you pick a version for one, you must go and pick a patch version of the other that matches, with no obvious indication whether you did it right or not other than that your styles won't look right when viewing the page.

    I guess the bug report here is that the variable names are not backwards compatible, and/or there doesn't seem to be an easy way to get 2 versions that are guaranteed to work together; and there is no documentation saying that "you must pick versions which are ~roughly released at the same time"

  2. SpyZzey commented on Oct 13, 2026

    @SpyZzey
    Member

    Hey @rix0rr,
    Thanks for the bug report!
    Indeed, the packages require dependencies that are roughly released together.
    We will check whether we can improve the documentation or version numbering on this.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions