poe-svelte-ui-lib 1.81.0 → 1.82.1

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.
@@ -153,7 +153,13 @@
153
153
  <UI.Input label={{ name: $T("widget.info.web_user") }} bind:value={info.WebUser} maxlength={16} />
154
154
  </div>
155
155
  <div use:hint={{ text: $T("widget.info.hint.web_psw"), enabled: $hints }}>
156
- <UI.Input type="password" label={{ name: $T("widget.info.web_psw") }} bind:value={info.WebPsw} maxlength={16} help={{ autocomplete: "off" }} />
156
+ <UI.Input
157
+ type="password"
158
+ label={{ name: $T("widget.info.web_psw") }}
159
+ bind:value={info.WebPsw}
160
+ maxlength={16}
161
+ help={{ autocomplete: "one-time-code" }}
162
+ />
157
163
  </div>
158
164
  </div>
159
165
  </div>
@@ -44,7 +44,7 @@
44
44
 
45
45
  - **Свечение** — палитра цвета, белый канал (только для модели SK6812), эффект и скорость. Каждое изменение сразу уходит в `onChange`.
46
46
  - **Оборудование** — количество светодиодов (1…`MaxCount`), модель чипа и порядок цветов. Редактируются локально и отправляются одним пакетом по «Сохранить»: прошивка пересоздаёт драйвер ленты. Пока правок нет, поля показывают свежие значения с устройства.
47
- - В шапке — образец текущего цвета.
47
+ - В шапке — образец цвета первого светодиода (`Color`): оттенок без учёта яркости, как превью палитры; выбранный цвет показывается сразу, до ответа устройства. Эффекты Rainbow/Palette/Fire цвет пикселей не сообщают — образец остаётся базовым `Color`.
48
48
 
49
49
  ## Пропсы
50
50
 
@@ -80,7 +80,26 @@
80
80
  onSave?.($state.snapshot(hardware))
81
81
  savedSnapshot = JSON.stringify(hardware)
82
82
  }
83
- const sendColor = (rgbw: number[]) => onChange?.("Color", rgbw)
83
+
84
+ /* Образец в шапке — цвет первого светодиода: отправленный сразу, до ответа устройства; новое значение с устройства его заменяет */
85
+ let sentColor: number[] | null = $state(null)
86
+ let colorKey = $derived(color.join(","))
87
+ $effect(() => {
88
+ void colorKey
89
+ sentColor = null
90
+ })
91
+ /* Как превью палитры: оттенок без учёта яркости (тусклый светодиод светится тем же цветом), белый — своим уровнем */
92
+ let headerColor = $derived.by(() => {
93
+ const [r, g, b] = sentColor ?? color
94
+ const max = Math.max(r, g, b)
95
+ if (max === 0 || (r === g && g === b)) return [r, g, b]
96
+ return [r, g, b].map((c) => Math.round((c / max) * 255))
97
+ })
98
+
99
+ const sendColor = (rgbw: number[]) => {
100
+ sentColor = rgbw
101
+ onChange?.("Color", rgbw)
102
+ }
84
103
  </script>
85
104
 
86
105
  <div
