poe-svelte-ui-lib 1.55.0 → 1.57.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
@@ -57,7 +57,7 @@ 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
- **Подсказки смарт-виджетов** — `hints.ts`: у каждого виджета своя кнопка «?» в шапке (`WidgetHeader` с пропом `hints`), выбор запоминается в браузере для виджетов этого типа (`hintsSetting("WidgetPFD")`, ключ `localStorage` `Hints.<тип>`), глобального переключателя нет. Элемент получает подсказку действием `use:hint={{ text, enabled: $hints }}` — всплывающее окно в стиле темы над элементом; тексты — в словаре библиотеки (`widget.*.hint.*`), только там, где смысл поля не очевиден.
60
+ **Подсказки смарт-виджетов** — `hints.ts`: у каждого виджета своя кнопка «?» в правом краю шапки (`WidgetHeader` с пропом `hints`), по умолчанию подсказки выключены, выбор оператора запоминается в браузере для виджетов этого типа (`hintsSetting("WidgetPFD")`, ключ `localStorage` `WidgetHints.<тип>`, пишется только по нажатию «?»), глобального переключателя нет. Элемент получает подсказку действием `use:hint={{ text, enabled: $hints }}` — всплывающее окно в стиле темы над элементом; тексты — в словаре библиотеки (`widget.*.hint.*`), только там, где смысл поля не очевиден.
61
61
 
62
62
  **Предпросмотр темы** — вкладка «Тема» на главной витрины (`src/routes/ThemePreview.svelte`): палитра токенов и состояния, затем все компоненты и виджеты в порядке меню витрины — каждый тип в своём разделе с живыми демо-данными (графики, видео, полёт для PFD и карты), в конце типографика и Markdown; тема переключается кнопкой в шапке витрины. Правьте `theme.css` и смотрите результат там.
63
63
 
@@ -21,7 +21,7 @@
21
21
 
22
22
  ### Шапка
23
23
 
24
- - Фон шапки — токен `--table-header-color`, по умолчанию `--container-color`. Внутри смарт-виджета он равен мягкому оттенку мастер-цвета (`widgetAccentStyle`), поэтому шапка перекрашивается вместе с виджетом.
24
+ - Фон шапки — токен `--table-header-color`, по умолчанию мягкий акцент `--accent-soft`, текст шапки — в тон акценту. Внутри смарт-виджета он равен мягкому оттенку мастер-цвета (`widgetAccentStyle`), поэтому шапка перекрашивается вместе с виджетом.
25
25
  - Когда у тела появляется полоса прокрутки, шапка сдвигается ровно на её фактическую ширину (`offsetWidth − clientWidth`, пересчёт при изменении строк и размеров) — столбцы шапки и строк совпадают. Для полос поверх содержимого (macOS) сдвиг 0.
26
26
 
27
27
  ### Адаптивность
@@ -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(--container-color))] text-[11px] font-bold tracking-[0.06em] text-(--muted-color) uppercase"
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)}
@@ -109,4 +109,4 @@
109
109
 
110
110
  ### Подсказки
111
111
 
