poe-svelte-ui-lib 1.41.0 → 1.42.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 CHANGED
@@ -26,7 +26,7 @@ npm install poe-svelte-ui-lib
26
26
  /* дальше — только собственные отличия приложения, например :root { min-width: 640px; } */
27
27
  ```
28
28
 
29
- **Предпросмотр темы** — страница «Тема» витрины (`src/routes/components/theme`): один и тот же интерфейс облака (шапка устройства, палитра токенов, кнопки во всех ролях, поля, таблица, виджеты, типографика, Markdown) в светлой и тёмной теме рядом — палитра задаётся классами `.light`/`.dark`, поэтому обе темы видны одновременно. Правьте `theme.css` и смотрите результат там.
29
+ **Предпросмотр темы** — страница «Тема» витрины (`src/routes/components/theme`): один и тот же интерфейс облака (шапка устройства, палитра токенов, кнопки во всех ролях, поля, таблица, виджеты, типографика, Markdown) на одной странице; тема переключается глобально кнопкой в шапке витрины. Правьте `theme.css` и смотрите результат там.
30
30
 
31
31
  Текст в Markdown, таблицы и код переносятся по ширине контейнера — горизонтальной прокрутки быть не должно, только вертикальная. Markdown рендерится с `breaks: true` (как в облаке), поэтому абзац и пункт списка пишутся одной строкой — ручной перенос внутри абзаца превращается в разрыв строки.
32
32
 
@@ -16,9 +16,7 @@
16
16
 
17
17
  ### Адаптивность
18
18
 
19
- - Компонент использует Tailwind CSS для адаптивного дизайна
20
19
  - Сетка содержимого адаптируется под размеры экрана (sm:p-3)
21
- - Используются относительные единицы измерения для обеспечения масштабируемости
22
20
 
23
21
  ### Ограничения
24
22
 
@@ -28,9 +26,7 @@
28
26
 
29
27
  ### Производительность
30
28
 
31
- - Компонент использует оптимизации Svelte для минимизации перерисовок
32
29
  - Содержимое аккордеона рендерится только при его открытии (`{#if isOpen}`)
33
- - Используется эффективное объединение классов через `twMerge`
34
30
 
35
31
  ## Пропсы
36
32
 
@@ -119,11 +115,8 @@
119
115
 
120
116
  ### Особенности конструктора
121
117
 
122
- - Предоставляет визуальные элементы управления для всех доступных свойств
123
118
  - Включает модальное окно для выбора иконок из библиотеки
124
119
  - Поддерживает загрузку изображений для фона
125
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
126
- - Использует систему локализации через `$T('constructor.props.*')`
127
120
  - Поддерживает валидацию числовых значений (min/max) для размеров
128
121
 
129
122
  ### Что настраивается
@@ -140,7 +133,6 @@
140
133
 
141
134
  ### Сторы и зависимости
142
135
 
143
- - Используется стор `twMerge` для объединения Tailwind CSS классов
144
136
  - Применяется переход `slide` из `svelte/transition` для анимации открытия/закрытия
145
137
 
146
138
  ### Директивы
@@ -21,8 +21,6 @@
21
21
 
22
22
  ### Адаптивность
23
23
 
24
- - Компонент использует Tailwind CSS для адаптивного дизайна
25
- - Используются относительные единицы измерения для обеспечения масштабируемости
26
24
  - Подсказки автоматически позиционируются в зависимости от стороны отображения
27
25
 
28
26
  ### Ограничения
@@ -33,9 +31,7 @@
33
31
 
34
32
  ### Производительность
35
33
 
36
- - Компонент использует оптимизации Svelte для минимизации перерисовок
37
34
  - Обработчики клавиатуры удаляются при размонтировании компонента
38
- - Используется эффективное объединение классов через `twMerge`
39
35
 
40
36
  ## Пропсы
41
37
 
@@ -148,11 +144,8 @@
148
144
 
149
145
  ### Особенности конструктора
150
146
 
151
- - Предоставляет визуальные элементы управления для всех доступных свойств
152
147
  - Включает модальное окно для выбора иконок из библиотеки
153
148
  - Поддерживает настройку обработчика событий и аргументов
154
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
155
- - Использует систему локализации через `$T('constructor.props.*')`
156
149
  - Поддерживает валидацию вводимых данных через регулярные выражения
157
150
 
158
151
  ### Что настраивается
@@ -169,7 +162,6 @@
169
162
 
170
163
  ### Сторы и зависимости
171
164
 
172
- - Используется стор `twMerge` для объединения Tailwind CSS классов
173
165
  - Применяется переход `fly` из `svelte/transition` для анимации подсказки
174
166
  - Используется `onMount` для подписки и отписки от глобальных событий клавиатуры
175
167
 
@@ -178,7 +170,3 @@
178
170
  - `transition:fly` для анимации появления/скрытия информационной подсказки
179
171
  - Обработчики `onmouseenter` и `onmouseleave` для показа/скрытия подсказки
180
172
  - Обработчик `onclick` для активации кнопки
181
-
182
- ### Слоты
183
-
184
- - Компонент не использует внешних слотов
@@ -12,9 +12,7 @@
12
12
 
13
13
  ### Адаптивность
14
14
 
15
- - Компонент использует Tailwind CSS для адаптивного дизайна
16
15
  - Стрелки навигации автоматически скрываются при достижении начала или конца карусели
17
- - Используются относительные единицы измерения для обеспечения масштабируемости
18
16
 
19
17
  ### Ограничения
20
18
 
@@ -24,9 +22,7 @@
24
22
 
25
23
  ### Производительность
26
24
 
27
- - Компонент использует оптимизации Svelte для минимизации перерисовок
28
25
  - Обработчики событий и `ResizeObserver` корректно удаляются при размонтировании
29
- - Используется эффективное объединение классов через `twMerge`
30
26
 
31
27
  ## Пропсы
32
28
 
@@ -129,7 +125,6 @@
129
125
 
130
126
  ### Сторы и зависимости
131
127
 
132
- - Используется стор `twMerge` для объединения Tailwind CSS классов
133
128
  - Применяется переход `slide` из `svelte/transition` для анимации стрелок навигации
134
129
  - Используется `ResizeObserver` для отслеживания изменений размера
135
130
 
@@ -110,7 +110,3 @@
110
110
 
111
111
  - `twMerge` для объединения классов обёртки и полосы
112
112
  - `$props()` для получения пропсов компонента
113
-
114
- ### Слоты
115
-
116
- - Компонент не использует внешних слотов
@@ -21,9 +21,7 @@
21
21
 
22
22
  ### Адаптивность
23
23
 
24
- - Компонент использует Tailwind CSS для адаптивного дизайна
25
24
  - Изображения масштабируются с учетом режима (cover/contain)
26
- - Используются относительные единицы измерения для обеспечения масштабируемости
27
25
 
28
26
  ### Ограничения
29
27
 
@@ -33,9 +31,7 @@
33
31
 
34
32
  ### Производительность
35
33
 
36
- - Компонент использует оптимизации Svelte для минимизации перерисовок
37
34
  - URL предварительного просмотра создаются только при необходимости
38
- - Используется эффективное объединение классов через `twMerge`
39
35
 
40
36
  ## Пропсы
41
37
 
@@ -143,11 +139,8 @@
143
139
 
144
140
  ### Особенности конструктора
145
141
 
146
- - Предоставляет визуальные элементы управления для всех доступных свойств
147
142
  - Поддерживает настройку типа компонента (файл или изображение)
148
143
  - Включает настройки размеров и режима отображения для изображений
149
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
150
- - Использует систему локализации через `$T('constructor.props.*')`
151
144
 
152
145
  ### Что настраивается
153
146
 
@@ -164,7 +157,6 @@
164
157
 
165
158
  ### Сторы и зависимости
166
159
 
167
- - Используется стор `twMerge` для объединения Tailwind CSS классов
168
160
  - Используется `URL.createObjectURL` для мгновенного превью выбранного файла — предыдущий blob-URL отзывается через `URL.revokeObjectURL` перед созданием нового и при размонтировании компонента
169
161
 
170
162
  ### Директивы
@@ -172,7 +164,3 @@
172
164
  - `bind:currentImage` для двусторонней привязки текущего изображения
173
165
  - Обработчик `onchange` для отслеживания изменения файла
174
166
  - Обработчик `onclick` для активации выбора файла
175
-
176
- ### Слоты
177
-
178
- - Компонент не использует внешних слотов
@@ -22,9 +22,7 @@
22
22
 
23
23
  ### Адаптивность
24
24
 
25
- - Компонент использует Tailwind CSS для адаптивного дизайна
26
25
  - График автоматически масштабируется под размер контейнера
27
- - Используются относительные единицы измерения для обеспечения масштабируемости
28
26
 
29
27
  ### Ограничения
30
28
 
@@ -35,7 +33,6 @@
35
33
 
36
34
  ### Производительность
37
35
 
38
- - Компонент использует оптимизации Svelte для минимизации перерисовок
39
36
  - Используется Canvas API для эффективной отрисовки графиков
40
37
  - Автоматическая очистка точек при превышении лимита для предотвращения утечки памяти
41
38
 
@@ -159,8 +156,6 @@
159
156
  - Предоставляет визуальные элементы управления для всех доступных свойств, включая `refreshRate` (`constructor.props.refreshrate`) через `Select` с теми же вариантами, что и на самом графике (`REFRESH_OPTIONS` из `Graph.svelte`)
160
157
  - Поддерживает настройку переменной для отображения
161
158
  - Включает переключатель для режима тестирования
162
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
163
- - Использует систему локализации через `$T('constructor.props.*')`
164
159
 
165
160
  ### Что настраивается
166
161
 
@@ -190,7 +185,3 @@
190
185
  - `bind:this` для получения ссылок на DOM-элементы (container, canvas)
191
186
  - `$effect` для обработки изменений данных и настроек
192
187
  - `onMount` для инициализации данных графика
193
-
194
- ### Слоты
195
-
196
- - Компонент не использует внешних слотов
@@ -21,11 +21,6 @@
21
21
  - Неверный ввод (длина, диапазон, выражение валидации) подсвечивается и не отправляется
22
22
  - «Только чтение» — поле для отображения с кнопкой копирования
23
23
 
24
- ### Адаптивность
25
-
26
- - Компонент использует Tailwind CSS для адаптивного дизайна
27
- - Используются относительные единицы измерения для обеспечения масштабируемости
28
-
29
24
  ### Ограничения
30
25
 
31
26
  - Для типа `password` кнопка копирования недоступна
@@ -33,11 +28,6 @@
33
28
  - Числовые значения автоматически округляются (до 5 знаков после запятой) для устранения ошибок плавающей точки
34
29
  - Подсказки не поддерживают HTML-разметку, отображают только текст
35
30
 
36
- ### Производительность
37
-
38
- - Компонент использует оптимизации Svelte для минимизации перерисовок
39
- - Используется эффективное объединение классов через `twMerge`
40
-
41
31
  ## Пропсы
42
32
 
43
33
  | Название | Тип | По умолчанию | Описание |
@@ -157,12 +147,9 @@
157
147
 
158
148
  ### Особенности конструктора
159
149
 
160
- - Предоставляет визуальные элементы управления для всех доступных свойств
161
150
  - Поддерживает выбор типа поля: текст, пароль, число, многострочный текст, битовая маска
162
151
  - Включает библиотеку готовых регулярных выражений для валидации (модальное окно с выбором шаблона)
163
152
  - Для типа `bitMode` позволяет задать диапазон битов слайдером; `number.maxNum` рассчитывается автоматически
164
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
165
- - Использует систему локализации через `$T('constructor.props.*')`
166
153
  - Поддерживает валидацию вводимых данных через регулярные выражения
167
154
 
168
155
  ### Что настраивается
@@ -183,7 +170,6 @@
183
170
 
184
171
  ### Сторы и зависимости
185
172
 
186
- - Используется стор `twMerge` для объединения Tailwind CSS классов
187
173
  - Используется компонент `InfoIcon` для отображения иконки информационной подсказки
188
174
  - Применяется переход `fly` из `svelte/transition` для анимации подсказки и `fade` для индикации копирования
189
175
 
@@ -194,7 +180,3 @@
194
180
  - `onkeydown` блокирует ввод символа `.` для типа `number`
195
181
  - `onclick` для кнопок инкремента/декремента (типы `number`/`bitMode`), кнопки копирования и кнопки показа пароля
196
182
  - `onmouseenter`/`onmouseleave` для показа/скрытия информационной подсказки
197
-
198
- ### Слоты
199
-
200
- - Компонент не использует внешних слотов
@@ -23,9 +23,7 @@
23
23
 
24
24
  ### Адаптивность
25
25
 
26
- - Компонент использует Tailwind CSS для адаптивного дизайна
27
26
  - Джойстик автоматически масштабируется под размер контейнера
28
- - Используются относительные единицы измерения для обеспечения масштабируемости
29
27
 
30
28
  ### Ограничения
31
29
 
@@ -35,9 +33,7 @@
35
33
 
36
34
  ### Производительность
37
35
 
38
- - Компонент использует оптимизации Svelte для минимизации перерисовок
39
36
  - Чувствительность управляется дискретными значениями для предотвращения чрезмерной нагрузки
40
- - Используется эффективное объединение классов через `twMerge`
41
37
 
42
38
  ## Пропсы
43
39
 
@@ -118,11 +114,8 @@
118
114
 
119
115
  ### Особенности конструктора
120
116
 
121
- - Предоставляет визуальные элементы управления для всех доступных свойств
122
117
  - Поддерживает настройку осей управления (названия, диапазоны значений)
123
118
  - Включает настройки чувствительности и иконки центральной кнопки
124
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
125
- - Использует систему локализации через `$T('constructor.props.*')`
126
119
 
127
120
  ### Что настраивается
128
121
 
@@ -140,7 +133,6 @@
140
133
 
141
134
  ### Сторы и зависимости
142
135
 
143
- - Используется стор `twMerge` для объединения Tailwind CSS классов
144
136
  - Используются тригонометрические функции для расчета позиций элементов джойстика
145
137
 
146
138
  ### Директивы
@@ -148,7 +140,3 @@
148
140
  - `bind:value` для двусторонней привязки значений осей
149
141
  - `$effect` для обработки изменений чувствительности и значений
150
142
  - `onmouseenter` и `onmouseleave` для визуальной обратной связи при наведении
151
-
152
- ### Слоты
153
-
154
- - Компонент не использует внешних слотов
@@ -152,7 +152,3 @@
152
152
 
153
153
  - `#each` для отображения вкладок переключателя, столбиков графика и подписей по X
154
154
  - `#if` для пустого состояния (уровень без данных)
155
-
156
- ### Слоты
157
-
158
- - Компонент не использует внешних слотов
@@ -21,9 +21,7 @@
21
21
 
22
22
  ### Адаптивность
23
23
 
24
- - Компонент использует Tailwind CSS для адаптивного дизайна
25
24
  - Индикаторы автоматически масштабируются под размер контейнера
26
- - Используются относительные единицы измерения для обеспечения масштабируемости
27
25
 
28
26
  ### Ограничения
29
27
 
@@ -33,9 +31,7 @@
33
31
 
34
32
  ### Производительность
35
33
 
36
- - Компонент использует оптимизации Svelte для минимизации перерисовок
37
34
  - Значения нормализуются для предотвращения некорректного отображения
38
- - Используется эффективное объединение классов через `twMerge`
39
35
 
40
36
  ## Пропсы
41
37
 
@@ -125,11 +121,8 @@
125
121
 
126
122
  ### Особенности конструктора
127
123
 
128
- - Предоставляет визуальные элементы управления для всех доступных свойств
129
124
  - Поддерживает добавление и удаление элементов индикатора
130
125
  - Включает настройки типа, диапазона значений и единиц измерения
131
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
132
- - Использует систему локализации через `$T('constructor.props.*')`
133
126
 
134
127
  ### Что настраивается
135
128
 
@@ -145,15 +138,7 @@
145
138
  - Функция `progressPercent` вычисляет процент заполнения индикатора
146
139
  - Функция `roundToClean` округляет числа для отображения
147
140
 
148
- ### Сторы и зависимости
149
-
150
- - Используется стор `twMerge` для объединения Tailwind CSS классов
151
-
152
141
  ### Директивы
153
142
 
154
143
  - `$derived` для вычисления минимального и максимального значений
155
144
  - `#each` для отображения нескольких элементов индикатора
156
-
157
- ### Слоты
158
-
159
- - Компонент не использует внешних слотов
@@ -23,9 +23,7 @@
23
23
 
24
24
  ### Адаптивность
25
25
 
26
- - Компонент использует Tailwind CSS для адаптивного дизайна
27
26
  - Выпадающий список автоматически позиционируется относительно родителя
28
- - Используются относительные единицы измерения для обеспечения масштабируемости
29
27
 
30
28
  ### Ограничения
31
29
 
@@ -35,9 +33,7 @@
35
33
 
36
34
  ### Производительность
37
35
 
38
- - Компонент использует оптимизации Svelte для минимизации перерисовок
39
36
  - Фильтрация опций выполняется только при изменении поискового запроса
40
- - Используется эффективное объединение классов через `twMerge`
41
37
 
42
38
  ## Пропсы
43
39
 
@@ -162,11 +158,8 @@
162
158
 
163
159
  ### Особенности конструктора
164
160
 
165
- - Предоставляет визуальные элементы управления для всех доступных свойств
166
161
  - Поддерживает настройку типа отображения, значения и мультивыбора
167
162
  - Включает управление списком опций с возможностью добавления/удаления
168
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
169
- - Использует систему локализации через `$T('constructor.props.*')`
170
163
 
171
164
  ### Что настраивается
172
165
 
@@ -184,7 +177,6 @@
184
177
 
185
178
  ### Сторы и зависимости
186
179
 
187
- - Используется стор `twMerge` для объединения Tailwind CSS классов
188
180
  - Применяется переход `slide` из `svelte/transition` для анимации выпадающего списка
189
181
 
190
182
  ### Директивы
@@ -192,7 +184,3 @@
192
184
  - `bind:value` для двусторонней привязки значения
193
185
  - `transition:slide` для анимации выпадающего списка
194
186
  - `onMount` и `onDestroy` для управления слушателями событий клика
195
-
196
- ### Слоты
197
-
198
- - Компонент не использует внешних слотов
@@ -20,9 +20,7 @@
20
20
 
21
21
  ### Адаптивность
22
22
 
23
- - Компонент использует Tailwind CSS для адаптивного дизайна
24
23
  - Слайдер автоматически масштабируется под размер контейнера
25
- - Используются относительные единицы измерения для обеспечения масштабируемости
26
24
 
27
25
  ### Ограничения
28
26
 
@@ -32,9 +30,7 @@
32
30
 
33
31
  ### Производительность
34
32
 
35
- - Компонент использует оптимизации Svelte для минимизации перерисовок
36
33
  - Значения нормализуются для предотвращения некорректного отображения
37
- - Используется эффективное объединение классов через `twMerge`
38
34
 
39
35
  ## Пропсы
40
36
 
@@ -146,11 +142,8 @@
146
142
 
147
143
  ### Особенности конструктора
148
144
 
149
- - Предоставляет визуальные элементы управления для всех доступных свойств
150
145
  - Поддерживает настройку типа слайдера (одиночный или диапазонный)
151
146
  - Включает настройки диапазона значений и шага
152
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
153
- - Использует систему локализации через `$T('constructor.props.*')`
154
147
 
155
148
  ### Что настраивается
156
149
 
@@ -168,7 +161,6 @@
168
161
 
169
162
  ### Сторы и зависимости
170
163
 
171
- - Используется стор `twMerge` для объединения Tailwind CSS классов
172
164
  - Используется `navigator.userAgent` для определения типа устройства для корректного отображения слайдера
173
165
 
174
166
  ### Директивы
@@ -176,7 +168,3 @@
176
168
  - `bind:value` для двусторонней привязки значений слайдера
177
169
  - `$effect` для синхронизации значений при изменении входных данных
178
170
  - `oninput` для обработки изменения значений через пользовательский ввод
179
-
180
- ### Слоты
181
-
182
- - Компонент не использует внешних слотов
@@ -20,9 +20,7 @@
20
20
 
21
21
  ### Адаптивность
22
22
 
23
- - Компонент использует Tailwind CSS для адаптивного дизайна
24
23
  - Переключатели автоматически масштабируются под размер контейнера
25
- - Используются относительные единицы измерения для обеспечения масштабируемости
26
24
 
27
25
  ### Ограничения
28
26
 
@@ -32,9 +30,7 @@
32
30
 
33
31
  ### Производительность
34
32
 
35
- - Компонент использует оптимизации Svelte для минимизации перерисовок
36
33
  - Битовые операции выполняются эффективно для управления состоянием
37
- - Используется эффективное объединение классов через `twMerge`
38
34
 
39
35
  ## Пропсы
40
36
 
@@ -163,11 +159,8 @@
163
159
 
164
160
  ### Особенности конструктора
165
161
 
166
- - Предоставляет визуальные элементы управления для всех доступных свойств
167
162
  - Поддерживает настройку типа переключателя, режима битов и подписей
168
163
  - Включает управление списком опций с возможностью добавления/удаления
169
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
170
- - Использует систему локализации через `$T('constructor.props.*')`
171
164
 
172
165
  ### Что настраивается
173
166
 
@@ -185,7 +178,6 @@
185
178
 
186
179
  ### Сторы и зависимости
187
180
 
188
- - Используется стор `twMerge` для объединения Tailwind CSS классов
189
181
  - Применяется переход `fly` из `svelte/transition` для анимации подсказки
190
182
 
191
183
  ### Директивы
@@ -193,7 +185,3 @@
193
185
  - `bind:value` для двусторонней привязки значения
194
186
  - `transition:fly` для анимации информационной подсказки
195
187
  - `$effect` для инициализации значения при его отсутствии
196
-
197
- ### Слоты
198
-
199
- - Компонент не использует внешних слотов
@@ -26,9 +26,7 @@
26
26
 
27
27
  ### Адаптивность
28
28
 
29
- - Компонент использует Tailwind CSS для адаптивного дизайна
30
29
  - Таблица автоматически адаптируется под размеры контейнера
31
- - Используются относительные единицы измерения для обеспечения масштабируемости
32
30
  - Размер текста строк задаётся CSS-переменной `--table-font-size` на любом родителе (по умолчанию `13px`), например `style="--table-font-size: 11.5px"` — так потребитель меняет масштаб данных без правки компонента
33
31
 
34
32
  ### Ограничения
@@ -39,9 +37,7 @@
39
37
 
40
38
  ### Производительность
41
39
 
42
- - Компонент использует оптимизации Svelte для минимизации перерисовок
43
40
  - Буферизация данных позволяет эффективно отображать большие объемы информации
44
- - Используется эффективное объединение классов через `twMerge`
45
41
 
46
42
  ## Пропсы
47
43
 
@@ -235,11 +231,8 @@
235
231
 
236
232
  ### Особенности конструктора
237
233
 
238
- - Предоставляет визуальные элементы управления для всех доступных свойств
239
234
  - Поддерживает настройку столбцов таблицы с различными типами содержимого
240
235
  - Включает настройки буфера данных, обводки и автопрокрутки
241
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
242
- - Использует систему локализации через `$T('constructor.props.*')`
243
236
 
244
237
  ### Что настраивается
245
238
 
@@ -257,7 +250,6 @@
257
250
 
258
251
  ### Сторы и зависимости
259
252
 
260
- - Используется стор `twMerge` для объединения Tailwind CSS классов
261
253
  - Используются переходы `fade`, `fly`, `slide` из `svelte/transition` для анимаций
262
254
  - Используется `onMount` для инициализации обработчиков прокрутки
263
255
 
@@ -15,9 +15,7 @@
15
15
 
16
16
  ### Адаптивность
17
17
 
18
- - Компонент использует Tailwind CSS для адаптивного дизайна
19
18
  - Вкладки автоматически адаптируются под размер контейнера
20
- - Используются относительные единицы измерения для обеспечения масштабируемости
21
19
 
22
20
  ### Ограничения
23
21
 
@@ -27,8 +25,6 @@
27
25
 
28
26
  ### Производительность
29
27
 
30
- - Компонент использует оптимизации Svelte для минимизации перерисовок
31
- - Используется эффективное объединение классов через `twMerge`
32
28
  - Содержимое вкладок рендерится только при активации соответствующей вкладки
33
29
 
34
30
  ## Пропсы
@@ -145,11 +141,8 @@
145
141
 
146
142
  ### Особенности конструктора
147
143
 
148
- - Предоставляет визуальные элементы управления для всех доступных свойств
149
144
  - Поддерживает настройку позиционирования иконки и текста
150
145
  - Включает управление списком вкладок с возможностью добавления/удаления
151
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
152
- - Использует систему локализации через `$T('constructor.props.*')`
153
146
 
154
147
  ### Что настраивается
155
148
 
@@ -166,7 +159,6 @@
166
159
 
167
160
  ### Сторы и зависимости
168
161
 
169
- - Используется стор `twMerge` для объединения Tailwind CSS классов
170
162
  - Используется `optionsStore` для получения цветовых опций
171
163
 
172
164
  ### Директивы
@@ -14,9 +14,7 @@
14
14
 
15
15
  ### Адаптивность
16
16
 
17
- - Компонент использует Tailwind CSS для адаптивного дизайна
18
17
  - Текст автоматически адаптируется под размер контейнера
19
- - Используются относительные единицы измерения для обеспечения масштабируемости
20
18
 
21
19
  ### Ограничения
22
20
 
@@ -24,11 +22,6 @@
24
22
  - При использовании фона применяется стандартное оформление с закругленными углами
25
23
  - Текст всегда выравнивается по центру
26
24
 
27
- ### Производительность
28
-
29
- - Компонент использует оптимизации Svelte для минимизации перерисовок
30
- - Используется эффективное объединение классов через `twMerge`
31
-
32
25
  ## Пропсы
33
26
 
34
27
  | Название | Тип | По умолчанию | Описание |
@@ -94,11 +87,8 @@
94
87
 
95
88
  ### Особенности конструктора
96
89
 
97
- - Предоставляет визуальные элементы управления для всех доступных свойств
98
90
  - Поддерживает настройку размера текста и цвета
99
91
  - Включает настройки оформления (жирный, курсив, фон)
100
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
101
- - Использует систему локализации через `$T('constructor.props.*')`
102
92
 
103
93
  ### Что настраивается
104
94
 
@@ -113,15 +103,7 @@
113
103
  - Объект `textSize` определяет CSS-классы для различных размеров текста
114
104
  - Переменная `background` управляет отображением фонового оформления
115
105
 
116
- ### Сторы и зависимости
117
-
118
- - Используется стор `twMerge` для объединения Tailwind CSS классов
119
-
120
106
  ### Директивы
121
107
 
122
108
  - `twMerge` для объединения классов обертки и текста
123
109
  - `$props()` для получения пропсов компонента
124
-
125
- ### Слоты
126
-
127
- - Компонент не использует внешних слотов
@@ -32,7 +32,6 @@
32
32
 
33
33
  ### Производительность
34
34
 
35
- - Компонент использует оптимизации Svelte для минимизации перерисовок
36
35
  - Поток камеры и обработчики корректно останавливаются/отписываются при размонтировании (`stopStream`, очистка `setInterval`)
37
36
  - `object URL` для кадров в режиме `remote` создаётся и отзывается на каждый кадр, чтобы избежать утечек памяти при длительной работе
38
37
 
@@ -132,7 +131,6 @@
132
131
  - Предоставляет переключатель видимости селектора устройств (`showSelect`)
133
132
  - Поле для `streamKey` отображается только при выбранном режиме `source="remote"`
134
133
  - В режиме редактирования (`forConstructor={false}`) дополнительно доступны идентификатор, класс обёртки и заголовок через `CommonSnippets`
135
- - Использует систему локализации через `$T('constructor.props.*')`
136
134
 
137
135
  ### Что настраивается
138
136
 
@@ -148,7 +146,6 @@
148
146
 
149
147
  ### Сторы и зависимости
150
148
 
151
- - Используется стор `twMerge` для объединения Tailwind CSS классов
152
149
  - Применяется переход `slide`-подобной анимации через `svelte/transition` в дочерних компонентах (`Select`), сама карточка использует условный рендеринг без переходов
153
150
  - Используется `onMount` для инициализации списка устройств и запроса доступа к камере (только в режиме `camera`), а также для остановки потока при размонтировании
154
151
  - Используется `$effect` с `setInterval` (1 сек) для периодического опроса `getDevices` и обновления списка камер (актуально при подключении/отключении устройств "на лету")
@@ -159,7 +156,3 @@
159
156
  - `bind:this={videoElement}` для прямого доступа к DOM-элементу `<video>` и привязки к нему `MediaStream`
160
157
  - Условные блоки `{#if isRemote}` / `{:else}` разделяют разметку камеры и удалённого режима
161
158
  - Обработчик `onclick` на кнопке повтора для повторного запроса доступа к камере при ошибке
162
-
163
- ### Слоты
164
-
165
- - Компонент не использует внешних слотов
@@ -22,9 +22,7 @@
22
22
 
23
23
  ### Адаптивность
24
24
 
25
- - Компонент использует Tailwind CSS для адаптивного дизайна
26
25
  - Виджет автоматически адаптируется под размер контейнера
27
- - Используются относительные единицы измерения для обеспечения масштабируемости
28
26
 
29
27
  ### Ограничения
30
28
 
@@ -34,8 +32,6 @@
34
32
 
35
33
  ### Производительность
36
34
 
37
- - Компонент использует оптимизации Svelte для минимизации перерисовок
38
- - Используется эффективное объединение классов через `twMerge`
39
35
  - Циклическое переключение иконок останавливается при размонтировании компонента
40
36
 
41
37
  ## Пропсы
@@ -173,11 +169,8 @@
173
169
 
174
170
  ### Особенности конструктора
175
171
 
176
- - Предоставляет визуальные элементы управления для всех доступных свойств
177
172
  - Поддерживает настройку типа управления (ввод, слайдер, переключатель)
178
173
  - Включает настройки числового диапазона и иконок
179
- - Имеет различные наборы полей в зависимости от режима (`forConstructor`)
180
- - Использует систему локализации через `$T('constructor.props.*')`
181
174
 
182
175
  ### Что настраивается
183
176
 
@@ -196,7 +189,6 @@
196
189
 
197
190
  ### Сторы и зависимости
198
191
 
199
- - Используется стор `twMerge` для объединения Tailwind CSS классов
200
192
  - Используется `window.setInterval` для циклического переключения иконок
201
193
 
202
194
  ### Директивы
@@ -204,7 +196,3 @@
204
196
  - `bind:value` для двусторонней привязки значения
205
197
  - `$effect` для синхронизации значений и состояний
206
198
  - `onUpdate` для обработки изменения значения
207
-
208
- ### Слоты
209
-
210
- - Компонент не использует внешних слотов
@@ -2,13 +2,13 @@
2
2
 
3
3
  ## Назначение
4
4
 
5
- Карта бортов в реальном времени: положение, курс и траектория каждого борта.
5
+ Карта объектов в реальном времени: положение, курс и траектория каждого объекта.
6
6
 
7
7
  > **Размеры.** Ширина — 100% контейнера (в конструкторе — ширина ячейки сетки); высота карты задаётся пропом `height` (px), в сетке конструктора виджет занимает одну строку. Мастер-цвет (`componentClass`) перекрашивает шапку.
8
8
 
9
9
  ## Пакет данных
10
10
 
11
- - Поля групп устройства, по группе на борт: по умолчанию `MAV`, несколько — через пробел (`MAV GNSS`); привязывать переменные не нужно
11
+ - Поля групп устройства, по группе на объект: по умолчанию `MAV`, несколько — через пробел (`MAV GNSS`); привязывать переменные не нужно
12
12
  - Поток телеметрии: координаты — раз в 0.5–1 с, имя и серийный номер — реже
13
13
  - Только отображение, ничего не отправляет
14
14
 
@@ -16,8 +16,8 @@
16
16
 
17
17
  1. **Устройство** шлёт поля группы в поток телеметрии (`Telemetry_SendObject`, ключ `Data`) — облако и WebApp раскладывают их в переменные `<ModSN>|<группа>.<ключ>`. Координаты — раз в 0.5–1 с, имя и серийный номер — реже (раз в несколько секунд) отдельным кадром: буфер `Telemetry_SendObject` — 512 байт, строки его быстро съедают.
18
18
  2. **В конструкторе** добавьте «Карту» из смарт-виджетов и перечислите группы через пробел (`MAV` или `MAV GNSS`). Переменные привязывать не нужно — виджет сам берёт ключи из таблицы ниже.
19
- 3. **Оператор** поверх карты включает траекторию, выбирает число её точек и таймаут маркеров. Кнопка **«Все борта»** в шапке виджета вписывает все видимые борта в экран (один борт — приближение к нему). Сама карта вид не меняет — бортов может быть много.
20
- 4. **Клик по маркеру** открывает карточку борта: имя, группа, координаты, высота, курс, спутники, серийный номер; кнопки «Копировать» (всё в буфер обмена) и «Скрыть» (до следующего обновления борта).
19
+ 3. **Оператор** поверх карты включает траекторию, выбирает число её точек и таймаут маркеров. Кнопка **«Показать все»** в шапке виджета вписывает все видимые объекты в экран (один объект — приближение к нему). Сама карта вид не меняет — объектов может быть много.
20
+ 4. **Клик по маркеру** открывает карточку объекта: имя, группа, координаты, высота, курс, спутники, серийный номер; кнопки «Копировать» (всё в буфер обмена) и «Скрыть» (до следующего обновления объекта).
21
21
 
22
22
  ```c
23
23
  /* Прошивка: группа MAV — те же ключи читает и WidgetPFD, одна отправка кормит оба виджета */
@@ -34,26 +34,26 @@ Telemetry_SendObject(g_telemetry_stream, g_mcfg.DevSN, "Data", dev, sizeof(dev)
34
34
 
35
35
  ## Ключи
36
36
 
37
- | Ключ | Описание |
38
- | --------- | ------------------------------------------------------------------------------- |
39
- | `Lat` | число, °: широта, обязательный; `Lat` и `Lon` = 0 — нет фикса, борт не рисуется |
40
- | `Lon` | число, °: долгота, обязательный |
41
- | `Alt` | число, м: высота |
42
- | `Heading` | число, 0–360°: курс, поворачивает маркер |
43
- | `Sat` | число спутников |
44
- | `DevName` | строка: имя борта, подпись маркера; без него — имя группы |
45
- | `DevSN` | строка: серийный номер |
37
+ | Ключ | Описание |
38
+ | --------- | --------------------------------------------------------------------------------- |
39
+ | `Lat` | число, °: широта, обязательный; `Lat` и `Lon` = 0 — нет фикса, объект не рисуется |
40
+ | `Lon` | число, °: долгота, обязательный |
41
+ | `Alt` | число, м: высота |
42
+ | `Heading` | число, 0–360°: курс, поворачивает маркер |
43
+ | `Sat` | число спутников |
44
+ | `DevName` | строка: имя объекта, подпись маркера; без него — имя группы |
45
+ | `DevSN` | строка: серийный номер |
46
46
 
47
47
  ## Особенности
48
48
 
49
- Смарт-виджет «Карта» — положение бортов на карте MapLibre с траекториями. Каждый борт — одна **группа полей** устройства (префикс, например `MAV`); виджет показывает сразу несколько групп, например `MAV GNSS` — автопилот и собственный GNSS-приёмник модуля. Только отображение: ничего не отправляет и не знает про DeviceStore/WebSocket. Заменяет удалённый компонент `Map`.
49
+ Смарт-виджет «Карта» — положение объектов на карте MapLibre с траекториями. Каждый объект — одна **группа полей** устройства (префикс, например `MAV`); виджет показывает сразу несколько групп, например `MAV GNSS` — автопилот и собственный GNSS-приёмник модуля. Только отображение: ничего не отправляет и не знает про DeviceStore/WebSocket. Заменяет удалённый компонент `Map`.
50
50
 
51
51
  ### Поведение
52
52
 
53
- - **Свежесть.** Борт зелёный, пока его значения менялись за таймаут; без изменений — красный; ещё через таймаут скрывается до новых данных.
53
+ - **Свежесть.** Объект зелёный, пока его значения менялись за таймаут; без изменений — красный; ещё через таймаут скрывается до новых данных.
54
54
  - **Траектория** — точка добавляется только при смене координат (курс и высота могут обновляться чаще позиции).
55
55
  - **Только 2D** — наклон (3D) запрещён; правой кнопкой мыши карта только поворачивается, кнопка-компас под зумом возвращает её на север.
56
- - **Шапка** — сколько бортов на связи из заданных: зелёный — все, серый — часть, красный — ни одного.
56
+ - **Шапка** — сколько объектов на связи из заданных: зелёный — все, серый — часть, красный — ни одного.
57
57
  - Карта светлая/тёмная по ближайшему предку `.dark`/`.light` (как токены `theme.css`), пересчёт по событию `ThemeChange`.
58
58
 
59
59
  ## Пропсы
@@ -63,7 +63,7 @@ Telemetry_SendObject(g_telemetry_stream, g_mcfg.DevSN, "Data", dev, sizeof(dev)
63
63
  | `wrapperClass` | `string` | `""` | CSS-классы обёртки |
64
64
  | `componentClass` | `string` | `""` | «Мастер-цвет» виджета — роль вида `"bg-blue"` |
65
65
  | `label` | `{ name?: string }` | `{ name: "Карта" }` | Заголовок карточки |
66
- | `groups` | `string[]` | `["MAV"]` | Префиксы групп полей — по борту на группу |
66
+ | `groups` | `string[]` | `["MAV"]` | Префиксы групп полей — по объекту на группу |
67
67
  | `value` | `Record<string, Partial<IWidgetMapData>>` | `undefined` | Значения по группам: `{ MAV: { Lat, Lon, ... }, GNSS: {...} }` |
68
68
  | `keys` | `Partial<Record<keyof IWidgetMapData, string>>` | `undefined` | Переопределение имён ключей (применяет GUIPreview) |
69
69
  | `height` | `number` | `400` | Высота карты, px |
@@ -1,7 +1,7 @@
1
- <!-- $lib/WidgetMap/WidgetMap.svelte — смарт-виджет «Карта»: борта из групп полей устройства (по умолчанию MAV) с полями
1
+ <!-- $lib/WidgetMap/WidgetMap.svelte — смарт-виджет «Карта»: объекты из групп полей устройства (по умолчанию MAV) с полями
2
2
  Lat/Lon/Alt/Heading/Sat/DevName/DevSN (см. IWidgetMapData), каждая группа — свой маркер и своя траектория. Только отображение:
3
3
  ничего не отправляет и не знает про DeviceStore/WebSocket. Траекторию, длину трека и таймаут маркеров оператор
4
- переключает прямо поверх карты, «Все борта» — кнопка в шапке; вид карта сама не меняет — бортов может быть много. -->
4
+ переключает прямо поверх карты, «Показать все» — кнопка в шапке; вид карта сама не меняет — объектов может быть много. -->
5
5
  <script lang="ts">
6
6
  import { onMount, untrack } from "svelte"
7
7
  import { slide } from "svelte/transition"
@@ -69,7 +69,7 @@
69
69
  let isCopied = $state(false)
70
70
  let isDarkMode = $state(false)
71
71
 
72
- /* Борт обновляется только при реальной смене значений — свежесть считается от последнего изменения, а не от перерисовки */
72
+ /* Объект обновляется только при реальной смене значений — свежесть считается от последнего изменения, а не от перерисовки */
73
73
  $effect(() => {
74
74
  for (const group of groupList) {
75
75
  const v = value?.[group]
@@ -120,7 +120,7 @@
120
120
  const isFresh = (b: Board) => now - b.lastChange < markerTimeout
121
121
  let freshCount = $derived(visibleBoards.filter(isFresh).length)
122
122
 
123
- /* Вписывает в экран все видимые борта, один борт — приближение к нему */
123
+ /* Вписывает в экран все видимые объекты, один объект — приближение к нему */
124
124
  const fitAllBoards = () => {
125
125
  if (!mapInstance || visibleBoards.length === 0) return
126
126
  if (visibleBoards.length === 1) return mapInstance.flyTo({ center: [visibleBoards[0].lon, visibleBoards[0].lat], zoom: 16 })
@@ -183,7 +183,7 @@
183
183
  <UI.Button
184
184
  wrapperClass="w-auto"
185
185
  componentClass="bg-transparent px-3"
186
- content={{ icon: FitIcon, name: $T("constructor.props.map.fitAll") }}
186
+ content={{ icon: FitIcon, name: $T("constructor.props.map.fitAll"), info: { text: $T("constructor.props.map.fitAllHint"), side: "bottom" } }}
187
187
  disabled={collapsed || visibleBoards.length === 0}
188
188
  onClick={fitAllBoards}
189
189
  />
@@ -1,5 +1,5 @@
1
1
  <!-- $lib/WidgetMap/WidgetMapProps.svelte — панель пропсов конструктора для WidgetMap: заголовок, группы полей
2
- (каждая — борт), мастер-цвет, высота карты, иконка маркера и начальные значения переключателей оператора. -->
2
+ (каждая — объект), мастер-цвет, высота карты, иконка маркера и начальные значения переключателей оператора. -->
3
3
  <script lang="ts">
4
4
  import { T } from "../locales/i18n"
5
5
  import * as UI from ".."
@@ -53,8 +53,10 @@
53
53
 
54
54
  - **Строка состояния** — ARMED/DISARMED, режим полёта (название по типу аппарата: самолёт, коптер, наземный), GPS (тип фиксации и спутники), батарея (В, А, %), расстояние и пеленг на точку взлёта.
55
55
  - **Авиагоризонт** — небо и земля по крену и тангажу, лестница тангажа через 5°, дуга крена (10/20/30/45/60°), символ самолёта. Ориентация сглаживается между пакетами (Tween 120 мс).
56
- - **Лента скорости** (слева, путевая) с воздушной числом, **лента высоты** (справа, над точкой взлёта) с вариометром, **лента курса** (снизу) с меткой трека (розовая) и направления на дом (зелёная).
57
- - **Под прибором** — координаты, высота над уровнем моря, давление, температура.
56
+ - **Лента скорости** (слева, путевая над землёй) и **лента высоты** (справа, над точкой взлёта) с вариометром у края, **лента курса** (снизу): розовый ▲ — трек (куда аппарат реально движется, по `Vx`/`Vy`), зелёный ● — направление на точку взлёта.
57
+ - **Углы под лентами** — воздушная скорость (относительно воздуха, отличается от путевой на ветер) и вертикальная скорость (+ набор зелёным, − снижение оранжевым).
58
+ - **Подсказки** — наведите курсор на любой элемент прибора, строки состояния или значений: всплывающая подсказка с расшифровкой и текущим значением (элементы помечены `data-tip`).
59
+ - **Под прибором** — легенда трека и направления на дом с градусами, координаты, высота над уровнем моря, давление, температура.
58
60
  - **Нет данных** — если пакеты не приходили дольше `limits.staleMs` (по умолчанию 2 с), прибор перечёркивается и помечается «НЕТ ДАННЫХ»; в шапке всегда виден возраст данных.
59
61
  - **Узкая ячейка** (уже 440 px) — ленты скорости и высоты заменяются числами поверх горизонта.
60
62
 
@@ -204,6 +204,17 @@
204
204
  const uid = crypto.randomUUID().slice(0, 8)
205
205
 
206
206
  const fmt = (v: number, digits = 1) => (Number.isFinite(v) ? v.toFixed(digits) : "—")
207
+ const signed = (v: number) => `${v >= 0 ? "+" : ""}${fmt(v)}`
208
+
209
+ /* Всплывающая подсказка: элементы прибора и строк помечены data-tip, одна подсказка следует за курсором */
210
+ let tip: { text: string; x: number; y: number } | null = $state(null)
211
+ const onTip = (e: PointerEvent) => {
212
+ const host = e.currentTarget as HTMLElement
213
+ const el = (e.target as Element | null)?.closest("[data-tip]")
214
+ if (!el) return (tip = null)
215
+ const r = host.getBoundingClientRect()
216
+ tip = { text: el.getAttribute("data-tip") ?? "", x: Math.min(Math.max(e.clientX - r.left, 90), r.width - 90), y: e.clientY - r.top }
217
+ }
207
218
  const fmtDistance = (m: number) => (m >= 1000 ? `${(m / 1000).toFixed(2)} км` : `${Math.round(m)} м`)
208
219
  const fmtAge = (s: number) => (Number.isFinite(s) ? `${s.toFixed(1)} с` : "нет связи")
209
220
  </script>
@@ -219,21 +230,31 @@
219
230
  </WidgetHeader>
220
231
 
221
232
  {#if !collapsed}
222
- <div class="flex flex-col gap-2" transition:slide={{ duration: 150 }} bind:clientWidth={width}>
233
+ <div
234
+ class="relative flex flex-col gap-2"
235
+ transition:slide={{ duration: 150 }}
236
+ bind:clientWidth={width}
237
+ onpointermove={onTip}
238
+ onpointerleave={() => (tip = null)}
239
+ role="presentation"
240
+ >
223
241
  <!-- Строка состояния -->
224
242
  <div
225
243
  class="flex flex-wrap items-center gap-x-4 gap-y-1 rounded-[10px] border border-(--hairline-color) bg-(--back-color) px-3 py-2 text-[12px] font-semibold tabular-nums"
226
244
  >
227
- <span class="rounded-md px-1.5 py-0.5 {armed ? 'bg-(--red-color) text-white' : 'bg-(--container-color) text-(--muted-color)'}"
228
- >{armed ? "ARMED" : "DISARMED"}</span
245
+ <span
246
+ class="rounded-md px-1.5 py-0.5 {armed ? 'bg-(--red-color) text-white' : 'bg-(--container-color) text-(--muted-color)'}"
247
+ data-tip={armed ? "Двигатели взведены — аппарат готов к полёту" : "Двигатели не взведены"}>{armed ? "ARMED" : "DISARMED"}</span
248
+ >
249
+ <span data-tip="Режим полёта автопилота">{modeName}</span>
250
+ <span class={fix < 3 ? "text-(--orange-color)" : ""} data-tip="Тип фиксации GPS · число спутников; меньше 3D — позиция неточная"
251
+ >GPS {FIX[fix] ?? fix} · {num(value?.Sat)}</span
229
252
  >
230
- <span>{modeName}</span>
231
- <span class={fix < 3 ? "text-(--orange-color)" : ""}>GPS {FIX[fix] ?? fix} · {num(value?.Sat)}</span>
232
- <span class={battLow ? "text-(--red-color)" : ""}>
253
+ <span class={battLow ? "text-(--red-color)" : ""} data-tip="Батарея: напряжение · ток · остаток заряда">
233
254
  {fmt(num(value?.BV))} В{battCurrent >= 0 ? ` · ${fmt(battCurrent)} А` : ""}{battRem >= 0 ? ` · ${battRem}%` : ""}
234
255
  </span>
235
256
  {#if home}
236
- <span>Дом {fmtDistance(home.distance)} · {Math.round(home.bearing)}°</span>
257
+ <span data-tip="Точка взлёта: расстояние · направление на неё">Дом {fmtDistance(home.distance)} · {Math.round(home.bearing)}°</span>
237
258
  {/if}
238
259
  </div>
239
260
 
@@ -247,7 +268,7 @@
247
268
  </defs>
248
269
 
249
270
  <!-- Авиагоризонт -->
250
- <g clip-path="url(#pfd-horizon-{uid})">
271
+ <g clip-path="url(#pfd-horizon-{uid})" data-tip="Авиагоризонт: крен {fmt(roll.current)}°, тангаж {fmt(pitch.current)}°">
251
272
  <g transform="rotate({-roll.current} {CX} {CY}) translate(0 {pitch.current * PPD})">
252
273
  <rect x={CX - 600} y={CY - 1000} width="1200" height="1000" fill="#3a86c8" />
253
274
  <rect x={CX - 600} y={CY} width="1200" height="1000" fill="#8a5a2b" />
@@ -274,7 +295,10 @@
274
295
  {@const b = arcPoint(t, ROLL_R + (t % 30 === 0 ? 12 : 7))}
275
296
  <line x1={a.x} y1={a.y} x2={b.x} y2={b.y} stroke="#fff" stroke-width="1.5" />
276
297
  {/each}
277
- <g transform="rotate({-roll.current} {CX} {CY})">
298
+ <g
299
+ transform="rotate({-roll.current} {CX} {CY})"
300
+ data-tip="Указатель крена: {fmt(roll.current)}°{limits?.bankMax !== undefined ? `, предел ±${limits.bankMax}°` : ''}"
301
+ >
278
302
  <polygon
279
303
  points="{CX},{CY - ROLL_R + 2} {CX - 7},{CY - ROLL_R + 14} {CX + 7},{CY - ROLL_R + 14}"
280
304
  fill={limits?.bankMax !== undefined && Math.abs(roll.current) > limits.bankMax ? "#ef4444" : "#facc15"}
@@ -303,7 +327,12 @@
303
327
 
304
328
  {#if !compact}
305
329
  <!-- Лента скорости (путевая), красные зоны вне speedMin/speedMax -->
306
- <g clip-path="url(#pfd-speed-{uid})">
330
+ <g
331
+ clip-path="url(#pfd-speed-{uid})"
332
+ data-tip="Путевая скорость (над землёй, по GPS): {fmt(gs)} м/с{limits?.speedMin !== undefined || limits?.speedMax !== undefined
333
+ ? ' — красное: вне допустимого диапазона'
334
+ : ''}"
335
+ >
307
336
  <rect x="0" y="0" width="70" height={HH} fill="#000" fill-opacity="0.72" />
308
337
  {#if limits?.speedMin !== undefined}
309
338
  {@const y = CY - (limits.speedMin - gs) * SPEED_PPU}
@@ -322,12 +351,15 @@
322
351
  <rect x="4" y={CY - 14} width="58" height="28" rx="4" fill="#000" stroke="var(--accent-color)" stroke-width="1.5" />
323
352
  <text x="33" y={CY + 6} fill="#fff" font-size="15" font-weight="600" text-anchor="middle">{fmt(gs)}</text>
324
353
  <rect x="0" y="0" width="70" height="20" rx="8" fill="#000" />
325
- <rect x="0" y={HH - 20} width="70" height="20" rx="8" fill="#000" />
326
- <text x="35" y="14" fill="#fff" font-size="10" text-anchor="middle" fill-opacity="0.7">GS м/с</text>
327
- <text x="35" y={HH - 6} fill="#fff" font-size="11" text-anchor="middle">AS {fmt(as)}</text>
354
+ <text x="35" y="14" fill="#fff" font-size="10" text-anchor="middle" fill-opacity="0.7">СКОР м/с</text>
328
355
 
329
356
  <!-- Лента высоты над точкой взлёта, красная зона выше altMax; вариометр справа -->
330
- <g clip-path="url(#pfd-alt-{uid})">
357
+ <g
358
+ clip-path="url(#pfd-alt-{uid})"
359
+ data-tip="Высота над точкой взлёта: {Math.round(alt)} м; полоса у края — вертикальная скорость{limits?.altMax !== undefined
360
+ ? ', красное — выше предела'
361
+ : ''}"
362
+ >
331
363
  <rect x={VW - 70} y="0" width="70" height={HH} fill="#000" fill-opacity="0.72" />
332
364
  {#if limits?.altMax !== undefined}
333
365
  {@const y = CY - (limits.altMax - alt) * ALT_PPU}
@@ -343,13 +375,30 @@
343
375
  <rect x={VW - 66} y={CY - 14} width="58" height="28" rx="4" fill="#000" stroke="var(--accent-color)" stroke-width="1.5" />
344
376
  <text x={VW - 37} y={CY + 6} fill="#fff" font-size="15" font-weight="600" text-anchor="middle">{Math.round(alt)}</text>
345
377
  <rect x={VW - 70} y="0" width="70" height="20" rx="8" fill="#000" />
346
- <rect x={VW - 70} y={HH - 20} width="70" height="20" rx="8" fill="#000" />
347
- <text x={VW - 35} y="14" fill="#fff" font-size="10" text-anchor="middle" fill-opacity="0.7">ALT м</text>
348
- <text x={VW - 35} y={HH - 6} fill="#fff" font-size="11" text-anchor="middle">VS {climb >= 0 ? "+" : ""}{fmt(climb)}</text>
378
+ <text x={VW - 35} y="14" fill="#fff" font-size="10" text-anchor="middle" fill-opacity="0.7">ВЫС м</text>
379
+
380
+ <!-- Углы под лентами: воздушная и вертикальная скорость -->
381
+ <g data-tip="Воздушная скорость — относительно воздуха; отличается от путевой на ветер">
382
+ <rect x="0" y={HH + 6} width={HX - 6} height="44" rx="8" fill="#000" fill-opacity="0.72" />
383
+ <text x={(HX - 6) / 2} y={HH + 21} fill="#fff" fill-opacity="0.7" font-size="9" text-anchor="middle">ВОЗД. СКОР</text>
384
+ <text x={(HX - 6) / 2} y={HH + 41} fill="#fff" font-size="14" font-weight="600" text-anchor="middle">{fmt(as)}</text>
385
+ </g>
386
+ <g data-tip="Вертикальная скорость: + набор высоты, − снижение, м/с">
387
+ <rect x={HX + HW + 6} y={HH + 6} width={VW - HX - HW - 6} height="44" rx="8" fill="#000" fill-opacity="0.72" />
388
+ <text x={(HX + HW + 6 + VW) / 2} y={HH + 21} fill="#fff" fill-opacity="0.7" font-size="9" text-anchor="middle">ВЕРТ. СКОР</text>
389
+ <text
390
+ x={(HX + HW + 6 + VW) / 2}
391
+ y={HH + 41}
392
+ fill={climb > 0.2 ? "#22c55e" : climb < -0.2 ? "#f97316" : "#fff"}
393
+ font-size="14"
394
+ font-weight="600"
395
+ text-anchor="middle">{signed(climb)}</text
396
+ >
397
+ </g>
349
398
  {/if}
350
399
 
351
400
  <!-- Лента курса: трек (розовый), направление на дом (зелёный) -->
352
- <g clip-path="url(#pfd-hdg-{uid})">
401
+ <g clip-path="url(#pfd-hdg-{uid})" data-tip="Курс — куда направлен нос аппарата: {Math.round(wrap360(heading.current))}°">
353
402
  <rect x={HX} y={HH + 6} width={HW} height="44" fill="#000" fill-opacity="0.72" />
354
403
  {#each hdgTicks as d (d)}
355
404
  {@const x = CX + hdgOffset(d)}
@@ -358,11 +407,21 @@
358
407
  {/each}
359
408
  {#if track !== null}
360
409
  {@const x = CX + hdgOffset(track)}
361
- <polygon points="{x},{HH + 8} {x - 6},{HH + 18} {x + 6},{HH + 18}" fill="#ec4899" />
410
+ <polygon
411
+ points="{x},{HH + 8} {x - 6},{HH + 18} {x + 6},{HH + 18}"
412
+ fill="#ec4899"
413
+ data-tip="Трек — куда аппарат реально движется над землёй (по скоростям на север и восток): {Math.round(track)}°"
414
+ />
362
415
  {/if}
363
416
  {#if home}
364
417
  {@const x = CX + hdgOffset(home.bearing)}
365
- <circle cx={x} cy={HH + 44} r="4" fill="#22c55e" />
418
+ <circle
419
+ cx={x}
420
+ cy={HH + 44}
421
+ r="4"
422
+ fill="#22c55e"
423
+ data-tip="Направление на точку взлёта: {Math.round(home.bearing)}°, {fmtDistance(home.distance)}"
424
+ />
366
425
  {/if}
367
426
  </g>
368
427
  <rect x={CX - 26} y={HH + 20} width="52" height="24" rx="4" fill="#000" stroke="var(--accent-color)" stroke-width="1.5" />
@@ -382,12 +441,27 @@
382
441
  {/if}
383
442
  </svg>
384
443
 
444
+ {#if tip}
445
+ <div
446
+ class="pointer-events-none absolute z-10 max-w-64 -translate-x-1/2 -translate-y-full rounded-lg border border-(--hairline-color) bg-(--back-color) px-2.5 py-1.5 text-[12px] text-(--font-color) shadow-(--elevation-2)"
447
+ style="left: {tip.x}px; top: {tip.y - 10}px"
448
+ >
449
+ {tip.text}
450
+ </div>
451
+ {/if}
452
+
385
453
  <!-- Значения под прибором -->
386
454
  <div
387
455
  class="flex flex-wrap gap-x-5 gap-y-1 rounded-[10px] border border-(--hairline-color) bg-(--back-color) px-3 py-2 text-[12px] whitespace-nowrap tabular-nums"
388
456
  >
457
+ {#if track !== null}<span data-tip="Направление движения над землёй"
458
+ ><span style="color:#ec4899">▲</span> <span class="text-(--muted-color)">Трек</span> {Math.round(track)}°</span
459
+ >{/if}
460
+ {#if home}<span data-tip="Направление на точку взлёта"
461
+ ><span style="color:#22c55e">●</span> <span class="text-(--muted-color)">Дом</span> {Math.round(home.bearing)}°</span
462
+ >{/if}
389
463
  <span><span class="text-(--muted-color)">Координаты</span> {lat ? `${lat.toFixed(6)}, ${lon.toFixed(6)}` : "—"}</span>
390
- <span><span class="text-(--muted-color)">Высота MSL</span> {Math.round(altMsl)} м</span>
464
+ <span data-tip="Высота над уровнем моря"><span class="text-(--muted-color)">Высота MSL</span> {Math.round(altMsl)} м</span>
391
465
  <span><span class="text-(--muted-color)">Давление</span> {fmt(num(value?.Press))} гПа</span>
392
466
  <span><span class="text-(--muted-color)">Температура</span> {fmt(num(value?.Temp))} °C</span>
393
467
  </div>
@@ -119,14 +119,14 @@ const translations = {
119
119
  "🎯 **用途**\n控制可寻址灯带:颜色、效果、速度以及灯带本身的参数。\n\n📦 **数据包**\n- `RGB_Strip` 驱动的 `LST` 分组字段(可通过设置中的前缀更改),无需绑定变量\n- 颜色、效果和速度立即发送\n- 「硬件」区块在本地编辑,点击「保存」一次性发送 —— 灯带重启\n\n🔑 **键**\n- `Color` —— 数组 `[R, G, B, W]`,0–255;`W` 仅用于 SK6812\n- `Effect` —— 数字:`0` 静态、`1` 彩虹、`2` 呼吸、`3` 调色板、`4` 彗星、`5` 闪烁、`6` 火焰、`7` 跑马灯\n- `Speed` —— 0–10 的数字(非线性),`0` —— 暂停\n- `Count` —— LED 数量,1–`MaxCount`\n- `Model` —— 数字:`0` WS2812、`1` SK6812(RGBW)、`2` WS2811\n- `Order` —— 颜色顺序:`0` GRB、`1` RGB、`2` BRG、`3` RBG、`4` GBR、`5` BGR\n- `MaxCount` —— 数字:固件中的容量,只读\n\n✨ **特点**\n- 彩虹、调色板和火焰不使用颜色\n- 颜色不对(红色变绿色)—— 更改顺序:WS2812 通常为 GRB,部分 WS2811 为 RGB 或 BRG\n- 数据引脚和传输方式(RMT/SPI)在固件中设定\n\n⚙️ **设置**\n- 分组前缀(ID)、主色",
120
120
  ],
121
121
  "component.info.WidgetPFD": [
122
- "🎯 **Назначение**\nПилотажный дисплей (PFD) — главный прибор контроля полёта: пространственное положение, скорость, высота, курс и состояние систем.\n\n📦 **Пакет данных**\n- Поля группы `MAV` — телеметрия автопилота MAVLink (меняется префиксом в настройках), привязывать переменные не нужно\n- Поток телеметрии: `Roll`, `Pitch`, `Heading` — ~20 раз в секунду, остальное — 1–2 раза в секунду\n- Только отображение, ничего не отправляет\n\n🔑 **Ключи**\n- `Roll`, `Pitch` — числа, °: крен (вправо +) и тангаж (вверх +)\n- `Heading` — число, 0–360°: курс\n- `GSpeed`, `ASpeed` — числа, м/с: путевая и воздушная скорость\n- `Alt` — число, м: высота над точкой взлёта; `AltMSL` — над уровнем моря\n- `Climb` — число, м/с: вертикальная скорость (вверх +)\n- `Lat`, `Lon` — числа, °: координаты\n- `Vx`, `Vy` — числа, м/с: скорость на север и восток — для трека\n- `Fix` — число: тип фиксации GPS, `0`–`1` нет, `2` 2D, `3` 3D, `4`–`6` DGPS/RTK; `Sat` — число спутников\n- `BV` — В; `BC` — А (`-1` не измеряется); `BRem` — % (`-1` неизвестно)\n- `Mode` — число: режим автопилота; `VType` — тип аппарата (по нему — названия режимов); `Armed` — `1` взведён\n- `HomeLat`, `HomeLon` — числа, °: точка взлёта, `0` — неизвестна\n- `Press` — гПа, `Temp` — °C\n\n✨ **Особенности**\n- Ориентация сглаживается между пакетами\n- Розовая метка на ленте курса — трек, зелёная — направление на точку взлёта\n- Нет данных дольше заданного времени — прибор перечёркнут и помечен «НЕТ ДАННЫХ»\n- В узкой ячейке ленты скорости и высоты заменяются числами поверх горизонта\n- Ключи `Lat`, `Lon`, `Alt`, `Heading`, `Sat` общие с «Картой» — одна группа питает оба виджета\n\n⚙️ **Настройки**\n- Префикс группы (ID), мастер-цвет\n- Границы: мин./макс. скорость и макс. высота — красные зоны на лентах; предельный крен — красная дуга; низкий заряд; время до «НЕТ ДАННЫХ»",
123
- '🎯 **Purpose**\nPrimary flight display (PFD) — the main flight instrument: attitude, speed, altitude, heading and system status.\n\n📦 **Data packet**\n- Fields of the `MAV` group — MAVLink autopilot telemetry (changed by the prefix in settings), no variable binding needed\n- Telemetry stream: `Roll`, `Pitch`, `Heading` ~20 times a second, the rest 1–2 times a second\n- Display only, sends nothing\n\n🔑 **Keys**\n- `Roll`, `Pitch` — numbers, °: bank (right +) and pitch (up +)\n- `Heading` — number, 0–360°: heading\n- `GSpeed`, `ASpeed` — numbers, m/s: ground speed and airspeed\n- `Alt` — number, m: altitude above home; `AltMSL` — above sea level\n- `Climb` — number, m/s: vertical speed (up +)\n- `Lat`, `Lon` — numbers, °: coordinates\n- `Vx`, `Vy` — numbers, m/s: north and east velocity — for the track\n- `Fix` — number: GPS fix type, `0`–`1` none, `2` 2D, `3` 3D, `4`–`6` DGPS/RTK; `Sat` — satellite count\n- `BV` — V; `BC` — A (`-1` not measured); `BRem` — % (`-1` unknown)\n- `Mode` — number: autopilot mode; `VType` — vehicle type (mode names depend on it); `Armed` — `1` armed\n- `HomeLat`, `HomeLon` — numbers, °: home position, `0` — unknown\n- `Press` — hPa, `Temp` — °C\n\n✨ **Features**\n- Attitude is smoothed between packets\n- The magenta mark on the heading tape is the track, the green one — direction to home\n- No data for longer than the set time — the instrument is crossed out and marked "NO DATA"\n- In a narrow cell the speed and altitude tapes become numbers over the horizon\n- Keys `Lat`, `Lon`, `Alt`, `Heading`, `Sat` are shared with the "Map" — one group feeds both widgets\n\n⚙️ **Settings**\n- Group prefix (ID), master color\n- Limits: min/max speed and max altitude — red bands on the tapes; bank limit — red arc; low battery; time until "NO DATA"',
124
- "🎯 **用途**\n主飞行显示器(PFD)—— 飞行监控的主要仪表:姿态、速度、高度、航向和系统状态。\n\n📦 **数据包**\n- `MAV` 分组的字段 —— MAVLink 自驾仪遥测(可通过设置中的前缀更改),无需绑定变量\n- 遥测流:`Roll`、`Pitch`、`Heading` 约每秒 20 次,其余每秒 1–2 次\n- 仅显示,不发送任何数据\n\n🔑 **键**\n- `Roll`、`Pitch` —— 数字,°:坡度(向右 +)和俯仰(向上 +)\n- `Heading` —— 数字,0–360°:航向\n- `GSpeed`、`ASpeed` —— 数字,m/s:地速和空速\n- `Alt` —— 数字,m:相对起飞点高度;`AltMSL` —— 海拔高度\n- `Climb` —— 数字,m/s:升降速度(向上 +)\n- `Lat`、`Lon` —— 数字,°:坐标\n- `Vx`、`Vy` —— 数字,m/s:向北和向东的速度 —— 用于航迹\n- `Fix` —— 数字:GPS 定位类型,`0`–`1` 无、`2` 2D、`3` 3D、`4`–`6` DGPS/RTK;`Sat` —— 卫星数\n- `BV` —— V;`BC` —— A(`-1` 未测量);`BRem` —— %(`-1` 未知)\n- `Mode` —— 数字:自驾仪模式;`VType` —— 机型(决定模式名称);`Armed` —— `1` 已解锁\n- `HomeLat`、`HomeLon` —— 数字,°:起飞点,`0` —— 未知\n- `Press` —— hPa,`Temp` —— °C\n\n✨ **特点**\n- 数据包之间的姿态经过平滑\n- 航向带上的粉色标记为航迹,绿色为起飞点方向\n- 超过设定时间无数据 —— 仪表被划叉并标记「无数据」\n- 在窄单元格中,速度带和高度带变为地平线上的数字\n- 键 `Lat`、`Lon`、`Alt`、`Heading`、`Sat` 与「地图」通用 —— 一个分组同时供两个组件使用\n\n⚙️ **设置**\n- 分组前缀(ID)、主色\n- 限值:最小/最大速度和最大高度 —— 速度带和高度带上的红色区域;最大坡度 —— 红色弧线;低电量;「无数据」前的时间",
122
+ "🎯 **Назначение**\nПилотажный дисплей (PFD) — главный прибор контроля полёта: пространственное положение, скорость, высота, курс и состояние систем.\n\n📦 **Пакет данных**\n- Поля группы `MAV` — телеметрия автопилота MAVLink (меняется префиксом в настройках), привязывать переменные не нужно\n- Поток телеметрии: `Roll`, `Pitch`, `Heading` — ~20 раз в секунду, остальное — 1–2 раза в секунду\n- Только отображение, ничего не отправляет\n\n🔑 **Ключи**\n- `Roll`, `Pitch` — числа, °: крен (вправо +) и тангаж (вверх +)\n- `Heading` — число, 0–360°: курс\n- `GSpeed`, `ASpeed` — числа, м/с: путевая и воздушная скорость\n- `Alt` — число, м: высота над точкой взлёта; `AltMSL` — над уровнем моря\n- `Climb` — число, м/с: вертикальная скорость (вверх +)\n- `Lat`, `Lon` — числа, °: координаты\n- `Vx`, `Vy` — числа, м/с: скорость на север и восток — для трека\n- `Fix` — число: тип фиксации GPS, `0`–`1` нет, `2` 2D, `3` 3D, `4`–`6` DGPS/RTK; `Sat` — число спутников\n- `BV` — В; `BC` — А (`-1` не измеряется); `BRem` — % (`-1` неизвестно)\n- `Mode` — число: режим автопилота; `VType` — тип аппарата (по нему — названия режимов); `Armed` — `1` взведён\n- `HomeLat`, `HomeLon` — числа, °: точка взлёта, `0` — неизвестна\n- `Press` — гПа, `Temp` — °C\n\n✨ **Особенности**\n- Ориентация сглаживается между пакетами\n- Наведите курсор на любой элемент прибора или строки — всплывающая подсказка с расшифровкой и текущим значением\n- Углы под лентами: воздушная скорость (относительно воздуха) и вертикальная скорость (+ набор, − снижение)\n- Розовый ▲ на ленте курса — трек: куда аппарат реально движется над землёй (по `Vx`, `Vy`); зелёный ● — направление на точку взлёта; легенда с градусами — под прибором\n- Нет данных дольше заданного времени — прибор перечёркнут и помечен «НЕТ ДАННЫХ»\n- В узкой ячейке ленты скорости и высоты заменяются числами поверх горизонта\n- Ключи `Lat`, `Lon`, `Alt`, `Heading`, `Sat` общие с «Картой» — одна группа питает оба виджета\n\n⚙️ **Настройки**\n- Префикс группы (ID), мастер-цвет\n- Границы: мин./макс. скорость и макс. высота — красные зоны на лентах; предельный крен — красная дуга; низкий заряд; время до «НЕТ ДАННЫХ»",
123
+ '🎯 **Purpose**\nPrimary flight display (PFD) — the main flight instrument: attitude, speed, altitude, heading and system status.\n\n📦 **Data packet**\n- Fields of the `MAV` group — MAVLink autopilot telemetry (changed by the prefix in settings), no variable binding needed\n- Telemetry stream: `Roll`, `Pitch`, `Heading` ~20 times a second, the rest 1–2 times a second\n- Display only, sends nothing\n\n🔑 **Keys**\n- `Roll`, `Pitch` — numbers, °: bank (right +) and pitch (up +)\n- `Heading` — number, 0–360°: heading\n- `GSpeed`, `ASpeed` — numbers, m/s: ground speed and airspeed\n- `Alt` — number, m: altitude above home; `AltMSL` — above sea level\n- `Climb` — number, m/s: vertical speed (up +)\n- `Lat`, `Lon` — numbers, °: coordinates\n- `Vx`, `Vy` — numbers, m/s: north and east velocity — for the track\n- `Fix` — number: GPS fix type, `0`–`1` none, `2` 2D, `3` 3D, `4`–`6` DGPS/RTK; `Sat` — satellite count\n- `BV` — V; `BC` — A (`-1` not measured); `BRem` — % (`-1` unknown)\n- `Mode` — number: autopilot mode; `VType` — vehicle type (mode names depend on it); `Armed` — `1` armed\n- `HomeLat`, `HomeLon` — numbers, °: home position, `0` — unknown\n- `Press` — hPa, `Temp` — °C\n\n✨ **Features**\n- Attitude is smoothed between packets\n- Hover any instrument element or row item — a tooltip with its meaning and current value\n- Corners under the tapes: airspeed (relative to the air) and vertical speed (+ climb, − descent)\n- Magenta ▲ on the heading tape is the track: where the vehicle actually moves over the ground (from `Vx`, `Vy`); green ● — direction to home; a legend with degrees is below the instrument\n- No data for longer than the set time — the instrument is crossed out and marked "NO DATA"\n- In a narrow cell the speed and altitude tapes become numbers over the horizon\n- Keys `Lat`, `Lon`, `Alt`, `Heading`, `Sat` are shared with the "Map" — one group feeds both widgets\n\n⚙️ **Settings**\n- Group prefix (ID), master color\n- Limits: min/max speed and max altitude — red bands on the tapes; bank limit — red arc; low battery; time until "NO DATA"',
124
+ "🎯 **用途**\n主飞行显示器(PFD)—— 飞行监控的主要仪表:姿态、速度、高度、航向和系统状态。\n\n📦 **数据包**\n- `MAV` 分组的字段 —— MAVLink 自驾仪遥测(可通过设置中的前缀更改),无需绑定变量\n- 遥测流:`Roll`、`Pitch`、`Heading` 约每秒 20 次,其余每秒 1–2 次\n- 仅显示,不发送任何数据\n\n🔑 **键**\n- `Roll`、`Pitch` —— 数字,°:坡度(向右 +)和俯仰(向上 +)\n- `Heading` —— 数字,0–360°:航向\n- `GSpeed`、`ASpeed` —— 数字,m/s:地速和空速\n- `Alt` —— 数字,m:相对起飞点高度;`AltMSL` —— 海拔高度\n- `Climb` —— 数字,m/s:升降速度(向上 +)\n- `Lat`、`Lon` —— 数字,°:坐标\n- `Vx`、`Vy` —— 数字,m/s:向北和向东的速度 —— 用于航迹\n- `Fix` —— 数字:GPS 定位类型,`0`–`1` 无、`2` 2D、`3` 3D、`4`–`6` DGPS/RTK;`Sat` —— 卫星数\n- `BV` —— V;`BC` —— A(`-1` 未测量);`BRem` —— %(`-1` 未知)\n- `Mode` —— 数字:自驾仪模式;`VType` —— 机型(决定模式名称);`Armed` —— `1` 已解锁\n- `HomeLat`、`HomeLon` —— 数字,°:起飞点,`0` —— 未知\n- `Press` —— hPa,`Temp` —— °C\n\n✨ **特点**\n- 数据包之间的姿态经过平滑\n- 将鼠标悬停在仪表或行中的任意元素上 —— 显示含义和当前值的提示\n- 速度带和高度带下方的角落:空速(相对空气)和升降速度(+ 爬升、− 下降)\n- 航向带上的粉色 ▲ 为航迹:载具相对地面的实际运动方向(由 `Vx`、`Vy` 计算);绿色 ● —— 起飞点方向;仪表下方有带角度的图例\n- 超过设定时间无数据 —— 仪表被划叉并标记「无数据」\n- 在窄单元格中,速度带和高度带变为地平线上的数字\n- 键 `Lat`、`Lon`、`Alt`、`Heading`、`Sat` 与「地图」通用 —— 一个分组同时供两个组件使用\n\n⚙️ **设置**\n- 分组前缀(ID)、主色\n- 限值:最小/最大速度和最大高度 —— 速度带和高度带上的红色区域;最大坡度 —— 红色弧线;低电量;「无数据」前的时间",
125
125
  ],
126
126
  "component.info.WidgetMap": [
127
- "🎯 **Назначение**\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- Начальные значения: траектория и число её точек",
128
- '🎯 **Purpose**\nA real-time map of vehicles: position, heading and track of each vehicle.\n\n📦 **Data packet**\n- Device field groups, one group per vehicle: `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 vehicle 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: vehicle 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 "Device info" — one packet feeds several widgets\n- Click a vehicle — a card with all values, "Copy" and "Hide" buttons\n- The operator switches the track, its point count and marker timeout on the map; a vehicle without new data turns red, after one more timeout it is hidden\n- "All vehicles" in the header fits vehicles into view; the map never moves by itself\n- The header shows how many of the configured vehicles 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',
129
- "🎯 **用途**\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- 默认值:轨迹及其点数",
127
+ "🎯 **Назначение**\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- Начальные значения: траектория и число её точек",
128
+ '🎯 **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 "Device info" — 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',
129
+ "🎯 **用途**\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- 默认值:轨迹及其点数",
130
130
  ],
