Использование переменных ядра Discourse в вашей теме

Discourse обладает невероятной настраиваемостью!

Цель этого поста — показать, как использовать все замечательные опции, доступные вам как разработчику тем. Знаете, чтобы не изобретать велосипед :smile:

Переменные? Какие переменные?

Переменные охватывают множество аспектов: от размеров шрифта до цветов и значений z-index. Вы можете использовать и переопределять подавляющее большинство переменных в редакторе темы.

Цвета

Для использования или переопределения в вашей теме доступно множество цветов. Базовый набор цветов можно увидеть в административном интерфейсе в разделе «Кастомизация > Цвета». Вот скриншот схемы цветов по умолчанию:

Эти цвета доступны в виде пользовательских свойств CSS, которые можно использовать и переопределять с помощью синтаксиса:

var(--primary)
var(--secondary)
var(--tertiary)
var(--quaternary)
var(--header_background)
var(--header_primary)
var(--highlight)
var(--danger)
var(--success)
var(--love)

:warning: Использование переменных цвета SCSS (таких как $primary, $secondary и т. д.) устарело. Ядро Discourse использует пользовательские свойства CSS с августа 2020 года, и мы рекомендуем всем существующим темам перейти с переменных SCSS на пользовательские свойства CSS. Для сложных манипуляций с цветами см. это руководство.

Как же их использовать?

Начните с создания новой темы или, если вы используете тему на основе git, создайте новый компонент темы и добавьте его в вашу тему.

Допустим, я хочу установить для фона <body> цвет, соответствующий цвету highlight текущей схемы цветов. Я могу сделать это так:

body {
  background: var(--highlight);
}

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

(Этот цвет фона не рекомендуется :sweat_smile:)

Теперь допустим, что текущая схема цветов для этой темы не установлена в «Светлую схему». Вместо этого, допустим, установлена схема «Тёмная» по умолчанию. Тот же код даст другой результат, так как переменная будет другой.

Вы можете увидеть, как фон <body> следует за текущей переменной highlight, каково бы ни было её значение в текущей схеме цветов.

Это базовые переменные цвета. Discourse также использует производные цвета, которые можно использовать или переопределять. Полный список цветов текущей схемы можно увидеть в инспекторе браузера. Вот скриншот темы по умолчанию:

Обратите внимание, что эти цвета можно исследовать на любом экземпляре Discourse, без необходимости аутентификации. На вашем собственном экземпляре Discourse вы можете (и должны) также использовать плагин styleguide, который теперь входит в ядро. Включите его и перейдите по адресу /styleguide, где вы увидите все элементы интерфейса Discourse, включая цвета:

(На скриншоте выше — схема цветов Grey Ember.)

Хорошо, перейдём к более продвинутым темам:


Продвинутые переменные

Посмотрите на этот файл в репозитории Discourse:

Здесь определяются большинство переменных. Как и в случае с цветами, эти переменные магическим образом доступны для использования в стилях темы.

Я постараюсь разобрать содержимое файла ниже:

Ширины

$small-width: 800px !default;
$medium-width: 995px !default;
$large-width: 1110px !default;

Они очень полезны, если вы хотите, чтобы ваша тема соответствовала нативному поведению Discourse, особенно в медиазапросах. Например, посмотрите на соответствующие части предкомпилированного scss для .user-info:

.user-info {
  &.medium {
    flex: 0 0 32%;
    margin: 0 2% 4vh 0;
    @media screen and (max-width: $small-width) {
      flex: 0 0 48%;
      margin-right: 0;
    }
  }
}

Обратите внимание, как в медиазапрос передаётся переменная для определения точки отсечения для маленьких экранов и применения разных стилей.


Шрифты

--base-font-size: 0.938em; // eq. to 15px
--base-font-size-larger: 1.063em; // eq. to 17px
--base-font-size-largest: 1.118em; // eq. to 19px

