Безголовая система компонентов · Новый ресурс

Дизайн-система Oruga UI.

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

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

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

Найдите нужное в контролируемом словаре, добавьте до трёх тем, удалите метку и сохраните описание локальной заметки.

Каталог исследовательских заметокОткрыть полный пример
@oruga-ui/oruga-next 0.14.4 с @oruga-ui/theme-oruga 0.10.0 и локальными иконками MDI. · Справочник по реализации
02

Справочник по дизайну для дизайн-системы Oruga UI

Пакет Oruga для Vue 3 версии 0.14.4 с @oruga-ui/theme-oruga 0.10.0. Приведённые ниже значения относятся к этой необязательной теме по умолчанию, а не к неизменяемому ядру без оформления. Иконки MDI 7.4.47 подключаются локально. Композиция каталога и изображения папок созданы специально для этого примера.

Семантические цвета необязательной темы Oruga

Источник
Название / правилоЗначение / конфигурацияПрименение
--oruga-primary#445e00 Выбранные метки и основное действие.
--oruga-primary-invert#fffТекст на основных метках.
--oruga-success#006724 Вариант для успешного состояния.
--oruga-info#005c98 Информационный вариант.
--oruga-warning#f4c300 Предупреждающий вариант.
--oruga-danger#b60000 Вариант ошибки поля.
--oruga-control-border-color#dbdbdb Граница поля по умолчанию.

Типографика, отступы и геометрия необязательной темы

Источник
Название / правилоЗначение / конфигурацияПрименение
--oruga-font-size1remРазмер текста по умолчанию.
--oruga-line-height1.5Коэффициент высоты строки по умолчанию.
--oruga-border-radius4pxСтандартное скругление элементов управления.
--oruga-control-spacer.5emОбщие отступы элементов управления.
--oruga-control-height2.25emВысота элемента управления относительно размера шрифта.
--oruga-control-padding-verticalcalc(.375em - 1px)Вертикальный внутренний отступ с учётом границы.
--oruga-control-padding-horizontalcalc(.8em - 1px)Горизонтальный внутренний отступ с учётом границы.
--oruga-control-disabled-opacity.5Визуальное состояние отключённого элемента.
--oruga-animation-speed-fast.15sБыстрая длительность перехода.
--oruga-animation-speed.3sСтандартная длительность перехода.

Явно заданные масштабы исходного приложения

Источник
Название / правилоЗначение / конфигурацияПрименение
Font stacksystem-ui, sans-serifВнешний текст приложения; необязательная тема также использует системный стек шрифтов.
Page title34px / 1.15; 29px narrowОригинальная иерархия.
Catalog card titleGeorgia, serif; 29px / 1.25Исходный контраст редакционного оформления, а не значение по умолчанию в Oruga.
Supporting type10 / 11 / 12 / 13 / 14 / 15pxЯвно заданные подписи, определения и текст оригинального приложения.
Spacing4 / 5 / 7 / 12 / 13 / 14 / 16 / 20 / 22 / 24 / 28 / 32pxФактические значения компоновки; библиотека без готового интерфейса не задаёт масштаб сетки.
LayoutFlexible editor + 330px catalog card; stack at 760pxИсходная сетка.
Topic constraints1–3 unique existing labelsallow-new=false, allow-duplicates=false, maxitems=3.
Title constraint5–80 characters; minimum evaluated after trimПроверка приложения и нативное ограничение длины.
03

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

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

DESIGN-oruga-ui.md

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

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

Отделите поведение компонентов Oruga от необязательной темы в дизайн-системе Oruga UI

Отделите поведение компонентов Oruga от необязательной темы

Oruga предоставляет компоненты Vue, не требуя определённого фреймворка CSS. В этом примере пакет для Vue 3 сочетается с отдельной темой Oruga по умолчанию. Зелёные выбранные метки и поля с обводкой задаются этой темой, а поиск, выбор и удаление реализованы как нативное поведение компонентов.

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

Это разграничение полезно при оценке библиотеки. Команда может сохранить API компонентов и заменить настройки классов или выбрать другую поддерживаемую тему. Поэтому в справочной таблице указаны название и версия пакета темы, а зелёный основной цвет не представлен как универсальное требование для всех приложений Oruga.

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

Используйте настоящие переменные темы по умолчанию в дизайн-системе Oruga UI

Используйте настоящие переменные темы по умолчанию

Установленная необязательная тема задаёт --oruga-primary как #445e00, а --oruga-primary-invert — как white. Для цвета ошибки используется #b60000, а границы элементов управления имеют цвет #dbdbdb. Свойство варианта компонента выбирает соответствующую семантическую группу, поэтому для каждого поля или метки не нужно задавать отдельное правило CSS.

