Кроссплатформенный и мобильный интерфейс · Новый ресурс

Дизайн-система Ionic Framework.

Нативный интерфейс Ionic для настройки чтения с проверенными цветовыми ролями, геометрией диапазонов iOS и Material, настоящим поведением сегментов и переключателей и статьёй, которая реагирует на выбор шрифта, размера и фона.

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

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

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

Настройки чтенияОткрыть полный пример
Ionic Vue/Core 9.0.6, Vue 3, режим iOS задан явно. Нативные веб-компоненты включены локально. · Справочник по реализации
02

Справочник по дизайн-системе Ionic Framework

Проверены Ionic Vue/Core 9.0.6. Основные цвета взяты из установленного core.css. В демонстрации явно выбран режим iOS. Типографика для чтения, цвета бумаги и окружающие отступы — авторские решения приложения, а не значения по умолчанию Ionic.

Стандартные семантические роли светлой темы

Источник
Название / правилоЗначение / конфигурацияПрименение
--ion-color-primary#0054e9 Нативные основные элементы управления.
--ion-color-primary-rgb0, 84, 233Каналы RGB для расчётов с прозрачностью.
--ion-color-primary-contrast#fffКонтраст текста и значков на основном цвете.
--ion-color-primary-shade#004acd Затемнённый вариант основного цвета.
--ion-color-primary-tint#1a65eb Осветлённый вариант основного цвета.
--ion-color-secondary#0163aa Вторичная роль.
--ion-color-tertiary#6030ff Роль третичного цвета.
--ion-color-success#2dd55b Роль успешного состояния.
--ion-color-warning#ffc409 Роль предупреждения.
--ion-color-danger#c5000f Роль опасности.

Геометрия нативного диапазона по режимам

Источник
Название / правилоЗначение / конфигурацияПрименение
iOS --bar-height4pxСкомпилированное значение диапазона по умолчанию для iOS.
iOS --knob-size26pxСкомпилированный размер ползунка для iOS.
MD --bar-height2pxСкомпилированное значение по умолчанию для режима Material Design.
MD --knob-size18pxСкомпилированный размер ползунка для Material Design.
Application min / max / step16 / 26 / 1Целочисленный размер шрифта для чтения; фактические свойства диапазона.
snaps / ticks / pintrue / true / trueВидимые деления и форматированное отображение размера.

Авторские шкалы для чтения и структуры страницы

Источник
Название / правилоЗначение / конфигурацияПрименение
Reading fontGeorgia, serif OR system-ui, sans-serifУправляется нативным сегментом; используются шрифты, уже установленные на устройстве.
Reading size16–26px; default 18pxНепосредственно применяется к статье.
Reading line-height1.65Авторская удобная ширина текстовой колонки.
Article heading1.9em / 1.15; 1.6em below 360pxМасштабируется в соответствии с выбранным читателем размером основного текста.
Control/body fontsystem-ui, sans-serifЯвно заданный выбор шрифта приложения.
Spacing10 / 12 / 14 / 16 / 20 / 22 / 24 / 28 / 32pxКонкретные значения авторской таблицы стилей, а не заявленная шкала Ionic.
Layout300px settings + flexible article; stack at 760pxДля обоих столбцов задано min-width:0.
Paper roles#fff9eb warm; #ffffff white; #24362e inkАвторские цвета содержимого, отдельно от ролей нативных элементов управления.
Card radius16pxАвторская геометрия окружающей панели.
03

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

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

DESIGN-ionic.md

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

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

Дизайн-система Ionic Framework — обдуманный выбор режима отображения

Обдуманно выбирайте режим отображения

Ionic предоставляет веб-компоненты через интеграции с фреймворками. В этом примере используются Ionic Vue 9.0.6, а в конфигурации IonicVue задан режим ios. Благодаря этому сегмент, переключатель, диапазон и кнопки оформлены согласованно с выбранной платформой независимо от того, в каком настольном браузере открыта страница. Режим определяет способ отображения компонентов; он не превращает страницу в нативное мобильное приложение.

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

В примере намеренно используется обычный элемент main вместо полноэкранной оболочки IonApp/IonContent. Так демонстрационный компонент занимает нужное ему место во встроенном ресурсе. В настоящем маршрутизируемом приложении Ionic следует придерживаться структуры страниц и маршрутизатора фреймворка, включая IonPage там, где он нужен для переходов.

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

Дизайн-система Ionic Framework — цвета Ionic образуют семейство связанных переменных

Цвета Ionic образуют семейство связанных переменных

Установленная основная таблица стилей задаёт для primary цвет #0054e9, а также отдельные значения каналов RGB, контраста, оттенения и высветления. Компоненты могут использовать эти связанные значения в разных состояниях. Если заменить только базовый шестнадцатеричный цвет, остальные состояния могут перестать ему соответствовать; для пользовательского фирменного цвета следует задать всё семейство.

В этом примере для нативных элементов управления сохранён цвет primary по умолчанию. Тёплая бумага — отдельная поверхность приложения с цветом #fff9eb, а текст статьи остаётся цвета #24362e. Переключение страницы на белый фон меняет только поверхность для чтения. Палитра элементов управления при этом не изменяется и полная тёмная палитра Ionic не имитируется.

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

Дизайн-система Ionic Framework — сделайте выбор шрифта для чтения заметным

Сделайте выбор шрифта для чтения заметным

Сегмент переключает шрифт статьи между Georgia и system-ui. Для самих элементов управления остаётся system-ui, чтобы настройка меняла именно текст для чтения, не влияя неожиданным образом на подписи и размеры элементов управления. Внешние шрифты не загружаются: пример использует соответствующие локальные стеки шрифтов.

Размер текста — целое число от шестнадцати до двадцати шести пикселей. Заголовок статьи масштабируется пропорционально, а высота строки остаётся равной 1.65. При ширине менее 360px соотношение размера заголовка уменьшается до 1.6em, поэтому даже максимальный размер остаётся читаемым в узкой встроенной колонке. Это авторские значения приложения, отдельно от значений компонентов Ionic по умолчанию.

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

Дизайн-система Ionic Framework — сегмент с управляемым выбором и нативной семантикой

Сегмент с управляемым выбором и нативной семантикой

IonSegment получает текущее значение шрифта и два дочерних элемента IonSegmentButton. Событие ionChange обновляет модель на основе event.detail.value. Каждой кнопке присвоено своё постоянное значение — serif или sans, а видимая подпись поясняет выбор. Абзац связывает подпись со всем элементом управления с помощью aria-labelledby.

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

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

Дизайн-система Ionic Framework — используйте события диапазона и ограничения как единый контракт

Используйте события диапазона и ограничения как единый контракт

Для IonRange явно заданы min, max и step: диапазон по умолчанию от нуля до ста не подходит для выбора удобного размера текста. Фиксированные шаги и деления показывают доступные значения, а форматтер pin добавляет к отображаемому при взаимодействии значению px. Постоянная подпись с размером под элементом управления остаётся читаемой и после завершения перетаскивания.

Обработчик использует ionChange и преобразует значение в число. Это подходит для одного ползунка; диапазон с двумя ползунками возвращает значение другой формы и требует отдельной обработки. В скомпилированном диапазоне для iOS используется ползунок размером двадцать шесть пикселей и полоса шириной четыре пикселя, а для Material — восемнадцать и два соответственно. Эти различия зафиксированы, а не сведены к вымышленному универсальному токену Ionic.

  1. Установите фокус на ползунок «Размер текста» и нажмите клавишу Right Arrow восемь раз, чтобы установить значение 26px.
  2. Выберите Sans и отключите переключатель «Тёплая бумага».
  3. Сохраните настройки и проверьте точное значение снимка: шрифт, размер и цвет бумаги.

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

Дизайн-система Ionic Framework: выбор варианта бумаги должен сразу менять поверхность

Переключатель цвета бумаги должен сразу менять интерфейс

IonToggle получает значение checked из модели warm. Событие передаёт detail.checked, которое напрямую присваивается этому логическому состоянию. Видимая надпись «Тёплая бумага» относится к встроенному переключателю, а пояснение рядом сообщает, что он меняет поверхность статьи.

