poe-svelte-ui-lib 1.56.0 → 1.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/Table/README.md +1 -1
- package/dist/Table/Table.svelte +1 -1
- package/dist/WidgetDeviceInfo/README.md +2 -2
- package/dist/WidgetFileSystem/README.md +1 -1
- package/dist/WidgetMap/README.md +1 -1
- package/dist/WidgetPFD/README.md +1 -1
- package/dist/WidgetRGBStrip/ColorPicker.svelte +1 -1
- package/dist/WidgetRGBStrip/README.md +2 -2
- package/dist/WidgetStackInfo/README.md +2 -2
- package/dist/WidgetWiFi/README.md +1 -1
- package/dist/WidgetWiFi/WidgetWiFi.svelte +1 -1
- package/dist/hints.js +14 -7
- package/dist/locales/i18n.d.ts +1 -0
- package/dist/locales/i18n.js +17 -1
- package/dist/locales/translations.js +8 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -57,7 +57,9 @@ npm install poe-svelte-ui-lib
|
|
|
57
57
|
|
|
58
58
|
**Поверхности — четыре ступени, заметные в обеих темах:** фон страницы `--bg-body` → панель `--back-color` → блок внутри панели `--container-color` → поле `--field-color` (в тёмной теме поле темнее блока — «утоплено»). Готовые рецепты — классы `ui-panel` (блок прямо на фоне страницы: карточка, шапка раздела, холст, область чата — заливка панели, волосяная рамка, лёгкая тень) и `ui-inset` (блок внутри панели: группа полей, шапка карточки, подложка сообщения). Отступы и скругление задаёт страница классами Tailwind. Панели не делаются полупрозрачными (`bg-(--back-color)/50` сливается с фоном): выпадающие меню и всплывающие блоки — `ui-panel` с тенью `--elevation-3`, свои сообщения в чатах — `--accent-soft`, чужие — `--container-color`.
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
**Названия смарт-виджетов** — в словаре библиотеки на всех языках (WiFi, «Об устройстве», «Файловая система», «Стек и задачи», «RGB лента», «Пилотажный дисплей», «Карта»); пустой `label.name` показывает название на языке пользователя, `widgetTitle(type)` отдаёт его сразу на всех языках `{ ru, en, zh }` — так конструктор заполняет заголовок нового виджета.
|
|
61
|
+
|
|
62
|
+
**Подсказки смарт-виджетов** — `hints.ts`: у каждого виджета своя кнопка «?» в правом краю шапки (`WidgetHeader` с пропом `hints`), по умолчанию подсказки выключены, выбор оператора запоминается в браузере для виджетов этого типа (`hintsSetting("WidgetPFD")`, ключ `localStorage` `WidgetHints.<тип>`, пишется только по нажатию «?»), глобального переключателя нет. Элемент получает подсказку действием `use:hint={{ text, enabled: $hints }}` — всплывающее окно в стиле темы над элементом; тексты — в словаре библиотеки (`widget.*.hint.*`), только там, где смысл поля не очевиден.
|
|
61
63
|
|
|
62
64
|
**Предпросмотр темы** — вкладка «Тема» на главной витрины (`src/routes/ThemePreview.svelte`): палитра токенов и состояния, затем все компоненты и виджеты в порядке меню витрины — каждый тип в своём разделе с живыми демо-данными (графики, видео, полёт для PFD и карты), в конце типографика и Markdown; тема переключается кнопкой в шапке витрины. Правьте `theme.css` и смотрите результат там.
|
|
63
65
|
|
package/dist/Table/README.md
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
### Шапка
|
|
23
23
|
|
|
24
|
-
- Фон шапки — токен `--table-header-color`, по умолчанию `--
|
|
24
|
+
- Фон шапки — токен `--table-header-color`, по умолчанию мягкий акцент `--accent-soft`, текст шапки — в тон акценту. Внутри смарт-виджета он равен мягкому оттенку мастер-цвета (`widgetAccentStyle`), поэтому шапка перекрашивается вместе с виджетом.
|
|
25
25
|
- Когда у тела появляется полоса прокрутки, шапка сдвигается ровно на её фактическую ширину (`offsetWidth − clientWidth`, пересчёт при изменении строк и размеров) — столбцы шапки и строк совпадают. Для полос поверх содержимого (macOS) сдвиг 0.
|
|
26
26
|
|
|
27
27
|
### Адаптивность
|
package/dist/Table/Table.svelte
CHANGED
|
@@ -259,7 +259,7 @@
|
|
|
259
259
|
<div class="relative flex h-full w-full flex-col overflow-hidden rounded-[14px] border border-(--hairline-color) bg-(--back-color)">
|
|
260
260
|
<!-- Table Header -->
|
|
261
261
|
<div
|
|
262
|
-
class="grid border-b border-(--hairline-color) bg-[var(--table-header-color,var(--
|
|
262
|
+
class="grid border-b border-(--hairline-color) bg-[var(--table-header-color,var(--accent-soft))] text-[11px] font-bold tracking-[0.06em] text-[color-mix(in_srgb,var(--accent-color)_60%,var(--font-color))] uppercase"
|
|
263
263
|
style={`grid-template-columns: ${gridTemplate}; padding-right: ${scrollbarWidth}px;`}
|
|
264
264
|
>
|
|
265
265
|
{#each header as column, index (column)}
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
| ---------------- | ----------------------------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
40
40
|
| `wrapperClass` | `string` | `""` | CSS-классы для обёртки компонента |
|
|
41
41
|
| `componentClass` | `string` | `""` | "Мастер-цвет" виджета — роль вида `"bg-red"` (см. `optionsStore.COLOR_OPTIONS`) |
|
|
42
|
-
| `label` | `{ name?: string }` | `{}` | Заголовок карточки; пустой —
|
|
42
|
+
| `label` | `{ name?: string }` | `{}` | Заголовок карточки; пустой — «Об устройстве» на текущем языке |
|
|
43
43
|
| `value` | `IWidgetDeviceInfoConfig` | внутренний дефолт | Текущая информация об устройстве |
|
|
44
44
|
| `collapsed` | `boolean` | `false` | Свёрнуто ли тело виджета (заголовок остаётся); поддерживает двустороннее связывание (`$bindable`) |
|
|
45
45
|
| `persistKey` | `string` | `undefined` | Ключ для сохранения состояния `collapsed` в `localStorage` — при заданном ключе состояние сворачивания переживает перезагрузку страницы |
|
|
@@ -109,4 +109,4 @@
|
|
|
109
109
|
|
|
110
110
|
### Подсказки
|
|
111
111
|
|
|
112
|
-
Кнопка «?» в правом краю шапки включает и выключает подсказки этого
|
|
112
|
+
Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetDeviceInfo` в браузере (`hintsSetting("WidgetDeviceInfo")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
|
|
@@ -118,4 +118,4 @@
|
|
|
118
118
|
|
|
119
119
|
### Подсказки
|
|
120
120
|
|
|
121
|
-
Кнопка «?» в правом краю шапки включает и выключает подсказки этого
|
|
121
|
+
Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetFileSystem` в браузере (`hintsSetting("WidgetFileSystem")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
|
package/dist/WidgetMap/README.md
CHANGED
|
@@ -98,4 +98,4 @@ Telemetry_SendObject(g_telemetry_stream, g_mcfg.DevSN, "Data", dev, sizeof(dev)
|
|
|
98
98
|
|
|
99
99
|
### Подсказки
|
|
100
100
|
|
|
101
|
-
Кнопка «?» в правом краю шапки включает и выключает подсказки этого
|
|
101
|
+
Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetMap` в браузере (`hintsSetting("WidgetMap")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
|
package/dist/WidgetPFD/README.md
CHANGED
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
- **Авиагоризонт** — небо и земля по крену и тангажу, лестница тангажа через 5°, дуга крена (10/20/30/45/60°), символ самолёта. Ориентация сглаживается между пакетами (Tween 120 мс).
|
|
71
71
|
- **Лента скорости** (слева, путевая над землёй) и **лента высоты** (справа, над точкой взлёта) с вариометром у края, **лента курса** (снизу): розовый ▲ — трек (куда аппарат реально движется, по `Vx`/`Vy`), зелёный ● — направление на точку взлёта.
|
|
72
72
|
- **Углы под лентами** — воздушная скорость (относительно воздуха, отличается от путевой на ветер) и вертикальная скорость (+ набор зелёным, − снижение оранжевым).
|
|
73
|
-
- **Подсказки** — наведите курсор на любой элемент прибора, строки состояния или значений: расшифровка появляется в информационной строке внизу горизонта: первая строка — величина, единица и текущее значение (обновляется, пока курсор стоит на месте), ниже по строке — что означают знаки, цвета и пороги. Элемент помечен `data-tip` с ключом, тексты собраны в `tips` в скрипте виджета, поэтому её не обрезают края и прокрутка. Без наведения в той же строке — последнее сообщение автопилота (10 с), наведение на неё показывает историю. Включаются и выключаются кнопкой «?» в шапке; выбор общий для всех PFD в браузере (`hintsSetting("WidgetPFD")` из `hints.ts`, ключ `localStorage` `
|
|
73
|
+
- **Подсказки** — наведите курсор на любой элемент прибора, строки состояния или значений: расшифровка появляется в информационной строке внизу горизонта: первая строка — величина, единица и текущее значение (обновляется, пока курсор стоит на месте), ниже по строке — что означают знаки, цвета и пороги. Элемент помечен `data-tip` с ключом, тексты собраны в `tips` в скрипте виджета, поэтому её не обрезают края и прокрутка. Без наведения в той же строке — последнее сообщение автопилота (10 с), наведение на неё показывает историю. Включаются и выключаются кнопкой «?» в шапке; выбор общий для всех PFD в браузере (`hintsSetting("WidgetPFD")` из `hints.ts`, ключ `localStorage` `WidgetHints.WidgetPFD`, по умолчанию выключены; прежний выбор `WidgetPFD.tips` переносится).
|
|
74
74
|
- **Под прибором** — группы «Маршрут» (точка, расстояние, боковое отклонение), «Дом» (расстояние и направление), «Трек», «Позиция» (координаты, MSL), «Воздух» (давление, температура); каждая величина показана один раз.
|
|
75
75
|
- **Метки целей** (бирюзовые) — целевая скорость и высота текущей точки на лентах, курс на точку ◆ на ленте курса; цель за пределами ленты прижимается к краю.
|
|
76
76
|
- **Сообщения автопилота** (`STATUSTEXT`) — в информационной строке внизу горизонта на 10 с, цвет по важности; история последних пяти — при наведении на строку.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- $lib/WidgetRGBStrip/ColorPicker.svelte — внутренняя палитра виджета
|
|
1
|
+
<!-- $lib/WidgetRGBStrip/ColorPicker.svelte — внутренняя палитра виджета «RGB лента» (HSV + белый), отдельным компонентом библиотеки не экспортируется -->
|
|
2
2
|
<script lang="ts">
|
|
3
3
|
import { twMerge } from "tailwind-merge"
|
|
4
4
|
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
| `id` | `string` | `undefined` | Префикс группы ленты (`"LST"`), используется вызывающим кодом |
|
|
54
54
|
| `wrapperClass` | `string` | `""` | CSS-классы обёртки |
|
|
55
55
|
| `componentClass` | `string` | `""` | «Мастер-цвет» виджета — роль вида `"bg-red"`, перекрашивает весь виджет |
|
|
56
|
-
| `label` | `{ name?: string }` | `{}` | Заголовок карточки; пустой —
|
|
56
|
+
| `label` | `{ name?: string }` | `{}` | Заголовок карточки; пустой — «RGB лента» на текущем языке |
|
|
57
57
|
| `value` | `Partial<IWidgetRGBStripConfig>` | `undefined` | Поля группы `LST` |
|
|
58
58
|
| `keys` | `Partial<Record<keyof IWidgetRGBStripConfig, string>>` | `undefined` | Переопределение имён полей устройства |
|
|
59
59
|
| `collapsed` | `boolean` | `false` | Свёрнуто ли тело виджета (`$bindable`) |
|
|
@@ -81,4 +81,4 @@
|
|
|
81
81
|
|
|
82
82
|
### Подсказки
|
|
83
83
|
|
|
84
|
-
Кнопка «?» в правом краю шапки включает и выключает подсказки этого
|
|
84
|
+
Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetRGBStrip` в браузере (`hintsSetting("WidgetRGBStrip")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
| ---------------- | ------------------------ | ------------ | ------------------------------------------------------------------------- |
|
|
47
47
|
| `wrapperClass` | `string` | `""` | CSS-классы обёртки |
|
|
48
48
|
| `componentClass` | `string` | `""` | «Мастер-цвет» виджета — роль вида `"bg-red"`, перекрашивает весь виджет |
|
|
49
|
-
| `label` | `{ name?: string }` | `{}` | Заголовок карточки; пустой —
|
|
49
|
+
| `label` | `{ name?: string }` | `{}` | Заголовок карточки; пустой — «Стек и задачи» на текущем языке |
|
|
50
50
|
| `value` | `IWidgetStackInfo` | `undefined` | Снимок `StackInfo`; без него — «Нет данных» |
|
|
51
51
|
| `keys` | `{ StackInfo?: string }` | `undefined` | Переопределение имени объекта ответа, по умолчанию `StackInfo` |
|
|
52
52
|
| `argument` | `string` | `undefined` | Аргумент запроса, по умолчанию `"StackInfo"` (используется вызывающим) |
|
|
@@ -84,4 +84,4 @@
|
|
|
84
84
|
|
|
85
85
|
### Подсказки
|
|
86
86
|
|
|
87
|
-
Кнопка «?» в правом краю шапки включает и выключает подсказки этого
|
|
87
|
+
Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetStackInfo` в браузере (`hintsSetting("WidgetStackInfo")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
|
|
@@ -100,4 +100,4 @@
|
|
|
100
100
|
|
|
101
101
|
### Подсказки
|
|
102
102
|
|
|
103
|
-
Кнопка «?» в правом краю шапки включает и выключает подсказки этого
|
|
103
|
+
Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetWiFi` в браузере (`hintsSetting("WidgetWiFi")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
|
|
@@ -144,7 +144,7 @@
|
|
|
144
144
|
style={accentStyle}
|
|
145
145
|
>
|
|
146
146
|
<!-- Заголовок и переключатель режима -->
|
|
147
|
-
<WidgetHeader icon={WifiIcon} label={label?.name || "
|
|
147
|
+
<WidgetHeader icon={WifiIcon} label={label?.name || $T("widget.wifi.title")} bind:collapsed {hints}>
|
|
148
148
|
{#snippet right()}
|
|
149
149
|
<div class="w-full sm:w-72" use:hint={{ text: $T("widget.wifi.hint.mode"), enabled: $hints }}>
|
|
150
150
|
<UI.Select
|
package/dist/hints.js
CHANGED
|
@@ -6,23 +6,30 @@ import { writable } from "svelte/store";
|
|
|
6
6
|
/* Прежние ключи хранения — выбор оператора переносится */
|
|
7
7
|
const LEGACY_KEYS = { WidgetPFD: "WidgetPFD.tips" };
|
|
8
8
|
const settings = new Map();
|
|
9
|
-
/* Настройка подсказок виджета:
|
|
9
|
+
/* Настройка подсказок виджета: выключены по умолчанию, одна на тип виджета; в браузер пишется только выбор оператора (нажатие «?»),
|
|
10
|
+
ключ WidgetHints.<тип> — прежние Hints.<тип> записывались автоматически при первом показе и выбором не являются, удаляются */
|
|
10
11
|
export const hintsSetting = (widget) => {
|
|
11
12
|
const cached = settings.get(widget);
|
|
12
13
|
if (cached)
|
|
13
14
|
return cached;
|
|
14
|
-
const storageKey = `
|
|
15
|
-
let initial =
|
|
15
|
+
const storageKey = `WidgetHints.${widget}`;
|
|
16
|
+
let initial = false;
|
|
16
17
|
try {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
if (typeof localStorage !== "undefined") {
|
|
19
|
+
localStorage.removeItem(`Hints.${widget}`);
|
|
20
|
+
const saved = localStorage.getItem(storageKey) ?? localStorage.getItem(LEGACY_KEYS[widget] ?? "");
|
|
21
|
+
if (saved !== null)
|
|
22
|
+
initial = saved === "1";
|
|
23
|
+
}
|
|
20
24
|
}
|
|
21
25
|
catch {
|
|
22
|
-
/* хранилище недоступно — подсказки
|
|
26
|
+
/* хранилище недоступно — подсказки выключены */
|
|
23
27
|
}
|
|
24
28
|
const store = writable(initial);
|
|
29
|
+
let first = true;
|
|
25
30
|
store.subscribe((on) => {
|
|
31
|
+
if (first)
|
|
32
|
+
return void (first = false);
|
|
26
33
|
if (!on)
|
|
27
34
|
hideHint();
|
|
28
35
|
try {
|
package/dist/locales/i18n.d.ts
CHANGED
|
@@ -15,3 +15,4 @@ export type Translator = (key: string, params?: TranslateParams) => string;
|
|
|
15
15
|
export declare const translate: (dictionary: Translations, locale: string, key: string, params?: TranslateParams) => string;
|
|
16
16
|
export declare const createTranslator: (dictionary: Translations) => Readable<Translator>;
|
|
17
17
|
export declare const T: Readable<Translator>;
|
|
18
|
+
export declare const widgetTitle: (type: string) => Partial<Record<LanguageCode, string>>;
|
package/dist/locales/i18n.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { derived, get, writable } from "svelte/store";
|
|
2
2
|
import translations from "./translations.js";
|
|
3
|
-
import { DEFAULT_LANGUAGE, LANGUAGES, isLanguageCode, resolveLanguage } from "./languages.js";
|
|
3
|
+
import { DEFAULT_LANGUAGE, LANGUAGES, LANGUAGE_CODES, isLanguageCode, resolveLanguage } from "./languages.js";
|
|
4
4
|
/* Язык и механизм перевода — общие для библиотеки и приложений: приложение берёт отсюда Language/setLanguage/LOCALES и строит свой $T
|
|
5
5
|
из своего словаря через createTranslator (см. README «Языки»); переключение языка одним setLanguage меняет и компоненты, и приложение */
|
|
6
6
|
/*
|
|
@@ -56,3 +56,19 @@ export const translate = (dictionary, locale, key, params) => {
|
|
|
56
56
|
export const createTranslator = (dictionary) => derived(Language, ($lang) => (key, params) => translate(dictionary, $lang, key, params));
|
|
57
57
|
/* $T самой библиотеки */
|
|
58
58
|
export const T = createTranslator(translations);
|
|
59
|
+
/* Названия смарт-виджетов по умолчанию — ключи словаря библиотеки */
|
|
60
|
+
const WIDGET_TITLE_KEYS = {
|
|
61
|
+
WidgetWiFi: "widget.wifi.title",
|
|
62
|
+
WidgetDeviceInfo: "widget.info.title",
|
|
63
|
+
WidgetFileSystem: "widget.fs.title",
|
|
64
|
+
WidgetStackInfo: "widget.stack.title",
|
|
65
|
+
WidgetRGBStrip: "widget.rgb.title",
|
|
66
|
+
WidgetPFD: "pfd.title",
|
|
67
|
+
WidgetMap: "widget.map.title",
|
|
68
|
+
};
|
|
69
|
+
/* Название виджета сразу на всех языках { ru, en, zh, ... } — конструктор заполняет им заголовок нового виджета,
|
|
70
|
+
переводы видны и правятся в «Тексты и переводы»; для неизвестного типа — пустой объект */
|
|
71
|
+
export const widgetTitle = (type) => {
|
|
72
|
+
const entry = translations[WIDGET_TITLE_KEYS[type] ?? ""];
|
|
73
|
+
return entry ? Object.fromEntries(LANGUAGE_CODES.filter((lang) => entry[lang]).map((lang) => [lang, entry[lang]])) : {};
|
|
74
|
+
};
|
|
@@ -124,8 +124,8 @@ const translations = {
|
|
|
124
124
|
},
|
|
125
125
|
"component.info.WidgetMap": {
|
|
126
126
|
ru: "🎯 **Назначение**\nКарта объектов в реальном времени: положение, курс и траектория каждого объекта.\n\n📦 **Пакет данных**\n- Поля групп устройства, по группе на объект: по умолчанию `MAV`, несколько — через пробел (`MAV GNSS`); привязывать переменные не нужно\n- Поток телеметрии: координаты — раз в 0.5–1 с, имя и серийный номер — реже\n- Только отображение, ничего не отправляет\n\n🔑 **Ключи**\n- `Lat` — число, °: широта, обязательный; `Lat` и `Lon` = 0 — нет фикса, объект не рисуется\n- `Lon` — число, °: долгота, обязательный\n- `Alt` — число, м: высота\n- `Heading` — число, 0–360°: курс, поворачивает маркер\n- `Sat` — число спутников\n- `DevName` — строка: имя объекта, подпись маркера; без него — имя группы\n- `DevSN` — строка: серийный номер\n\n✨ **Особенности**\n- Ключи общие с «Пилотажным дисплеем» и «Об устройстве» — один пакет питает несколько виджетов\n- Клик по объекту — карточка со всеми значениями, кнопки «Копировать» и «Скрыть»\n- Траекторию, число её точек и таймаут маркеров оператор переключает на карте; объект без новых данных краснеет, ещё через таймаут скрывается\n- «Показать все» в шапке вписывает объекты в экран; сама карта вид не меняет\n- В шапке — сколько объектов на связи из заданных\n- Только 2D: правой кнопкой мыши карта поворачивается, компас под зумом возвращает её на север\n\n⚙️ **Настройки**\n- Группы полей, мастер-цвет\n- Высота карты `S`/`M`/`L`/`XL`, иконка маркера\n- Начальные значения: траектория и число её точек",
|
|
127
|
-
en: '🎯 **Purpose**\nA real-time map of objects: position, heading and track of each object.\n\n📦 **Data packet**\n- Device field groups, one group per object: `MAV` by default, several separated by spaces (`MAV GNSS`); no variable binding needed\n- Telemetry stream: coordinates every 0.5–1 s, name and serial number less often\n- Display only, sends nothing\n\n🔑 **Keys**\n- `Lat` — number, °: latitude, required; `Lat` and `Lon` = 0 — no fix, the object is not drawn\n- `Lon` — number, °: longitude, required\n- `Alt` — number, m: altitude\n- `Heading` — number, 0–360°: heading, rotates the marker\n- `Sat` — satellite count\n- `DevName` — string: object name, the marker label; without it — the group name\n- `DevSN` — string: serial number\n\n✨ **Features**\n- Keys are shared with the "Flight
|
|
128
|
-
zh: "🎯 **用途**\n实时对象地图:每个对象的位置、航向和轨迹。\n\n📦 **数据包**\n- 设备字段分组,每个分组一个对象:默认 `MAV`,多个用空格分隔(`MAV GNSS`);无需绑定变量\n- 遥测流:坐标每 0.5–1 秒一次,名称和序列号频率更低\n- 仅显示,不发送任何数据\n\n🔑 **键**\n- `Lat` —— 数字,°:纬度,必需;`Lat` 和 `Lon` 为 0 —— 无定位,不绘制对象\n- `Lon` —— 数字,°:经度,必需\n- `Alt` —— 数字,m:高度\n- `Heading` —— 数字,0–360°:航向,旋转标记\n- `Sat` —— 卫星数\n- `DevName` —— 字符串:对象名称,标记标签;缺省时为分组名\n- `DevSN` —— 字符串:序列号\n\n✨ **特点**\n-
|
|
127
|
+
en: '🎯 **Purpose**\nA real-time map of objects: position, heading and track of each object.\n\n📦 **Data packet**\n- Device field groups, one group per object: `MAV` by default, several separated by spaces (`MAV GNSS`); no variable binding needed\n- Telemetry stream: coordinates every 0.5–1 s, name and serial number less often\n- Display only, sends nothing\n\n🔑 **Keys**\n- `Lat` — number, °: latitude, required; `Lat` and `Lon` = 0 — no fix, the object is not drawn\n- `Lon` — number, °: longitude, required\n- `Alt` — number, m: altitude\n- `Heading` — number, 0–360°: heading, rotates the marker\n- `Sat` — satellite count\n- `DevName` — string: object name, the marker label; without it — the group name\n- `DevSN` — string: serial number\n\n✨ **Features**\n- Keys are shared with the "Flight Display" and "About Device" — one packet feeds several widgets\n- Click an object — a card with all values, "Copy" and "Hide" buttons\n- The operator switches the track, its point count and marker timeout on the map; an object without new data turns red, after one more timeout it is hidden\n- "Show all" in the header fits all objects into view; the map never moves by itself\n- The header shows how many of the configured objects are online\n- 2D only: the right mouse button rotates the map, the compass under the zoom returns it to north\n\n⚙️ **Settings**\n- Field groups, master color\n- Map height `S`/`M`/`L`/`XL`, marker icon\n- Defaults: track and its point count',
|
|
128
|
+
zh: "🎯 **用途**\n实时对象地图:每个对象的位置、航向和轨迹。\n\n📦 **数据包**\n- 设备字段分组,每个分组一个对象:默认 `MAV`,多个用空格分隔(`MAV GNSS`);无需绑定变量\n- 遥测流:坐标每 0.5–1 秒一次,名称和序列号频率更低\n- 仅显示,不发送任何数据\n\n🔑 **键**\n- `Lat` —— 数字,°:纬度,必需;`Lat` 和 `Lon` 为 0 —— 无定位,不绘制对象\n- `Lon` —— 数字,°:经度,必需\n- `Alt` —— 数字,m:高度\n- `Heading` —— 数字,0–360°:航向,旋转标记\n- `Sat` —— 卫星数\n- `DevName` —— 字符串:对象名称,标记标签;缺省时为分组名\n- `DevSN` —— 字符串:序列号\n\n✨ **特点**\n- 键与「飞行显示器」和「关于设备」通用 —— 一个数据包可供多个组件使用\n- 点击对象 —— 显示所有值的卡片,带「复制」和「隐藏」按钮\n- 操作员在地图上切换轨迹、轨迹点数和标记超时;无新数据的对象变红,再过一个超时后隐藏\n- 标题栏中的「显示全部」将对象纳入视野;地图本身不会自动移动\n- 标题栏显示已配置对象中在线的数量\n- 仅 2D:按住鼠标右键旋转地图,缩放按钮下方的指南针将其恢复为正北\n\n⚙️ **设置**\n- 字段分组、主色\n- 地图高度 `S`/`M`/`L`/`XL`、标记图标\n- 默认值:轨迹及其点数",
|
|
129
129
|
},
|
|
130
130
|
"component.info.WidgetStackInfo": {
|
|
131
131
|
ru: '🎯 **Назначение**\nОтладка прошивки: свободная память и запас стека задач.\n\n📦 **Пакет данных**\n- Один объект `StackInfo` из ответа на `GET StackInfo`, привязывать переменные не нужно\n- Запрос — кнопкой «Обновить» или автоопросом\n\n🔑 **Ключи**\n- `Heap` — массив `[{ "Name", "Total", "Free", "MinFree" }]`, байт: кучи памяти — `Internal` встроенная и `PSRAM` внешняя ОЗУ у ESP, `Heap` у STM, в виджете понятными подписями; `MinFree` — минимум свободного с момента старта\n- `Tasks` — массив `[{ "Name", "State", "Prio", "Core", "FreeMin" }]`: задачи; `State` — `0` выполняется, `1` готова, `2` ждёт, `3` приостановлена, `4` удалена; `Core` — ядро (только ESP32, `-1` без привязки); `FreeMin` — минимальный запас стека, байт\n\n✨ **Особенности**\n- Светлая часть полосы кучи — пик занятости\n- Задачи отсортированы по запасу стека — самые рискованные сверху\n- Свёрнутый виджет не опрашивает устройство\n\n⚙️ **Настройки**\n- Порог запаса стека: меньше порога — красным, меньше удвоенного — оранжевым\n- Автоопрос: выкл / 1 / 5 / 10 с; мастер-цвет',
|
|
@@ -475,7 +475,7 @@ const translations = {
|
|
|
475
475
|
"widget.wifi.allowed_modes": { ru: "Разрешённые режимы", en: "Allowed modes", zh: "允许的模式" },
|
|
476
476
|
"widget.wifi.ap_confirm": { ru: "Подтверждение при включении AP", en: "Confirm when enabling AP", zh: "启用 AP 时确认" },
|
|
477
477
|
"widget.wifi.scan_command": { ru: "Команда сканирования", en: "Scan command", zh: "扫描命令" },
|
|
478
|
-
"widget.info.title": { ru: "
|
|
478
|
+
"widget.info.title": { ru: "Об устройстве", en: "About Device", zh: "关于设备" },
|
|
479
479
|
"widget.info.restart": { ru: "Перезагрузить", en: "Restart", zh: "重启" },
|
|
480
480
|
"widget.info.sn": { ru: "Серийный номер", en: "Serial number", zh: "序列号" },
|
|
481
481
|
"widget.info.id": { ru: "ID устройства", en: "Device ID", zh: "设备 ID" },
|
|
@@ -489,7 +489,7 @@ const translations = {
|
|
|
489
489
|
"widget.info.web_user": { ru: "Пользователь Web", en: "Web user", zh: "Web 用户" },
|
|
490
490
|
"widget.info.web_psw": { ru: "Пароль Web", en: "Web password", zh: "Web 密码" },
|
|
491
491
|
"widget.info.restart_command": { ru: "Команда перезагрузки", en: "Restart command", zh: "重启命令" },
|
|
492
|
-
"widget.stack.title": { ru: "
|
|
492
|
+
"widget.stack.title": { ru: "Стек и задачи", en: "Stack and Tasks", zh: "堆栈与任务" },
|
|
493
493
|
"widget.stack.off": { ru: "Выкл", en: "Off", zh: "关" },
|
|
494
494
|
"widget.stack.sec": { ru: "{n} с", en: "{n} s", zh: "{n} 秒" },
|
|
495
495
|
"widget.stack.state.running": { ru: "Работает", en: "Running", zh: "运行" },
|
|
@@ -548,6 +548,7 @@ const translations = {
|
|
|
548
548
|
en: 'Auto polling — how often to request data from the device; "Refresh" — request now',
|
|
549
549
|
zh: "自动轮询——向设备请求数据的频率;“刷新”——立即请求",
|
|
550
550
|
},
|
|
551
|
+
"widget.wifi.title": { ru: "WiFi", en: "WiFi", zh: "WiFi" },
|
|
551
552
|
"widget.wifi.static": { ru: "Статический", en: "Static", zh: "静态" },
|
|
552
553
|
"widget.wifi.hint.mode": {
|
|
553
554
|
ru: "Режим Wi-Fi: клиент — устройство подключается к роутеру, точка — создаёт свою сеть, оба — одновременно; выключено — Wi-Fi не работает",
|
|
@@ -702,7 +703,7 @@ const translations = {
|
|
|
702
703
|
"widget.stack.period": { ru: "Автоопрос по умолчанию, мс (0 — выкл)", en: "Default auto-poll, ms (0 — off)", zh: "默认自动轮询, 毫秒 (0 — 关)" },
|
|
703
704
|
"widget.stack.response": { ru: "Объект ответа", en: "Response object", zh: "响应对象" },
|
|
704
705
|
"widget.stack.request": { ru: "Аргумент запроса", en: "Request argument", zh: "请求参数" },
|
|
705
|
-
"widget.fs.title": { ru: "Файловая система", en: "File
|
|
706
|
+
"widget.fs.title": { ru: "Файловая система", en: "File System", zh: "文件系统" },
|
|
706
707
|
"widget.fs.path": { ru: "Путь", en: "Path", zh: "路径" },
|
|
707
708
|
"widget.fs.size": { ru: "Размер", en: "Size", zh: "大小" },
|
|
708
709
|
"widget.fs.name_too_long": { ru: "Имя файла длиннее {n} символов", en: "File name is longer than {n} characters", zh: "文件名超过 {n} 个字符" },
|
|
@@ -717,7 +718,7 @@ const translations = {
|
|
|
717
718
|
"widget.fs.max_name": { ru: "Максимальная длина имени", en: "Maximum name length", zh: "最大名称长度" },
|
|
718
719
|
"widget.fs.state_field": { ru: "Поле состояния ФС", en: "File system state field", zh: "文件系统状态字段" },
|
|
719
720
|
"widget.fs.command_arg": { ru: "Аргумент команд", en: "Command argument", zh: "命令参数" },
|
|
720
|
-
"widget.rgb.title": { ru: "
|
|
721
|
+
"widget.rgb.title": { ru: "RGB лента", en: "RGB Strip", zh: "RGB 灯带" },
|
|
721
722
|
"widget.rgb.effect.static": { ru: "Статичный", en: "Static", zh: "静态" },
|
|
722
723
|
"widget.rgb.effect.rainbow": { ru: "Радуга", en: "Rainbow", zh: "彩虹" },
|
|
723
724
|
"widget.rgb.effect.breath": { ru: "Дыхание", en: "Breathing", zh: "呼吸" },
|
|
@@ -771,7 +772,7 @@ const translations = {
|
|
|
771
772
|
en: "Select the bit range within the global variable for this component.",
|
|
772
773
|
zh: "为此组件选择全局变量中的位范围。",
|
|
773
774
|
},
|
|
774
|
-
"pfd.title": { ru: "Пилотажный дисплей", en: "Flight
|
|
775
|
+
"pfd.title": { ru: "Пилотажный дисплей", en: "Flight Display", zh: "飞行显示器" },
|
|
775
776
|
"pfd.fix.none": { ru: "нет", en: "none", zh: "无" },
|
|
776
777
|
"pfd.sev.0": { ru: "АВАРИЯ", en: "EMERGENCY", zh: "紧急" },
|
|
777
778
|
"pfd.sev.1": { ru: "ТРЕВОГА", en: "ALERT", zh: "警报" },
|