poe-svelte-ui-lib 1.22.0 → 1.22.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.
@@ -12,12 +12,15 @@
12
12
  import RestartIcon from "./RestartIcon.svelte"
13
13
  import WidgetHeader from "../WidgetHeader.svelte"
14
14
  import { widgetAccentStyle } from "../widgetAccent"
15
+ import { readPersistedCollapsed, writePersistedCollapsed } from "../widgetCollapse"
15
16
 
16
17
  let {
17
18
  wrapperClass = "",
18
19
  componentClass = "",
19
20
  label = { name: "Информация об устройстве" },
20
21
  value = $bindable(),
22
+ collapsed: initialCollapsed = false,
23
+ persistKey,
21
24
  onSave = () => {},
22
25
  onRestart = () => {},
23
26
  }: IWidgetDeviceInfoProps = $props()
@@ -37,8 +40,10 @@
37
40
  },
38
41
  )
39
42
 
40
- /* Сворачивание тела виджета по клику на значок/заголовок (как аккордеон) */
41
- let collapsed = $state(false)
43
+ /* Сворачивание тела виджета по клику на значок/заголовок (как аккордеон), но в отличие от
44
+ Accordion переживает перезагрузку страницы через localStorage, если передан persistKey */
45
+ let collapsed = $state(readPersistedCollapsed(persistKey, initialCollapsed))
46
+ $effect(() => writePersistedCollapsed(persistKey, collapsed))
42
47
 
43
48
  /* Поля редактируются локально (как Argument: NoSend в реальной GUI) — отправка одним пакетом по кнопке */
44
49
  let savedSnapshot = $state(JSON.stringify(info))
@@ -22,5 +22,11 @@
22
22
  value={component.properties.componentClass ?? ""}
23
23
  onUpdate={(value) => updateProperty("componentClass", value, component, onPropertyChange)}
24
24
  />
25
+ <UI.Switch
26
+ label={{ name: "Свёрнут по умолчанию" }}
27
+ value={component.properties.collapsed ? 1 : 0}
28
+ options={[{ id: crypto.randomUUID(), value: 0, class: "" }]}
29
+ onChange={(value) => updateProperty("collapsed", value === 1, component, onPropertyChange)}
30
+ />
25
31
  </div>
26
32
  </div>
@@ -15,6 +15,7 @@
15
15
  import WarningIcon from "./WarningIcon.svelte"
16
16
  import WidgetHeader from "../WidgetHeader.svelte"
17
17
  import { widgetAccentStyle } from "../widgetAccent"
18
+ import { readPersistedCollapsed, writePersistedCollapsed } from "../widgetCollapse"
18
19
 
19
20
  let {
20
21
  wrapperClass = "",
@@ -23,6 +24,8 @@
23
24
  value = $bindable(),
24
25
  allowedModes = [1, 2, 3],
25
26
  confirmOnAP = true,
27
+ collapsed: initialCollapsed = false,
28
+ persistKey,
26
29
  onScan,
27
30
  onSave = () => {},
28
31
  }: IWidgetWiFiProps = $props()
@@ -85,8 +88,11 @@
85
88
  }
86
89
 
87
90
  /* Сворачивание тела виджета по клику на значок/заголовок (как аккордеон) — переключатель режима
88
- в шапке кликом не триггерит, только сама кнопка значок+заголовок (см. WidgetHeader.svelte) */
89
- let collapsed = $state(false)
91
+ в шапке кликом не триггерит, только сама кнопка значок+заголовок (см. WidgetHeader.svelte).
92
+ В отличие от Accordion (только начальное значение из GUI) — переживает перезагрузку страницы
93
+ через localStorage, если передан persistKey. */
94
+ let collapsed = $state(readPersistedCollapsed(persistKey, initialCollapsed))
95
+ $effect(() => writePersistedCollapsed(persistKey, collapsed))
90
96
 
91
97
  /* Поля редактируются локально (как Argument: NoSend в реальной GUI) — отправка одним пакетом по кнопке */
92
98
  let savedSnapshot = $state(JSON.stringify(cfg))
@@ -55,6 +55,15 @@
55
55
  />
56
56
  {/snippet}
57
57
 
58
+ {#snippet WidgetCollapsed()}
59
+ <UI.Switch
60
+ label={{ name: "Свёрнут по умолчанию" }}
61
+ value={component.properties.collapsed ? 1 : 0}
62
+ options={[{ id: crypto.randomUUID(), value: 0, class: "" }]}
63
+ onChange={(value) => updateProperty("collapsed", value === 1, component, onPropertyChange)}
64
+ />
65
+ {/snippet}
66
+
58
67
  <div class="flex w-full flex-col gap-3">
59
68
  <div class="grid grid-cols-1 gap-3 sm:grid-cols-2">
60
69
  {@render WidgetLabel()}
@@ -62,4 +71,5 @@
62
71
  </div>
63
72
  {@render WidgetAllowedModes()}
64
73
  {@render WidgetColor()}
74
+ {@render WidgetCollapsed()}
65
75
  </div>
package/dist/types.d.ts CHANGED
@@ -516,6 +516,8 @@ export interface IWidgetWiFiProps {
516
516
  value?: IWidgetWiFiConfig;
517
517
  allowedModes?: number[];
518
518
  confirmOnAP?: boolean;
519
+ collapsed?: boolean;
520
+ persistKey?: string;
519
521
  onScan?: () => Promise<{
520
522
  id: string;
521
523
  name: string;
@@ -541,6 +543,8 @@ export interface IWidgetDeviceInfoProps {
541
543
  name?: string;
542
544
  };
543
545
  value?: IWidgetDeviceInfoConfig;
546
+ collapsed?: boolean;
547
+ persistKey?: string;
544
548
  onSave?: (info: IWidgetDeviceInfoConfig) => void;
545
549
  onRestart?: () => void;
546
550
  }
@@ -0,0 +1,2 @@
1
+ export declare const readPersistedCollapsed: (persistKey: string | undefined, defaultValue?: boolean) => boolean;
2
+ export declare const writePersistedCollapsed: (persistKey: string | undefined, collapsed: boolean) => void;
@@ -0,0 +1,26 @@
1
+ /* $lib/widgetCollapse.ts — запоминание свёрнутости смарт-виджетов в localStorage браузера
2
+ (Accordion этого не делает — isOpen у него только начальное значение из сохранённого GUI,
3
+ без переживания перезагрузки; виджеты сделаны надёжнее). typeof window-проверка вместо
4
+ $app/environment — библиотека не должна знать про SvelteKit. */
5
+ const STORAGE_PREFIX = "widget-collapsed:";
6
+ export const readPersistedCollapsed = (persistKey, defaultValue = false) => {
7
+ if (!persistKey || typeof window === "undefined")
8
+ return defaultValue;
9
+ try {
10
+ const saved = window.localStorage.getItem(STORAGE_PREFIX + persistKey);
11
+ return saved === null ? defaultValue : saved === "1";
12
+ }
13
+ catch {
14
+ return defaultValue;
15
+ }
16
+ };
17
+ export const writePersistedCollapsed = (persistKey, collapsed) => {
18
+ if (!persistKey || typeof window === "undefined")
19
+ return;
20
+ try {
21
+ window.localStorage.setItem(STORAGE_PREFIX + persistKey, collapsed ? "1" : "0");
22
+ }
23
+ catch {
24
+ /* приватный режим/заблокировано — молча игнорируем, просто не запомнится */
25
+ }
26
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "poe-svelte-ui-lib",
3
- "version": "1.22.0",
3
+ "version": "1.22.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {