Система веб-компонентов · Новый ресурс

Дизайн-система Web Awesome.

Изучите фактические семантические токены Web Awesome в нативных пользовательских элементах, включая локальные изменения радиуса и интервалов, стилизацию Shadow DOM, поведение списков выбора и валидацию полей ввода.

Руководство OpenDesign9 глав37 справочных записейАвторское руководство по приложению
01

Предварительный просмотр интерфейса дизайн-системы Web Awesome

Измените шкалы скруглений и отступов, переключите оформление примера, выберите регион и проверьте название локальной рабочей области.

Рабочая область для токенов с изолированной областью действияОткрыть полный пример
Нативные пользовательские элементы Web Awesome 3.14.0 и тема по умолчанию, локально собранные. · Справочник по реализации
02

Справочник дизайн-системы Web Awesome

Тема по умолчанию CSS для Web Awesome 3.14.0, изученная в установленном пакете. Приведённые ниже значения цветов — семантические псевдонимы; ссылки на палитру сохранены, а не заменены предположительными HEX-значениями. Примеры размеров в пикселях, рассчитанные по шкале, предполагают корневой размер шрифта 16 px и масштаб 1.

Семантические роли поверхностей и текста

Источник
Название / правилоЗначение / конфигурацияПрименение
--wa-color-surface-defaultwhiteОсновная поверхность примера.
--wa-color-surface-raisedwhiteПриподнятый слой.
--wa-color-surface-loweredvar(--wa-color-neutral-95)Поверхность для отображения кода.
--wa-color-surface-bordervar(--wa-color-neutral-90)Граница контейнера.
--wa-color-text-normalvar(--wa-color-neutral-10)Обычный текст.
--wa-color-text-quietvar(--wa-color-neutral-40)Вторичный текст.
--wa-color-text-linkvar(--wa-color-brand-40)Роль ссылки.
--wa-color-brand-fill-loudvar(--wa-color-brand-50)Заливка основного цвета бренда.
--wa-color-brand-on-loudwhiteТекст на заливке основного цвета бренда.
--wa-color-brand-fill-quietvar(--wa-color-brand-95)Спокойная заливка бейджа.
--wa-color-brand-on-quietvar(--wa-color-brand-40)Текст на спокойной заливке бренда.

Отступы и форма

Источник
Название / правилоЗначение / конфигурацияПрименение
--wa-space-scale1Множитель, используемый токенами отступов.
--wa-space-xscalc(var(--wa-space-scale) * 0.5rem)8 px при масштабе по умолчанию.
--wa-space-scalc(var(--wa-space-scale) * 0.75rem)12 px при масштабе по умолчанию.
--wa-space-mcalc(var(--wa-space-scale) * 1rem)16 px при масштабе по умолчанию.
--wa-space-lcalc(var(--wa-space-scale) * 1.5rem)24 px при масштабе по умолчанию.
--wa-space-xlcalc(var(--wa-space-scale) * 2rem)32 px при масштабе по умолчанию.
--wa-space-2xlcalc(var(--wa-space-scale) * 2.5rem)40 px при масштабе по умолчанию.
--wa-border-radius-scale1Множитель, используемый для масштабируемых скруглений.
--wa-border-radius-scalc(var(--wa-border-radius-scale) * 0.1875rem)3 px при масштабе по умолчанию.
--wa-border-radius-mcalc(var(--wa-border-radius-scale) * 0.375rem)6 px при масштабе по умолчанию.
--wa-border-radius-lcalc(var(--wa-border-radius-scale) * 0.75rem)12 px при масштабе по умолчанию.

Типографика

Источник
Название / правилоЗначение / конфигурацияПрименение
--wa-font-family-bodyui-sans-serif, system-ui, sans-serifСистемный шрифт без засечек для основного текста.
--wa-font-family-headingvar(--wa-font-family-body)Псевдоним шрифта для заголовков.
--wa-font-family-codeui-monospace, monospaceМоноширинный шрифт для отображения кода.
--wa-font-size-scale1Множитель типографической шкалы.
--wa-font-size-mcalc(1rem * var(--wa-font-size-scale))16 px при корневом размере шрифта и масштабе по умолчанию.
--wa-font-size-lround(calc(var(--wa-font-size-m) * 1.125 * 1.125), 1px)20 px при корневом размере шрифта и масштабе по умолчанию.
--wa-font-size-xlround(calc(var(--wa-font-size-l) * 1.125 * 1.125), 1px)25 px при корневом размере шрифта и масштабе по умолчанию.
--wa-font-size-2xlround(calc(var(--wa-font-size-xl) * 1.125 * 1.125), 1px)32 px при корневом размере шрифта и масштабе по умолчанию.
--wa-line-height-condensed1.2Сжатые заголовки и подписи.
--wa-line-height-normal1.6Нормальная высота строки для чтения.

Псевдонимы элементов управления формы

Источник
Название / правилоЗначение / конфигурацияПрименение
--wa-form-control-background-colorvar(--wa-color-surface-default)Псевдоним поверхности поля ввода.
--wa-form-control-border-colorvar(--wa-color-neutral-border-loud)Роль границы поля ввода.
--wa-form-control-border-radiusvar(--wa-border-radius-m)Псевдоним скругления поля.
--wa-form-control-label-colorvar(--wa-color-text-normal)Цвет доступной для восприятия подписи.
--wa-form-control-hint-colorvar(--wa-color-text-quiet)Псевдоним цвета подсказки.
03

Полное руководство по дизайн-системе Web Awesome

Практическое руководство по выбору, применению и оценке этой системы для реального интерфейса.

DESIGN-web-awesome.md

Подробные рекомендации, отправная точка для реализации и ссылки на источники.

Скачать руководство

Пользовательские элементы дизайн-системы Web Awesome со своей границей компонента

Пользовательские элементы со своей границей компонента

Web Awesome предоставляет зарегистрированные пользовательские элементы HTML, поэтому приложение React не требуется. После импорта wa-input или wa-select элемент можно поместить в обычный HTML и управлять им с помощью документированных свойств и событий. В этой рабочей области локально собрана версия 3.14.0 и используются только компоненты из общедоступного пакета.

Из этого руководства OpenDesign

Видимые элементы управления — это настоящие пользовательские элементы со своей реализацией в теневом DOM. Заголовок, разделы и область отображения кода вокруг них — оригинальные элементы HTML. Благодаря этому пример позволяет увидеть, какие решения о стилизации распространяются через границу компонента с помощью наследуемых пользовательских свойств, а какие относятся к композиции страницы.

Прочитать вспомогательную спецификацию

Сохраняйте семантические псевдонимы цветов дизайн-системы Web Awesome

Сохраняйте семантические псевдонимы цветов

Тема по умолчанию различает приподнятые, базовые и утопленные поверхности, обычный и спокойный текст, а также несколько пар цветов заливки бренда и текста на ней. Для области отображения токенов используется утопленная поверхность, для основного примера — базовая поверхность, а небольшой бейдж сочетает brand-fill-quiet и brand-on-quiet. Эти роли сохраняют смысл при смене оформления.

В справочнике сохранены псевдонимы, например var(--wa-color-neutral-10), вместо того чтобы подставлять предполагаемые HEX-значения для каждой роли. Палитра может измениться, а семантическое назначение останется корректным. Если вы меняете цвет заливки для важного действия бренда, учитывайте также цвет текста на ней. Изменение только одного из этих цветов может ухудшить читаемость текста кнопки.

Прочитать вспомогательную спецификацию

Меняйте шкалу, не переписывая каждый компонент дизайн-системы Web Awesome

Меняйте шкалу, не переписывая каждый компонент

Переключатель скруглений меняет только у образца значение --wa-border-radius-scale. При масштабе 1 значения токенов скругления малого, среднего и большого размера составляют три, шесть и двенадцать пикселей при корневом размере шрифта 16 px. При масштабе 0 масштабируемые углы становятся прямыми; при масштабе 2 их размер удваивается. Токены для формы таблетки и круга — отдельные понятия; не следует считать, что их размер зависит от этого множителя.

Переключатель отступов меняет --wa-space-scale. Для полей, интервалов и отступов в области отображения кода используются официальные токены space, поэтому их соотношения меняются согласованно. Это не означает, что масштабируются все размеры каждого компонента: для размеров элементов управления есть собственные зависимости от токенов. Панель редактирования находится вне области действия настройки, поэтому её вид остаётся неизменным, пока меняется пример.

  1. Выберите «Квадратные углы» и изучите скругления поля ввода, контейнера и области отображения кода.
  2. Выберите увеличенные отступы и сравните интервалы в примере с неизменившейся панелью редактирования.
  3. Восстановите значения по умолчанию, чтобы одновременно вернуть исходные множители и оформление.

Прочитать вспомогательную спецификацию

Токены типографики и авторский выбор заголовков в дизайн-системе Web Awesome

Токены типографики и авторский выбор заголовков

По умолчанию для основного текста используется семейство шрифтов ui-sans-serif, system-ui, sans-serif. Для заголовков используется то же семейство, что и для основного текста, а для кода — ui-monospace. Обычный токен межстрочного интервала равен 1.6, сжатый — 1.2. Средний типографический токен равен одному rem, умноженному на font-size-scale, а для более крупных размеров используются округлённые вычисления. В таблице приведены эти выражения, чтобы показать их зависимости.

В самой рабочей области для заголовка выбрано значение 34px, а для заголовка раздела — 23px; при локальной контрольной точке 700px размер заголовка страницы уменьшается. Это явно заданные оригинальные правила страницы. Для нативных полей сохраняются стили меток и подсказок библиотеки, чтобы пользователь мог сравнить собственную иерархию страницы с типографикой компонентов по умолчанию.

Прочитать вспомогательную спецификацию

Начальные значения, свойства и события изменения дизайн-системы Web Awesome

Начальные значения, свойства и события изменений

Каждый элемент select содержит дочерние элементы wa-option со стабильными значениями. В вариантах по умолчанию используется атрибут selected, как и предписывает актуальное руководство по начальному выбору компонента. При изменениях во время работы читается свойство value элемента select. Элементы управления темой отслеживают события change и обновляют пользовательские свойства CSS; текст отображаемых подписей вариантов для этого не анализируется.

Выбор региона — обычное демонстрационное поле, которое не управляет внешней службой хранения данных. Выбранное значение отображается в локальном сообщении о действии. Интерфейс не создаёт впечатления, будто выбор региона «Европа» выделяет хранилище. Это различие важно, когда реалистично выглядящая демонстрация компонента использует продуктовую терминологию.

Прочитать вспомогательную спецификацию

Стилизация дизайн-системы Web Awesome с помощью токенов и документированных частей

Стилизуйте с помощью токенов и документированных частей

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

Чтобы внести изменения для конкретного компонента, изучите документированные пользовательские свойства и части CSS этого компонента. Глобальный селектор input не обязательно изменит внутренний элемент input компонента wa-input. И наоборот, класс темы или переменная на общем предке могут намеренно влиять на множество дочерних пользовательских элементов, поэтому область действия нужно выбирать внимательно.

Прочитать вспомогательную спецификацию

Обновление, проверка и локальные результаты дизайн-системы Web Awesome

Обновление, проверка и локальные результаты

С точки зрения страницы регистрация компонентов выполняется асинхронно. В примере ожидается выполнение customElements.whenDefined для используемых API, а затем — обновление элементов select, прежде чем считываются начальные значения. Так начальные значения не применяются к элементу, который ещё не прошёл обновление из неизвестного тега HTML до класса компонента.

Для локального применения имени рабочая область использует setCustomValidity и reportValidity на wa-input. Имя после удаления пробелов по краям должно содержать не менее двух символов; иначе оно отклоняется. Событие input сбрасывает пользовательскую ошибку, чтобы можно было повторить попытку после исправления. Кнопка «Пригласить позже» отключена с помощью нативного состояния disabled компонента. Текст состояния сообщает только о локально применённом имени; полный код не отправляет запросов на создание рабочей области или выделение хранилища.

  • Подписанные поля размечены с помощью атрибутов label.
  • Подсказки сообщают об ограничении для имени до появления ошибки.
  • Отключённая кнопка остаётся неинтерактивной, но её назначение видно.

Прочитать вспомогательную спецификацию

Импорт темы и используемых компонентов дизайн-системы Web Awesome

Подключайте тему и используемые компоненты

Установите @awesome.me/[email protected] в обычное приложение Vite и используйте предоставленный main.js как точку входа. Таблица стилей темы по умолчанию обязательна; пример намеренно не подключает более широкий набор сброса нативных стилей или утилит, поскольку макет страницы задан явно CSS. Импорты регистрируют пять типов компонентов, используемых в разметке.

Модули npm dist предназначены для сборщиков. Вариант dist-cdn подходит для непосредственной загрузки модулей в браузере, поскольку зависимости в нём объединены иначе. Не копируйте импорт из dist в обычный тег script, рассчитывая, что зависимости без указания пути будут разрешены автоматически. Для компонентов, которым нужны внешние ресурсы, требуется настроить базовый путь согласно документации; в этом образце не используются предоставляемые пользователем иконки, а сборка выполняется для автономной работы.

Прочитать вспомогательную спецификацию

Публичные компоненты и границы темы дизайн-системы Web Awesome

Общедоступные компоненты и реальные границы темы

В рабочей области показаны тема по умолчанию и публичные компоненты. Некоторые компоненты, шаблоны и ресурсы для дизайна Web Awesome доступны в версии Pro, поэтому страница не создаёт впечатления, будто установка публичного пакета открывает доступ ко всему каталогу. Прежде чем делать компонент обязательной зависимостью общей дизайн-системы, следует проверить, доступен ли он.

В документации к повторно используемой теме продукта следует указать, какие переменные изменены, где они действуют и как проверены оба режима отображения. Рабочая область — небольшой пример такого процесса: читатель может увидеть конкретно изменённые переменные и сравнить результат на нативных компонентах, а не полагаться на отдельное изображение палитры.

Прочитать вспомогательную спецификацию

Примеры компонентов дизайн-системы Web Awesome

Разметка рабочей области пользовательских элементов

Нативные wa-select, wa-option, wa-input, wa-switch и wa-button сочетаются с обычной семантической разметкой HTML.

html
<main class="token-workbench"><header><p class="eyebrow">WEB AWESOME / TOKEN WORKBENCH</p><h1>See the theme cross the component boundary.</h1><p>Change a scoped token and inspect native custom elements alongside ordinary HTML.</p></header><div class="workbench-grid"><section class="controls"><h2>Theme controls</h2><wa-select id="radius" label="Corner scale"><wa-option value="0">Square / 0</wa-option><wa-option value="1" selected>Default / 1</wa-option><wa-option value="2">Rounder / 2</wa-option></wa-select><wa-select id="spacing" label="Spacing scale"><wa-option value="0.8">Compact / 0.8</wa-option><wa-option value="1" selected>Default / 1</wa-option><wa-option value="1.25">Relaxed / 1.25</wa-option></wa-select><wa-switch id="dark">Dark appearance</wa-switch><wa-button id="reset" appearance="outlined">Restore defaults</wa-button><p class="hint">These controls change only the specimen. The editing controls keep their original dimensions.</p></section><section id="specimen" class="specimen" aria-label="Theme specimen"><div class="sample-head"><span class="badge">COMPONENT PREVIEW</span><span class="hint">Free components</span></div><h2>Your next workspace</h2><p class="hint">Form labels, field borders and actions inherit semantic tokens through the shadow boundary.</p><wa-input id="workspace" label="Workspace name" hint="Use at least two characters." value="Field notes"></wa-input><wa-select id="region" label="Storage region"><wa-option value="europe" selected>Europe</wa-option><wa-option value="america">North America</wa-option><wa-option value="asia">Asia Pacific</wa-option></wa-select><div class="sample-actions"><wa-button id="create" variant="brand">Apply name locally</wa-button><wa-button disabled>Invite later</wa-button></div><p id="result" role="status">No workspace is created by this specimen.</p><div class="token-readout"><code id="values">--wa-border-radius-scale: 1;<br>--wa-space-scale: 1;</code></div></section></div><footer>Native Web Awesome 3.14.0. The surrounding workbench is original HTML/CSS.</footer></main>

Справочник по коду

  • Для начального выбора на wa-option используется selected.
  • Используются только бесплатные компоненты.

Полные импорты и элементы управления токенами

Регистрирует компоненты, ожидает их обновления, изменяет ограниченные областью действия пользовательские свойства и применяет локальную проверку допустимости.

