poe-svelte-ui-lib 1.81.0 → 1.82.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/dist/WidgetDeviceInfo/WidgetDeviceInfo.svelte +7 -1
- package/dist/WidgetRGBStrip/README.md +1 -1
- package/dist/WidgetRGBStrip/WidgetRGBStrip.svelte +21 -2
- package/dist/WidgetWiFi/WidgetWiFi.svelte +4 -2
- package/dist/protocols/PROTOCOL.md +6 -6
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
|
@@ -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
|
|
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
|
-
|
|
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({
|
|
114
|
+
style="background: rgb({headerColor[0]}, {headerColor[1]}, {headerColor[2]})"
|
|
96
115
|
title={$T("widget.rgb.current_color")}
|
|
97
116
|
></span>
|
|
98
117
|
{/snippet}
|
|
@@ -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: "
|
|
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: "
|
|
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
|
}
|