Класс warm меняет фон статьи, не убирая рамку и не изменяя текст эссе. Благодаря этому сравнение остаётся наглядным. Это также позволяет не смешивать настройку оттенка бумаги с системным режимом светлой или тёмной темы, для которого пришлось бы согласованно менять гораздо больше переменных поверхностей и текста Ionic.

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

Дизайн-система Ionic Framework: отделяйте применённые настройки от сохранённого снимка

Разделяйте применённые настройки и сохранённый снимок

Каждая настройка сразу применяется к статье. Кнопка «Сохранить настройки» сохраняет читаемый снимок в локальном реактивном состоянии и отключается, пока этот снимок актуален. Наблюдатель за всеми тремя моделями сбрасывает сообщение после любого изменения, чтобы устаревшее подтверждение не относилось к новой комбинации настроек.

Кнопка «Восстановить значения по умолчанию» задаёт шрифт с засечками, размер 18 пикселей и тёплую бумагу, а затем сбрасывает сообщение о сохранении. Статус явно сообщает, что настройки применяются только в этом предпросмотре. Действие не использует localStorage, настройки учётной записи или нативный плагин предпочтений; после перезагрузки возвращаются значения по умолчанию.

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

Дизайн-система Ionic Framework: сохраняйте нативные элементы управления в Shadow DOM, оформляя композицию

Сохраняйте нативные элементы управления в Shadow DOM, оформляя композицию

У ползунка есть видимая подпись «Размер текста», переключатель содержит собственную текстовую подпись, а сегмент подписан «Гарнитура». Исходная иллюстрация скрыта от средств доступности с помощью aria-hidden. Для подтверждения сохранения используется role=status, а статья остаётся обычным семантическим элементом HTML: её заголовок и абзацы доступны при стандартной навигации по документу.

Компоненты Ionic инкапсулируют внутреннюю разметку в Shadow DOM. В примере используются общедоступные свойства, события и документированные CSS пользовательские свойства вместо обращения к закрытым внутренним классам. Для внешней страницы задана высота по содержимому и нулевая минимальная ширина; проверка при 280px выявляет проблемы с шириной встроенного компонента, которые могут остаться незаметными на отдельном снимке экрана телефона.

  • Сохраняйте связи с подписями на нативных компонентах.
  • Используйте общедоступные свойства и события, не меняя внутреннюю структуру Shadow DOM.
  • Проверьте одновременное изменение размера текста и обновление статьи.

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

Дизайн-система Ionic Framework: установите интеграцию с Vue и подключите базовые CSS

Установите интеграцию Vue и подключите Ionic Core CSS

Полный пример входной точки регистрирует IonicVue и импортирует @ionic/vue/css/core.css перед исходной таблицей стилей. Установленный пакет Vue также разрешает vue-router, поэтому в воспроизводимую команду установки зависимостей включён vue-router, хотя в этом встроенном примере навигация не настраивается. Без этой peer-зависимости локальная сборка не могла разрешить модуль.

В двух полных примерах приведены App.vue и style.css. Стандартный проект Vue на Vite компилирует SFC и импорты нативных компонентов. Отдельный предпросмотр ресурсов локально собирает итоговые JavaScript и CSS, включая реализации компонентов, поэтому для изменения элементов управления не нужен внешний запрос к CDN.

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

Дизайн-система Ionic Framework Примеры компонентов

Полный SFC с настройками чтения

Нативные IonSegment, IonRange, IonToggle и IonButton управляют оригинальным коротким эссе.