131
131
  "component.info.WidgetStackInfo": [
132
132
  '🎯 **Назначение**\nОтладка прошивки: свободная память и запас стека задач.\n\n📦 **Пакет данных**\n- Один объект `StackInfo` из ответа на `GET StackInfo`, привязывать переменные не нужно\n- Запрос — кнопкой «Обновить» или автоопросом\n\n🔑 **Ключи**\n- `Heap` — массив `[{ "Name", "Total", "Free", "MinFree" }]`, байт: кучи памяти, `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 с; мастер-цвет',
@@ -346,8 +346,9 @@ const translations = {
346
346
  "constructor.props.multiselect": ["Мультивыбор", "Multi-select", "多选"],
347
347
  "constructor.props.access": ["Доступ (не для владельца)", "Access (non-owner)", "访问权限(非所有者)"],
348
348
  "constructor.props.map.timeout": ["Таймаут маркеров:", "Marker timeout:", "标记超时:"],
349
- "constructor.props.map.boards": ["Бортов на связи", "Vehicles online", "在线载具"],
350
- "constructor.props.map.fitAll": ["Все борта", "All vehicles", "全部设备"],
349
+ "constructor.props.map.boards": ["Объектов на связи", "Objects online", "在线对象"],
350
+ "constructor.props.map.fitAllHint": ["Вписать все объекты в экран", "Fit all objects into view", "将所有对象纳入视野"],
351
+ "constructor.props.map.fitAll": ["Показать все", "Show all", "显示全部"],
351
352
  "constructor.props.map.track": ["Траектория", "Track", "轨迹"],
352
353
  "constructor.props.map.trackLength": ["Точек в траектории:", "Points in track:", "轨迹点数:"],
353
354
  "constructor.props.joystick.pitch.axe": ["Ocь ⮃", "Pitch axis ⮃", "俯仰轴 ⮃"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "poe-svelte-ui-lib",
3
- "version": "1.41.0",
3
+ "version": "1.42.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/Oleg-Perevyshin/ElementsUI.git"