Изменение значения использованной css-переменной

Я ожидал, что в следующем коде получится синий div, а он красный. Как поправить?

:root {
  --base-color: red;
  --color: var(--base-color);
}

main {
  --base-color: blue;
}

div {
  height: 3em;
  background: var(--color);
}
<main>
  <div></div>
</main>


Более подробно: я хочу менять цвет в зависимости от темы и не переопределять для каждой из них вычисляемые значения, поскольку они одинаковы:

:root {
  --base-color: red;
  --color: var(--base-color);
}

.theme1 {
  --base-color: green;
}

.theme2 {
  --base-color: blue;
}

div {
  padding: 1em;
  background: var(--color);
}

body * + * {
  margin-top: 1em;
}
<section>
  <div>Red</div>
</section>

<section class="theme1">
  <div>Green</div>
</section>

<section class="theme2">
  <div>Blue</div>
</section>

Пробовал поиграться с CSS.RegisterProperty, но из этого ничего не вышло.


Ответы (1 шт):

Автор решения: smellyshovel

Вполне ожидаемое поведение. По аналогии:

введите сюда описание изображения

А вот если b определить уже после того, как была изменена a, тогда все будет работать как ожидалось.

:root {
  --base-color: red;
}

main {
  --base-color: blue;
  --color: var(--base-color);
}

div {
  height: 3em;
  background: var(--color);
}
<main>
  <div></div>
</main>


Спасибо @Grundy за наводку. Побочный эффект - придется апплаить дополнительный класс.

:root {
  --base-color: red;

}

.use-vars {
  --color: var(--base-color);
}

.theme1 {
  --base-color: green;
}

.theme2 {
  --base-color: blue;
}

div {
  padding: 1em;
  background: var(--color);
}

body * + * {
  margin-top: 1em;
}
<section>
  <div class="use-vars">Red</div>
</section>

<section class="use-vars theme1">
  <div>Green</div>
</section>

<section class="use-vars theme2">
  <div>Blue</div>
</section>

→ Ссылка