112
- Кнопка «?» в шапке включает и выключает подсказки этого виджета; выбор общий для всех `WidgetDeviceInfo` в браузере (`hintsSetting("WidgetDeviceInfo")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
112
+ Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetDeviceInfo` в браузере (`hintsSetting("WidgetDeviceInfo")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
@@ -118,4 +118,4 @@
118
118
 
119
119
  ### Подсказки
120
120
 
121
- Кнопка «?» в шапке включает и выключает подсказки этого виджета; выбор общий для всех `WidgetFileSystem` в браузере (`hintsSetting("WidgetFileSystem")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
121
+ Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetFileSystem` в браузере (`hintsSetting("WidgetFileSystem")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
@@ -29,11 +29,11 @@
29
29
  const Icon = $derived(icon)
30
30
  </script>
31
31
 
32
- <!-- Фиксированная высота 32 px без переноса — свёрнутые виджеты одной высоты при любом содержимом справа; «?» — сразу за заголовком, видна и в узком виджете -->
32
+ <!-- Фиксированная высота 32 px без переноса — свёрнутые виджеты одной высоты при любом содержимом справа; «?» — в правом краю, после содержимого шапки -->
33
33
  <div class="flex h-[32px] items-center justify-between gap-3">
34
34
  <button
35
35
  type="button"
36
- class="flex min-w-0 cursor-pointer items-center gap-2 border-none bg-transparent p-0 text-left"
36
+ class="flex min-w-0 flex-1 cursor-pointer items-center gap-2 border-none bg-transparent p-0 text-left"
37
37
  onclick={() => (collapsed = !collapsed)}
38
38
  aria-expanded={!collapsed}
39
39
  >
@@ -48,6 +48,11 @@
48
48
  <ArrowIcon />
49
49
  </span>
50
50
  </button>
51
+ {#if right}
52
+ <div class="flex min-w-0 shrink-0 items-center justify-end">
53
+ {@render right()}
54
+ </div>
55
+ {/if}
51
56
  {#if hints}
52
57
  <button
53
58
  type="button"
@@ -60,10 +65,4 @@
60
65
  onclick={() => hints.update((on) => !on)}>?</button
61
66
  >
62
67
  {/if}
63
- <div class="flex-1"></div>
64
- {#if right}
65
- <div class="flex min-w-0 shrink-0 items-center justify-end">
66
- {@render right()}
67
- </div>
68
- {/if}
69
68
  </div>
@@ -98,4 +98,4 @@ Telemetry_SendObject(g_telemetry_stream, g_mcfg.DevSN, "Data", dev, sizeof(dev)
98
98
 
99
99
  ### Подсказки
100
100
 
101
- Кнопка «?» в шапке включает и выключает подсказки этого виджета; выбор общий для всех `WidgetMap` в браузере (`hintsSetting("WidgetMap")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
101
+ Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetMap` в браузере (`hintsSetting("WidgetMap")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
@@ -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` `Hints.WidgetPFD`; прежний выбор `WidgetPFD.tips` переносится).
73
+ - **Подсказки** — наведите курсор на любой элемент прибора, строки состояния или значений: расшифровка появляется в информационной строке внизу горизонта: первая строка — величина, единица и текущее значение (обновляется, пока курсор стоит на месте), ниже по строке — что означают знаки, цвета и пороги. Элемент помечен `data-tip` с ключом, тексты собраны в `tips` в скрипте виджета, поэтому её не обрезают края и прокрутка. Без наведения в той же строке — последнее сообщение автопилота (10 с), наведение на неё показывает историю. Включаются и выключаются кнопкой «?» в шапке; выбор общий для всех PFD в браузере (`hintsSetting("WidgetPFD")` из `hints.ts`, ключ `localStorage` `WidgetHints.WidgetPFD`, по умолчанию выключены; прежний выбор `WidgetPFD.tips` переносится).
74
74
  - **Под прибором** — группы «Маршрут» (точка, расстояние, боковое отклонение), «Дом» (расстояние и направление), «Трек», «Позиция» (координаты, MSL), «Воздух» (давление, температура); каждая величина показана один раз.
75
75
  - **Метки целей** (бирюзовые) — целевая скорость и высота текущей точки на лентах, курс на точку ◆ на ленте курса; цель за пределами ленты прижимается к краю.
76
76
  - **Сообщения автопилота** (`STATUSTEXT`) — в информационной строке внизу горизонта на 10 с, цвет по важности; история последних пяти — при наведении на строку.
@@ -81,4 +81,4 @@
81
81
 
82
82
  ### Подсказки
83
83
 
84
- Кнопка «?» в шапке включает и выключает подсказки этого виджета; выбор общий для всех `WidgetRGBStrip` в браузере (`hintsSetting("WidgetRGBStrip")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
84
+ Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetRGBStrip` в браузере (`hintsSetting("WidgetRGBStrip")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
@@ -84,4 +84,4 @@
84
84
 
85
85
  ### Подсказки
86
86
 
87
- Кнопка «?» в шапке включает и выключает подсказки этого виджета; выбор общий для всех `WidgetStackInfo` в браузере (`hintsSetting("WidgetStackInfo")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
87
+ Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetStackInfo` в браузере (`hintsSetting("WidgetStackInfo")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
@@ -100,4 +100,4 @@
100
100
 
101
101
  ### Подсказки
102
102
 
103
- Кнопка «?» в шапке включает и выключает подсказки этого виджета; выбор общий для всех `WidgetWiFi` в браузере (`hintsSetting("WidgetWiFi")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
103
+ Кнопка «?» в правом краю шапки включает и выключает подсказки этого виджета (по умолчанию выключены); выбор общий для всех `WidgetWiFi` в браузере (`hintsSetting("WidgetWiFi")`, `hints.ts`). Подсказка всплывает при наведении на поле, смысл которого не очевиден, — что это за значение и на что влияет.
@@ -73,10 +73,10 @@
73
73
  устройство и режим на нём меняется. STA+AP не предупреждаем: STA остаётся активным. */
74
74
  let showAPWarning = $state(false)
75
75
 
76
- const IP_MODE_OPTIONS: IOption<number>[] = [
76
+ let IP_MODE_OPTIONS: IOption<number>[] = $derived([
77
77
  { id: "dhcp", name: "DHCP", value: 0 },
78
- { id: "static", name: "Static", value: 1 },
79
- ]
78
+ { id: "static", name: $T("widget.wifi.static"), value: 1 },
79
+ ])
80
80
  let selectedIPMode = $derived(IP_MODE_OPTIONS.find((o) => o.value === cfg.StaticIP) ?? IP_MODE_OPTIONS[0])
81
81
 
82
82
  const IP_REGEXP = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
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 = `Hints.${widget}`;
15
- let initial = true;
15
+ const storageKey = `WidgetHints.${widget}`;
16
+ let initial = false;
16
17
  try {
17
- const saved = typeof localStorage === "undefined" ? null : (localStorage.getItem(storageKey) ?? localStorage.getItem(LEGACY_KEYS[widget] ?? ""));
18
- if (saved !== null)
19
- initial = saved !== "0";
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 {
@@ -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.static": { ru: "Статический", en: "Static", zh: "静态" },
551
552
  "widget.wifi.hint.mode": {
552
553
  ru: "Режим Wi-Fi: клиент — устройство подключается к роутеру, точка — создаёт свою сеть, оба — одновременно; выключено — Wi-Fi не работает",
553
554
  en: "Wi-Fi mode: client — the device joins a router, access point — creates its own network, both — at once; off — Wi-Fi is disabled",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "poe-svelte-ui-lib",
3
- "version": "1.55.0",
3
+ "version": "1.57.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/Oleg-Perevyshin/ElementsUI.git"