@@ -92,7 +111,7 @@
92
111
  {#snippet right()}
93
112
  <span
94
113
  class="size-6 rounded-md border border-(--hairline-color)"
95
- style="background: rgb({color[0]}, {color[1]}, {color[2]})"
114
+ style="background: rgb({headerColor[0]}, {headerColor[1]}, {headerColor[2]})"
96
115
  title={$T("widget.rgb.current_color")}
97
116
  ></span>
98
117
  {/snippet}
@@ -34,18 +34,18 @@
34
34
 
35
35
  ## Пропсы
36
36
 
37
- | Название | Тип | По умолчанию | Описание |
38
- | ---------------- | -------------------------------------------------------------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
39
- | `wrapperClass` | `string` | `""` | CSS-классы для обёртки компонента |
40
- | `componentClass` | `string` | `""` | "Мастер-цвет" виджета — роль вида `"bg-red"` (см. `optionsStore.COLOR_OPTIONS`); перекрашивает значок, сегмент-контролы и фокус-кольцо у полей |
41
- | `label` | `{ name?: string }` | `{ name: "WiFi" }` | Заголовок карточки |
42
- | `value` | `IWidgetWiFiConfig` | внутренний дефолт | Текущая конфигурация WiFi |
43
- | `allowedModes` | `number[]` | `[1, 2, 3]` | Какие режимы показывать в сегмент-контроле (1=STA, 2=AP, 3=STA+AP) |
44
- | `confirmOnAP` | `boolean` | `true` | Показывать предупреждение при сохранении чистого режима AP |
45
- | `collapsed` | `boolean` | `false` | Свёрнуто ли тело виджета (заголовок остаётся); поддерживает двустороннее связывание (`$bindable`) |
46
- | `persistKey` | `string` | `undefined` | Ключ для сохранения состояния `collapsed` в `localStorage` — при заданном ключе сворачивание переживает перезагрузку страницы |
47
- | `onScan` | `() => Promise<{ id: string; name: string; value: string }[]>` | `undefined` | Обработчик сканирования сетей (в проде — `Header: GET, Argument: APsList`) |
48
- | `onSave` | `(config: IWidgetWiFiConfig) => void` | `undefined` | Срабатывает при нажатии "Сохранить" — конфиг уходит одним пакетом |
37
+ | Название | Тип | По умолчанию | Описание |
38
+ | ---------------- | -------------------------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
39
+ | `wrapperClass` | `string` | `""` | CSS-классы для обёртки компонента |
40
+ | `componentClass` | `string` | `""` | "Мастер-цвет" виджета — роль вида `"bg-red"` (см. `optionsStore.COLOR_OPTIONS`); перекрашивает значок, сегмент-контролы и фокус-кольцо у полей |
41
+ | `label` | `{ name?: string }` | `{ name: "WiFi" }` | Заголовок карточки |
42
+ | `value` | `IWidgetWiFiConfig` | внутренний дефолт | Текущая конфигурация WiFi |
43
+ | `allowedModes` | `number[]` | `[1, 2, 3]` | Какие режимы показывать в сегмент-контроле (1=STA, 2=AP, 3=STA+AP) |
44
+ | `confirmOnAP` | `boolean` | `true` | Показывать предупреждение при сохранении чистого режима AP |
45
+ | `collapsed` | `boolean` | `false` | Свёрнуто ли тело виджета (заголовок остаётся); поддерживает двустороннее связывание (`$bindable`) |
46
+ | `persistKey` | `string` | `undefined` | Ключ для сохранения состояния `collapsed` в `localStorage` — при заданном ключе сворачивание переживает перезагрузку страницы |
47
+ | `onScan` | `() => Promise<{ id: string; name: string; value: string }[]>` | `undefined` | Обработчик сканирования сетей (в проде — `Header: GET, Argument: APsList`): `name` — подпись в списке (SSID, RSSI, канал), `value` — SSID, он и пишется в `StaSSID` |
48
+ | `onSave` | `(config: IWidgetWiFiConfig) => void` | `undefined` | Срабатывает при нажатии "Сохранить" — конфиг уходит одним пакетом |
49
49
 
50
50
  ### IWidgetWiFiConfig
51
51
 
@@ -175,7 +175,7 @@
175
175
  label={{ name: $T("widget.wifi.ssid") }}
176
176
  value={{ id: "current", name: cfg.StaSSID, value: cfg.StaSSID }}
177
177
  options={foundNetworks}
178
- onUpdate={(option) => (cfg.StaSSID = (option as IOption<string>).name ?? "")}
178
+ onUpdate={(option) => (cfg.StaSSID = String((option as IOption<string>).value ?? (option as IOption<string>).name ?? ""))}
179
179
  />
180
180
  </div>
181
181
  <UI.Button
@@ -187,12 +187,14 @@
187
187
  />
188
188
  </div>
189
189
 
190
+ <!-- one-time-code: менеджер паролей браузера не считает поле паролем входа и не накрывает список сетей у SSID
191
+ своими сохранёнными логинами (autocomplete="off" для паролей Chrome игнорирует) -->
190
192
  <UI.Input
191
193
  type="password"
192
194
  label={{ name: $T("widget.common.password") }}
193
195
  bind:value={cfg.StaPSK}
194
196
  maxlength={64}
195
- help={{ autocomplete: "off", regExp: PSK_REGEXP }}
197
+ help={{ autocomplete: "one-time-code", regExp: PSK_REGEXP }}
196
198
  />
197
199
 
198
200
  <div class="w-48" use:hint={{ text: $T("widget.wifi.hint.ip_mode"), enabled: $hints }}>
@@ -254,7 +256,7 @@
254
256
  label={{ name: $T("widget.common.password") }}
255
257
  bind:value={cfg.ApPSK}
256
258
  maxlength={64}
257
- help={{ autocomplete: "off", regExp: PSK_REGEXP }}
259
+ help={{ autocomplete: "one-time-code", regExp: PSK_REGEXP }}
258
260
  />
259
261
  </div>
260
262
 
@@ -59,12 +59,12 @@
59
59
 
60
60
  ## 🚌 Транспорты
61
61
 
62
- | Канал | Передача |
63
- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------ |
64
- | CAN / CAN FD | Кадры по 8 / 64 байта; 11-битный ID: бит 10 — последний фрагмент, биты 9-0 — номер пакета; паддинг CAN FD отрезается по длине пакета |
65
- | RS485 | Сырой поток: начало `0x9F 0x85`, пауза приёма (20 мс) сбрасывает недособранный хвост, мусор сдвигается по байту |
66
- | LoRa | Пакет целиком в радиокадре |
67
- | UART-консоль | Сырой поток вперемешку с текстом загрузчика: начало `0x9F 0x85`, остальное — текст (RAW), хвост сбрасывается после 100 мс тишины |
62
+ | Канал | Передача |
63
+ | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
64
+ | CAN / CAN FD | Кадры по 8 / 64 байта; 11-битный ID: бит 10 — последний фрагмент, биты 9-0 — номер пакета; паддинг CAN FD отрезается по длине пакета |
65
+ | RS485 | Сырой поток: начало `0x9F 0x85`, пауза приёма сбрасывает недособранный хвост (прошивка — 20 мс, `createPacketStreamParser` на ПК — 100 мс: USB-адаптер отдаёт байты пачками), мусор сдвигается по байту |
66
+ | LoRa | Пакет целиком в радиокадре |
67
+ | UART-консоль | Сырой поток вперемешку с текстом загрузчика: начало `0x9F 0x85`, остальное — текст (RAW), хвост сбрасывается после 100 мс тишины |
68
68
 
69
69
  ## 🐞 Консоль: отладочные пакеты
70
70
 
package/dist/types.d.ts CHANGED
@@ -205,7 +205,7 @@ export interface IInputProps {
205
205
  info?: string;
206
206
  copyButton?: boolean;
207
207
  regExp?: string | RegExp;
208
- autocomplete?: "on" | "off" | "given-name" | "family-name" | "nickname" | "username" | "new-password" | "current-password" | "organization-title" | "country-name" | "address-level1" | "address-level2" | "street-address" | "postal-code" | "email" | "tel" | null;
208
+ autocomplete?: "on" | "off" | "given-name" | "family-name" | "nickname" | "username" | "new-password" | "current-password" | "one-time-code" | "organization-title" | "country-name" | "address-level1" | "address-level2" | "street-address" | "postal-code" | "email" | "tel" | null;
209
209
  };
210
210
  onUpdate?: (value: string | number) => void;
211
211
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "poe-svelte-ui-lib",
3
- "version": "1.81.0",
3
+ "version": "1.82.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/Oleg-Perevyshin/ElementsUI.git"