Интеграция иконок в дизайн-систему

Есть несколько способов использования иконок. Для нашей дизайн-системы мы выбрали SVG. Векторная графика проста в использовании и дает широкий простор для настройки.

Тонкости работы с SVG мы разбирать не будем. Если вы хотите познакомиться с этой темой поближе, загляните в это руководство по внедрению иконок в дизайн-систему. Тут вы найдете много полезной информации.

Примечание: в статье будут использоваться только SVG-символы (Symbols). Но весь CSS-код, включая классы, легко можно применить и к инлайновым SVG-элементам, и к иконочным шрифтам.

Первым делом импортируем нужные символы в начале страницы, сразу после тега body.

<body>
  {% include "icons.svg" %}
  <svg class="icon">
    <use href="#icon-rugby" xlink:href= "#icon-rugby"/>
  </svg>
</body>

Здесь используется синтаксис шаблонизатора Nunjucks. Вы можете использовать ваш любимый шаблонизатор или же напрямую включить в страницу полный SVG-код.

Класс .icon отвечает за базовый стиль:

.icon {
  display: inline-block;
  color: var(--color-icon-primary);
  height: 1em;
  width: 1em;
  line-height: 1;
}

Он устанавливает способ отображения и размеры для всех иконок.

Примечание: если вы используете иконочный шрифт, обязательно добавьте в класс .icon свойство font-family с правильным значением (например, font-family: MyIconFont).

Размеры иконок

По умолчанию длина и ширина иконки равны 1em – эти значения определены в классе .icon. Для изменения размеров мы создадим несколько вспомогательных классов:

:root {
  --icon-xs: 16px;
  --icon-sm: 24px;
  --icon-md: 32px;
  --icon-lg: 48px;
  --icon-xl: 64px;
}

/* icon size */
.icon--xs {
  font-size: var(--icon-xs);
}

.icon--sm {
  font-size: var(--icon-sm);
}

.icon--md {
  font-size: var(--icon-md);
}

.icon--lg {
  font-size: var(--icon-lg);
}

.icon--xl {
  font-size: var(--icon-xl);
}

Так как свойства width и height заданы в относительных единицах em, они сразу же реагируют на изменение размера шрифта (1em = текущий размер шрифта элемента).

А для иконок будем использовать абсолютные единицы – пиксели, чтобы они не зависели от размеров вьюпорта и медиа-запросов.

Иконки разного стиля

Для цвета иконок используем CSS-переменные:

.icon {
  color: var(--color-icon-primary);
}

Примечание: работа с цветами описывалась в третьей части серии, а все переменные включены в отдельный файл _colors.scss. Таким образом, их можно удобно использовать для иконок.

Переменная --color-icon-primary будет определять цвет иконок по умолчанию на светлом фоне.

Для компонентов с классом .theme--dark и темным фоном ее значение можно изменять, как и значения других переменных.

@supports(--css: variables) {
  .theme--dark {
    --component-background: var(--black);
    --color-text: var(--gray-4);
    --color-icon-primary: #fff;
    //..другие переменные, изменяющиеся в темной теме
  }
}

Идея состоит в том, что при модификации стилей мы не используем непосредственно класс .icon (или другие классы элементов, зависящие от темы). Вместо этого мы храним все значения цветов в отдельном месте (внутри класса .theme--dark). Это позволяет удобно управлять состоянием компонентов в разных темах, просто добавляя или удаляя класс.

Выравнивание иконок в тексте

По умолчанию иконки имеют размер в 1em – то есть они равны тексту, среди которого находятся. Но для адекватного выравнивания этого недостаточно, поэтому мы воспользуемся flexbox-свойствами.

Создадим класс для выравнивания, который нужно будет добавить к контейнеру, содержащему текст с иконками.

.icon-text-aligner {
  display: flex;
  align-items: center;

  > *:nth-child(2) {
    margin-left: var(--space-xxs);
  }

  .icon {
    color: inherit;
    flex-shrink: 0;
  }
}

Свойство align-items отцентрирует всех потомков контейнера по оси y. Кроме того, для иконки устанавливается цвет, зависящий от цвета текста контейнера.

<p class="icon-text-aligner">
  <svg class="icon">
    <use href="#icon-dog" xlink:href="#icon-dog"/>
  </svg>
  <em>This is some text here</em>
</p>

А вот живой пример использования и кастомизации иконок:

See the Pen SVG Icons in a design system by Claudia (@claudiar) on CodePen.

0 комментариев

Оставить комментарий

*Доступные HTML-теги: a, abbr, blockquote, code, pre, del, i, em, strong, b, strike
*Не будет опубликован