vue
<script setup>
import {ref,computed,watch} from 'vue';
import {IonSegment,IonSegmentButton,IonLabel,IonRange,IonToggle,IonButton,IonChip} from '@ionic/vue';
const face=ref('serif'),size=ref(18),warm=ref(true),saved=ref('');
const family=computed(()=>face.value==='serif'?'Georgia, serif':'system-ui, sans-serif');
watch([face,size,warm],()=>saved.value='');
function save(){saved.value=`Saved locally: ${face.value}, ${size.value}px, ${warm.value?'warm':'white'} paper.`}
function reset(){face.value='serif';size.value=18;warm.value=true;saved.value=''}
</script>
<template>
<main class="reader-shell">
<header><p class="eyebrow">A QUIETER READING SPACE</p><h1>Make room for the words.</h1><p>Adjust this short essay to your reading preferences. The sample changes as you move the controls.</p></header>
<div class="reader-layout"><section class="preferences" aria-labelledby="preferences-title"><h2 id="preferences-title">Reading settings</h2><p class="label" id="face-label">Typeface</p>
<IonSegment :value="face" @ionChange="face=$event.detail.value" aria-labelledby="face-label"><IonSegmentButton value="serif"><IonLabel>Serif</IonLabel></IonSegmentButton><IonSegmentButton value="sans"><IonLabel>Sans</IonLabel></IonSegmentButton></IonSegment>
<IonRange :value="size" @ionChange="size=Number($event.detail.value)" :min="16" :max="26" :step="1" :snaps="true" :ticks="true" :pin="true" label="Text size" label-placement="stacked" :pin-formatter="v=>`${v}px`"/><p class="scale"><span>16px</span><strong>{{size}}px</strong><span>26px</span></p>
<div class="paper-toggle"><IonToggle :checked="warm" @ionChange="warm=$event.detail.checked" justify="space-between">Warm paper</IonToggle><p>Soft ivory or a white page. The controls keep their own contrast.</p></div>
<IonButton expand="block" @click="save" :disabled="!!saved">Save preferences</IonButton><IonButton expand="block" fill="clear" @click="reset">Restore defaults</IonButton><p class="save-result" role="status">{{saved||'Preferences apply to this preview only.'}}</p></section>
<article class="reading-paper" :class="{warm}" :style="{fontFamily:family,fontSize:size+'px'}"><div class="paper-art" aria-hidden="true"><span></span><i></i><b></b></div><p class="article-kicker">FIELD NOTES · 03</p><h2>The useful pause</h2><p>There is a small garden between the library and the river. Its benches face away from the busiest path, toward a row of young trees.</p><p>On an ordinary afternoon, the place asks very little. You can read a paragraph twice, let a conversation settle, or watch the shadow of a leaf move across the page.</p><p>Good reading spaces leave that choice with the reader. A comfortable line, a familiar letterform, and a little breathing room can make a page easier to return to.</p><footer><IonChip outline>Original sample essay</IonChip><span>{{size}}px · {{face==='serif'?'Georgia':'System sans'}} · 1.65 line height</span></footer></article></div>
</main>
</template>

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

  • Значение диапазона применяется через ionChange; e.detail.value преобразуется в число.
  • Любое изменение настройки сбрасывает сохранённый снимок.
  • Сохранение использует локальное реактивное состояние, а не память устройства и не запрос к серверу.

Полная исходная таблица стилей макета

Встраивание с высотой по содержимому, узкая компоновка со стеками элементов и типографика, выбранная читателем, без обращения к корневым элементам Shadow DOM компонентов.

