poe-svelte-ui-lib 1.38.1 → 1.38.2

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.
@@ -5,7 +5,7 @@
5
5
  > **Размеры.** Ширина — 100% контейнера (в конструкторе — ширина ячейки сетки); высота карты задаётся пропом `height` (px), в сетке конструктора виджет занимает одну строку. Мастер-цвет (`componentClass`) перекрашивает шапку.
6
6
 
7
7
  Смарт-виджет «Карта» — положение бортов на карте MapLibre с траекториями. Каждый борт — одна **группа полей**
8
- устройства (префикс, например `MAV`); виджет показывает сразу несколько групп, например `MAV, GNSS` — автопилот
8
+ устройства (префикс, например `MAV`); виджет показывает сразу несколько групп, например `MAV GNSS` — автопилот
9
9
  и собственный GNSS-приёмник модуля. Только отображение: ничего не отправляет и не знает про DeviceStore/WebSocket.
10
10
  Заменяет удалённый компонент `Map`.
11
11
 
@@ -14,8 +14,8 @@
14
14
  1. **Устройство** шлёт поля группы в поток телеметрии (`Telemetry_SendObject`, ключ `Data`) — облако и WebApp
15
15
  раскладывают их в переменные `<ModSN>|<группа>.<ключ>`. Координаты — раз в 0.5–1 с, имя и серийный номер
16
16
  можно в том же пакете (строки передаются только при отправке, отдельной частоты не нужно).
17
- 2. **В конструкторе** добавьте «Карту» из смарт-виджетов и перечислите группы через запятую (`MAV` или
18
- `MAV, GNSS`). Переменные привязывать не нужно — виджет сам берёт ключи из таблицы ниже.
17
+ 2. **В конструкторе** добавьте «Карту» из смарт-виджетов и перечислите группы через пробел (`MAV` или
18
+ `MAV GNSS`). Переменные привязывать не нужно — виджет сам берёт ключи из таблицы ниже.
19
19
  3. **Оператор** поверх карты включает траекторию, выбирает число её точек и таймаут маркеров. Кнопка
20
20
  **«Все борта»** в шапке виджета вписывает все видимые борта в экран (один борт — приближение к нему).
21
21
  Сама карта вид не меняет — бортов может быть много.
