Skip to content

Иконки ​

Дизайн-система CDS v4 «из коробки» поддерживает множество популярных наборов иконок (iconpack).

Использование ​

По умолчанию CDS рисует иконки набором Phosphor. Настраивать ничего не нужно: CSS всех иконок, которые используют компоненты, уже входит в пакет. UnoCSS и @iconify-json/ph для этого не требуются.

ts
import { createCds } from '@central-design-system/components';

const cds = createCds();

app.use(cds);

После этого иконку можно использовать в шаблонах:

html
<template>
  <CdsIcon icon="add" />
</template>

Имя иконки описывает её назначение: close закрывает контейнер, remove убирает элемент или значение, warning и error — разные статусы. Полный список — в галерее иконок.

Иконки в CSS хранятся как data: URI. Если у проекта настроен Content Security Policy, директива img-src должна разрешать data:. При печати иконки всегда чёрные: цвет задаётся маской, а она печатается неверно.

Имена CDS 3 продолжают работать весь 4.x: иконка подставляется по новому имени, а в dev-консоли появляется предупреждение [CDS UPGRADE]. В 5.0 старые имена будут удалены. Таблица замен — в гайде по миграции.

Своя иконка вместо алиаса ​

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

ts
const cds = createCds({
  icons: {
    aliases: {
      remove: 'class:my-remove-icon',
    }
  },
});

Установка наборов иконок через UnoCSS ​

Дизайн-система CDS интегрируется с UnoCSS Preset Icons, который поддерживает все наборы иконок, доступные на Iconify.

Иконки подключаются с tree-shaking, поэтому в итоговый CSS-бандл попадают только те иконки, которые вы действительно используете. Вы можете зарегистрировать сразу несколько наборов и свободно комбинировать иконки из любого из них в своих компонентах.

Наборы иконок ​

Для перечисленных ниже наборов в CDS подготовлены iconset'ы с alias mappings — псевдонимами для иконок, которые используют компоненты CDS (например, чекбоксы, выпадающие списки, радио-кнопки и т. д.). В качестве набора по умолчанию (defaultSet) нужно выбрать один из них; при необходимости alias mappings можно переопределить. Дополнительные наборы — уже без алиасов — можно подключить параллельно и свободно использовать в своих шаблонах.

Библиотека иконокIconify packageИмпорт iconset'аSet name
Phosphor Iconsне нужен для алиасов@central-design-system/components/iconsets/phosphorphosphor
Remix Icon@iconify-json/ri@central-design-system/components/iconsets/remixremix
Lucide@iconify-json/lucide@central-design-system/components/iconsets/lucidelucide
Tabler Icons@iconify-json/tabler@central-design-system/components/iconsets/tablertabler
Material Symbols@iconify-json/material-symbols@central-design-system/components/iconsets/materialSymbolsmaterialSymbols

Каждый модуль экспортирует объект с именем набора: icons (сам набор для sets) и aliases (псевдонимы для aliases).

Установите нужный набор из таблицы выше:

bash
npm install @iconify-json/ri
bash
pnpm add @iconify-json/ri
bash
yarn add @iconify-json/ri
bash
bun add @iconify-json/ri

Иконки из таблицы работают через UnoCSS, поэтому сначала нужно установить и настроить сам UnoCSS. Подробнее об этом — в официальной документации.

Ниже — пример интеграции в проект на Vite.

  1. Установите UnoCSS в dev-зависимости (см. интеграцию с Vite):
bash
npm install -D unocss
bash
pnpm add -D unocss
bash
yarn add -D unocss
bash
bun add -d unocss
  1. Подключите плагин UnoCSS в конфигурации Vite:
ts
// vite.config.ts
import UnoCSS from 'unocss/vite'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [
    UnoCSS(),
  ],
})
  1. Создайте в корне проекта файл unocss.config.ts:
ts
// unocss.config.ts
import { presetIcons, defineConfig } from 'unocss'

export default defineConfig({
  presets: [
    presetIcons({
      processor(props) {
        delete props.color
      },
    }),
  ],
})

Больше ничего в unocss.config.ts дописывать не нужно: iconset'ы CDS помечены маркером @unocss-include, поэтому UnoCSS сканирует их сам — несмотря на то, что они лежат в node_modules и это .js-файлы, которые по умолчанию не попадают в content.pipeline.include.

  1. Передайте набор иконок в функцию createCds(). В примере используется набор Remix, но его можно заменить любым другим из таблицы выше:
ts
import { createCds } from '@central-design-system/components';
import { remix } from '@central-design-system/components/iconsets/remix';

const cds = createCds({
  icons: {
    defaultSet: 'remix',
    aliases: remix.aliases,
    sets: {
      remix: remix.icons,
    }
  },
});

app.use(cds);

Импортируйте набор подпутём @central-design-system/components/iconsets/<набор>, а не из общего объекта iconsets. Общий объект ссылается сразу на все наборы и не тришейкается — в бандл попадут лишний JS и CSS всех наборов.

После этого можно выбрать любую иконку из набора — например, ri:settings-3-line — и использовать её в шаблонах:

html
<CdsButton icon="i-ri:settings-3-line" />

UnoCSS использует для иконок префикс i-. CDS использует тот же префикс и уже настраивает с ним свои алиасы — не меняйте его, иначе алиасы из CDS перестанут работать.

Свой пак в компонентах ​

Любой пак Iconify можно подключить без карты CDS: установите @iconify-json/<пак> и пишите класс в шаблоне, например icon="i-mdi:home".

Чтобы своим паком рисовали и компоненты, передайте в createCds свою карту aliases. Имена, которых в ней нет, нарисует пак по умолчанию. UnoCSS сам не найдёт классы из этой карты: паки CDS помечены @unocss-include, а файл проекта нет. Добавьте файл карты в content.pipeline.include или перечислите классы в safelist, иначе иконки молча не нарисуются.

ts
// unocss.config.ts
import { presetIcons, defineConfig } from 'unocss'

export default defineConfig({
  content: {
    pipeline: {
      include: [/\.vue$/, 'src/icons/aliases.ts'],
    },
  },
  presets: [presetIcons()],
})

Авторство паков ​

ПакАвторЛицензия
PhosphorPhosphor IconsMIT
Remix IconRemix DesignApache-2.0
LucideLucide ContributorsISC
Tabler IconsPaweł KunaMIT
Material SymbolsGoogleApache-2.0

Если вы подключаете пак под лицензией CC-BY (например, Solar), автора обязан указать ваш проект.

Набор cds ​

Набор CDS 3 на инлайновых SVG помечен как устаревший и работает весь 4.x. Он нужен, чтобы сохранить привычный вид при переходе с CDS 3:

ts
const cds = createCds({
  icons: {
    defaultSet: 'cds'
  },
});

Новые имена, для которых в наборе нет рисунка, рисуются глифом Phosphor.

Legacy-пакет иконок из CDS v3 ​

Пакет @central-design-system/icons устарел и будет удалён в 5.0. Если он подключён, иконки компонентов рисует набор cds, а компоненты Icon* из пакета остаются зарегистрированными глобально:

bash
npm install @central-design-system/icons
bash
pnpm add @central-design-system/icons
bash
yarn add @central-design-system/icons
bash
bun add @central-design-system/icons
ts
import * as icons from '@central-design-system/icons';

const cds = createCds({
  icons
});

app.use(cds);