Эта же тема задаёт стандартный радиус в четыре пикселя, высоту элемента управления 2.25em и формулы отступов с вычитанием границы толщиной в один пиксель. Поскольку эти значения зависят от размера текста элемента управления, изменение масштаба шрифта влияет на геометрию. Промежуток темы в половину em описывает взаимосвязь компонентов, а не наличие полной шкалы отступов для макета страницы.

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

Самостоятельно задайте компоновку, которую Oruga намеренно не навязывает, в дизайн-системе Oruga UI

Самостоятельно задайте компоновку, которую Oruga намеренно не навязывает

В каталоге используется гибкая колонка редактора и колонка карточки шириной 330px; ниже 760px они располагаются друг под другом. Для заголовка страницы выбран системный шрифт без засечек, а для заголовка карточки — Georgia, чтобы придать записи редакционный характер. Оба решения — авторские; внешние файлы шрифтов не нужны.

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

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

Храните выбранные значения отдельно от поискового запроса в дизайн-системе Oruga UI

Храните выбранные значения отдельно от поискового запроса

OTaginput связывает массив выбранных тем через v-model. Внутренний текст автодополнения фильтрует названия доступных вариантов, не заменяя этот массив. Словарь включает шесть оригинальных тем с конкретными определениями, а на карточке отображаются определения только выбранных тем.

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

  1. Найдите Color и выберите соответствующий вариант.
  2. Добавьте Forms, чтобы вместе с Navigation выбрать три темы.
  3. Удалите метку, убедитесь, что карточка обновилась, и выберите замену перед сохранением.

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

Независимо задавайте словарь, дубликаты и количество элементов в дизайн-системе Oruga UI

Независимо задавайте словарь, дубликаты и количество элементов

allow-new=false запрещает превращать произвольный введённый текст в метку. allow-duplicates=false не позволяет добавить одну и ту же существующую метку дважды. maxitems=3 ограничивает общее количество выбранных элементов и показывает счётчик. Каждая настройка отвечает за отдельный аспект контролируемого словаря.

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

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

Используйте OField для подписей и конкретных сообщений валидации в дизайн-системе Oruga UI

Используйте OField для подписей и конкретных сообщений валидации

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

Встроенный список раскрывающихся вариантов для ввода тегов использует шаблон combobox/listbox. В этой версии роль combobox назначена обёртке, а поле для ввода текста находится внутри неё. Поэтому тест QA заполняет именно поле Search topics, а не предполагает, что элемент с ролью combobox сам является полем ввода.

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

Дизайн-система Oruga UI: стандартному набору иконок всё ещё нужен файл шрифта

Для набора иконок по умолчанию всё равно нужен файл шрифта

Для управления удалением тегов используется набор иконок MDI по умолчанию в Oruga. Подключение темы компонента не загружает этот шрифт автоматически, поэтому полная конфигурация включает @mdi/font. В автономном предпросмотре используется локальный файл WOFF2 и необходимые правила для иконок, благодаря чему не требуется загрузка шрифта из удалённого источника.

Для удаления используется настоящая кнопка с доступной меткой Remove topic. Декоративная иллюстрация папки не относится к этим элементам управления, поэтому она скрыта от вспомогательных технологий. Это не позволяет принять декоративный значок за интерактивный элемент.

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

Дизайн-система Oruga UI: сбрасывайте сохранённый снимок при изменении исходных данных

Сбрасывайте сохранённый снимок при изменении исходных данных

Действие Save сохраняет предложение с обрезанным заголовком и количеством выбранных тем. Наблюдатель отслеживает заголовок и массив тем с глубокой проверкой; поэтому удаление элемента сбрасывает подтверждение так же, как и изменение заголовка. Кнопка Save отключена только тогда, когда текущий снимок сохранён.

Команда Clear note сбрасывает заголовок, все выбранные темы, состояние проверки и сохранённый статус. На карточке снова отображаются Untitled research note и No topics selected. Пользователь может пройти весь цикл от пустой заметки до редактирования и сохранения без скрытых за кнопкой операций с сервером, загрузкой или публикацией.

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

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

Дизайн-система Oruga UI: подключайте компоненты явно с актуальной моделью регистрации Oruga

Импортируйте компоненты явно, используя актуальный способ регистрации Oruga

Проверенная конфигурация 0.14.4 создаёт экземпляр Oruga и устанавливает его в приложении Vue. В App.vue компоненты OField, OInput, OTaginput, OTag и OButton импортируются явно. Это соответствует актуальной модели регистрации; использование старых примеров, в которых предполагалась глобальная регистрация всех компонентов, может привести к неполной конфигурации приложения.

В README темы указано, что стандартная тема использует существующие имена классов Oruga и требует подключения таблицы стилей, но не дополнительного объекта конфигурации темы. Точка входа последовательно импортирует эту таблицу стилей, ресурс MDI и исходную компоновку. Все необходимые части есть в приведённых выше полных примерах исходного кода и ниже, в корне Vite.

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

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

Полный SFC каталога тем

OTaginput, OField, OInput, OTag и OButton связывают ограниченный словарь с динамически обновляемой карточкой каталога.

vue
<script setup>
import {ref,computed,watch} from 'vue';
import {OField,OInput,OTaginput,OButton,OTag} from '@oruga-ui/oruga-next';
const title=ref('Finding a calmer navigation'),topics=ref(['Navigation']),attempted=ref(false),saved=ref('');
const definitions={'Navigation':'Menus, wayfinding and the path through a product.','Typography':'Type hierarchy, reading rhythm and legibility.','Color':'Semantic roles, contrast and theme behavior.','Forms':'Input labels, validation and correction.','Motion':'Transitions, reduced motion and continuity.','Accessibility':'Keyboard flow, semantics and assistive technology.'};
const options=Object.keys(definitions),valid=computed(()=>title.value.trim().length>=5&&topics.value.length>=1&&topics.value.length<=3);
watch([title,topics],()=>saved.value='',{deep:true});
function save(){attempted.value=true;if(valid.value)saved.value=`Saved locally: “${title.value.trim()}” with ${topics.value.length} ${topics.value.length===1?'topic':'topics'}.`}
function reset(){title.value='';topics.value=[];attempted.value=false;saved.value=''}
</script>
<template><main class="catalog-shell"><header><p class="eyebrow">RESEARCH CATALOG · LABEL A NOTE</p><h1>Give the next reader a useful starting point.</h1><p>Name a research note and choose up to three topics from a controlled vocabulary.</p></header><div class="catalog-layout"><section class="editor"><h2>Note details</h2><OField label="Note title" :variant="attempted&&title.trim().length<5?'danger':undefined" :message="attempted&&title.trim().length<5?'Use at least five meaningful characters.':undefined"><OInput v-model="title" maxlength="80" expanded placeholder="What did you learn?"/></OField><OField label="Topics" :variant="attempted&&!topics.length?'danger':undefined" :message="attempted&&!topics.length?'Choose at least one topic.':'Choose 1–3 existing topics; duplicate and new labels are not added.'"><OTaginput v-model="topics" :options="options" :allow-new="false" :allow-duplicates="false" :maxitems="3" open-on-focus :keep-open="false" expanded variant="primary" placeholder="Search topics" aria-close-label="Remove topic"><template #empty>No matching topic. Try Color, Forms or Motion.</template></OTaginput></OField><div class="actions"><OButton variant="primary" @click="save" :disabled="!!saved">Save local note</OButton><OButton @click="reset">Clear note</OButton></div><p role="status" class="result">{{saved||'The preview keeps only local page state.'}}</p><h3>Vocabulary guide</h3><dl class="vocabulary"><div v-for="(meaning,name) in definitions" :key="name"><dt>{{name}}</dt><dd>{{meaning}}</dd></div></dl></section><aside class="note-card"><div class="folder-art" aria-hidden="true"><i></i><b></b><span></span></div><p class="eyebrow">CATALOG CARD PREVIEW</p><h2>{{title.trim()||'Untitled research note'}}</h2><div class="topic-tags"><OTag v-for="topic in topics" :key="topic" variant="primary">{{topic}}</OTag><span v-if="!topics.length" class="empty-topics">No topics selected</span></div><p class="card-label">This note will appear under</p><ul><li v-for="topic in topics" :key="topic"><strong>{{topic}}</strong><span>{{definitions[topic]}}</span></li></ul><p class="card-foot">Original sample note · no upload or publishing</p></aside></div></main></template>

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

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

Полная исходная компоновка каталога

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

