Почему calc превращает отрицательное число повторений в одно?

Почему в Хроме (версия 121 и не только) repeat(-10, 1fr) является ошибкой, а repeat(calc(-10), 1fr) ведёт себя как 1? С другими неположительными числами - аналогично. Я ожидал, что поведение будет одинаковым...

скриншот

section {
  border: 1px solid orange;
  background: antiquewhite;
  display: grid;
  padding: .5em;
  gap: .5em;
}

section + section {
  margin-top: 1em;
}

.a {
  grid-template-columns: 1fr repeat(-10, 1fr) 1fr;
}

.b {
  grid-template-columns: 1fr repeat(calc(-10), 1fr) 1fr;
}

div {
  height: 1em;
  background: gray;
}
<section class="a">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</section>

<section class="b">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</section>


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

Автор решения: Alexey Ten

https://www.w3.org/TR/css-values-4/#calc-range

Parse-time range-checking of values is not performed within math functions, and therefore out-of-range values do not cause the declaration to become invalid. However, the value resulting from a top-level calculation must be clamped to the range allowed in the target context.

Для математических функций (в частности calc) не происходит проверка на соответствие ограничениям в процессе парсинга, но результат вычисления принудительно вписывается в ограничения.

В вашем примере у repeat() первое значение должно быть целым положительным числом (<integer [1,∞]>) поэтому число -10 приводится к ближайшему разрешённому, т.е. 1.

При этом для явно заданных значений (specified value) такого принудительного вписывания не происходит и всё объявленное просто становится невалидным и игнорируется.

Там же в документации приведён простой пример: width: -5px невалидно и браузер игнорирует это правило, а в width: calc(-5px); приводится к ближайшему разрешённому значению и получается width: 0px;

→ Ссылка