Интерфейс
Pairx рисует вокруг приложения свою шапку: название, пометку «Код пользователя · автор», «Закрыть» и меню (код приложения, жалоба, удаление своих данных). Всё остальное — страница приложения. Чтобы она выглядела частью Pairx, у моста есть нативные элементы.
Заставка и app.ready#
Пока страница загружается, Pairx показывает заставку со значком и названием. Вызовите app.ready, как только нарисован первый экран, — заставка уйдёт:
await load(); // снимок, первый рендер
pairx.call("app.ready");Если приложение не вызвало app.ready, заставка уходит сама после загрузки страницы.
Главная кнопка#
Нативная кнопка Pairx внизу экрана: та же, что в остальном Pairx, над клавиатурой и с учётом жестов системы. Подходит для главного действия экрана — «Отправить», «Встать в очередь», «Проголосовать».
await pairx.call("ui.mainButton", { text: "Проголосовать", visible: true });
pairx.on("ui.mainButton.clicked", async () => {
pairx.call("ui.mainButton", { progress: true }); // индикатор вместо надписи
try { await vote(); }
finally { pairx.call("ui.mainButton", { visible: false }); }
});Параметры, которые не переданы, остаются прежними: { progress: true } не меняет надпись. Пустой text или visible: false прячет кнопку.
«Назад»#
Если в приложении несколько экранов, покажите «Назад» в шапке Pairx вместо «Закрыть»:
function openDetails() {
showScreen("details");
pairx.call("ui.backButton", { visible: true });
}
pairx.on("ui.backButton.clicked", () => {
showScreen("list");
pairx.call("ui.backButton", { visible: false });
});Системный жест «назад» на Android следует за этой кнопкой: пока она показана, жест приходит тем же событием, а не закрывает приложение.
Окна и подсказки#
const choice = await pairx.call("ui.popup", {
message: "Удалить запись?",
buttons: [{ id: "cancel", text: "Отмена", type: "cancel" }, { id: "delete", text: "Удалить", type: "destructive" }],
});
if (choice === "delete") remove();
pairx.call("ui.toast", { text: "Скопировано" });Заголовок окна Pairx пишет сам: «Название · код пользователя». Так окно приложения нельзя принять за окно Pairx — и поэтому в тексте не стоит просить пароли и коды: люди знают, что Pairx так не делает.
Тема#
CSS prefers-color-scheme в приложении следует теме Pairx, а не системы. Поддержите обе:
:root { color-scheme: light dark; --bg: #f5f6f8; --text: #1b1e24; }
@media (prefers-color-scheme: dark) { :root { --bg: #101113; --text: #f3f4f7; } }Точные цвета Pairx отдаёт ui.theme, а при смене темы на открытом приложении приходит событие theme.changed:
function apply({ colors }) {
for (const [name, value] of Object.entries(colors)) document.documentElement.style.setProperty(`--pairx-${name}`, value);
}
apply(await pairx.call("ui.theme"));
pairx.on("theme.changed", apply);Отступы#
ui.safeArea отдаёт отступы, которые нужно оставить у краёв. Шапку и главную кнопку Pairx рисует вне страницы, их место уже учтено: снизу отступ нужен, только пока главная кнопка скрыта.
Вёрстка#
- Ширина от 320 px, высота — весь экран под шапкой Pairx.
- Размер текста не меньше 15 px, области нажатия — не меньше 44 × 44 px.
- Системный шрифт:
-apple-system, system-ui, sans-serif. <meta name="viewport" content="width=device-width, initial-scale=1">обязателен, иначе страница уменьшится.
Копирование#
clipboard.writeText копирует текст до 10 000 символов — только в ответ на нажатие человека:
copyButton.onclick = async () => {
await pairx.call("clipboard.writeText", { text: code });
pairx.call("ui.toast", { text: "Скопировано" });
};