@@ -85,7 +85,7 @@ Telemetry_SendObject(g_telemetry_stream, g_mcfg.DevSN, "Data", mav, sizeof(mav)
85
85
 
86
86
  ## Конструктор свойств (WidgetMapProps.svelte)
87
87
 
88
- Группы панели: общие (заголовок, группы полей через запятую, мастер-цвет), оформление (высота карты, иконка
88
+ Группы панели: общие (заголовок, группы полей через пробел, мастер-цвет), оформление (высота карты S/M/L/XL — 250/400/600/800 px, иконка
89
89
  маркера), по умолчанию (траектория и её длина — оператор меняет их на карте).
90
90
 
91
91
  ## Внутренняя архитектура
@@ -14,14 +14,20 @@
14
14
  onPropertyChange: (updates: Partial<{ properties?: string | object; name?: string; access?: string }>) => void
15
15
  }>()
16
16
 
17
- const HEIGHT_OPTIONS = [250, 300, 400, 500, 600, 800].map((value) => ({ id: crypto.randomUUID(), value, name: `${value} px` }))
17
+ /* Высота карты размерами, как у текстового поля: S/M/L/XL */
18
+ const HEIGHT_OPTIONS = [
19
+ { value: 250, name: "S" },
20
+ { value: 400, name: "M" },
21
+ { value: 600, name: "L" },
22
+ { value: 800, name: "XL" },
23
+ ].map((o) => ({ id: crypto.randomUUID(), ...o }))
18
24
  const TRACK_LENGTH_OPTIONS = [100, 500, 1000, 5000, 10000, 50000].map((value) => ({ id: crypto.randomUUID(), value, name: String(value) }))
19
25
 
20
- /* Группы вводятся через запятую: "MAV, GNSS" */
26
+ /* Группы через пробел, как переменные кнопки (имя группы не содержит пробелов): "MAV GNSS" */
21
27
  const setGroups = (raw: unknown) => {
22
28
  const list = String(raw ?? "")
23
- .split(",")
24
- .map((g) => g.trim())
29
+ .trim()
30
+ .split(/[\s,]+/)
25
31
  .filter(Boolean)
26
32
  updateProperty("groups", list.length ? list : ["MAV"], component, onPropertyChange)
27
33
  }
@@ -34,7 +40,7 @@
34
40
  value={component.properties.label?.name}
35
41
  onUpdate={(value) => updateProperty("label.name", value as string, component, onPropertyChange)}
36
42
  />
37
- <UI.Input label={{ name: "Группы полей (через запятую)" }} value={(component.properties.groups ?? ["MAV"]).join(", ")} onUpdate={setGroups} />
43
+ <UI.Input label={{ name: "Группы полей (через пробел)" }} value={(component.properties.groups ?? ["MAV"]).join(" ")} onUpdate={setGroups} />
38
44
  <WidgetAccentPicker
39
45
  value={component.properties.componentClass ?? ""}
40
46
  onUpdate={(value) => updateProperty("componentClass", value, component, onPropertyChange)}
@@ -45,7 +51,7 @@
45
51
  label={{ name: "Высота карты" }}
46
52
  type="buttons"
47
53
  options={HEIGHT_OPTIONS}
48
- value={HEIGHT_OPTIONS.find((opt) => opt.value === (component.properties.height ?? 400))}
54
+ value={HEIGHT_OPTIONS.find((opt) => opt.value === (component.properties.height ?? 400)) ?? HEIGHT_OPTIONS[1]}
49
55
  onUpdate={(option) => updateProperty("height", (option as { value: number }).value, component, onPropertyChange)}
50
56
  />
51
57
  <CommonSnippets
@@ -129,9 +129,9 @@ const translations = {
129
129
  "🎯 **主飞行显示器(PFD)** —— 飞行监控的主要仪表:姿态、速度、高度、航向和系统状态。\n\n**🔗 与设备的关联** —— `MAV` 分组的字段(MAVLink 自驾仪遥测),无需绑定变量\n- ✈️ `Roll`、`Pitch`、`Heading` —— 姿态仪和航向带(约每秒 20 次,运动经过平滑)\n- 📈 `GSpeed`、`ASpeed` —— 地速带和空速数值;`Alt`、`Climb` —— 相对起飞点高度带和升降速度\n- 🧭 `Vx`、`Vy` —— 航迹(航向带上的粉色标记),`HomeLat`/`HomeLon` —— 到起飞点的距离和方向(绿色标记)\n- 🛰️ 状态栏:`Armed`、`Mode`(按机型 `VType` 显示名称)、GPS `Fix`/`Sat`、电池 `BV`/`BC`/`BRem`\n- 📍 仪表下方:`Lat`/`Lon`、`AltMSL`、`Press`、`Temp`\n\n**🚦 限值**(在组件设置中)\n- 最小/最大速度、最大高度 —— 速度带和高度带上的红色区域;最大坡度 —— 红色弧线,坡度指针变红\n- 低电量 —— 电池高亮\n- 超过设定时间无数据 —— 仪表被划叉并标记「无数据」\n\n**📱 尺寸** —— 在窄单元格中,速度带和高度带变为地平线上的数字。\n\n⚙️ 若分组不是 `MAV`(例如设备自身的航姿系统)—— 在组件设置中修改前缀(ID)。",
130
130
  ],
131
131
  "component.info.WidgetMap": [
132
- "🎯 **Карта** — положение бортов на карте с траекториями.\n\n**🔗 Связь с устройством** — поля групп, привязывать переменные не нужно\n- 🛰️ Каждая группа из настроек (по умолчанию `MAV`, можно несколько через запятую: `MAV, GNSS`) — отдельный борт: свой маркер и своя траектория\n- 📍 `Lat`, `Lon` — координаты (0, 0 — нет фикса); `Heading` — поворот маркера; `Alt`, `Sat` — в карточке борта\n- 🏷️ `DevName` — подпись маркера (без него — имя группы), `DevSN` — серийный номер в карточке\n- 🔁 Имена ключей общие с «Пилотажным дисплеем» и «Об устройстве» — одни данные идут в несколько виджетов\n\n**👆 Клик по борту** — карточка: имя, координаты, высота, курс, спутники, серийный номер; копировать или скрыть борт\n\n**🕹️ Поверх карты** (оператор)\n- Траектория и число её точек, таймаут маркеров: борт без новых данных краснеет, ещё через таймаут — скрывается\n- Кнопка «Все борта» в шапке — вписать все борта в экран; сама карта вид не меняет\n\n**📱 В шапке** — сколько бортов на связи из заданных.\n\n⚙️ Высота карты, иконка маркера и начальные значения переключателей — в настройках виджета.",
133
- '🎯 **Map** — vehicle positions on the map with tracks.\n\n**🔗 Device link** — group fields, no variable binding needed\n- 🛰️ Each group from the settings (default `MAV`, several separated by commas: `MAV, GNSS`) is a separate vehicle with its own marker and track\n- 📍 `Lat`, `Lon` — coordinates (0, 0 — no fix); `Heading` — marker rotation; `Alt`, `Sat` — in the vehicle card\n- 🏷️ `DevName` — marker label (group name if absent), `DevSN` — serial number in the card\n- 🔁 Key names are shared with the flight display and device info widgets — the same data feeds several widgets\n\n**👆 Click a vehicle** — card with name, coordinates, altitude, heading, satellites, serial number; copy or hide the vehicle\n\n**🕹️ On the map** (operator)\n- Track and its point count, marker timeout: a vehicle without new data turns red, after one more timeout it is hidden\n- "All vehicles" button in the header — fit all vehicles into view; the map never moves by itself\n\n**📱 Header** — how many of the configured vehicles are online.\n\n⚙️ Map height, marker icon and default switch values — in widget settings.',
134
- "🎯 **地图** —— 在地图上显示各载具位置及轨迹。\n\n**🔗 与设备的关联** —— 分组字段,无需绑定变量\n- 🛰️ 设置中的每个分组(默认 `MAV`,可用逗号分隔多个:`MAV, GNSS`)都是一个独立载具,有自己的标记和轨迹\n- 📍 `Lat`、`Lon` —— 坐标(0, 0 表示无定位);`Heading` —— 标记旋转;`Alt`、`Sat` —— 显示在载具卡片中\n- 🏷️ `DevName` —— 标记标签(缺省时为分组名),`DevSN` —— 卡片中的序列号\n- 🔁 键名与主飞行显示器和设备信息组件通用 —— 同一数据可用于多个组件\n\n**👆 点击载具** —— 卡片显示名称、坐标、高度、航向、卫星数、序列号;可复制或隐藏\n\n**🕹️ 地图上**(操作员)\n- 轨迹及点数、标记超时:无新数据的载具变红,再过一个超时后隐藏\n- 标题栏中的「全部设备」按钮 —— 将所有载具纳入视野;地图本身不会自动移动\n\n**📱 标题栏** —— 已配置载具中在线的数量。\n\n⚙️ 地图高度、标记图标和开关默认值 —— 在组件设置中。",
132
+ "🎯 **Карта** — положение бортов на карте с траекториями.\n\n**🔗 Связь с устройством** — поля групп, привязывать переменные не нужно\n- 🛰️ Каждая группа из настроек (по умолчанию `MAV`, можно несколько через пробел: `MAV GNSS`) — отдельный борт: свой маркер и своя траектория\n- 📍 `Lat`, `Lon` — координаты (0, 0 — нет фикса); `Heading` — поворот маркера; `Alt`, `Sat` — в карточке борта\n- 🏷️ `DevName` — подпись маркера (без него — имя группы), `DevSN` — серийный номер в карточке\n- 🔁 Имена ключей общие с «Пилотажным дисплеем» и «Об устройстве» — одни данные идут в несколько виджетов\n\n**👆 Клик по борту** — карточка: имя, координаты, высота, курс, спутники, серийный номер; копировать или скрыть борт\n\n**🕹️ Поверх карты** (оператор)\n- Траектория и число её точек, таймаут маркеров: борт без новых данных краснеет, ещё через таймаут — скрывается\n- Кнопка «Все борта» в шапке — вписать все борта в экран; сама карта вид не меняет\n\n**📱 В шапке** — сколько бортов на связи из заданных.\n\n⚙️ Высота карты, иконка маркера и начальные значения переключателей — в настройках виджета.",
133
+ '🎯 **Map** — vehicle positions on the map with tracks.\n\n**🔗 Device link** — group fields, no variable binding needed\n- 🛰️ Each group from the settings (default `MAV`, several separated by spaces: `MAV GNSS`) is a separate vehicle with its own marker and track\n- 📍 `Lat`, `Lon` — coordinates (0, 0 — no fix); `Heading` — marker rotation; `Alt`, `Sat` — in the vehicle card\n- 🏷️ `DevName` — marker label (group name if absent), `DevSN` — serial number in the card\n- 🔁 Key names are shared with the flight display and device info widgets — the same data feeds several widgets\n\n**👆 Click a vehicle** — card with name, coordinates, altitude, heading, satellites, serial number; copy or hide the vehicle\n\n**🕹️ On the map** (operator)\n- Track and its point count, marker timeout: a vehicle without new data turns red, after one more timeout it is hidden\n- "All vehicles" button in the header — fit all vehicles into view; the map never moves by itself\n\n**📱 Header** — how many of the configured vehicles are online.\n\n⚙️ Map height, marker icon and default switch values — in widget settings.',
134
+ "🎯 **地图** —— 在地图上显示各载具位置及轨迹。\n\n**🔗 与设备的关联** —— 分组字段,无需绑定变量\n- 🛰️ 设置中的每个分组(默认 `MAV`,可用空格分隔多个:`MAV GNSS`)都是一个独立载具,有自己的标记和轨迹\n- 📍 `Lat`、`Lon` —— 坐标(0, 0 表示无定位);`Heading` —— 标记旋转;`Alt`、`Sat` —— 显示在载具卡片中\n- 🏷️ `DevName` —— 标记标签(缺省时为分组名),`DevSN` —— 卡片中的序列号\n- 🔁 键名与主飞行显示器和设备信息组件通用 —— 同一数据可用于多个组件\n\n**👆 点击载具** —— 卡片显示名称、坐标、高度、航向、卫星数、序列号;可复制或隐藏\n\n**🕹️ 地图上**(操作员)\n- 轨迹及点数、标记超时:无新数据的载具变红,再过一个超时后隐藏\n- 标题栏中的「全部设备」按钮 —— 将所有载具纳入视野;地图本身不会自动移动\n\n**📱 标题栏** —— 已配置载具中在线的数量。\n\n⚙️ 地图高度、标记图标和开关默认值 —— 在组件设置中。",
135
135
  ],
136
136
  "component.info.WidgetStackInfo": [
137
137
  "🎯 **Виджет «Память и задачи»** — отладка: свободная память и запас стека задач прошивки.\n\n**🔗 Связь с устройством** — один объект `StackInfo` из ответа на `GET StackInfo`\n- 📊 **Кучи** `Heap[]`: занято / всего, свободно и минимум свободного с момента старта; светлая часть полосы — пик занятости\n- 🧵 **Задачи** `Tasks[]`: имя, состояние, приоритет, ядро (ESP32), минимальный запас стека в байтах\n\n**⚙️ Настройки**\n- Порог запаса стека — меньше порога красным, меньше удвоенного — оранжевым\n- Автоопрос: выкл / 1 / 5 / 10 с; свёрнутый виджет не опрашивает\n\n💡 Задачи всегда отсортированы по запасу стека — самые рискованные сверху.",
@@ -194,7 +194,7 @@ const translations = {
194
194
  "constructor.props.defaultcolor": ["Первоначальный цвет", "Initial color", "初始颜色"],
195
195
  "constructor.props.file.accept": ["Допустимые файлы", "Allowed files", "允许的文件"],
196
196
  "constructor.props.file.accept.help": [
197
- "'audio/*', 'video/*', 'image/*' или расширения файлов через запятую в формате '.pdf'",
197
+ "'audio/*', 'video/*', 'image/*' или расширения файлов через пробел в формате '.pdf'",
198
198
  "'audio/*', 'video/*', 'image/*' or comma-separated file extensions like '.pdf'",
199
199
  "'audio/*'、'video/*'、'image/*' 或以逗号分隔的文件扩展名,如 '.pdf'",
200
200
  ],
@@ -327,8 +327,8 @@ const translations = {
327
327
  "constructor.props.bits.title": ["Биты", "Bits", "位"],
328
328
  "constructor.props.tabs.title": ["Вкладки меню", "Menu tabs", "菜单标签"],
329
329
  "constructor.props.periodchart.title": ["Уровни детализации", "Detail levels", "详细级别"],
330
- "constructor.props.periodchart.data": ["Данные (через запятую)", "Data (comma-separated)", "数据(逗号分隔)"],
331
- "constructor.props.periodchart.labels": ["Подписи столбиков (через запятую)", "Bar labels (comma-separated)", "柱标签(逗号分隔)"],
330
+ "constructor.props.periodchart.data": ["Данные (через пробел)", "Data (comma-separated)", "数据(逗号分隔)"],
331
+ "constructor.props.periodchart.labels": ["Подписи столбиков (через пробел)", "Bar labels (comma-separated)", "柱标签(逗号分隔)"],
332
332
  "constructor.props.valuetype": ["Тип значения", "Value type", "值类型"],
333
333
  "constructor.props.action": ["Действие при переключении", "Action on switch", "切换时的操作"],
334
334
  "constructor.props.caption.left": ["Надпись слева", "Left caption", "左侧标题"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "poe-svelte-ui-lib",
3
- "version": "1.38.1",
3
+ "version": "1.38.2",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/Oleg-Perevyshin/ElementsUI.git"