css
html,body,#app{height:auto;min-height:0;margin:0}*{box-sizing:border-box}body{font-family:system-ui,sans-serif;color:#24362e;background:#f2f5f3}.reader-shell{max-width:1120px;margin:auto;padding:32px}.eyebrow{font-size:11px;letter-spacing:.14em;font-weight:700;color:#52695c}h1{font-size:34px;line-height:1.15;max-width:660px;margin:12px 0}header>p:last-child{font-size:15px;line-height:1.6;max-width:660px;color:#56675e}.reader-layout{display:grid;grid-template-columns:300px minmax(0,1fr);gap:24px;margin-top:28px}.preferences{background:white;border:1px solid #dbe3de;border-radius:16px;padding:22px;align-self:start;min-width:0}.preferences h2{font-size:19px;margin:0 0 22px}.label{font-size:14px;font-weight:600;margin-bottom:10px}ion-segment{margin-bottom:20px}ion-range{padding:12px 0 0;--bar-height:4px}.scale{display:flex;justify-content:space-between;font-size:12px;color:#52695c;margin:0 0 24px}.paper-toggle{border-top:1px solid #e4e9e6;padding-top:20px;margin-bottom:20px}.paper-toggle ion-toggle{width:100%;font-size:14px}.paper-toggle p{font-size:12px;line-height:1.6;color:#5a6b61}.save-result{font-size:12px;line-height:1.6;color:#46614f;min-height:38px}.reading-paper{background:white;border:1px solid #dce3dd;border-radius:16px;padding:28px;line-height:1.65;min-width:0;overflow-wrap:anywhere;transition:background .2s}.reading-paper.warm{background:#fff9eb}.reading-paper h2{font-size:1.9em;line-height:1.15;margin:14px 0 24px;font-weight:400}.reading-paper p{margin:0 0 1.2em}.article-kicker{font-family:system-ui,sans-serif;font-size:10px;letter-spacing:.15em}.paper-art{height:112px;background:#dce8d9;border-radius:8px;position:relative;overflow:hidden;margin-bottom:24px}.paper-art span{position:absolute;width:150px;height:150px;background:#a4baa2;border-radius:50%;right:15%;top:35px}.paper-art i{position:absolute;width:130px;height:70px;background:#f3e0a8;border-radius:50% 50% 0 0;right:25%;top:48px}.paper-art b{position:absolute;width:60px;height:130px;transform:rotate(24deg);background:#64816b;left:15%;top:38px;border-radius:50% 50% 0 0}.reading-paper footer{font:11px/1.6 system-ui,sans-serif;border-top:1px solid #deded3;padding-top:18px;display:flex;gap:12px;flex-wrap:wrap;align-items:center}.reading-paper ion-chip{font-size:11px;margin:0}@media(max-width:760px){.reader-shell{padding:20px}.reader-layout{grid-template-columns:minmax(0,1fr)}h1{font-size:29px}}@media(max-width:360px){.reader-shell{padding:14px}.preferences,.reading-paper{padding:16px}.reader-layout{gap:18px}.reading-paper h2{font-size:1.6em}}

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

  • В ползунке используется документированное пользовательское свойство --bar-height.
  • Все иллюстрации к тексту созданы специально для этого примера CSS и помечены как декоративные.
04

Дизайн-система Ionic Framework Настройка агента

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

Проверено на Ionic Vue/Core 9.0.6. Полный SFC и таблица стилей приведены выше; vue-router установлен как зависимость интеграции, хотя в предпросмотре нет страниц с маршрутизацией.

javascript
// Start with: npm create vite@latest ionic-reader -- --template vue
// cd ionic-reader && npm install
// npm install @ionic/[email protected] @ionic/[email protected] vue-router@4
// Save the complete examples as src/App.vue and src/style.css.
// src/main.js:
import {createApp} from 'vue';
import {IonicVue} from '@ionic/vue';
import '@ionic/vue/css/core.css';
import './style.css';
import App from './App.vue';
createApp(App).use(IonicVue, {mode:'ios'}).mount('#app');
// The Vite index.html must contain:
// <div id="app"></div><script type="module" src="/src/main.js"></script>
// Run: npm run dev

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

Промпт для AI-агента
Используйте Ionic Vue/Core 9.0.6 в явном режиме iOS, чтобы собрать предоставленный пример настроек чтения. Свяжите нативные Segment для выбора шрифта, Range для размера текста, Toggle для оформления бумаги и действия Button с фактическими стилями статьи. Сохраните диапазон 16–26px и отражайте изменения в локальном снимке настроек. Добавьте настройку IonicVue и необходимые CSS и peer-зависимость vue-router; сохраните композицию с высотой по содержимому, не добавляя внутрь встроенного компонента полноэкранную оболочку. Загрузка данных для проверки и удалённое изменение учётной записи не выполняются.
05

Ionic Framework Источники и область применения дизайн-системы

Ionic Vue/Core 9.0.6, режим iOS. Оригинальные эссе, иллюстрации, шкала размера текста и цвета тёплой бумаги. Сохранение выполняется в локальном реактивном состоянии и не переживает перезагрузку. Этот встроенный пример компонента не является полноценным приложением Ionic с маршрутизацией или поддержкой нативного устройства.