diff --git a/composer.lock b/composer.lock index bce89464d..a5ee071a7 100644 --- a/composer.lock +++ b/composer.lock @@ -1570,16 +1570,16 @@ }, { "name": "simai/docara", - "version": "v3.13.0", + "version": "v3.14.1", "source": { "type": "git", "url": "https://github.com/simai/docara.git", - "reference": "c3b066cd1bdc3a86ae07e3032750c4c3961a5353" + "reference": "5dff9b704c05c25bcce4d57365acfaa23d4ed664" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simai/docara/zipball/c3b066cd1bdc3a86ae07e3032750c4c3961a5353", - "reference": "c3b066cd1bdc3a86ae07e3032750c4c3961a5353", + "url": "https://api.github.com/repos/simai/docara/zipball/5dff9b704c05c25bcce4d57365acfaa23d4ed664", + "reference": "5dff9b704c05c25bcce4d57365acfaa23d4ed664", "shasum": "" }, "require": { @@ -1637,7 +1637,7 @@ "security": "https://github.com/simai/docara/security/policy", "source": "https://github.com/simai/docara" }, - "time": "2026-11-07T19:04:07+00:00" + "time": "2026-11-10T13:26:32+00:00" }, { "name": "symfony/clock", diff --git a/config/catalog-groups.json b/config/catalog-groups.json index 623950d44..af73b340c 100644 --- a/config/catalog-groups.json +++ b/config/catalog-groups.json @@ -23,7 +23,6 @@ "switch", "quantity", "range-slider", - "slider", "datepicker", "country-code", "file-upload", @@ -87,7 +86,8 @@ "modal", "tooltip", "carousel", - "swiper" + "swiper", + "slider" ] }, "tools": { @@ -131,7 +131,6 @@ "radio", "input-choice", "switch", - "slider", "range-slider", "datepicker", "country-code", @@ -196,7 +195,8 @@ "gallery", "file-preview", "reference-link", - "include" + "include", + "slider" ] }, "overlays": { diff --git a/config/catalogue-group-leads.json b/config/catalogue-group-leads.json new file mode 100644 index 000000000..21cbd52c4 --- /dev/null +++ b/config/catalogue-group-leads.json @@ -0,0 +1,45 @@ +{ + "schema": "ui-doc.catalogue-group-leads.v1", + "groups": { + "smart/forms": { + "description": "Поля и элементы выбора для форм: что взять для текста, числа, выбора из вариантов, даты, телефона и файлов.", + "list_heading": "Все компоненты раздела", + "body": "Поле формы принимает значение от человека и отправляет его с формой. Выберите поле по тому, что человек вводит или выбирает.\n\n| Что нужно от человека | Что брать |\n|:---|:---|\n| Строка текста: имя, почта, пароль, адрес сайта | [Текстовое поле](/ru/smart/forms/inputs/) |\n| Текст в несколько строк: комментарий, описание | [Многострочное поле](/ru/smart/forms/textarea/) |\n| Текст с заголовками, списками и ссылками | [Форматированный текст](/ru/smart/forms/rich-text/) |\n| Небольшое число, которое меняют по шагу | [Количество](/ru/smart/forms/quantity/) |\n| Число или две границы на шкале с пределами | [Слайдер диапазона](/ru/smart/forms/range-slider/) |\n| Один вариант из нескольких видимых | [Радиокнопки](/ru/smart/forms/radio/), с пояснением и иконкой — [Выбор карточками](/ru/smart/forms/input-choice/) |\n| Несколько независимых отметок | [Флажок](/ru/smart/forms/checkbox/) |\n| Включить или выключить настройку сразу | [Переключатель](/ru/smart/forms/switch/) |\n| Человек или объект из длинного списка | [Выбор из поиска](/ru/smart/forms/lookup/) |\n| Дата, время или период | [Календарь](/ru/smart/forms/datepicker/) |\n| Телефон с кодом страны | [Код страны](/ru/smart/forms/country-code/) |\n| Одноразовый код из сообщения | [Код подтверждения](/ru/smart/forms/code-input/) |\n| Цвет | [Цвет](/ru/smart/forms/color/) |\n| Файлы или одно изображение | [Загрузка файлов](/ru/smart/forms/file-upload/), [Поле изображения](/ru/smart/forms/image-field/) |" + }, + "components/actions": { + "description": "Кнопки и действия на классах: что взять для главного действия, действия без подписи, закрытия, копирования и скачивания.", + "list_heading": "Все компоненты раздела", + "body": "Действие запускает что-то по нажатию. Выберите компонент по тому, как действие выглядит и где стоит.\n\n| Задача | Что брать |\n|:---|:---|\n| Действие с подписью: «Сохранить», «Отмена» | [Кнопки](/ru/components/actions/buttons/) |\n| Несколько связанных действий одной строкой | [Группа кнопок](/ru/components/actions/button-group/) |\n| Действие значком без подписи: панель, строка таблицы | [Кнопки с иконкой](/ru/components/actions/icon-buttons/) |\n| Одно главное действие поверх содержимого | [Плавающая кнопка](/ru/components/actions/fab/) |\n| Закрыть окно, панель или уведомление | [Кнопка закрытия](/ru/components/actions/close/) |\n| Скопировать значение в буфер | [Копирование](/ru/components/actions/clipboard/) |\n| Скачать файл с именем и размером | [Скачивание файла](/ru/components/actions/download-file/) |" + }, + "components/forms": { + "description": "Поля и элементы выбора на классах: что взять для текста, числа, выбора, даты, телефона, файлов и кода.", + "list_heading": "Все компоненты раздела", + "body": "Поле формы принимает значение от человека и отправляет его с формой. Выберите поле по тому, что человек вводит или выбирает.\n\n| Задача | Что брать |\n|:---|:---|\n| Строка текста: имя, почта, пароль | [Текстовые поля](/ru/components/forms/inputs/) |\n| Текст в несколько строк | [Многострочное поле](/ru/components/forms/textarea/) |\n| Несколько независимых отметок | [Флажок](/ru/components/forms/checkbox/) |\n| Один вариант из нескольких видимых | [Радиокнопки](/ru/components/forms/radio/) |\n| Включить или выключить настройку сразу | [Переключатель](/ru/components/forms/switch/) |\n| Небольшое число, которое меняют по шагу | [Количество](/ru/components/forms/quantity/) |\n| Число или границы диапазона на шкале | [Слайдер диапазона](/ru/components/forms/range-slider/) |\n| Дата или период | [Календарь](/ru/components/forms/datepicker/) |\n| Телефон с кодом страны | [Код страны](/ru/components/forms/country-code/) |\n| Файлы | [Загрузка файлов](/ru/components/forms/file-upload/) |\n| Одноразовый код из сообщения | [Код подтверждения](/ru/components/forms/verification/) |" + }, + "components/navigation": { + "description": "Навигация на классах: что взять для ссылки, пути, меню, страниц, вкладок, дерева и шагов процесса.", + "list_heading": "Все компоненты раздела", + "body": "Навигация переводит человека к другому месту или части страницы. Выберите компонент по тому, куда и как он ведёт.\n\n| Задача | Что брать |\n|:---|:---|\n| Переход по тексту | [Ссылка](/ru/components/navigation/link/) |\n| Путь от корня сайта до текущей страницы | [Хлебные крошки](/ru/components/navigation/breadcrumbs/) |\n| Разделы сайта или приложения | [Меню](/ru/components/navigation/menu/) |\n| Части длинного списка | [Пагинация](/ru/components/navigation/pagination/) |\n| Соседние разделы одного экрана | [Вкладки](/ru/components/navigation/tabs/) |\n| Значение или действие из скрытого списка | [Выпадающий список](/ru/components/navigation/dropdown/) |\n| Действия над выбранным объектом | [Контекстное меню](/ru/components/navigation/context-menu/) |\n| Вложенная иерархия | [Дерево](/ru/components/navigation/tree/) |\n| Этапы процесса и текущий шаг | [Шаги](/ru/components/navigation/step/) |" + }, + "components/feedback": { + "description": "Сообщения и состояния на классах: что взять для уведомления, статуса, счётчика, прогресса, ожидания и пустого места.", + "list_heading": "Все компоненты раздела", + "body": "Обратная связь говорит человеку, что произошло и что идёт сейчас. Выберите компонент по тому, о чём и как громко нужно сказать.\n\n| Задача | Что брать |\n|:---|:---|\n| Важное сообщение в тексте страницы | [Уведомления](/ru/components/feedback/alerts/) |\n| Короткий итог действия, который уходит сам | [Всплывающие сообщения](/ru/components/feedback/toast/) |\n| Статус, категория или счётчик рядом с объектом | [Бейджи](/ru/components/feedback/badges/) |\n| Минимальный знак состояния | [Точка состояния](/ru/components/feedback/dot/) |\n| Ход операции с известной долей | [Прогресс](/ru/components/feedback/progress-bar/), по участкам — [Шкала прогресса](/ru/components/feedback/progress-scale/) |\n| Ожидание без известного срока | [Спиннер](/ru/components/feedback/spinner/) |\n| Форма содержимого, пока данные грузятся | [Скелетон](/ru/components/feedback/skeleton/) |\n| Пустое место или временная область | [Заполнитель](/ru/components/feedback/placeholder/) |" + }, + "components/content": { + "description": "Содержимое на классах: что взять для карточки, раздела, человека, картинки, кода, значка, метки и шагов.", + "list_heading": "Все компоненты раздела", + "body": "Компоненты содержимого показывают сам материал страницы. Выберите компонент по тому, что нужно показать.\n\n| Задача | Что брать |\n|:---|:---|\n| Несколько блоков на своей поверхности | [Карточка](/ru/components/content/card/) |\n| Сворачиваемые разделы | [Аккордеон](/ru/components/content/accordion/) |\n| Человек или группа людей | [Аватары](/ru/components/content/avatars/) |\n| Картинка или видео с подписью | [Рисунок](/ru/components/content/figure/) |\n| Блок кода с подсветкой | [Подсветка](/ru/components/content/highlight/) |\n| Символ действия или объекта | [Иконки](/ru/components/content/icons/), крупный акцент — [Акцентная иконка](/ru/components/content/featured-icon/) |\n| Категория или выбранное значение | [Теги](/ru/components/content/tags/) |\n| Клавиша или сочетание клавиш | [Клавиши](/ru/components/content/kbd/) |\n| Нумерованная инструкция | [Шаги инструкции](/ru/components/content/procedure/) |\n| Файл с именем, размером и действиями | [Предпросмотр файла](/ru/components/content/file-preview/) |" + }, + "smart/feedback": { + "description": "Уведомления и состояния: что взять для сообщения, статуса, прогресса, ожидания, подсказки и пустого экрана.", + "list_heading": "Все компоненты раздела", + "body": "Эти компоненты говорят человеку, что произошло и что идёт сейчас. Выберите компонент по тому, о чём и как громко нужно сказать.\n\n| Задача | Что брать |\n|:---|:---|\n| Сообщение в тексте страницы | [Уведомление](/ru/smart/feedback/alert/) |\n| Важные сообщения над всей страницей | [Плашка уведомлений](/ru/smart/feedback/alert-bar/) |\n| Список проблем, которым нужен человек | [Требует внимания](/ru/smart/feedback/list-attention/) |\n| Короткий итог действия, который уходит сам | [Всплывающие сообщения](/ru/smart/feedback/toast/) |\n| Статус или счётчик рядом с объектом | [Бейджи](/ru/smart/feedback/badges/) |\n| Ход операции с известной долей | [Прогресс](/ru/smart/feedback/progress-bar/), [Кольцо прогресса](/ru/smart/feedback/progress-ring/), [Шкала прогресса](/ru/smart/feedback/progress-scale/) |\n| Долгое задание по шагам | [Ход выполнения](/ru/smart/feedback/progress-run/) |\n| Ожидание данных | [Скелетон](/ru/smart/feedback/skeleton/), без формы — [Спиннер](/ru/smart/feedback/spinner/) |\n| Короткое пояснение элемента | [Подсказка](/ru/smart/feedback/tooltip/), знак «?» — [Подсказка «?»](/ru/smart/feedback/help-mark/) |\n| Пустой список или экран | [Пустое состояние](/ru/smart/feedback/empty-state/) |" + }, + "smart/navigation": { + "description": "Навигация: что взять для пути, страниц, меню, вкладок, шагов, дерева, выпадающего списка, настроек и языка.", + "list_heading": "Все компоненты раздела", + "body": "Навигация переводит человека к другому месту или части экрана. Выберите компонент по тому, куда и как он ведёт.\n\n| Задача | Что брать |\n|:---|:---|\n| Путь от корня до текущей страницы | [Хлебные крошки](/ru/smart/navigation/breadcrumbs/) |\n| Части длинного списка | [Пагинация](/ru/smart/navigation/pagination/), только «назад» и «вперёд» — [Листалка страниц](/ru/smart/navigation/pager/) |\n| Разделы сайта или приложения | [Меню](/ru/smart/navigation/menu/) |\n| Заголовки длинной страницы | [Оглавление](/ru/smart/navigation/contents/) |\n| Соседние разделы одного экрана | [Вкладки](/ru/smart/navigation/tabs/) |\n| Этапы процесса | [Шаги](/ru/smart/navigation/steps/) |\n| Вложенная иерархия | [Дерево](/ru/smart/navigation/tree/) |\n| Значение или действие из скрытого списка | [Выпадающий список](/ru/smart/navigation/dropdown/) |\n| Действия над выбранным объектом | [Контекстное меню](/ru/smart/navigation/context-menu/) |\n| Тема и другие настройки вида | [Настройки](/ru/smart/navigation/settings/) |\n| Язык интерфейса | [Выбор языка](/ru/smart/navigation/language/) |" + } + } +} diff --git a/config/guide-release-values.json b/config/guide-release-values.json index 257c60811..2b123abd6 100644 --- a/config/guide-release-values.json +++ b/config/guide-release-values.json @@ -2,14 +2,14 @@ "schema": "ui-doc.guide-release-values.v1", "why": "The release values the guide's pages name in its examples and tables, as last written. scripts/sync-framework-documentation-versions.php replaces each with the pinned value from scripts/materialize-framework-runtime.php and records the new set here; --check fails while a page still names an old one. `keep` lists the exact spans that name a past release on purpose; the sync leaves them as written.", "values": { - "ui_runtime": "b4a77681f0a7f1c540566e5abac2a4f9d3082a3d", - "ui_record": "c62eae925213318fca769c5cf0149f60b53df76c", - "source": "a29cc9989bebace9a98c235b074ce23998ad39c6", - "builder": "e87e47dc7b69e696e7aef48ffa626a307e6763ad", - "pro": "7a2900066a50a6c683edfe57367c442223d48532", - "pro_builder": "e87e47dc7b69e696e7aef48ffa626a307e6763ad", - "release": "ui-b4a77681f0a7", - "npm_version": "5.20261109.1121" + "ui_runtime": "2bd5a3ab478a46fcee24d2460e7792135b0bb864", + "ui_record": "c4d7d46f481d15af1601ba1c937863d933ebde83", + "source": "d25a01f9989df2ec920364a23ed76d494d91844c", + "builder": "16e9a81c1f2838f7cfeebbbd19654016743c9672", + "pro": "dc13c0f724009847add06c25bf98a6c033c037db", + "pro_builder": "16e9a81c1f2838f7cfeebbbd19654016743c9672", + "release": "ui-2bd5a3ab478a", + "npm_version": "5.20261110.1541" }, "keep": [ { diff --git a/config/guide-structure.json b/config/guide-structure.json index abe7869e9..808d2f951 100644 --- a/config/guide-structure.json +++ b/config/guide-structure.json @@ -82,6 +82,143 @@ } ] }, + { + "slug": "functions", + "title": "Функции", + "order": 25, + "pages": [ + { + "slug": "loading/index", + "title": "Загрузка и готовность", + "order": 10 + }, + { + "slug": "loading/ready", + "title": "Готовность Loader", + "order": 10 + }, + { + "slug": "loading/loader", + "title": "Загрузка по требованию", + "order": 20 + }, + { + "slug": "loading/when-defined", + "title": "Ожидание элемента", + "order": 30 + }, + { + "slug": "loading/create", + "title": "Создание элемента", + "order": 40 + }, + { + "slug": "loading/smart-base", + "title": "Загрузка основы смарт-компонентов", + "order": 50 + }, + { + "slug": "loading/smart", + "title": "Свой смарт-компонент", + "order": 60 + }, + { + "slug": "loading/package", + "title": "API набора", + "order": 70 + }, + { + "slug": "text/index", + "title": "Текст, язык и значения", + "order": 20 + }, + { + "slug": "text/format", + "title": "Даты, числа и размеры", + "order": 10 + }, + { + "slug": "text/language", + "title": "Язык страницы", + "order": 20 + }, + { + "slug": "text/page-text", + "title": "Слово компонента", + "order": 30 + }, + { + "slug": "text/sanitize-html", + "title": "Чужой HTML", + "order": 40 + }, + { + "slug": "text/mask", + "title": "Маска поля", + "order": 50 + }, + { + "slug": "actions/index", + "title": "Действия на странице", + "order": 30 + }, + { + "slug": "actions/copy-text", + "title": "Копирование текста", + "order": 10 + }, + { + "slug": "actions/code-copy", + "title": "Копирование кода в тексте", + "order": 20 + }, + { + "slug": "actions/notify", + "title": "Уведомления", + "order": 30 + }, + { + "slug": "actions/theme", + "title": "Тема", + "order": 40 + }, + { + "slug": "screen/index", + "title": "Экран и прокрутка", + "order": 40 + }, + { + "slug": "screen/breakpoints", + "title": "Контрольные точки", + "order": 10 + }, + { + "slug": "screen/reading-position", + "title": "Положение чтения", + "order": 20 + }, + { + "slug": "screen/position", + "title": "Привязка к якорю", + "order": 30 + }, + { + "slug": "person/index", + "title": "Выбор человека", + "order": 50 + }, + { + "slug": "person/preferences", + "title": "Настройки вида", + "order": 10 + }, + { + "slug": "person/icons", + "title": "Значки на выбор", + "order": 20 + } + ] + }, { "slug": "colour", "title": "Токены, цвет и темы", @@ -122,6 +259,11 @@ "title": "Фоны", "order": 65 }, + { + "slug": "forms", + "title": "Формы: фон и группировка", + "order": 66 + }, { "slug": "elevation", "title": "Поверхность и тень", diff --git a/config/js-api-index.json b/config/js-api-index.json new file mode 100644 index 000000000..c45c74cf5 --- /dev/null +++ b/config/js-api-index.json @@ -0,0 +1,349 @@ +{ + "schema": "ui-doc.js-api-index.v1", + "why": "The JavaScript API page is the index of window.SF (owner D17, 2026-11-10): every public name of core/contracts/public-js-api.json, grouped by what brings it, links to its function page or to the page that describes it; a component's script API links to the component's page. text is the short line the index shows (the contract's summary is the release's record, not an author's line); a component row shows the page title. scripts/build-smart-reference.mjs fails --check when a public name has no row here or a row names no public name.", + "names": { + "SF.ready": { + "text": "Ждёт запуска Loader: обещание или вызов функцией.", + "page": "/ru/guide/functions/loading/ready/", + "label": "Готовность Loader" + }, + "SF.package": { + "text": "Отдаёт API набора компонентов: функции, которые набор зарегистрировал.", + "page": "/ru/guide/functions/loading/package/", + "label": "API набора" + }, + "SF.format": { + "text": "Даты, дни, числа и размеры файлов на языке страницы.", + "page": "/ru/guide/functions/text/format/", + "label": "Даты, числа и размеры" + }, + "SF.language": { + "text": "Язык всей страницы и слова, добавленные для компонентов.", + "page": "/ru/guide/functions/text/language/", + "label": "Язык страницы" + }, + "SF.pageLanguage": { + "text": "Язык, который действует для узла страницы.", + "page": "/ru/guide/functions/text/page-text/", + "label": "Слово компонента" + }, + "SF.pageText": { + "text": "Слово компонента на языке узла.", + "page": "/ru/guide/functions/text/page-text/", + "label": "Слово компонента" + }, + "SF.sanitizeHtml": { + "text": "Очищает HTML из чужого источника перед вставкой на страницу.", + "page": "/ru/guide/functions/text/sanitize-html/", + "label": "Чужой HTML" + }, + "SF.safeHref": { + "text": "Отвечает, можно ли оставить адрес ссылки.", + "page": "/ru/guide/functions/text/sanitize-html/", + "label": "Чужой HTML" + }, + "SF.Mask": { + "text": "Маска ввода у поля и форматирование значения по маске.", + "page": "/ru/guide/functions/text/mask/", + "label": "Маска поля" + }, + "SF.copyText": { + "text": "Кладёт текст в буфер обмена.", + "page": "/ru/guide/functions/actions/copy-text/", + "label": "Копирование текста" + }, + "SF.codeCopy": { + "text": "Код в тексте копируется по нажатию.", + "page": "/ru/guide/functions/actions/code-copy/", + "label": "Копирование кода в тексте" + }, + "SF.notify": { + "text": "Показывает сообщение в области уведомлений страницы.", + "page": "/ru/guide/functions/actions/notify/", + "label": "Уведомления" + }, + "SF.notifications": { + "text": "Настройки области уведомлений и показанные сообщения.", + "page": "/ru/guide/functions/actions/notify/", + "label": "Уведомления" + }, + "SF.breakpoints": { + "text": "Контрольные точки ширины для скрипта.", + "page": "/ru/guide/functions/screen/breakpoints/", + "label": "Контрольные точки" + }, + "SF.readingPosition": { + "text": "Сохраняет место читателя в прокручиваемой колонке.", + "page": "/ru/guide/functions/screen/reading-position/", + "label": "Положение чтения" + }, + "SF.Position": { + "text": "Держит всплывающую панель у её якоря.", + "page": "/ru/guide/functions/screen/position/", + "label": "Привязка к якорю" + }, + "SF.Preferences": { + "text": "Хранит вид, который выбрал человек: порядок, ширину, сортировку.", + "page": "/ru/guide/functions/person/preferences/", + "label": "Настройки вида" + }, + "SF.icons": { + "text": "Список значков, из которых выбирает человек.", + "page": "/ru/guide/functions/person/icons/", + "label": "Значки на выбор" + }, + "SF.RegionNavigation": { + "text": "Переходы между страницами заменой области содержимого.", + "page": "/ru/guide/layouts/building/region-navigation/", + "label": "Навигация по областям страницы" + }, + "SF.workspace": { + "text": "Управляет рабочей областью: список, основная часть, панель.", + "page": "/ru/guide/layouts/building/workspace/", + "label": "Рабочая область" + }, + "SF.Composition": { + "text": "Помощники композиции и редактора блоков.", + "page": "/ru/guide/layouts/reference/api/", + "label": "API композиции" + }, + "SF.Assembly": { + "text": "Среда выполнения сборок.", + "page": "/ru/guide/smart-components/assemblies/", + "label": "Сборки" + }, + "SF.EarlyPort": { + "text": "Порты, объявленные в разметке: первый запрос до кода компонента.", + "page": "/ru/guide/smart-components/data/", + "label": "Данные с сервера" + }, + "SF.Effects": { + "text": "Прежнее имя движка фоновых эффектов; новое — `SF.package('effects')`.", + "page": "/ru/guide/layouts/building/background-effects/", + "label": "Фоновые эффекты" + }, + "SF.RuleLoader": { + "text": "Правила загрузки и регистрация пакета компонентов.", + "page": "/ru/guide/connection/loader/#пакеты-компонентов", + "label": "Пакеты компонентов" + }, + "SF.loadRuntime": { + "text": "Загружает общую среду смарт-компонентов; её вызывает Loader.", + "page": "/ru/guide/smart-components/runtime/", + "label": "Загрузка и общая среда" + }, + "SF.runtimeModule": { + "text": "Модуль общей среды для собранного смарт-компонента.", + "page": "/ru/guide/smart-components/runtime/", + "label": "Загрузка и общая среда" + }, + "SF.deprecations": { + "text": "Прежние имена, которые ещё принимаются, и чем их заменить.", + "page": "/ru/guide/connection/change-lifecycle/", + "label": "Жизненный цикл изменений" + }, + "SF.tags": { + "text": "Прежние теги переименованных смарт-компонентов.", + "page": "/ru/guide/smart-components/names/", + "label": "Имена и общие слова" + }, + "SF.aliases": { + "text": "Прежние имена событий, настроек и атрибутов у элемента.", + "page": "/ru/guide/smart-components/names/", + "label": "Имена и общие слова" + }, + "SF.Loader": { + "text": "Загружает компоненты по требованию и следит за новыми частями страницы.", + "page": "/ru/guide/functions/loading/loader/", + "label": "Загрузка по требованию" + }, + "SF.whenDefined": { + "text": "Ждёт, когда смарт-элемент будет определён.", + "page": "/ru/guide/functions/loading/when-defined/", + "label": "Ожидание элемента" + }, + "SF.whenDefine": { + "text": "Прежнее имя `SF.whenDefined`.", + "page": "/ru/guide/functions/loading/when-defined/", + "label": "Ожидание элемента" + }, + "SF.create": { + "text": "Создаёт элемент компонента по имени.", + "page": "/ru/guide/functions/loading/create/", + "label": "Создание элемента" + }, + "SF.createAsync": { + "text": "Создаёт элемент и ждёт, когда его тег будет определён.", + "page": "/ru/guide/functions/loading/create/", + "label": "Создание элемента" + }, + "SF.loadSmartBase": { + "text": "Загружает основу смарт-компонентов.", + "page": "/ru/guide/functions/loading/smart-base/", + "label": "Загрузка основы смарт-компонентов" + }, + "SF.smartBaseReady": { + "text": "Обещание основы смарт-компонентов, как бы она ни пришла.", + "page": "/ru/guide/functions/loading/smart-base/", + "label": "Загрузка основы смарт-компонентов" + }, + "SF.whenFieldRenderers": { + "text": "Загружает набор отрисовщиков полей.", + "page": "/ru/guide/smart-components/field-renderers/", + "label": "Поля по типу свойства" + }, + "SF.smart": { + "text": "Базовый класс и помощники для своего смарт-компонента.", + "page": "/ru/guide/functions/loading/smart/", + "label": "Свой смарт-компонент" + }, + "SF.SfBaseElement": { + "text": "Базовый класс смарт-элемента.", + "page": "/ru/guide/functions/loading/smart/", + "label": "Свой смарт-компонент" + }, + "SF.html": { + "text": "Тег шаблона, которым рисуют смарт-элементы.", + "page": "/ru/guide/functions/loading/smart/", + "label": "Свой смарт-компонент" + }, + "SF.render": { + "text": "Рисует шаблон в узел.", + "page": "/ru/guide/functions/loading/smart/", + "label": "Свой смарт-компонент" + }, + "SF.nothing": { + "text": "Пустое место в шаблоне.", + "page": "/ru/guide/functions/loading/smart/", + "label": "Свой смарт-компонент" + }, + "SF.AdminMenu": { + "page": "/ru/components/internal/admin-menu/#javascript", + "label": "Основа Admin Menu" + }, + "SF.AnchoredBadge": { + "page": "/ru/components/feedback/badges/#бейдж-на-якоре", + "label": "Бейджи" + }, + "SF.ButtonGroup": { + "page": "/ru/components/actions/button-group/#javascript", + "label": "Группа кнопок" + }, + "SF.Carousel": { + "page": "/ru/components/overlays-media/carousel/#javascript", + "label": "Карусель" + }, + "SF.Checkbox": { + "page": "/ru/components/forms/checkbox/#javascript", + "label": "Флажок" + }, + "SF.Clipboard": { + "page": "/ru/components/actions/clipboard/#javascript", + "label": "Копирование" + }, + "SF.CountryCode": { + "page": "/ru/components/forms/country-code/#javascript", + "label": "Код страны" + }, + "SF.DownloadFile": { + "page": "/ru/components/actions/download-file/#javascript", + "label": "Скачивание файла" + }, + "SF.FileUpload": { + "page": "/ru/components/forms/file-upload/#javascript", + "label": "Загрузка файлов" + }, + "SF.Flag": { + "page": "/ru/components/content/flag/#javascript", + "label": "Флаг" + }, + "SF.Highlight": { + "page": "/ru/components/content/highlight/#javascript", + "label": "Подсветка кода" + }, + "SF.Input": { + "page": "/ru/components/forms/inputs/#javascript", + "label": "Текстовые поля" + }, + "SF.ProgressBar": { + "page": "/ru/components/feedback/progress-bar/#javascript", + "label": "Прогресс" + }, + "SF.ProgressScale": { + "page": "/ru/components/feedback/progress-scale/#javascript", + "label": "Шкала прогресса" + }, + "SF.Radio": { + "page": "/ru/components/forms/radio/#javascript", + "label": "Радиокнопки" + }, + "SF.RangeSlider": { + "page": "/ru/components/forms/range-slider/#javascript", + "label": "Слайдер диапазона" + }, + "SF.Scrollbar": { + "page": "/ru/components/tools/scrollbar/#javascript", + "label": "Полоса прокрутки" + }, + "SF.Slider": { + "page": "/ru/components/overlays-media/slider/#javascript", + "label": "Слайдер контента" + }, + "SF.Spinner": { + "page": "/ru/components/feedback/spinner/#javascript", + "label": "Спиннер" + }, + "SF.Switch": { + "page": "/ru/components/forms/switch/#javascript", + "label": "Переключатель" + }, + "SF.Tab": { + "page": "/ru/components/navigation/tab/#javascript", + "label": "Вкладка (совместимость)" + }, + "SF.Tabs": { + "page": "/ru/components/navigation/tabs/#javascript", + "label": "Вкладки" + }, + "SF.Textarea": { + "page": "/ru/components/forms/textarea/#javascript", + "label": "Многострочное поле" + }, + "SF.Toast": { + "page": "/ru/components/feedback/toast/#javascript", + "label": "Всплывающие сообщения" + }, + "SF.Tree": { + "page": "/ru/components/navigation/tree/#javascript", + "label": "Дерево" + }, + "SF.Verification": { + "page": "/ru/components/forms/verification/#javascript", + "label": "Код подтверждения" + }, + "SF.CompositionOverlay": { + "page": "/ru/smart/editor/composition-overlay/#методы", + "label": "Оверлей редактора" + }, + "SF.InlineEditor": { + "page": "/ru/smart/editor/inline-editor/#методы", + "label": "Inline-редактор" + }, + "SF.Resizer": { + "page": "/ru/smart/overlays/resizer/#методы", + "label": "Изменение ширины" + }, + "SF.Sortable": { + "page": "/ru/smart/editor/sortable/#методы", + "label": "Перетаскивание" + }, + "SF.fieldRenderers": { + "page": "/ru/guide/smart-components/field-renderers/", + "label": "Поля по типу свойства" + }, + "SF.ThemePalette": { + "page": "/ru/smart/forms/theme-generator/", + "label": "Генератор темы" + } + } +} diff --git a/config/public-variables.ru.json b/config/public-variables.ru.json index 545d7e556..4b8761869 100644 --- a/config/public-variables.ru.json +++ b/config/public-variables.ru.json @@ -299,6 +299,14 @@ "The block's edge and the line under its head.": "Цвет рамки блока и линии под его шапкой.", "The width of the block's edge and of the line under its head.": "Толщина рамки блока и линии под его шапкой.", "The border colour; every appearance reads it (the dark one draws no border until a width is set).": "Цвет рамки; его читает каждый вид (тёмный рисует рамку, только когда задана толщина).", - "The border width on every side: one hairline on the light appearance, none on the dark one unless set.": "Толщина рамки со всех сторон: тонкая линия у светлого вида, у тёмного рамки нет, пока её не задали." + "The border width on every side: one hairline on the light appearance, none on the dark one unless set.": "Толщина рамки со всех сторон: тонкая линия у светлого вида, у тёмного рамки нет, пока её не задали.", + "The colour under the offline dot: the place the avatar stands on, so neither the photo nor the initials show through the dot (C43).": "Цвет под точкой «не в сети»: фон места, где стоит аватар, чтобы сквозь точку не просвечивали ни фото, ни инициалы.", + "The layer over that colour: the disabled ink. Set it to none for an offline dot of exactly --sf-avatar-offline-background-color.": "Слой поверх этого цвета: цвет отключённого. Задайте `none`, чтобы точка «не в сети» была ровно цвета `--sf-avatar-offline-background-color`.", + "A cap's and a key's height and least width: the line height of the text step one below the place's (C38). Read from the place: a button's or a field's size, a text class, else body text (component.kbd).": "Высота и наименьшая ширина клавиши: высота строки текста на шаг меньше, чем у места. Берётся из места: размер кнопки или поля, класс текста, иначе основной текст.", + "A cap's and a key's letters: the size of the text step one below the place's (C38). Read from the place: a button's or a field's size, a text class, else body text (component.kbd).": "Буквы клавиши: размер текста на шаг меньше, чем у места. Берётся из места: размер кнопки или поля, класс текста, иначе основной текст.", + "A cap's letters (in a button or a field): the ink it sits in, whole -- at least 4.5:1 against the cap's fill on every look of sf-button.": "Буквы клавиши в кнопке или поле: цвет текста места целиком — не меньше 4.5:1 к заливке клавиши на любом виде `sf-button`.", + "Space above and below the content (decision C35: the first line stands in a low control's box inside it).": "Отступ над и под содержимым: первая строка стоит в рамке низкого элемента управления.", + "Space between the icon, the text and the buttons (decision C35: the toast's icon gap).": "Промежуток между иконкой, текстом и кнопками.", + "The fixed width of a drilling panel (submenu=\"drill\"), the settings panel's own: it grows neither with a level's longest word nor with a value. By default --sf-popup-menu-max-width, the menu's ceiling of the popup widths, which follows density (C32).": "Постоянная ширина панели с переходами (`submenu=\"drill\"`), собственная ширина панели настроек: она не растёт ни от самого длинного слова уровня, ни от значения. По умолчанию — `--sf-popup-menu-max-width`, наибольшая ширина меню, которая следует плотности." } } diff --git a/config/reference-pages.json b/config/reference-pages.json index cd0031ef1..ab60c9e2f 100644 --- a/config/reference-pages.json +++ b/config/reference-pages.json @@ -284,7 +284,7 @@ "sf-range-slider" ] }, - "components/forms/slider.md": { + "components/overlays-media/slider.md": { "kind": "component", "component": "slider", "blocks": [ @@ -625,7 +625,7 @@ }, "smart/forms/inputs.md": { "kind": "smart", - "standard": 3 + "standard": 4 }, "smart/forms/radio.md": { "kind": "smart", @@ -635,7 +635,7 @@ "kind": "smart", "standard": 3 }, - "smart/forms/slider.md": { + "smart/content/slider.md": { "kind": "smart", "standard": 3 }, @@ -649,11 +649,11 @@ }, "smart/forms/lookup.md": { "kind": "smart", - "standard": 3 + "standard": 4 }, "smart/forms/textarea.md": { "kind": "smart", - "standard": 3 + "standard": 4 }, "smart/navigation/breadcrumbs.md": { "kind": "smart", @@ -2062,7 +2062,7 @@ }, "smart/forms/quantity.md": { "kind": "smart", - "standard": 3 + "standard": 4 }, "smart/navigation/menu.md": { "kind": "smart", diff --git a/config/smart-reference.json b/config/smart-reference.json index e2d382aa7..277e9f54a 100644 --- a/config/smart-reference.json +++ b/config/smart-reference.json @@ -71,6 +71,62 @@ "file-download": { "target": "Где открыть ссылку без `download`, как у атрибута `target` ссылки HTML: `_blank` — в новой вкладке, `_self` — на месте", "aria-label": "Имя ссылки или кнопки для экранного диктора вместо имени и размера файла; назовите в нём файл" + }, + "input": { + "label": "Видимая подпись над полем; она же даёт полю доступное имя", + "required": "Обязательное поле: звёздочка у подписи, браузер не отправит форму с пустым полем", + "placeholder": "Образец формата в пустом поле; исчезает после ввода и подпись не заменяет", + "input-type": "Тип поля: `text`, `email`, `password`, `search`, `tel`, `url` или `number`; от него зависят проверка браузера и экранная клавиатура", + "autocomplete": "Подсказка браузеру для автозаполнения, как у `autocomplete` поля HTML: `email`, `tel`, `current-password`", + "inputmode": "Какую экранную клавиатуру показать на телефоне: `numeric` — цифры, `email` — с «@», `tel` — номер", + "minlength": "Наименьшее число символов; браузер проверяет его перед отправкой формы", + "maxlength": "Наибольшее число символов; больше ввести нельзя", + "pattern": "Регулярное выражение, которому должно соответствовать значение; браузер проверяет его перед отправкой формы", + "hint": "Постоянное пояснение под полем; при ошибке его место занимает сообщение", + "default-value": "Начальное значение: дальше поле хранит то, что ввёл человек", + "name": "Имя поля в форме: под ним значение уходит с отправкой", + "icon-start": "Значок в начале поля, имя иконки: `search`, `mail`", + "text-end": "Короткий текст в конце поля: единица или валюта, например «₽»", + "hint-icon": "Значок подсказки в конце рамки, имя иконки, например `info`", + "disabled": "Поле выключено: значение не меняется и не отправляется с формой", + "readonly": "Значение видно, его можно выделить и скопировать, но не изменить; отправляется с формой", + "invalid": "Поле с ошибкой: красная рамка, сообщение из `error-message` под полем, `aria-invalid`", + "error-message": "Текст ошибки под полем, пока задан `invalid`", + "mask": "Включает маску ввода из `mask-pattern` или `mask-options`", + "mask-pattern": "Шаблон маски: `0` — цифра, `a` — буква, `*` — любой символ, `{…}` — постоянная часть значения", + "mask-lazy": "`false` — показать весь шаблон маски сразу, а не по мере ввода", + "mask-placeholder-char": "Символ пустой позиции маски, например `_`", + "mask-options": "Полные настройки маски JSON-строкой, например `{\"mask\": \"Number\"}`", + "value": "Значение, которым управляет страница: при перерисовке поле показывает его" + }, + "input-textarea": { + "size": "Ступень высоты поля: `1/2`, `1` или `2`, как у текстового поля и кнопки того же размера", + "label": "Видимая подпись над полем; она же даёт полю доступное имя", + "required": "Обязательное поле: звёздочка у подписи, браузер не отправит форму с пустым полем", + "placeholder": "Образец формата в пустом поле; исчезает после ввода и подпись не заменяет", + "autocomplete": "Подсказка браузеру для автозаполнения, как у `autocomplete` поля HTML: `email`, `tel`, `current-password`", + "inputmode": "Какую экранную клавиатуру показать на телефоне: `numeric` — цифры, `email` — с «@», `tel` — номер", + "minlength": "Наименьшее число символов; браузер проверяет его перед отправкой формы", + "maxlength": "Наибольшее число символов; больше ввести нельзя", + "spell-check": "Проверка орфографии браузером; `false` — для кода, адресов, артикулов", + "wrap": "Как браузер отправляет переносы: `soft` — только переносы, которые ввёл человек, `hard` — и переносы по ширине поля", + "hint": "Постоянное пояснение под полем; при ошибке его место занимает сообщение", + "name": "Имя поля в форме: под ним значение уходит с отправкой", + "rows": "Начальная высота в строках; человек может растянуть поле по вертикали. С `auto-grow` не действует", + "disabled": "Поле выключено: значение не меняется и не отправляется с формой", + "readonly": "Значение видно, его можно выделить и скопировать, но не изменить; отправляется с формой", + "invalid": "Поле с ошибкой: красная рамка, сообщение из `error-message` под полем, `aria-invalid`", + "error-message": "Текст ошибки под полем, пока задан `invalid`", + "mask": "Включает маску ввода из `mask-pattern` или `mask-options`", + "mask-pattern": "Шаблон маски: `0` — цифра, `a` — буква, `*` — любой символ, `{…}` — постоянная часть значения", + "mask-options": "Полные настройки маски JSON-строкой, например `{\"mask\": \"Number\"}`", + "value": "Значение, которым управляет страница: при перерисовке поле показывает его" + }, + "input-rich": { + "aria-label": "Название поля для экранного диктора, если видимой подписи нет" + }, + "input-lookup": { + "aria-label": "Название поля поиска и списка для экранного диктора, если видимой подписи нет" } }, "slots": { diff --git a/config/smart-reference.ru.json b/config/smart-reference.ru.json index f27c80733..8ea8f0037 100644 --- a/config/smart-reference.ru.json +++ b/config/smart-reference.ru.json @@ -692,7 +692,7 @@ "Selects a batch action by value (an empty value clears the choice) and emits sf-action-change when it differs from the current one.": "Выбирает групповое действие по значению (пустое значение сбрасывает выбор) и отправляет sf-action-change, если оно отличается от текущего.", "Selects a node by id.": "Выбирает узел по id.", "Selects an enabled item by value.": "Выбирает кнопку по значению, если она доступна.", - "Semantic Material Symbol wrapper with exact Loader tracking, accessible decorative or informative modes and token-owned geometry.": "Семантическая обёртка Material Symbol с точным отслеживанием в Loader, доступными декоративным и информативным режимами и геометрией из токенов.", + "Semantic Material Symbol wrapper with exact Loader tracking, accessible decorative or informative modes and token-owned geometry.": "Семантическая обёртка Material Symbol с точным отслеживанием в загрузчике, доступными декоративным и информативным режимами и геометрией из токенов.", "Semantic internal spacing profile.": "Внутренние отступы: `compact` плотнее, `spacious` свободнее.", "Send one failed file again.": "Повторно отправляет один файл, загрузка которого не удалась.", "Set and commit the colour as a person would: normalised, reflected to value, input and then change dispatched when it differs from the committed one. Returns whether the value changed.": "Устанавливает и фиксирует цвет так же, как это делает пользователь: нормализует его, отражает в value и отправляет input, а затем change, если цвет отличается от зафиксированного. Возвращает, изменилось ли значение.", @@ -1085,8 +1085,8 @@ "The table's look: density (compact, normal, spacious), stripes, lines, singleLine, stickyHead. Under sf-table/* it is the person's look for every table, read under this table's own.": "Вид таблицы: `density` (`compact`, `normal`, `spacious`), `stripes`, `lines`, `singleLine`, `stickyHead`. Под `sf-table/*` это вид всех таблиц человека; он читается под видом этой таблицы.", "The width the person dragged to, in CSS pixels, clamped to min and max when it is applied.": "Ширина, до которой человек дотянул панель, в пикселях CSS; при применении ограничивается `min` и `max`.", "Write a column-settings layer, personal or shared, against its revision: settings.save_personal or settings.save_shared. The base revision is the one given, else the layer's, else the port target's. After a conflict the view takes the current_revision (and the layer's columns) the answer carries beside answer, as simai.dataview-port 1.12.0 states; it still reads data.current_revision and data.column_settings from a host that followed 1.10.0's words, and re-reads the list when the conflict names no revision.": "Записывает слой настроек колонок, личный или общий, против его ревизии: `settings.save_personal` или `settings.save_shared`. Базовая ревизия — переданная, иначе ревизия слоя, иначе ревизия цели порта. После конфликта представление берёт `current_revision` (и колонки слоя), которые ответ несёт рядом с `answer`, как требует `simai.dataview-port` 1.12.0; `data.current_revision` и `data.column_settings` оно тоже читает, а если конфликт не называет ревизию, перечитывает список.", - "A CSS selector for the element the theme is applied to; empty is the document element. A target other than the root carries a theme class (theme-light or theme-dark): the semantic tokens are declared there, so without one only the 128 primitives change on it.": "Селектор CSS элемента, к которому применяется тема; пусто — корневой элемент документа. Цель, отличная от корня, несёт класс темы (`theme-light` или `theme-dark`): на нём объявлены семантические токены, и без него на цели сменятся только 128 примитивов.", - "A theme from one colour: a person chooses the main colour (or the generator's hue and chroma) and it makes the Framework's eight tonal palettes, the 128 primitives every semantic token reads, with a preview, events carrying the CSS, and an optional live application to the page.": "Тема из одного цвета: человек выбирает основной цвет (или тон и насыщенность генератора), а компонент строит восемь тональных палитр Framework — 128 примитивов, из которых читаются все семантические токены, — с предпросмотром, событиями с CSS и применением к странице по желанию.", + "A CSS selector for the element the theme is applied to; empty is the document element. A target other than the root carries a theme class (theme-light or theme-dark): the semantic tokens are declared there, so without one only the 128 primitives change on it.": "Селектор CSS элемента, к которому применяется тема; пусто — корневой элемент документа. Цель, отличная от корня, несёт класс темы (`theme-light` или `theme-dark`): на нём объявлены семантические токены, и без него на цели сменятся только примитивы.", + "A theme from one colour: a person chooses the main colour (or the generator's hue and chroma) and it makes the Framework's eight tonal palettes, the 128 primitives every semantic token reads, with a preview, events carrying the CSS, and an optional live application to the page.": "Тема из одного цвета: человек выбирает основной цвет (или тон и насыщенность генератора), а компонент строит тональные палитры Framework — примитивы, из которых читаются все семантические токены, — с предпросмотром, событиями с CSS и применением к странице по желанию.", "Apply the theme to `target` as inline custom properties, live on every change, undoing the previous application first and on removal. Without it the page is not changed.": "Применять тему к `target` встроенными переменными, сразу при каждом изменении; предыдущее применение снимается перед следующим и при удалении элемента. Без атрибута страница не меняется.", "Back to the Framework's own colour; fires sf-theme-change and sf-theme-apply.": "Возвращает цвет Framework; отправляет sf-theme-change и sf-theme-apply.", "The choice moved: a drag across the picker, a swatch, a number typed in a field.": "Выбор меняется: перетаскивание в палитре, образец цвета, число в поле.", @@ -1097,12 +1097,12 @@ "The main colour, #rrggbb. Empty means the Framework's own colour (#005bbe) and draws the Framework's own theme.": "Основной цвет, `#rrggbb`. Пусто — цвет Framework (`#005bbe`) и собственная тема Framework.", "The product's own colours offered beside the picker, as sf-color takes them: '#hex|Name, #hex'.": "Цвета продукта рядом с выбором, как у sf-color: `'#hex|Название, #hex'`.", "The selector of the rule in the events' css and in toCSS().": "Селектор правила в `css` событий и в `toCSS()`.", - "The theme as one stylesheet rule of its 128 primitives, under the given selector or the `selector` attribute.": "Тема одним правилом CSS из 128 примитивов под переданным селектором или под атрибутом `selector`.", + "The theme as one stylesheet rule of its 128 primitives, under the given selector or the `selector` attribute.": "Тема одним правилом CSS из примитивов под переданным селектором или под атрибутом `selector`.", "The theme object (simai.framework.theme.v1): source hue and chroma, and each palette's hue, chroma and tones.": "Объект темы (`simai.framework.theme` с `schema_version: 1`): тон и насыщенность источника и у каждой палитры её тон, насыщенность и тона.", "A component's word in the language of a node, with the page's registered words first.": "Слово компонента на языке узла; сначала — слова, зарегистрированные страницей.", "A promise of a Smart element's definition, loading it when the page has not.": "Обещание определения смарт-элемента; загружает его, если страница ещё не загрузила.", "A promise of the field renderer set (SF.fieldRenderers), loading it on demand.": "Обещание набора отрисовщиков полей (`SF.fieldRenderers`); загружает его по требованию.", - "A whole theme from one colour: the eight tonal palettes as the 128 --sf-- primitives.": "Тема из одного цвета: восемь тональных палитр — 128 примитивов `--sf-<палитра>-<тон>`.", + "A whole theme from one colour: the eight tonal palettes as the 128 --sf-- primitives.": "Тема из одного цвета: тональные палитры — примитивы `--sf-<палитра>-<тон>`.", "Anchored positioning of a floating surface beside its anchor, flipping at the edge.": "Расположение всплывающей поверхности рядом с её якорем с переворотом у края.", "Background effects (simai.effect): check a manifest, read stored settings, resolve a placement's theme, mount an effect or a windows group under the rules, load one from the pinned catalogue with integrity, run a foreign one only in a sandboxed frame.": "Фоновые эффекты (`simai.effect`): проверить манифест, прочитать сохранённые настройки, выбрать тему размещения, подключить эффект или группу окон по правилам, загрузить эффект из закреплённого каталога с проверкой целостности, запустить чужой эффект только в изолированном фрейме.", "Creates a component element by name with attributes.": "Создаёт элемент компонента по имени с атрибутами.", @@ -1159,10 +1159,10 @@ "The person's view preferences: kept in this browser and, when the host keeps them, for the person (simai.interaction-rules).": "Персональный вид человека: хранится в этом браузере, а если приложение его хранит, — и у человека (`simai.interaction-rules`).", "The runtime loader: loads what a page uses, components and utilities, on demand, and the theme. Once a theme is set (setTheme, changeTheme), SF.Loader.theme and SF.Loader.themePreference read it.": "Загрузчик: по требованию загружает то, что использует страница, — компоненты и утилиты — и тему. Когда тема задана (`setTheme`, `changeTheme`), её читают `SF.Loader.theme` и `SF.Loader.themePreference`.", "A CSS selector for the element the theme is applied to; empty is the document element. A target other than the root carries a theme class (theme-light or theme-dark): the semantic tokens are declared there, so without one only the primitives change on it.": "Селектор CSS элемента, к которому применяется тема; пусто — корневой элемент документа. Цель, отличная от корня, несёт класс темы (`theme-light` или `theme-dark`): на нём объявлены семантические токены, и без него на цели сменятся только примитивы.", - "A theme from one colour: a person chooses the main colour (or the generator's hue and chroma) and it makes the Framework's eight tonal palettes, the 128 primitives every semantic token reads and the 98 translucent steps core derives from them, with a preview, events carrying the CSS, and an optional live application to the page.": "Тема из одного цвета: человек выбирает основной цвет (или тон и насыщенность генератора), а компонент строит восемь тональных палитр Framework — 128 примитивов, из которых читаются все семантические токены, и 98 полупрозрачных ступеней, которые ядро выводит из них, — с предпросмотром, событиями с CSS и применением к странице по желанию.", + "A theme from one colour: a person chooses the main colour (or the generator's hue and chroma) and it makes the Framework's eight tonal palettes, the 128 primitives every semantic token reads and the 98 translucent steps core derives from them, with a preview, events carrying the CSS, and an optional live application to the page.": "Тема из одного цвета: человек выбирает основной цвет (или тон и насыщенность генератора), а компонент строит тональные палитры Framework — примитивы, из которых читаются все семантические токены, и полупрозрачные ступени, которые ядро выводит из них, — с предпросмотром, событиями с CSS и применением к странице по желанию.", "Its first name, still emitted with the same detail until 2026-12-01 (journal event-theme-generator-names); the Loader's light/dark event bears it too. Bind sf-theme-generator-apply.": "Прежнее имя; ещё отправляется с тем же detail до 2026-12-01 (запись журнала event-theme-generator-names). Это имя носит и событие Loader о светлой и тёмной теме. Подписывайтесь на sf-theme-generator-apply.", "Its first name, still emitted with the same detail until 2026-12-01 (journal event-theme-generator-names); the Loader's light/dark event bears it too. Bind sf-theme-generator-change.": "Прежнее имя; ещё отправляется с тем же detail до 2026-12-01 (запись журнала event-theme-generator-names). Это имя носит и событие Loader о светлой и тёмной теме. Подписывайтесь на sf-theme-generator-change.", - "The theme as one stylesheet rule of its 128 primitives and 98 translucent steps, under the given selector or the `selector` attribute.": "Тема одним правилом CSS из 128 примитивов и 98 полупрозрачных ступеней под переданным селектором или под атрибутом `selector`.", + "The theme as one stylesheet rule of its 128 primitives and 98 translucent steps, under the given selector or the `selector` attribute.": "Тема одним правилом CSS из примитивов и полупрозрачных ступеней под переданным селектором или под атрибутом `selector`.", "A promise of one module of the shared Smart runtime by its id (lit, smart-base, page-language, ...); what a built Smart bundle imports through.": "Обещание одного модуля общей среды смарт-компонентов по его id (`lit`, `smart-base`, `page-language` и другие); через него импортирует собранный смарт-бандл.", "A promise of the Smart base, however it arrives (a Smart element or SF.loadSmartBase()).": "Обещание основы смарт-компонентов, как бы она ни пришла (со смарт-элементом или через `SF.loadSmartBase()`).", "Back to the Framework's own colour; fires sf-theme-generator-change and sf-theme-generator-apply (and their first names until 2026-12-01).": "Возвращает цвет Framework; отправляет sf-theme-generator-change и sf-theme-generator-apply (и их прежние имена до 2026-12-01).", @@ -1181,7 +1181,7 @@ "typeahead": "поиск по первым буквам", "Typeahead": "поиск по первым буквам", "The first day of the week, 0 Sunday to 6 Saturday (1 Monday). Without the attribute it follows the page's language (ru: Monday, en-US: Sunday, ar-EG: Saturday).": "Первый день недели: от 0 — воскресенье до 6 — суббота (1 — понедельник). Без атрибута следует языку страницы (`ru` — понедельник, `en-US` — воскресенье, `ar-EG` — суббота).", - "A whole theme from one colour: the eight tonal palettes as the 128 --sf-- primitives and the 98 translucent steps core defines on them (--sf----alfa-, listed in THEME_ALPHA), 226 variables in all.": "Тема из одного цвета: восемь тональных палитр — 128 примитивов `--sf-<палитра>-<тон>` и 98 полупрозрачных ступеней, которые ядро определяет на них (`--sf-<палитра>-<тон>--alfa-`, список — в `THEME_ALPHA`), всего 226 переменных.", + "A whole theme from one colour: the eight tonal palettes as the 128 --sf-- primitives and the 98 translucent steps core defines on them (--sf----alfa-, listed in THEME_ALPHA), 226 variables in all.": "Тема из одного цвета: тональные палитры — примитивы `--sf-<палитра>-<тон>` и полупрозрачные ступени, которые ядро определяет на них (`--sf-<палитра>-<тон>--alfa-`, список — в `THEME_ALPHA`).", "The sf-system modal's script API, loaded with component/sf-system; its methods are that component's documentation. It is not the Modal component's class: a page that loads only component/modal (sf-modal, the modal examples) has no SF.Modal, and finds the class at SF.Loader.ComponentRegistry.Modal (new Modal({id, param})), as the documentation's examples do.": "Скриптовый API модального окна `sf-system`; приходит с `component/sf-system`, его методы описаны на странице этого компонента. Это не класс компонента Modal: на странице, которая загружает только `component/modal` (`sf-modal`, примеры окна), `SF.Modal` нет, а класс лежит в `SF.Loader.ComponentRegistry.Modal` (`new Modal({id, param})`), как в примерах документации.", "": "", "Color scheme for the selected button, and for the selected plate in the segmented appearance.": "Цвет выбранной кнопки, например `primary`; в виде `segmented` — цвет плашки выбранного сегмента.", @@ -1599,7 +1599,7 @@ "The edit was put back (Escape): the element shows its HTML from before; sent on the edited element": "Правка отменена (Escape): элемент показывает свой прежний HTML; отправляется на редактируемом элементе", "The editor's layer over a rendered Composition Document: hover and selection frames, a toolbar of the node's actions, insertion places, moves by pointer and keyboard and a structure tree; the canvas is never changed and the host performs every change.": "Слой редактора над отрисованным документом композиции: рамки наведения и выбора, панель действий узла, места вставки, перенос указателем и клавиатурой и дерево структуры; холст никогда не меняется, каждое изменение выполняет приложение.", "The end came into view while has-more: {direction: after}.": "Конец списка показался на экране, пока `has-more`: `{direction: after}`.", - "The exact subset that draws this glyph is in place; synchronized from the Loader, never an authoring switch": "Точное подмножество, рисующее этот символ, на месте; синхронизируется из Loader, это не переключатель для автора", + "The exact subset that draws this glyph is in place; synchronized from the Loader, never an authoring switch": "Точное подмножество, рисующее этот символ, на месте; синхронизируется из загрузчика, это не переключатель для автора", "The fact after a record that could not be read, {reason, message}: the host's code (record-unknown for a stale link) and its sentence.": "Факт после записи, которую не удалось прочитать, `{reason, message}`: код приложения (record-unknown для устаревшей ссылки) и его фраза.", "The fact after an applied delete, vocabulary §4: {ids}.": "Факт после применённого удаления: `{ids}`.", "The fact after an applied save (group.save or record.save), vocabulary §4: {id, revision}.": "Факт после применённого сохранения (`group.save` или `record.save`): `{id, revision}`.", @@ -1917,7 +1917,7 @@ "Close the search in the conversation; the focus returns to what opened it (action close-find; answers an outcome).": "Закрыть поиск по разговору; фокус возвращается туда, откуда поиск открыли (действие close-find; отвечает исходом).", "Enter in the link editor applies, Escape closes it": "`Enter` в поле ссылки применяет адрес, `Esc` закрывает поле", "HTML of the subset p, h2, h3, h4, strong, em, a[href], ul, ol, li, blockquote, br; href only https:, mailto:, tel: or a /path on the site. Cleaned when it is given and as it is edited; \"\" when there is no text.": "HTML из набора p, h2, h3, h4, strong, em, a[href], ul, ol, li, blockquote, br; href только https:, mailto:, tel: или путь на сайте. Очищается при задании и при правке; пустая строка, когда текста нет.", - "How the field looks: a bordered box or a filled one, sf-textarea's two boxes.": "Вид поля: блок с рамкой или с заливкой — те же два вида, что у sf-textarea.", + "How the field looks: a bordered box or a filled one, sf-textarea's two boxes.": "Вид поля: блок с рамкой или с заливкой — те же два вида, что у многострочного поля.", "Mod+B and Mod+I toggle bold and italic, Mod+K opens the link editor": "`Ctrl/Cmd+B` и `Ctrl/Cmd+I` включают и выключают полужирный и курсив, `Ctrl/Cmd+K` открывает поле ссылки", "Mod+Z undoes, Mod+Shift+Z and Mod+Y redo": "`Ctrl/Cmd+Z` отменяет, `Ctrl/Cmd+Shift+Z` и `Ctrl/Cmd+Y` повторяют", "Not editable, not focusable and not sent with the form; a disabled fieldset does the same.": "Не редактируется, не получает фокус и не отправляется с формой; так же действует отключённый fieldset.", @@ -1932,7 +1932,7 @@ "Tab reaches the toolbar (one stop) and then the text; Tab in the text leaves the field": "`Tab` ведёт на панель кнопок (одна остановка), затем в текст, а из текста — дальше из поля", "The fewest lines the text area shows; it grows with the text.": "Наименьшее число строк в области текста; она растёт вместе с текстом.", "The field is named and described by the character count shown past 80 % of the limit; a polite line speaks only when a threshold is crossed. A rejected file is a role=alert notice. Enter while an answer is awaited says why nothing was sent, or, with queue, that the message goes after the answer. «Stop waiting» returns focus to the field.": "Поле названо и описано счётчиком символов, который виден после 80 % предела; вежливая строка говорит только при переходе порога. Отклонённый файл — уведомление role=alert. Enter, пока ждётся ответ, объясняет, почему ничего не отправлено, а с queue — что сообщение уйдёт после ответа. «Не ждать» возвращает фокус в поле.", - "The field ladder, as sf-textarea's: the frame, the padding and the text of the same size; the toolbar's buttons a rung below.": "Размер поля, как у `sf-textarea`: рамка, отступы и текст; кнопки панели на размер меньше.", + "The field ladder, as sf-textarea's: the frame, the padding and the text of the same size; the toolbar's buttons a rung below.": "Размер поля, как у многострочного поля: рамка, отступы и текст; кнопки панели на размер меньше.", "The form is not sent while the value is empty (value-missing).": "Форма не отправляется, пока значение пустое (value-missing).", "The form name the value is sent under.": "Имя, под которым значение уходит с формой.", "The frame draws the focus ring while the text has keyboard focus; a click into the text draws none. Toolbar commands keep the caret and the selection in the text; the link editor takes focus when it opens and gives the caret back to the text when it closes.": "Рамка рисует кольцо фокуса, пока текст в фокусе с клавиатуры; щелчок в текст кольца не рисует. Команды панели сохраняют курсор и выделение в тексте; поле ссылки при открытии забирает фокус и при закрытии возвращает курсор в текст.", @@ -2697,7 +2697,7 @@ "A person closed an item (reason close) or a page called close(id) (reason api): hide day for a warning (hidden for 24 hours), always for an info item (hidden for good). The bar stores nothing: the host keeps the choice and leaves the item out when it sets the list again. Not cancelled, the item leaves the bar at once. An error item is never closed": "Человек закрыл пункт (`reason: close`) или страница вызвала `close(id)` (`reason: api`): предупреждение скрывается на сутки, сведения — насовсем. Полоса ничего не хранит: выбор сохраняет приложение и не передаёт этот пункт в следующий список. Пункт уходит сразу; ошибку закрыть нельзя.", "A promise of one module of the shared Smart runtime by its id (lit, smart-base, page-language, ...), or of a package's shared core by /; what a built Smart bundle imports through. SF.runtimeModule.register(, , {: namespace}) registers a package's shared core (core.runtime 1.38.0).": "Обещание одного модуля общей среды смарт-компонентов по его имени (`lit`, `smart-base`, `page-language` …) или общего ядра пакета по имени `<пакет>/<модуль>`; через него импортирует собранный смарт-компонент. `SF.runtimeModule.register(<пакет>, , {<модуль>: namespace})` регистрирует общее ядро пакета.", "A ready theme switch over SF.Loader's theme (the contract of sf-segmented's theme-switch: themePreference, setTheme, sf-theme-change). Present and empty: three values, «as the system», light and dark, in the owner's order -- first the theme opposite to the visible one, then the other, then «as the system» (rule D11d); \"light dark\": two values, every press flips the visible theme. The icons are contrast, light_mode and dark_mode; the words are the page language's («Тема: светлая. Нажмите — тёмная»). cycle is ignored beside it.": "Готовый переключатель темы: по нажатию — следующая тема. Пустой атрибут — три значения в порядке владельца: сначала тема, противоположная видимой, потом другая, потом «как в системе» (D11d); `\"light dark\"` — два значения, каждое нажатие меняет видимую тему. Значки `contrast`, `light_mode` и `dark_mode`, слова — на языке страницы («Тема: светлая. Нажмите — тёмная»). Рядом с ним `cycle` не действует.", - "A whole theme from one colour: the eight tonal palettes as the 128 --sf-- primitives and the 104 translucent steps core defines on them (--sf----alfa-, listed in THEME_ALPHA), 232 variables in all.": "Целая тема из одного цвета: восемь тональных палитр как 128 примитивов `--sf-<палитра>-<тон>` и 104 полупрозрачные ступени на них (`--sf-<палитра>-<тон>--alfa-`), всего 232 переменные.", + "A whole theme from one colour: the eight tonal palettes as the 128 --sf-- primitives and the 104 translucent steps core defines on them (--sf----alfa-, listed in THEME_ALPHA), 232 variables in all.": "Целая тема из одного цвета: тональные палитры как примитивы `--sf-<палитра>-<тон>` и полупрозрачные ступени на них (`--sf-<палитра>-<тон>--alfa-`).", "Accessible name for a textarea drawn without a visible label; it lands on the native textarea. A visible label wins.": "Имя поля для экранного диктора, когда видимой подписи нет; ставится на само поле. Видимая подпись важнее.", "Closes the item with this id as its close button would, sending sf-alert-bar-close with reason api: refused {reason: missing} for an id the bar does not show, {reason: danger} for an error item or one with dismissible false, {reason: prevented} when a page cancels sf-alert-bar-close": "Закрывает пункт с этим `id`, как его кнопка закрытия, и присылает `sf-alert-bar-close` с `reason: api`. Отказ: `missing` — такого пункта нет, `danger` — пункт с ошибкой или с `dismissible: false`, `prevented` — страница отменила `sf-alert-bar-close`.", "Colour scheme for the selected button of the buttons look, and for the plate on the track when plate is scheme.": "Цвет выбранной кнопки в виде «кнопки» и плашки на дорожке, когда `plate=\"scheme\"`.", @@ -2722,7 +2722,7 @@ "The plate under the selected option on the track. raised, the default: a neutral raised surface with its shadow (white in the light theme). scheme: the scheme's fill, an accent for the one switch on a screen that needs it.": "Плашка под выбранным вариантом на дорожке. `raised`, по умолчанию, — нейтральная приподнятая плашка с тенью (белая в светлой теме). `scheme` — заливка цвета `scheme`: акцент для одного такого переключателя на экране.", "The shape of the ghost spot, as the icon buttons beside it: default is the rounded square of controls, rounded a circle. plain has no spot; media is always a circle.": "Форма пятна у вида `ghost`, как у кнопок с иконкой рядом: `default` — скруглённый квадрат, `rounded` — круг. У `plain` пятна нет, у `media` — всегда круг.", "The step of the control ladder the field stands on, the height of sf-button and sf-button-icon of the same size. sf-input keeps the outer steps 1/3 and 3 (a compact toolbar search, a hero search); the other fields stay on 1/2, 1 and 2.": "Ступень линейки высот, на которой стоит поле, — высота `sf-button` и `sf-button-icon` того же размера. `sf-input` знает и крайние ступени `1/3` и `3` (компактный поиск в панели, крупный поиск на главной); остальные поля — `1/2`, `1` и `2`.", - "The theme as one stylesheet rule of its 128 primitives and 104 translucent steps, under the given selector or the `selector` attribute.": "Тема одним правилом стилей: 128 примитивов и 104 полупрозрачные ступени под заданным селектором или селектором из атрибута `selector`.", + "The theme as one stylesheet rule of its 128 primitives and 104 translucent steps, under the given selector or the `selector` attribute.": "Тема одним правилом стилей: примитивы и полупрозрачные ступени под заданным селектором или селектором из атрибута `selector`.", "The value the inner button submits under name when it is the submitter (next, skip); for a cycle, the current item's value, which a press moves to the next one.": "Значение, которое кнопка отправляет под `name`, когда форму отправляют ею (`next`, `skip`); у цикла — значение текущего пункта, нажатие переводит его к следующему.", "The widths offered, as sf-segmented takes them: {value, label, icon, icon-only, aria-label}. value is the letter's width; frame is the frame's width in pixels when it differs from value. Empty shows no switch and the frame fills the well.": "Предлагаемые ширины в формате `sf-segmented`: `{value, label, icon, icon-only, aria-label}`. `value` — ширина письма; `frame` — ширина рамки в пикселях, если отличается от `value`. Пусто — переключателя нет, рамка занимает всё место.", "What the close stands on. surface, the default: a page, a card, a dialog. color: a coloured banner or bar; the cross takes the place's ink (currentColor) and the ghost spot is that ink at the state steps 8 / 12.": "На чём стоит крестик. `surface`, по умолчанию, — страница, карточка, окно. `color` — цветная полоса или плашка: крестик берёт цвет её текста, пятно — тот же цвет на ступенях состояния 8 / 12.", @@ -2750,7 +2750,7 @@ "ghost (default): no fill, a fill under the pointer; outline; tonal. link is ghost's former name (decision C15), read as ghost until 2027-01-01.": "ghost, по умолчанию, — без заливки, заливка под указателем; outline — с рамкой; tonal — мягкая заливка.", "ready: the file can be fetched. preparing: the application is making it -- a spinner in the sign's place, «Готовим файл…», aria-busy, a press is ignored; when the host sets ready again with an href, the file a person pressed for is fetched once. error: it could not be made -- an error notice «Не удалось подготовить файл» with «Повторить» under the file (decision C25).": "ready — файл можно скачать. preparing — приложение его готовит: на месте знака индикатор, «Готовим файл…», aria-busy, нажатие не срабатывает; когда страница снова ставит ready с адресом в href, файл, за которым пришёл человек, скачивается один раз. error — подготовить не удалось: под файлом сообщение «Не удалось подготовить файл» и кнопка «Повторить».", "A table event the view listens to: filter templates were saved (detail {templates}). The view turns each template into saveView (view.save) with key, label, revision, level, roles, layout and settings, each one its own view.save, entries without a key skipped.": "Событие таблицы, которое слушает представление: шаблоны фильтров сохранены (detail {templates}). Представление превращает каждый шаблон в saveView (view.save) с key, label, revision, level, roles, layout и settings — каждый своим view.save; записи без key пропускаются.", - "A whole theme from one colour: the eight tonal palettes as the 128 --sf-- primitives and the 160 translucent steps core defines on them (--sf----alfa-, listed in THEME_ALPHA), 288 variables in all.": "Целая тема из одного цвета: восемь тональных палитр как 128 примитивов --sf-- и 160 полупрозрачных ступеней, которые ядро задаёт на них (--sf----alfa-, список в THEME_ALPHA), всего 288 переменных.", + "A whole theme from one colour: the eight tonal palettes as the 128 --sf-- primitives and the 160 translucent steps core defines on them (--sf----alfa-, listed in THEME_ALPHA), 288 variables in all.": "Целая тема из одного цвета: тональные палитры как примитивы --sf-- и полупрозрачные ступени, которые ядро задаёт на них (--sf----alfa-, список в THEME_ALPHA).", "How the cards stand (owner decision C28). tile: cards in the grid, the control at the end of the name line, name, description and price on one left edge, the price at the foot after a divider (plans, modules). list: one frame of rows divided by lines, the control at the start, price and term a column at the end of the name line (delivery, payment); columns does not apply. picture: tiles whose image runs to the edges, the caption under it and the control at the end of the caption's name line; in a field narrower than 30rem (a phone) each tile is a row, the image at its start.": "Как стоят карточки (решение владельца C28). tile — карточки в сетке: элемент выбора в конце строки названия, название, описание и цена по одному левому краю, цена внизу после разделителя (тарифы, модули). list — одна рамка из строк, разделённых линиями: элемент выбора в начале, цена и срок — столбцом в конце строки названия (доставка, оплата); columns здесь не действует. picture — плитки с картинкой до краёв, подпись под ней, элемент выбора в конце строки названия подписи; в поле уже 30rem (телефон) каждая плитка становится строкой с картинкой в начале.", "Request persistence of one or more filter templates (order, pin, delete, default, selected flags or data): detail {templates}, one entry or several. Loading a saved view is reported by sf-table-template-select.": "Запрос на сохранение одного или нескольких шаблонов фильтров (порядок, закрепление, удаление, флаги «по умолчанию» и «выбран» или данные): detail {templates}, одна запись или несколько. О загрузке сохранённого представления сообщает sf-table-template-select.", "The control height (owner decision C27), separate from size: size sets the text, the icons and the inner scale, height picks the control height from the size's tightness steps of the adaptive-sizing contract -- low, default, high, highest, the size's usual step and its neighbours on the UI height ladder. Desktop 1/3 24/28/32/40, 1/2 28/32/40/48, 1 32/40/48/56, 2 40/48/56/68, 3 48/56/68/80; phone 1/3 20/24/28/36, 1/2 24/28/36/44, 1 28/36/44/52, 2 36/44/52/64, 3 44/52/64/76. The side padding grows with the height by half of what the height adds, so the gap from the end to the icon stays the same. A compact region (data-sf-density) shifts the steps one down and height picks the neighbour there. A value outside the list reads as default, with one console warning.": "Высота элемента управления (решение владельца C27), отдельно от size: size задаёт текст, значки и внутренний масштаб, а height выбирает высоту из ступеней плотности размера по контракту адаптивных размеров — low, default, high, highest: обычная ступень размера и её соседи на лестнице высот интерфейса. Компьютер: 1/3 — 24/28/32/40, 1/2 — 28/32/40/48, 1 — 32/40/48/56, 2 — 40/48/56/68, 3 — 48/56/68/80; телефон: 1/3 — 20/24/28/36, 1/2 — 24/28/36/44, 1 — 28/36/44/52, 2 — 36/44/52/64, 3 — 44/52/64/76. Боковой отступ растёт с высотой на половину прибавки, поэтому расстояние от края до значка не меняется. Компактная область (data-sf-density) сдвигает ступени на одну вниз, и height выбирает соседа уже там. Значение не из списка читается как default, с одним предупреждением в консоли.", @@ -2758,6 +2758,97 @@ "The hue of the static palette the initials are drawn in (owner decision C17): the plate is the hue's container, the ink its on-container. Empty: the neutral look. auto: one of eight hues (pink, amber, lime, green, teal, sky, indigo, violet) picked from the name (heading, else aria-label, else text) by a fixed hash, the same in every browser and on a server; no name, the neutral look. Only initials take a hue: an image and the placeholder stay as they are. --sf-avatar-background-color and --sf-avatar-color still win.": "Оттенок статической палитры, которым рисуются инициалы (решение владельца C17): плашка — container оттенка, буквы — его on-container. Пусто — нейтральный вид. auto — один из восьми оттенков (pink, amber, lime, green, teal, sky, indigo, violet), выбранный по имени (heading, иначе aria-label, иначе текст) постоянным хешем, одинаковым в любом браузере и на сервере; без имени — нейтральный вид. Оттенок получают только инициалы: картинка и заглушка не меняются. --sf-avatar-background-color и --sf-avatar-color по-прежнему главнее.", "The options, [{value, label, caption?, icon?, badge?, price?, term?, image?, disabled?}]: each a card with its name (label, or title), a description under it (caption), an icon on the name line, a short badge (sf-badge) beside the name, a price and its term (list: a column at the end of the name line; tile and picture: the foot of the card, after a divider) and an image (picture: to the card's edges, over the caption). A property, the JSON island or the attribute as JSON. An option without a value or repeating one is left out.": "Варианты, [{value, label, caption?, icon?, badge?, price?, term?, image?, disabled?}]: каждый — карточка с названием (label или title), описанием под ним (caption), значком в строке названия, коротким бейджем (sf-badge) рядом с названием, ценой и сроком (list — столбец в конце строки названия; tile и picture — низ карточки после разделителя) и картинкой (picture — до краёв карточки, над подписью). Свойство, JSON-остров или атрибут в виде JSON. Вариант без value или с повторяющимся value пропускается.", "The panel asks to be closed (by its close control, Esc, a press on the dimmed page or Cancel), carrying how many fields would be lost: changed and not saved, or entered and not yet a value.": "Панель просит закрыть её (своей кнопкой закрытия, Esc, нажатием на затемнённую страницу или «Отмена») и сообщает, сколько полей будет потеряно: изменённых и не сохранённых или введённых, но ещё не ставших значением.", - "The theme as one stylesheet rule of its 128 primitives and 160 translucent steps, under the given selector or the `selector` attribute.": "Тема одним правилом таблицы стилей из 128 примитивов и 160 полупрозрачных ступеней — под заданным селектором или селектором из атрибута `selector`." + "The theme as one stylesheet rule of its 128 primitives and 160 translucent steps, under the given selector or the `selector` attribute.": "Тема одним правилом таблицы стилей из примитивов и полупрозрачных ступеней — под заданным селектором или селектором из атрибута `selector`.", + "A column with a border of its own (C30 amended 2026-11-09, R072 e): a hairline of outline-variant at the surface radius, the plates space-1/4 in from it on every side, and the path to the current page marked by a 2 px primary line on its start border at the closed branch that holds it, besides the medium label. Without it a column has no frame and marks the path with the medium label alone (R065 a). A row ignores it: its panels always have the line (R084).": "Своя рамка у колонки: тонкая линия цвета `outline-variant` со скруглением поверхности, пункты отступают от неё на четверть шага со всех сторон; путь к текущей странице отмечен линией 2 px основного цвета у начала свёрнутой ветки, которая её содержит, и полужирной подписью. Без рамки колонка отмечает путь только подписью. В строке настройка не действует: у её панелей линия есть всегда.", + "A key combination drawn at the end of the field as the kbd component's soft caps in the muted ink (owner decisions C04, C38): words joined by +, e.g. mod+k (⌘K on a Mac, Ctrl K elsewhere), shift+mod+p, / or escape; mod is Cmd on Apple platforms and Ctrl elsewhere. The keys take the text step one below the value's (size 1 a plate of 20 with letters of 14). Written as aria-keyshortcuts on the native input. A hint only: the field does not listen to it. Empty: no keys": "Сочетание клавиш в конце поля мягкими клавишами в приглушённом цвете: слова через `+`, например `mod+k` (⌘K на Mac, Ctrl K на других системах), `shift+mod+p`, `/` или `escape`; `mod` — Cmd на Apple и Ctrl на остальных. Клавиши на шаг текста меньше значения. Записывается в `aria-keyshortcuts` поля. Только подсказка: поле само клавиши не слушает. Пусто — без клавиш.", + "A line under the title: where and when («Каталог «Электроника» · запущено в 14:02»). Plain text": "Строка под заголовком: где и когда («Каталог «Электроника» · запущено в 14:02»). Обычный текст.", + "A list/table switch (sf-segmented, two icons) in the toolbar before Create (owner decision C31). The choice is the person's: kept with the table's preferences (preferences-key, table-settings-key or remember-widths, else for the page) and in the settings of a saved view; with it, layout table reads as auto. Below list-below there is only the list and no switch.": "Переключатель «список / таблица» (`sf-segmented` с двумя иконками) на панели перед кнопкой создания. Выбор за человеком: он сохраняется в настройках таблицы (`preferences-key`, `table-settings-key` или `remember-widths`, иначе для страницы) и в настройках сохранённого вида; с переключателем `layout=\"table\"` читается как `auto`. Уже `list-below` остаётся только список, без переключателя.", + "A person asked for the errors: the error count link or «Ещё N ошибок». Not cancelled, the count link moves to the error list shown in the summary; the host serves the full report (a file, a page)": "Человек попросил ошибки: ссылка с числом ошибок или «Ещё N ошибок». Если событие не отменено, ссылка ведёт к списку ошибок в итоге; полный отчёт (файл, страницу) отдаёт ваше приложение.", + "A person chose «Не напоминать» (only where the host's dismissible allows it). A request: cancelled, nothing changes; not cancelled, the item is set aside with a notice and «Вернуть»; the host stores it": "Человек выбрал «Не напоминать» (только там, где это разрешает `dismissible`). Это запрос: отменили — ничего не меняется; не отменили — пункт откладывается с уведомлением и кнопкой «Вернуть»; хранит выбор ваше приложение.", + "A person chose «Отложить на день» or «на неделю» in an item's «⋯»: until is the ISO instant one or seven days on. A request: cancelled, nothing changes; not cancelled, the item is set aside here at once and a notice says so with «Вернуть». The host stores the snooze and leaves the item out of the list until then": "Человек выбрал «Отложить на день» или «на неделю» в меню «⋯» пункта: `until` — момент ISO через один или семь дней. Это запрос: отменили — ничего не меняется; не отменили — пункт сразу откладывается, а уведомление говорит об этом и предлагает «Вернуть». Отсрочку хранит ваше приложение и до её конца не показывает пункт в списке.", + "A person pressed Continue while the job was paused (pausable). A request: the host goes on and sets run-state running": "Человек нажал «Продолжить», когда задача стояла на паузе (`pausable`). Это запрос: приложение продолжает задачу и ставит `run-state=\"running\"`.", + "A person pressed Expand in the notice look. A request: the host shows the full look (in a drawer or in place)": "Человек нажал «Развернуть» в виде уведомления. Это запрос: приложение показывает полный вид (в выдвижной панели или на месте).", + "A person pressed Minimize in the full look (minimizable). A request: the host shows the notice look, in its own corner panel": "Человек нажал «Свернуть» в полном виде (`minimizable`). Это запрос: приложение показывает вид уведомления в своей угловой панели.", + "A person pressed Pause while the job ran (pausable). A request: the host pauses the job and sets run-state paused; the component changes nothing by itself": "Человек нажал «Пауза» во время работы задачи (`pausable`). Это запрос: приложение приостанавливает задачу и ставит `run-state=\"paused\"`; компонент сам ничего не меняет.", + "A person pressed Retry (vocabulary §5 retry): {scope: failed} after a partial result -- only what failed; {scope: all, from?} after a failure (from: the failed step's id) or a cancel. The host starts the job again and sets the steps anew": "Человек нажал «Повторить»: `{scope: failed}` после частичного результата — только то, что не удалось; `{scope: all, from?}` после сбоя (`from` — шаг, на котором произошёл сбой) или отмены. Приложение запускает задачу заново и задаёт шаги снова.", + "A person pressed a link of an item: its action's (part action), its object's (part object) or «Подробнее о проверке» in its «⋯» (part help) (vocabulary §5 navigate {id, href}). A request: a page cancels it to go there itself (a router); not cancelled, the browser follows href. A press with a modifier key or a middle button opens the link elsewhere and asks nothing": "Человек нажал ссылку пункта: его действия (часть `action`), его объекта (часть `object`) или «Подробнее о проверке» в меню «⋯» (часть `help`); в событии `{id, href}`. Это запрос: страница отменяет его, чтобы перейти сама (роутер); не отменили — браузер переходит по `href`. Нажатие с клавишей-модификатором или средней кнопкой открывает ссылку в другом месте и ничего не спрашивает.", + "A person pressed a value link or an action link (an action with href) (vocabulary §5 navigate {id, href}). A request: a page cancels it to go there itself (a router); not cancelled, the browser follows href. A press with a modifier key or a middle button opens the link elsewhere and asks nothing": "Человек нажал ссылку значения или ссылку действия (действие с `href`); в событии `{id, href}`. Это запрос: страница отменяет его, чтобы перейти сама (роутер); не отменили — браузер переходит по `href`. Нажатие с клавишей-модификатором или средней кнопкой открывает ссылку в другом месте и ничего не спрашивает.", + "A person pressed an item's or a section's action button, one without href (vocabulary §5 apply {action, scope: entry, ids}): action is the action's event («edit» when it names none), ids and id the item's or the section's id, kind item or section. The page does it (opens a form, a dialog) and sets the list again": "Человек нажал кнопку действия пункта или раздела без `href`: `action` — событие действия (`edit`, если оно не названо), `ids` и `id` — идентификатор пункта или раздела, `kind` — `item` или `section`. Страница выполняет действие (открывает форму, диалог) и задаёт список заново.", + "A person pressed «Вернуть» on the notice of a snooze or a dismiss (action snooze | dismiss): the item is back in the list; the host forgets what it stored": "Человек нажал «Вернуть» в уведомлении об отсрочке или отказе (`action` — `snooze` или `dismiss`): пункт вернулся в список, приложение забывает сохранённый выбор.", + "A person pressed «Все проблемы (N)»: with more-href a link, the request first (a router cancels it); without it «Показать все (N)», and not cancelled, every row is shown in place": "Человек нажал «Все проблемы (N)»: с `more-href` это ссылка, и сначала идёт запрос (роутер его отменяет); без него — «Показать все (N)», и если запрос не отменён, все строки показываются на месте.", + "A person pressed «Проверить снова» (shown with checked-at). The host runs the checks and sets items and checked-at again": "Человек нажал «Проверить снова» (кнопка видна вместе с `checked-at`). Приложение запускает проверки и задаёт `items` и `checked-at` заново.", + "A row with overflow more changed which first-level items it shows: hidden, the ids of the items now in «Ещё», in their order (empty when all fit again).": "Строка с `overflow=\"more\"` поменяла набор пунктов первого уровня: `hidden` — идентификаторы пунктов, ушедших в «Ещё», по порядку (пусто, когда снова всё помещается).", + "A search field over a column (C30 amended 2026-11-09, R071 a; off by default, never by the number of items): the rows are filtered as the field is typed in -- without case, ё as е, on the items' words and the group headings; a match keeps its parents, opened, a matching item keeps its children, closed, a matching heading keeps its group -- and the matched words are highlighted (::highlight(sf-menu-match), --sf-mark). Down from the field enters the results, Down and Up walk them, Up from the first goes back; Escape clears the field, or goes back to it from the results. A polite live region says how many matched; «Ничего не найдено» when none. The field stands still and the rows scroll when the host gives the menu a height. A row ignores it.": "Поле поиска над колонкой (по умолчанию выключено и не включается от числа пунктов): строки отбираются по мере ввода — без учёта регистра, «ё» как «е», по словам пунктов и заголовкам групп; у совпадения остаются родители, раскрытыми, у совпавшего пункта — дети, свёрнутыми, у совпавшего заголовка — его группа; найденные слова подсвечиваются (`::highlight(sf-menu-match)`, `--sf-mark`). Стрелка вниз из поля переходит к результатам, вниз и вверх идут по ним, вверх с первого возвращает в поле; Escape очищает поле или возвращает в него из результатов. Вежливая живая область сообщает, сколько найдено; «Ничего не найдено», если ничего. Поле стоит на месте, а строки прокручиваются, когда приложение задаёт меню высоту. В строке настройка не действует.", + "Appends text to the output: chunk({text, step?}), the object form of vocabulary §5.2 chunk {id, text} of a stream (a rule hands a job's output chunk on); a plain string, chunk(text), is accepted as shorthand. With step the text goes to that step's own log (its row opens it; a failed step's log is open by itself); without step to the run's output. A line break ends a line; the pane follows the new text only while the reader is at its end. Refused {reason: invalid} for no text, {reason: missing} for a step the run does not have": "Добавляет текст в вывод: `chunk({text, step?})`; строка `chunk(text)` — короткая запись. Со `step` текст идёт в журнал этого шага (его строка раскрывает журнал; у шага со сбоем он открыт сам); без `step` — в общий вывод. Перевод строки заканчивает строку; панель следует за новым текстом, только пока читатель в её конце. Отказ `{reason: invalid}` — нет текста, `{reason: missing}` — такого шага нет.", + "At most this many rows; the rest are behind «Все проблемы (N)» (more-href) or «Показать все (N)» in place. 0 shows every row. Group mode shows every row": "Не больше стольких строк; остальные — за «Все проблемы (N)» (`more-href`) или «Показать все (N)» на месте. `0` показывает все строки. В режиме групп видны все строки.", + "Changes one step: the fields given replace that step's (state, text, value, total, started, finished, duration). Refused {reason: missing} for an id the run does not have": "Меняет один шаг: переданные поля заменяют поля шага (`state`, `text`, `value`, `total`, `started`, `finished`, `duration`). Отказ `{reason: missing}` — такого шага нет.", + "Choose the list or the table for this person, as the layout switch does: kept with the table's preferences and drawn. Refused for another value; unchanged when it is the choice already.": "Выбирает для человека список или таблицу, как переключатель: выбор сохраняется в настройках таблицы и сразу рисуется. Другое значение отклоняется; если выбор уже такой, ничего не меняется.", + "Each problem gets a «⋯» menu: «Отложить на день», «Отложить на неделю» and, where the person may, «Не напоминать». A choice asks snooze {id, until} or dismiss {id}, then sets the problem aside with a notice whose «Вернуть» sends undo. A problem with help has the menu without triage too (only «Подробнее о проверке»)": "У каждой проблемы есть меню «⋯»: «Отложить на день», «Отложить на неделю» и, где человеку можно, «Не напоминать». Выбор запрашивает `snooze {id, until}` или `dismiss {id}`, затем откладывает проблему с уведомлением, в котором «Вернуть» отправляет `undo`. Проблема с `help` получает меню и без этой настройки (только «Подробнее о проверке»).", + "Enter or Space presses a button; Enter follows the error link": "Enter или пробел нажимает кнопку; Enter переходит по ссылке на ошибки.", + "Group mode's «Пройдено»: the checks that passed, strings or {id?, title, text?}, a closed group after the problems": "«Пройдено» в режиме групп: проверки, которые прошли, — строки или `{id?, title, text?}`; закрытая группа после проблем.", + "How a row marks its first-level section that is the current page or holds it (C30, R060): line (the default), a 2 px primary line under the whole control lying on the header's bottom border, as the tabs do (sf-header-site publishes that edge), and a medium label; fill, the C23 plate, for a header with no bottom border (over a photo, transparent). An open section has the neutral select plate, never primary.": "Как строка отмечает раздел первого уровня, который является текущей страницей или содержит её: `line` (по умолчанию) — линия 2 px основного цвета под всем пунктом на нижней границе шапки, как у вкладок (`sf-header-site` публикует эту границу), и полужирная подпись; `fill` — подложка, для шапки без нижней границы (поверх фото, прозрачной). Открытый раздел получает нейтральную подложку выбора, никогда не основной цвет.", + "How a row's branch opens with a mouse: hover (the default), a mouse resting on a branch opens it after 300 ms -- a region after 500 ms -- and it closes 500 ms after the mouse has left the branch and its panel (NN/g, WCAG 1.4.13); click, only a press. Touch, a pen and the keyboard always go through the branch's chevron: a section that is a page is a split control, its name a link and the chevron beside it a button «<раздел>: подразделы» (C30, APG disclosure navigation with top-level links).": "Как ветка строки открывается мышью: `hover` (по умолчанию) — мышь, задержавшаяся на ветке, открывает её через 300 мс (область — через 500 мс), а закрывается ветка через 500 мс после того, как мышь ушла с неё и с её панели; `click` — только нажатием. Касание, перо и клавиатура всегда открывают ветку шевроном: раздел, который сам является страницей, — составной пункт, его название — ссылка, а шеврон рядом — кнопка «<раздел>: подразделы».", + "How many errors the job had in all (40). Above the errors shown, «Ещё 35 ошибок» sends report; above 0 an auto run that finished is partial": "Сколько всего ошибок было у задачи (например `40`). Если больше показанных — «Ещё 35 ошибок» отправляет `report`; при значении больше `0` завершённая задача в `auto` считается частично выполненной.", + "How much is done, in units of total (4812). With total the overall bar is determinate and the figures read «4 812 из 12 000 товаров · 40 %»; without total the bar runs (indeterminate) and the figure reads the count so far": "Сколько сделано, в единицах `total` (например `4812`). С `total` общая полоса показывает долю, а цифры читаются «4 812 из 12 000 товаров · 40 %»; без `total` полоса бежит (неопределённый ход), а цифра показывает, сколько сделано на сейчас.", + "How much there is (12000). Unset or 0: the size is not known yet and the bar runs; once set the same bar fills, once (C34)": "Сколько всего (например `12000`). Не задано или `0` — размер ещё неизвестен, полоса бежит; как только значение задано, та же полоса заполняется, один раз.", + "How the records are drawn, passed to the table (owner decision C31): auto, a table where there is room and the list below list-below; table; list. A table the host wrote a layout on keeps it. An embedded view (no toolbar) without this attribute is a table, as before.": "Как рисуются записи, передаётся таблице: `auto` — таблица, где хватает места, и список уже `list-below`; `table`; `list`. Таблица, которой приложение задало `layout`, сохраняет его. Встроенный вид (без панели инструментов) без этого атрибута — таблица, как раньше.", + "How the records are drawn: a table, a compact list of records, or auto -- a table while the table's container is at least list-below pixels wide, the list below that. sf-view asks for auto on a page's list. With layout-switch, the person's choice comes first.": "Как рисуются записи: таблица, компактный список записей или `auto` — таблица, пока её контейнер не уже `list-below` пикселей, и список, когда уже. `sf-view` просит `auto` для списка страницы. С `layout-switch` первым идёт выбор человека.", + "How wide openFor() opens the menu, by what it holds (decision C32; the steps are core's --sf-popup-*-width, compact density moves them with the text): content (a menu: its longest line, between --sf-popup-menu-min-width and --sf-popup-menu-max-width, 10-18rem, 9-16rem compact), list (choices at a field: at least the trigger, up to --sf-popup-list-max-width or the trigger, whichever is wider), panel (a panel with a search and actions: --sf-popup-panel-width or the trigger, whichever is wider, fixed), form and form-wide (a form: --sf-popup-form-width or --sf-popup-form-wide-width; on a phone (below 44rem) a sheet at the bottom of the screen, its whole width, over the scrim; focus goes to its first field and Escape closes it), trigger (exactly the control that opened it; a long line ends in an ellipsis) or a CSS length. Every kind stays inside the screen. While open the menu publishes the trigger's width as --sf-context-menu-trigger-inline-size. openFor(anchor, {width}) overrides it.": "Какой ширины `openFor()` открывает меню, по тому, что в нём (шаги — переменные ядра `--sf-popup-*-width`, компактная плотность сдвигает их вместе с текстом): `content` — меню: по самой длинной строке, между `--sf-popup-menu-min-width` и `--sf-popup-menu-max-width` (10–18rem, в компактной плотности 9–16rem); `list` — варианты у поля: не уже кнопки, до `--sf-popup-list-max-width` или ширины кнопки, что шире; `panel` — панель с поиском и действиями: `--sf-popup-panel-width` или ширина кнопки, что шире, постоянная; `form` и `form-wide` — форма: `--sf-popup-form-width` или `--sf-popup-form-wide-width`, а на телефоне (уже 44rem) — лист внизу экрана во всю ширину поверх затемнения, фокус на первом поле, Escape закрывает; `trigger` — ровно ширина открывшего элемента, длинная строка кончается многоточием; или длина CSS. Любой вариант остаётся в пределах экрана. Пока меню открыто, оно публикует ширину открывшего элемента в `--sf-context-menu-trigger-inline-size`. `openFor(anchor, {width})` её переопределяет.", + "In the «⋯» menu the arrows move, Enter chooses, Escape closes and gives the focus back": "В меню «⋯» стрелки двигают выбор, Enter выбирает, Escape закрывает и возвращает фокус.", + "Loading state: the spinner at the icon's size in place of the start icon (else the end icon); without an icon it lies over the label, which keeps its place, so the width does not change. The spinner takes the page's look (data-sf-spinner) and the label's ink. The inner button is unavailable while it loads but keeps its scheme colour (owner decision C36); a button that is also disabled wears the disabled look.": "Загрузка: спиннер размером с иконку вместо начальной иконки (иначе — вместо конечной); без иконки он ложится поверх подписи, а подпись сохраняет место, так что ширина не меняется. Спиннер берёт вид страницы (`data-sf-spinner`) и цвет подписи. Пока идёт загрузка, кнопка недоступна, но сохраняет цвет своей схемы; кнопка, которая ещё и отключена, выглядит отключённой.", + "Shows Minimize in the full look; its press sends minimize, and the host shows the notice look (a corner panel is the page's composition)": "Показывает «Свернуть» в полном виде; нажатие отправляет `minimize`, и приложение показывает вид уведомления (угловую панель собирает страница).", + "Shows Pause while the job runs and Continue while it is paused; their presses send pause and resume. Only where the host can really pause the job (C34)": "Показывает «Пауза», пока задача работает, и «Продолжить», пока она на паузе; нажатия отправляют `pause` и `resume`. Только там, где приложение действительно может приостановить задачу.", + "Shows Retry after a failure, a cancel or a partial result; its press sends retry {scope, from?}: «Повторить неудачные» (scope failed) on partial, «Повторить» (scope all, from the failed step) on a failure": "Показывает «Повторить» после сбоя, отмены или частичного результата; нажатие отправляет `retry {scope, from?}`: «Повторить неудачные» (`scope: failed`) при частичном результате, «Повторить» (`scope: all`, с шага сбоя) при сбое.", + "Size on the ladder: as a button the box is the icon button's, the control ladder (1/3 28px, 1/2 32, 1 40, 2 48, 3 56; on a phone 24, 28, 36, 44, 52; size 1/3 is 28 on the desktop by owner decision C27) and the cross its step; 1/4 and 4-7 are glyph sizes only, drawn by a button at the nearest ladder step. The line is 2px at every size.": "Размер по шкале: как кнопка — рамка кнопки-иконки по шкале элементов управления (1/3 — 28 px, 1/2 — 32, 1 — 40, 2 — 48, 3 — 56; на телефоне 24, 28, 36, 44, 52), а крестик — её шаг; 1/4 и 4–7 — только размеры знака, кнопка рисует их на ближайшем шаге шкалы. Линия — 2 px на любом размере.", + "Tab reaches each item's object link, action and «⋯» in order, then the foot's recheck and «Все проблемы»; Enter follows a link, Enter or Space presses a button": "Tab проходит по ссылке объекта, действию и «⋯» каждого пункта по порядку, затем по «Проверить снова» и «Все проблемы» внизу; Enter переходит по ссылке, Enter или пробел нажимает кнопку.", + "Tab reaches the error link, the step logs, the output toggle, the output, copy, download and the actions in order": "Tab проходит по ссылке на ошибки, журналам шагов, переключателю вывода, выводу, копированию, скачиванию и действиям по порядку.", + "Tab reaches, in reading order, each section's action, each help mark, each value link, each copy button, each item's action and, with overflow truncate, each cut value; Enter follows a link, copies or presses the action": "Tab проходит в порядке чтения по действию каждого раздела, каждой метке справки, каждой ссылке значения, каждой кнопке копирования, действию каждого пункта и, с `overflow=\"truncate\"`, по каждому обрезанному значению; Enter переходит по ссылке, копирует или выполняет действие.", + "The button's height (owner decisions C27, C35), as on sf-button and sf-button-icon: size sets the cross and the box's step, height picks the box's height from that step's tightness steps -- low, default, high, highest -- on the UI height ladder; the box stays square and the cross keeps its size. Size 1 on desktop 32/40/48/56, phone 28/36/44/52; without a size, a height makes it a control of its place (DEV D1 on C35): size 1, which a compact region moves down, so is 32, compact and phone 28, the notice's close; an explicit size keeps its step in a compact region (C22), as every size does; without a size or a height it stays 1/3. Inside a containing button the element is the cross only and height does nothing. A value outside the list reads as default.": "Высота кнопки, как у `sf-button` и `sf-button-icon`: `size` задаёт крестик и шаг рамки, `height` выбирает высоту рамки из ступеней этого шага — `low`, `default`, `high`, `highest` — по шкале высот; рамка остаётся квадратной, а крестик сохраняет размер. Размер 1 на компьютере — 32/40/48/56, на телефоне — 28/36/44/52. Без `size` высота делает кнопку элементом управления своего места: размер 1, который компактная область сдвигает вниз, так что `` — 32, в компактной области и на телефоне 28, как закрытие уведомления; явный `size` сохраняет свой шаг в компактной области, как любой размер; без `size` и `height` остаётся 1/3. Внутри кнопки-владельца элемент — только крестик, и `height` ничего не делает. Значение вне списка читается как `default`.", + "The control fills its container, as sf-segmented's full-width does, and its content stays in the middle; without it the button is as wide as its content (owner decision C36). The height does not change.": "Элемент заполняет контейнер, как `full-width` у `sf-segmented`, а содержимое стоит посередине; без атрибута кнопка шириной по содержимому. Высота не меняется.", + "The control height (owner decisions C27, C35), as on sf-button: size sets the icon and the inner scale, height picks the control height from the size's tightness steps -- low, default, high, highest, the size's usual step and its neighbours on the UI height ladder. The button stays square: the step is the padding on all four sides. Desktop 1/3 24/28/32/40, 1/2 28/32/40/48, 1 32/40/48/56, 2 40/48/56/68, 3 48/56/68/80; phone 1/3 20/24/28/36, 1/2 24/28/36/44, 1 28/36/44/52, 2 36/44/52/64, 3 44/52/64/76. A compact region (data-sf-density) shifts the steps one down. kind=\"close\" takes the same heights. A value outside the list reads as default.": "Высота элемента, как у `sf-button`: `size` задаёт иконку и внутреннюю шкалу, `height` выбирает высоту из ступеней размера — `low`, `default`, `high`, `highest`: обычный шаг размера и его соседи по шкале высот. Кнопка остаётся квадратной: шаг — отступ со всех четырёх сторон. Компьютер: 1/3 — 24/28/32/40, 1/2 — 28/32/40/48, 1 — 32/40/48/56, 2 — 40/48/56/68, 3 — 48/56/68/80; телефон: 1/3 — 20/24/28/36, 1/2 — 24/28/36/44, 1 — 28/36/44/52, 2 — 36/44/52/64, 3 — 44/52/64/76. Компактная область (`data-sf-density`) сдвигает ступени на одну вниз. `kind=\"close\"` берёт те же высоты. Значение вне списка читается как `default`.", + "The facts in order, each {label, value, id?, hint?, mono?, numeric?, copy?, href?, status?, badge?, help?, empty?, action?}, and section items {type: \"section\", label, id?, action?} that open a section of the record (decision C33). A property, or the JSON island a server prints. value is text (a number is written as it is, in figures of one width); an empty value (no text and no badge) shows empty (the item's words) or empty-text, and then no link, no copy button and no status are drawn. mono writes the value in the monospace face (a path, a hash, a key), numeric in figures of one width (a sum), copy adds a button that copies it (always shown), href makes it a link, status puts a status icon before it (success, warning, error, info; neutral or none draws nothing; none with a badge, the badge is the one mark), badge draws an sf-badge on the value's line ({text, status | scheme, icon?}), hint is a line under it, help puts a help mark (sf-help-mark) after the label, action one ghost button after the value -- an empty value's «Указать» too ({label, event?, href?}; a press asks apply, or navigate with href). A section's label is its title, a heading at heading-level, its action stands at the head's end. Every label of a record with sections shares one column. An item without a label is left out": "Сведения по порядку, каждое — `{label, value, id?, hint?, mono?, numeric?, copy?, href?, status?, badge?, help?, empty?, action?}`, и разделы `{type: \"section\", label, id?, action?}`, которые открывают раздел записи. Свойство или JSON-остров, который печатает сервер. `value` — текст (число пишется как есть, цифрами одной ширины); у пустого значения (ни текста, ни значка) показывается `empty` пункта или `empty-text`, и тогда нет ни ссылки, ни кнопки копирования, ни статуса. `mono` пишет значение моноширинным шрифтом (путь, хеш, ключ), `numeric` — цифрами одной ширины (сумма), `copy` добавляет кнопку копирования (видна всегда), `href` делает значение ссылкой, `status` ставит перед ним иконку статуса (`success`, `warning`, `error`, `info`; `neutral` или `none` ничего не рисуют; `none` со значком — значок единственная метка), `badge` рисует `sf-badge` в строке значения (`{text, status | scheme, icon?}`), `hint` — строка под значением, `help` ставит метку справки (`sf-help-mark`) после подписи, `action` — одну кнопку-ссылку после значения, у пустого значения — и «Указать» (`{label, event?, href?}`; нажатие запрашивает `apply`, а с `href` — `navigate`). Подпись раздела — его заголовок уровня `heading-level`, действие стоит в конце его шапки. Все подписи записи с разделами делят одну колонку. Пункт без подписи пропускается.", + "The first errors of the job, each {where?, key?, text}: where it happened (a row «218»), what (an article «TV-55-QL»), and why. The first 5 are shown in the summary; errors-total says how many there are": "Первые ошибки задачи, каждая — `{where?, key?, text}`: где случилась (строка «218»), что (артикул «TV-55-QL») и почему. В итоге показываются первые 5; сколько их всего — в `errors-total`.", + "The heading; «Требует внимания» / «Needs attention» in the page language when not set. The summary badges, one per severity, stand beside it": "Заголовок; если не задан — «Требует внимания» / «Needs attention» на языке страницы. Рядом стоят значки итога, по одному на степень важности.", + "The items, [{id, label, href?, icon?, badge?, count?, status?, current?, disabled?, open?, region?, target?, external?, children?}] and first-level groups {group: true, label, collapsible?, open?, items}: an array in the property, the same array as JSON in the attribute. Without items the element reads the nested