javascript
import '@awesome.me/webawesome/dist/styles/themes/default.css';
import '@awesome.me/webawesome/dist/components/button/button.js';
import '@awesome.me/webawesome/dist/components/input/input.js';
import '@awesome.me/webawesome/dist/components/select/select.js';
import '@awesome.me/webawesome/dist/components/option/option.js';
import '@awesome.me/webawesome/dist/components/switch/switch.js';
import './style.css';
const $=id=>document.getElementById(id);function update(){const s=$('specimen');s.style.setProperty('--wa-border-radius-scale',$('radius').value);s.style.setProperty('--wa-space-scale',$('spacing').value);s.classList.toggle('wa-dark',$('dark').checked);s.classList.toggle('wa-light',!$('dark').checked);$('values').textContent=`--wa-border-radius-scale: ${$('radius').value};\n--wa-space-scale: ${$('spacing').value};`;}
Promise.all(['wa-select','wa-switch','wa-input','wa-button'].map(x=>customElements.whenDefined(x))).then(async()=>{await Promise.all([...document.querySelectorAll('wa-select')].map(e=>e.updateComplete));for(const id of ['radius','spacing','dark'])$(id).addEventListener('change',update);$('reset').addEventListener('click',()=>{$('radius').value='1';$('spacing').value='1';$('dark').checked=false;update()});$('create').addEventListener('click',()=>{const field=$('workspace');field.setCustomValidity(field.value.trim().length<2?'Use at least two non-space characters.':'');if(!field.reportValidity())return;$('result').textContent=`Applied “${field.value.trim()}” in the ${$('region').value} specimen. No workspace or storage allocation was created.`});$('workspace').addEventListener('input',()=>$('workspace').setCustomValidity(''));update()});

Справочник по коду

  • whenDefined не позволяет читать пользовательский элемент API до его обновления.
  • Код импортирует только используемые компоненты.

Демонстрационная область с ограниченной областью действия CSS

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

css
*{box-sizing:border-box}body{margin:0;font-family:var(--wa-font-family-body);font-size:16px;line-height:var(--wa-line-height-normal);color:var(--wa-color-text-normal);background:#f5f6f8}.token-workbench{max-width:1100px;margin:auto;padding:32px}header{max-width:740px;margin-bottom:28px}h1{font-size:34px;line-height:1.15;letter-spacing:-.03em}h2{font-size:23px;line-height:1.25}.eyebrow{font-size:11px;letter-spacing:.12em;font-weight:700}.workbench-grid{display:grid;grid-template-columns:300px minmax(0,1fr);gap:24px}.controls{display:flex;flex-direction:column;gap:20px;padding:24px;background:white;border:1px solid #d9dde3;border-radius:12px}.controls h2{margin:0}.hint,footer{color:var(--wa-color-text-quiet);font-size:14px}.specimen{background:var(--wa-color-surface-default);color:var(--wa-color-text-normal);border:1px solid var(--wa-color-surface-border);border-radius:var(--wa-border-radius-l);padding:var(--wa-space-xl);display:flex;flex-direction:column;gap:var(--wa-space-l)}.specimen h2,.specimen p{margin:0}.sample-head,.sample-actions{display:flex;align-items:center;flex-wrap:wrap;gap:var(--wa-space-s)}.sample-head{justify-content:space-between}.badge{font-size:10px;letter-spacing:.09em;font-weight:700;background:var(--wa-color-brand-fill-quiet);color:var(--wa-color-brand-on-quiet);padding:4px 8px;border-radius:var(--wa-border-radius-s)}.token-readout{background:var(--wa-color-surface-lowered);padding:var(--wa-space-m);border-radius:var(--wa-border-radius-m);font:13px/1.7 var(--wa-font-family-code);white-space:pre-wrap;overflow-wrap:anywhere}#result{font-size:13px}footer{margin-top:20px}@media(max-width:700px){.token-workbench{padding:20px 16px}.workbench-grid{grid-template-columns:1fr}.controls{padding:20px}h1{font-size:28px}.specimen{padding:var(--wa-space-l)}}

Справочник по коду

  • Заголовок рабочей области и контрольная точка макета выбраны самостоятельно.

Полный документ index.html

Корневой документ Vite для предоставленных файлов main.js и таблицы стилей.

html
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Web Awesome token workbench</title></head><body><main class="token-workbench"><header><p class="eyebrow">WEB AWESOME / TOKEN WORKBENCH</p><h1>See the theme cross the component boundary.</h1><p>Change a scoped token and inspect native custom elements alongside ordinary HTML.</p></header><div class="workbench-grid"><section class="controls"><h2>Theme controls</h2><wa-select id="radius" label="Corner scale"><wa-option value="0">Square / 0</wa-option><wa-option value="1" selected>Default / 1</wa-option><wa-option value="2">Rounder / 2</wa-option></wa-select><wa-select id="spacing" label="Spacing scale"><wa-option value="0.8">Compact / 0.8</wa-option><wa-option value="1" selected>Default / 1</wa-option><wa-option value="1.25">Relaxed / 1.25</wa-option></wa-select><wa-switch id="dark">Dark appearance</wa-switch><wa-button id="reset" appearance="outlined">Restore defaults</wa-button><p class="hint">These controls change only the specimen. The editing controls keep their original dimensions.</p></section><section id="specimen" class="specimen" aria-label="Theme specimen"><div class="sample-head"><span class="badge">COMPONENT PREVIEW</span><span class="hint">Free components</span></div><h2>Your next workspace</h2><p class="hint">Form labels, field borders and actions inherit semantic tokens through the shadow boundary.</p><wa-input id="workspace" label="Workspace name" hint="Use at least two characters." value="Field notes"></wa-input><wa-select id="region" label="Storage region"><wa-option value="europe" selected>Europe</wa-option><wa-option value="america">North America</wa-option><wa-option value="asia">Asia Pacific</wa-option></wa-select><div class="sample-actions"><wa-button id="create" variant="brand">Apply name locally</wa-button><wa-button disabled>Invite later</wa-button></div><p id="result" role="status">No workspace is created by this specimen.</p><div class="token-readout"><code id="values">--wa-border-radius-scale: 1;<br>--wa-space-scale: 1;</code></div></section></div><footer>Native Web Awesome 3.14.0. The surrounding workbench is original HTML/CSS.</footer></main>
<script type="module" src="/main.js"></script></body></html>

Справочник по коду

  • Создайте проект Vite без фреймворка и используйте полные версии main.js и style.css, приведённые выше.
04

Настройка агента дизайн-системы Web Awesome

Отправная точка для реализации

Полные примеры main.js, CSS и body воспроизводят рабочую область в сборщике. Автономная демонстрация собрана с помощью esbuild, а тема CSS встроена в пакет. Провайдер React не требуется.

javascript
// Create a Vite vanilla project, then install:
// npm install @awesome.me/[email protected]
// index.html: paste the complete workbench markup in body,
// then add <script type="module" src="/main.js"></script>.
// main.js: use the complete imports and token-controls example above.
// style.css: use the complete scoped specimen CSS above.

// Minimum registration pattern used by this example:
import '@awesome.me/webawesome/dist/styles/themes/default.css';
import '@awesome.me/webawesome/dist/components/button/button.js';
import '@awesome.me/webawesome/dist/components/input/input.js';
import '@awesome.me/webawesome/dist/components/select/select.js';
import '@awesome.me/webawesome/dist/components/option/option.js';
import '@awesome.me/webawesome/dist/components/switch/switch.js';
// Do not duplicate these imports if using the complete main.js above.

Запрос для вашего проекта

Промпт для AI-агента
Используйте рабочую область с токенами Web Awesome 3.14.0 и зарегистрируйте предоставленные элементы wa-select, wa-option, wa-input, wa-button и wa-switch. Прежде чем считывать начальные значения, дождитесь определения компонентов и выполнения updateComplete. Применяйте --wa-border-radius-scale и --wa-space-scale только к демонстрационной области, а её класс wa-light/wa-dark переключайте, не изменяя остальное содержимое страницы. Синхронизируйте отображаемые значения токенов с нативными элементами управления и сохраните подписи. Используйте рабочую область для изучения компонентов, а не как интерфейс управления устройствами.
05

Источники и область действия дизайн-системы Web Awesome

Публичные компоненты Web Awesome 3.14.0 и тема по умолчанию. Макет выбран самостоятельно; локальное применение имени не создаёт рабочую область и не выделяет хранилище.