Skip to content

Параметры и состояния

Параметры — это входные значения блока, от которых зависит, какие стили применятся. Они объявляются директивой @param и управляют условными правилами @if. Это и есть «состояния» компонента, только описанные в стилях, а не в JavaScript.

Объявление параметров

@param объявляется в начале тела блока: имя (CSS-переменная с префиксом --), тип и, при необходимости, значение по умолчанию.

ecss
@enum Variant {
  values: "primary", "ghost";
}

@block Button {
  @param --variant Variant;       // обязательный
  @param --disabled? boolean;     // опциональный (знак ?)
  @param --size? string: "md";    // опциональный со значением по умолчанию

  /* стили ниже */
}

Знак ? после имени делает параметр необязательным. Типы бывают примитивные (boolean, string, number, unit, color) и пользовательские — перечисления @enum. Полный список — в разделе Типы данных.

Связь с пропом params

Каждый @param становится полем объекта params у сгенерированного компонента. Имя переводится из --kebab-case в camelCase:

В .ecssВ компоненте
@param --variantparams.variant
@param --is-activeparams.isActive
tsx
import { EButton } from './Button.ecss';

<EButton as="button" params={{ variant: 'primary', disabled: true }}>
  Нажми меня
</EButton>;

TypeScript знает типы всех параметров: передать variant: 'danger', которого нет в @enum Variant, не получится. Если у блока есть хотя бы один обязательный параметр, проп params обязателен; если все параметры опциональны — его можно не передавать.

Условные стили @if

Параметры сами по себе ничего не делают — их «считывают» условия @if / @elseif / @else. Это механизм, который превращает значение параметра в набор CSS-правил:

ecss
@block Button {
  @param --variant Variant;
  @param --disabled? boolean;

  display: inline-flex;
  padding: 8px 16px;

  @if (--variant == "primary") {
    background: #646cff;
    color: #fff;
  } @elseif (--variant == "ghost") {
    background: transparent;
    border: 1px solid currentColor;
  }

  @if (--disabled) {
    opacity: 0.4;
    cursor: not-allowed;
  }
}

Для boolean-параметра достаточно голого имени (@if (--disabled) — эквивалент --disabled == true). Для перечислений и строк используется сравнение == / !=. Условия можно комбинировать (&&, ||, !) и вкладывать — подробности в справочнике @if.

Что дальше?