Custom Elements Collection — библиотека компонентов, которая подключается двумя строками в <head>: один <link> с темой и один <script type="module"> с регистрацией тегов. Без npm, без bundler, без node_modules. После двух строк в разметке становятся доступны hero-блоки, KPI, callout-уведомления, чат-виджеты, графики, формы.
В туториале — минимальный пример: hero-страница с инлайн-метриками и callout-уведомлением. На выходе — HTML-файл, который открывается двойным кликом.
Что внутри
Цифры из package.json и README:
147 web-components, разбитых на 9 групп.
Lit 3 как runtime, бандлится в пакет.
Light DOM по умолчанию — теги встают в обычный поток DOM, видны в DevTools как обычные элементы, дочерние ноды доступны через
children.10 готовых тем через CSS Custom Properties: light, dark, bauhaus, gruvbox, memphis, muji, neo-brutal, nordic, solarized, swiss. Переключение атрибутом
data-ce-theme="..."на<html>.
Группы компонентов (полный каталог — на демо-странице, ссылка в конце):
Layout & primitives (38) -
ce-hero,ce-section,ce-grid,ce-stack,ce-callout,ce-card,ce-tabs,ce-modal,ce-drawer,ce-table.Metrics & charts (11) -
ce-kpi,ce-sparkline,ce-bar-chart,ce-donut,ce-heatmap,ce-gauge.Comparison & narrative (19) -
ce-feature-card,ce-pros-cons,ce-matrix,ce-decision-tree,ce-timeline,ce-pricing-tier.Chat surfaces (18) -
ce-chat-input,ce-chat-bubble,ce-message-group,ce-reasoning,ce-tool-call,ce-source-card,ce-citation- примитивы для LLM-UI.Feedback (11) -
ce-feedback-bar,ce-rating,ce-comment,ce-tooltip.Forms (16) -
ce-button,ce-input,ce-textarea,ce-select,ce-checkbox,ce-radio-group.Dashboard (6) -
ce-clock,ce-counter,ce-gauge,ce-sparkline,ce-status-light.Content (10) -
ce-image,ce-list,ce-tree,ce-json,ce-diff,ce-qr.Education
lesson-*(18) -lesson-quiz,lesson-vocab,lesson-match,lesson-revealдля интерактивных уроков.
Web-components - W3C-стандарт, поддерживается во всех evergreen-браузерах (Chrome, Edge, Firefox, Safari 16.4+). Один и тот же <ce-hero> работает в React, Vue 3, Angular 17+, Svelte 5, Astro и в любом SSG; для некоторых фреймворков нужна минимальная настройка (isCustomElement для Vue, CUSTOM_ELEMENTS_SCHEMA для Angular).
Шаг 1. Пустой HTML
index.html в любой папке, без сервера и node:
<!doctype html> <html lang="ru"> <head> <meta charset="utf-8"> <title>Custom Elements Collection - первый запуск</title> </head> <body> </body> </html>
Двойной клик открывает пустую страницу.
Шаг 2. Две строки CDN
Добавляем в <head> таблицу токенов темы и сам пакет с тегами:
<link rel="stylesheet" href="https://unpkg.com/custom-elements-collection/dist/tokens/light.css"> <script type="module" src="https://unpkg.com/custom-elements-collection/dist/auto.js"></script>
light.css- convenience-таблица светлой темы. Внутри -@importбазовогоtokens.css(--ce-color-*,--ce-space-*,--ce-radius-*,--ce-text-*), переопределение:rootпод светлую палитру иcolor-scheme: light. Аналогично естьdark.css(см. Шаг 5) иtokens.cssнапрямую - с ручным переключением черезdata-ce-theme="…".auto.js- entry-point с автоматической регистрацией всех 147 тегов вcustomElements.registry.
unpkg.com раздаёт содержимое npm-пакетов как статику. Версия фиксируется через @ - unpkg.com/custom-elements-collection@0.7.0/dist/auto.js; без указания версии тянется latest. Для прода версию имеет смысл закрепить.
Шаг 3. Первый
Добавляем в <body>:
<ce-callout type="success" title="Всё работает"> Custom Elements Collection подключена через CDN, сборка не требуется. </ce-callout>
Сохраняем, обновляем браузер — на странице зелёная панель с заголовком, акцент-полосой слева и телом. Это «admonition»-блок.
Атрибуты ce-callout по meta.json:
type— тон:info(по умолчанию),success,warn,danger,neutral.title— необязательный заголовок жирным.Тело — обычный children-контент в unnamed-slot. Внутрь можно класть ссылки, абзацы, списки.
Шаг 4. Композиция: +
Заменяем содержимое <body> на hero-блок со встроенными KPI:
<ce-hero kicker="Туториал" title="Custom Elements Collection - за 10 минут" lede="147 готовых web-components, две строки CDN, ноль сборки."> <ce-kpi slot="stats" value="147" label="Компоненты" color="green"></ce-kpi> <ce-kpi slot="stats" value="10" label="Тем" color="blue"></ce-kpi> <ce-kpi slot="stats" value="0" label="Шагов npm" color="purple"></ce-kpi> </ce-hero> <ce-callout type="success" title="Всё работает"> Custom Elements Collection подключена через CDN, сборка не требуется. </ce-callout>
<ce-hero>принимает строковые атрибутыkicker(надстрочный лейбл),titleиlede(подзаголовок). Это страничный header-блок с радиальным градиентом; атрибутflatградиент отключает.<ce-kpi>— leaf-компонент. Атрибуты:value(крупное значение),label(мелкий лейбл),color(neutral | green | red | amber | blue | purple | cyan),trend(строка вида+12%или-3msс автоматической расцветкой по знаку).slot="stats"— именованный slot: hero показывает KPI-блоки в отдельной строке внизу header’а. Список слотов — публичная часть API, описанная вhero.meta.json.
Шаг 5. Тёмная тема — смена одной ссылки
Custom Elements Collection включает 10 готовых тем. Переключаемся подменой <link> - light.css на dark.css:
<link rel="stylesheet" href="https://unpkg.com/custom-elements-collection/dist/tokens/dark.css">
Обновляем браузер — фон, текст, границы и все цветовые токены --ce-color-* переключаются на тёмную палитру; color-scheme: dark перекрашивает канвас. Аналогично работают solarized.css, nordic.css, gruvbox.css, bauhaus.css, memphis.css, muji.css, neo-brutal.css, swiss.css.
Runtime-переключение темы и prefers-color-scheme
Если тему нужно менять во время работы страницы — подключаем tokens.css напрямую (внутри палитры всех 10 тем) и переключаемся атрибутом data-ce-theme="dark" на <html>. В этом туториале статический выбор через <link> короче.
Для системной темы через prefers-color-scheme хватает небольшого скрипта на matchMedia('(prefers-color-scheme: dark)') — отдельная тема следующих туториалов.
Финальный файл
<!doctype html> <html lang="ru"> <head> <meta charset="utf-8"> <title>Custom Elements Collection — первый запуск</title> <link rel="stylesheet" href="https://unpkg.com/custom-elements-collection/dist/tokens/dark.css"> <script type="module" src="https://unpkg.com/custom-elements-collection/dist/auto.js"></script> </head> <body> <ce-hero kicker="Туториал" title="Custom Elements Collection — за 10 минут" lede="147 готовых web-components, две строки CDN, ноль сборки."> <ce-kpi slot="stats" value="147" label="Компоненты" color="green"></ce-kpi> <ce-kpi slot="stats" value="10" label="Тем" color="blue"></ce-kpi> <ce-kpi slot="stats" value="0" label="Шагов npm" color="purple"></ce-kpi> </ce-hero> <ce-callout type="success" title="Всё работает"> Custom Elements Collection подключена через CDN, сборка не требуется. </ce-callout> </body> </html>
Открывается двойным кликом — модули подтягиваются с CDN по file://, страница рендерится.
Light DOM vs Shadow DOM — без оценки
Компоненты по умолчанию рендерятся в light DOM: разметка видна в обычном DOM, доступна через document.querySelector и innerHTML, дочерние элементы лежат в children. Решение зафиксировано в ADR-002 проекта — оно упрощает интеграцию с server-side markdown, со скриптами, ищущими элементы по селекторам, и инспектирование в DevTools.
У Shadow DOM другая модель — изоляция стилей и encapsulated DOM. Сильная сторона - shadow-tree не «течёт» в host-страницу, что критично для embeddable виджетов на чужих сайтах. У light DOM сильнее интеграционная модель, но стили host-страницы могут затечь в компоненты, если небрежно работать с селекторами. В Custom Elements Collection Shadow DOM опт-ин — отдельные компоненты используют его, когда нужны :host()-селекторы; снаружи API одинаков: атрибуты, slots и CSS Custom Properties.
Когда CDN подходит - а когда лучше npm
CDN через unpkg.com подходит когда:
прототип, лендинг или одностраничник — пайплайн сборки лишний;
документация и блог-пост — markdown + один
<script>в head шаблона;демо к OSS-библиотеке - посетитель открывает страницу, всё работает;
встроенный виджет на чужом сайте — особенно если у сайта нет bundler’а;
онбординг разработчиков — первый рабочий пример без
node_modules.
CDN начинает мешать когда:
проект уже на bundler (Vite, webpack, esbuild) — естественнее
pnpm add custom-elements-collectionи tree-shakableimport "custom-elements-collection/hero", чтобы платить байтами только за используемые теги;нужна детерминированная версия и offline-сборка —
unpkg.comтянется по сети;CSP-политика запрещает внешние script-источники — CDN исключён архитектурно;
используется SSR —
<script type="module">исполняется только в браузере; для SSR (Astro, Nuxt, Next.js) нужен npm-режим с правильной hydration-стратегией.
Как попробовать в своём проекте
Каталог всех компонентов с переключателем тем и живыми примерами
Репозиторий на GitHub с исходными кодами и подробной спецификацией каждого компонента.
debagger
Каталог недоступен. Хбраэффект?