css
html,body,#app{height:auto;min-height:0;margin:0}*{box-sizing:border-box}body{font-family:system-ui,sans-serif;background:#f4f4ed;color:#34392b}.catalog-shell{max-width:1100px;margin:auto;padding:32px}.eyebrow{font-size:10px;letter-spacing:.14em;font-weight:700;color:#6e775f}h1{font-size:34px;line-height:1.15;max-width:700px;margin:12px 0}header>p:last-child{font-size:15px;line-height:1.6;color:#727965;max-width:630px}.catalog-layout{display:grid;grid-template-columns:minmax(0,1fr) 330px;gap:24px;margin-top:28px}.editor,.note-card{background:white;border:1px solid #dfe3d4;border-radius:14px;padding:24px;min-width:0}.editor>h2{font-size:20px;margin:0 0 24px}.editor .o-field{margin-bottom:22px}.editor .o-field__message{font-size:12px;line-height:1.6}.actions{display:flex;gap:12px;flex-wrap:wrap}.result{font-size:12px;line-height:1.6;color:#596d2e;margin:16px 0 28px}.editor h3{font-size:14px}.vocabulary{margin:0}.vocabulary>div{padding:12px 0;border-bottom:1px solid #eaede3}.vocabulary dt{font-size:13px;font-weight:650}.vocabulary dd{font-size:12px;line-height:1.6;margin:4px 0 0;color:#707763}.note-card{align-self:start;background:#fcfcf5}.note-card h2{font-family:Georgia,serif;font-size:29px;line-height:1.25;font-weight:400;overflow-wrap:anywhere}.folder-art{height:145px;background:#e3e8cf;border-radius:8px;position:relative;overflow:hidden;margin-bottom:24px}.folder-art i{position:absolute;left:15%;top:40px;width:70%;height:100px;border-radius:7px;background:#7e8e52;transform:rotate(-8deg)}.folder-art b{position:absolute;left:21%;top:24px;width:60%;height:115px;background:#fffef5;transform:rotate(5deg);border-radius:4px}.folder-art span{position:absolute;left:16%;top:71px;width:70%;height:80px;background:#a6b57a;border-radius:7px}.topic-tags{display:flex;gap:7px;flex-wrap:wrap}.card-label{font-size:11px;color:#737b65;margin-top:24px}.note-card ul{list-style:none;padding:0}.note-card li{border-top:1px solid #e0e4d6;padding:13px 0}.note-card li strong{font-size:13px;display:block}.note-card li span{font-size:12px;color:#6c765b;line-height:1.6;display:block;margin-top:5px}.card-foot{font-size:10px;line-height:1.6;color:#7c846e;margin-top:20px}.empty-topics{font-size:12px;color:#7c846e}.o-taginput{max-width:100%}.o-taginput__container{min-width:0}.o-taginput .o-input{min-width:0}@media(max-width:760px){.catalog-layout{grid-template-columns:minmax(0,1fr)}.catalog-shell{padding:20px}h1{font-size:29px}}@media(max-width:360px){.catalog-shell{padding:14px}.editor,.note-card{padding:16px}.actions>*{width:100%}}
.o-taginput__counter{white-space:nowrap;flex-shrink:0}

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

  • Oruga не предоставляет обязательную систему сеток; эта компоновка явно задана в приложении CSS.
  • Текст счётчика остаётся в одну строку даже при узкой ширине.
04

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

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

Проверенные версии: Oruga 0.14.4, необязательная стандартная тема 0.10.0 и MDI 7.4.47. Компоненты импортируются явно; стандартной теме не требуется дополнительная конфигурация темы JavaScript.

javascript
// npm create vite@latest oruga-catalog -- --template vue
// cd oruga-catalog && npm install
// npm install @oruga-ui/[email protected] @oruga-ui/[email protected] @mdi/[email protected]
// Save the complete examples as src/App.vue and src/style.css.
// src/main.js:
import {createApp} from 'vue';
import {createOruga} from '@oruga-ui/oruga-next';
import '@oruga-ui/theme-oruga/style.css';
import '@mdi/font/css/materialdesignicons.css';
import './style.css';
import App from './App.vue';
createApp(App).use(createOruga()).mount('#app');
// index.html: <div id="app"></div><script type="module" src="/src/main.js"></script>
// npm run dev

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

Промпт для AI-агента
Начните с каталога исследовательских заметок на Oruga 0.14.4 и темы 0.10.0. Сохраните управляемый выбор OTaginput из словаря из шести тем, поиск без учёта регистра, запрет на добавление новых и повторяющихся тегов и ограничение в три тега. Свяжите определения тем и проверку заголовка с сохранённым снимком; при изменениях сбрасывайте подтверждение сохранения. Включите настройку createOruga, темы CSS и локального ресурса MDI. Сброс выполняйте до пустого черновика; не придумывайте данные для сравнения продуктов или обновление удалённого каталога.
05

Дизайн-система Oruga UI: источники и область применения

Oruga 0.14.4 и необязательная стандартная тема 0.10.0. Оригинальный словарь и иллюстрация каталога. Сохранение изменяет только локальное состояние страницы, без загрузки, публикации и сохранения после перезагрузки.