// Font-size definitions, multiplier ^ (step / interval)
--font-up-6: 2.296em;
--font-up-5: 2em;
--font-up-4: 1.7511em;
--font-up-3: 1.5157em;
--font-up-2: 1.3195em;
--font-up-1: 1.1487em; // 2^(1/5)
--font-0: 1em;
--font-down-1: 0.8706em; // 2^(-1/5)
--font-down-2: 0.7579em; // Smallest size we use based on the 1em base
--font-down-3: 0.6599em;
--font-down-4: 0.5745em;
--font-down-5: 0.5em;
--font-down-6: 0.4355em;

Это тоже довольно просто. В Discourse есть отличная система масштабирования шрифтов, поэтому вы должны использовать её.

Используемые единицы измерения — em, поэтому они будут относительными по отношению к --base-font-size, который используется на элементе <html>.

Таким образом:

.btn {
  font-size: var(--font-up-6);
}

компилируется в:

(–base-font-size _ --font-up-6) или (14px _ 2.296) = 32.14px

Или вот так:


Межстрочные интервалы

--line-height-small: 1;
--line-height-medium: 1.2; // Headings or large text
--line-height-large: 1.4; // Normal or small text

Эти переменные можно использовать так же, как в предыдущем примере. Обратите внимание, что это значения без единиц измерения. Вот что это значит:

Значения Z-index

$z-layers: (
  "max": 9999,
  "fullscreen": 1700,
  "modal": (
    "tooltip": 1600,
    "popover": 1500,
    "dropdown": 1400,
    "content": 1300,
    "overlay": 1200,
  ),
  "mobile-composer": 1100,
  "header": 1000,
  "tooltip": 600,
  "composer": (
    "popover": 500,
    "content": 400,
  ),
  "dropdown": 300,
  "usercard": 200,
  "timeline": 100,
  "base": 1,
);

Их можно использовать, как обсуждается здесь:

div {
  z-index: z("header");
}

«или, если они вложены, вот так:»

div {
  z-index: z("modal", "dropdown");
}

«Вы также можете выполнять базовые математические операции, как и ожидалось:»

div {
  z-index: z("base") + 1;
}

Блоки кода выше являются частью цитаты, но я вынес их наружу ради форматирования

Теперь вот пример:

Поместите блок над заголовком:

.zbox {
  position: fixed;
  top: 0;
  left: 0;
  height: 200px;
  width: 200px;
  background: red;
  z-index: z("header") + 1;
}

Поместите блок под заголовок:

.zbox {
  position: fixed;
  top: 0;
  left: 0;
  height: 200px;
  width: 200px;
  background: red;
  z-index: z("header") - 1;
}


Тени блоков

$box-shadow: (
  "modal": 0 8px 60px rgba(0, 0, 0, 0.6),
  "composer": 0 -1px 40px rgba(0, 0, 0, 0.12),
  "menu-panel": 0 6px 14px rgba(0, 0, 0, 0.15),
  "card": 0 4px 14px rgba(0, 0, 0, 0.15),
  "dropdown": 0 2px 3px 0 rgba(0, 0, 0, 0.2),
  "header": 0 2px 4px -1px rgba(0, 0, 0, 0.25),
  "kbd": (
    0 2px 0 rgba(0, 0, 0, 0.2),
    0 0 0 1px dark-light-choose(#fff, #000) inset,
  ),
  "focus": 0 0 6px 0 $tertiary,
  "focus-danger": 0 0 6px 0 $danger,
);

Как вы, вероятно, видите, большая часть работы с переменными уже сделана за вас, и в большинстве случаев вам нужно только использовать то, что уже есть.

Использование теней блоков выглядит так:

.d-header {
  box-shadow: shadow("focus");
}

Это должно заставить заголовок использовать тень фокуса. И если мы проверим это:


Этот пост является вики, поэтому редактируйте по необходимости :wink:


Этот документ находится под контролем версий — предложите изменения на github.

45 лайков