poe-svelte-ui-lib 1.83.1 → 1.84.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 +114 -77
- package/dist/Accordion/Accordion.svelte +2 -4
- package/dist/Accordion/README.md +30 -124
- package/dist/Button/Button.svelte +3 -18
- package/dist/Button/README.md +37 -141
- package/dist/Carousel/README.md +24 -116
- package/dist/CopiedChip.svelte +1 -6
- package/dist/Divider/Divider.svelte +1 -1
- package/dist/Divider/README.md +22 -91
- package/dist/Dragging.README.md +36 -52
- package/dist/Dragging.svelte +1 -4
- package/dist/FileAttach/FileAttach.svelte +2 -5
- package/dist/FileAttach/README.md +38 -150
- package/dist/Graph/README.md +39 -157
- package/dist/Input/Input.svelte +3 -10
- package/dist/Input/README.md +50 -152
- package/dist/Joystick/README.md +33 -114
- package/dist/Modal.README.md +32 -77
- package/dist/Modal.svelte +3 -8
- package/dist/PeriodChart/PeriodChart.svelte +2 -4
- package/dist/PeriodChart/README.md +41 -134
- package/dist/ProgressBar/ProgressBar.svelte +1 -2
- package/dist/ProgressBar/README.md +30 -122
- package/dist/PropsGroup.svelte +1 -5
- package/dist/PropsListHeader.svelte +1 -2
- package/dist/PropsListModal.svelte +1 -3
- package/dist/Select/README.md +54 -155
- package/dist/Select/Select.svelte +4 -18
- package/dist/Slider/README.md +30 -142
- package/dist/Slider/Slider.svelte +7 -38
- package/dist/Switch/README.md +38 -156
- package/dist/Switch/Switch.svelte +2 -7
- package/dist/Table/README.md +70 -238
- package/dist/Table/TableProps.svelte +2 -4
- package/dist/Table/columnWidth.js +1 -2
- package/dist/Tabs/README.md +41 -152
- package/dist/Tabs/Tabs.svelte +3 -18
- package/dist/Tabs/TabsProps.svelte +1 -4
- package/dist/TextField/README.md +23 -89
- package/dist/TextField/TextField.svelte +2 -4
- package/dist/TextsEditor.svelte +1 -3
- package/dist/Tooltip.svelte +1 -7
- package/dist/VideoViewer/README.md +35 -133
- package/dist/VideoViewer/VideoViewer.svelte +1 -5
- package/dist/Widget/README.md +42 -175
- package/dist/Widget/Widget.svelte +2 -6
- package/dist/Widget/WidgetProps.svelte +1 -3
- package/dist/WidgetAccentPicker.svelte +1 -3
- package/dist/WidgetDeviceInfo/README.md +50 -81
- package/dist/WidgetDeviceInfo/WidgetDeviceInfo.svelte +4 -18
- package/dist/WidgetDeviceInfo/WidgetDeviceInfoProps.svelte +1 -4
- package/dist/WidgetFileSystem/README.md +61 -88
- package/dist/WidgetFileSystem/WidgetFileSystem.svelte +2 -8
- package/dist/WidgetFileSystem/WidgetFileSystemProps.svelte +1 -4
- package/dist/WidgetHeader.svelte +2 -9
- package/dist/WidgetMap/README.md +61 -67
- package/dist/WidgetMap/WidgetMap.svelte +27 -7
- package/dist/WidgetMap/WidgetMapProps.svelte +8 -3
- package/dist/WidgetMap/mapWrapper/Line.svelte +1 -1
- package/dist/WidgetMap/mapWrapper/utils.js +2 -2
- package/dist/WidgetPFD/README.md +134 -114
- package/dist/WidgetPFD/WidgetPFD.svelte +18 -7
- package/dist/WidgetPFD/WidgetPFDProps.svelte +9 -3
- package/dist/WidgetRGBStrip/README.md +52 -58
- package/dist/WidgetRGBStrip/WidgetRGBStrip.svelte +1 -4
- package/dist/WidgetRGBStrip/WidgetRGBStripProps.svelte +1 -2
- package/dist/WidgetStackInfo/README.md +52 -58
- package/dist/WidgetStackInfo/WidgetStackInfo.svelte +1 -4
- package/dist/WidgetStackInfo/WidgetStackInfoProps.svelte +1 -4
- package/dist/WidgetWiFi/README.md +47 -77
- package/dist/WidgetWiFi/WidgetWiFi.svelte +7 -29
- package/dist/WidgetWiFi/WidgetWiFiProps.svelte +1 -3
- package/dist/bitField.js +1 -2
- package/dist/dragStyle.js +2 -6
- package/dist/flightSim.d.ts +6 -0
- package/dist/flightSim.js +131 -0
- package/dist/hints.js +3 -6
- package/dist/index.js +1 -0
- package/dist/locales/i18n.js +3 -8
- package/dist/locales/index.js +1 -2
- package/dist/locales/languages.js +1 -5
- package/dist/locales/localize.js +2 -3
- package/dist/locales/translations.js +2 -3
- package/dist/options.js +2 -9
- package/dist/protocols/PROTOCOL.md +96 -71
- package/dist/protocols/can.js +2 -5
- package/dist/protocols/cbor/json.js +1 -0
- package/dist/protocols/dictionary.js +1 -4
- package/dist/protocols/dictionary.yaml +1 -3
- package/dist/protocols/index.js +1 -2
- package/dist/protocols/packet.js +2 -4
- package/dist/protocols/plotGroups.js +1 -2
- package/dist/protocols/xPoeDebug.js +1 -2
- package/dist/theme.css +9 -31
- package/dist/types.d.ts +2 -0
- package/dist/widgetAccent.js +3 -9
- package/dist/widgetCollapse.js +1 -4
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -1,35 +1,36 @@
|
|
|
1
1
|
# poe-svelte-ui-lib
|
|
2
2
|
|
|
3
|
-
Библиотека компонентов на Svelte 5
|
|
3
|
+
Библиотека компонентов на Svelte 5 для интерфейсов устройств. Её используют три приложения, и компонент в каждом выглядит и работает одинаково:
|
|
4
4
|
|
|
5
|
-
- **DevCloud**
|
|
6
|
-
- **WebApp**
|
|
7
|
-
- **DevTerminal**
|
|
5
|
+
- **DevCloud** - облако: конструктор интерфейса устройства, панель управления, отладка;
|
|
6
|
+
- **WebApp** - веб-интерфейс, который прошивка ProdFactory-ESP раздаёт с самого устройства;
|
|
7
|
+
- **DevTerminal** - настольный терминал для отладки через COM-порт.
|
|
8
|
+
|
|
9
|
+
Кроме компонентов, в библиотеке лежат ядро протоколов обмена с устройством, общий словарь команд, тема и переводы. Приложения не держат своих копий, всё берут отсюда.
|
|
8
10
|
|
|
9
11
|
Витрина с живыми примерами: [oleg-perevyshin.github.io/ElementsUI](https://oleg-perevyshin.github.io/ElementsUI/).
|
|
10
12
|
|
|
11
|
-
##
|
|
13
|
+
## Что внутри
|
|
14
|
+
|
|
15
|
+
**Смарт-виджеты.** Готовые блоки под одну задачу. Виджет сам работает с группой полей прошивки по префиксу, привязывать переменные по одной не нужно.
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
- `WidgetWiFi` - режим сети, подключение к точке доступа, своя точка доступа, поиск сетей.
|
|
18
|
+
- `WidgetDeviceInfo` - паспорт устройства, основные настройки, перезагрузка.
|
|
19
|
+
- `WidgetFileSystem` - занятая память, список файлов, загрузка и удаление.
|
|
20
|
+
- `WidgetStackInfo` - свободная память и запас стека задач, для отладки.
|
|
21
|
+
- `WidgetRGBStrip` - адресная светодиодная лента: цвет, эффекты, параметры.
|
|
22
|
+
- `WidgetPFD` - пилотажный дисплей: авиагоризонт, шкалы скорости и высоты, маршрут, сообщения автопилота.
|
|
23
|
+
- `WidgetMap` - карта с объектами и их траекториями.
|
|
14
24
|
|
|
15
|
-
|
|
16
|
-
- `WidgetDeviceInfo` — паспорт устройства и основные настройки, перезагрузка;
|
|
17
|
-
- `WidgetFileSystem` — память, список файлов, удаление и закачка;
|
|
18
|
-
- `WidgetStackInfo` — отладка: свободная память и запас стека задач;
|
|
19
|
-
- `WidgetRGBStrip` — адресная светодиодная лента: цвет, эффекты, параметры ленты;
|
|
20
|
-
- `WidgetPFD` — пилотажный дисплей: авиагоризонт, ленты, маршрут, связь, сообщения автопилота;
|
|
21
|
-
- `WidgetMap` — карта объектов с траекториями, несколько групп-объектов на одной карте.
|
|
25
|
+
**Компоненты.** Каждый привязывается к одной переменной устройства: `Input`, `Select`, `Switch`, `Slider`, `Button`, `Joystick`, `ProgressBar`, `Graph`, `PeriodChart`, `Table`, `FileAttach`, `VideoViewer`, `TextField`, `Widget`.
|
|
22
26
|
|
|
23
|
-
|
|
27
|
+
**Раскладка.** `Accordion`, `Tabs`, `Divider`, `Carousel`, `Modal`.
|
|
24
28
|
|
|
25
|
-
|
|
29
|
+
**Ядро протоколов** (`poe-svelte-ui-lib/protocols`). Кодирование и разбор пакетов для всех каналов связи с устройством. Работает без Svelte, в том числе под Node.
|
|
26
30
|
|
|
27
|
-
|
|
31
|
+
**Тема** (`poe-svelte-ui-lib/theme.css`) и **языки** (`poe-svelte-ui-lib/locales`).
|
|
28
32
|
|
|
29
|
-
|
|
30
|
-
- **Конструктор свойств.** У каждого компонента есть `<Компонент>Props.svelte` — панель свойств для конструктора DevCloud.
|
|
31
|
-
- **Описания.** Короткое описание (i) — `component.info.<Тип>` в переводах (ru/en/zh), его показывают конструктор облака и витрина; развёрнутое — README рядом с исходником компонента.
|
|
32
|
-
- **Тема** — один файл `poe-svelte-ui-lib/theme.css` для всех приложений: палитра светлой и тёмной темы, типографика, Markdown, роли заливки.
|
|
33
|
+
Полный список экспортов в `src/lib/index.ts`. У каждого компонента рядом с исходником есть свой README с пропсами и примерами.
|
|
33
34
|
|
|
34
35
|
## Установка
|
|
35
36
|
|
|
@@ -37,41 +38,73 @@
|
|
|
37
38
|
npm install poe-svelte-ui-lib
|
|
38
39
|
```
|
|
39
40
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
- `svelte ^5.0.0`
|
|
43
|
-
- `tailwindcss ^4.0.0` — компоненты стилизуются Tailwind-утилитами и CSS-переменными темы; сама тема поставляется файлом `theme.css`
|
|
41
|
+
Приложению нужны `svelte` 5 и `tailwindcss` 4. Компоненты стилизуются утилитами Tailwind и переменными темы.
|
|
44
42
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
Тема поставляется пакетом — `poe-svelte-ui-lib/theme.css`: цветовые токены светлой и тёмной темы (`--back-color`, `--accent-color`, `--red-color`…), типографика тегов в `@layer base`, компактный Markdown (`.markdown-content` — обёртка для `{@html}` с результатом `RenderMarkdown`) и роли заливки `bg-*`/`border-*`. Эталон темы — DevCloud; витрина подключает тот же файл, поэтому компоненты в ней выглядят ровно как в облаке. В `app.css` потребителя:
|
|
43
|
+
В `app.css` приложения:
|
|
48
44
|
|
|
49
45
|
```css
|
|
50
46
|
@import "tailwindcss";
|
|
51
47
|
@import "poe-svelte-ui-lib/theme.css";
|
|
52
48
|
@source "../node_modules/poe-svelte-ui-lib/dist";
|
|
53
49
|
@custom-variant dark (&:where(.dark, .dark *));
|
|
50
|
+
```
|
|
54
51
|
|
|
55
|
-
|
|
52
|
+
Ниже можно дописать только то, чем приложение отличается от остальных.
|
|
53
|
+
|
|
54
|
+
## Как пользоваться
|
|
55
|
+
|
|
56
|
+
```svelte
|
|
57
|
+
<script lang="ts">
|
|
58
|
+
import * as UI from "poe-svelte-ui-lib"
|
|
59
|
+
|
|
60
|
+
let value = $state("")
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<UI.Input label={{ name: "Имя" }} bind:value type="text" />
|
|
64
|
+
<UI.Button content={{ name: "Сохранить" }} onClick={() => console.log(value)} />
|
|
56
65
|
```
|
|
57
66
|
|
|
58
|
-
|
|
67
|
+
Главное правило: компонент только показывает данные и сообщает об изменениях. Значения приходят через пропсы, изменения уходят колбэками (`onUpdate`, `onChange`, `onSave` и другие). Сетью, WebSocket и хранилищем значений занимается приложение.
|
|
68
|
+
|
|
69
|
+
В DevCloud и WebApp значения устройства хранятся под ключами вида `<ModSN>|<ключ>`. Смарт-виджет читает свою группу целиком, например все поля `CFG.*` или `MAV.*`.
|
|
70
|
+
|
|
71
|
+
У каждого компонента есть парный `<Компонент>Props.svelte`. Это панель свойств для конструктора DevCloud. Пропсы у всех панелей одинаковые:
|
|
72
|
+
|
|
73
|
+
| Пропс | Что это |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `component` | Компонент интерфейса и его свойства |
|
|
76
|
+
| `onPropertyChange` | Сообщает об изменении свойств, имени, доступа или события |
|
|
77
|
+
| `forConstructor` | `true` — полная панель конструктора, `false` — упрощённая для редактирования |
|
|
59
78
|
|
|
60
|
-
|
|
79
|
+
## Протоколы
|
|
61
80
|
|
|
62
|
-
|
|
81
|
+
Пакет `poe_cbor_pkt` один для CAN, CAN FD, RS485 и UART-консоли. В нём адрес получателя, адрес отправителя, команда и данные в CBOR. Библиотека умеет:
|
|
63
82
|
|
|
64
|
-
|
|
83
|
+
- собирать и разбирать пакеты, считать CRC;
|
|
84
|
+
- резать пакет на кадры CAN и CAN FD и собирать обратно, общаться со slcan-адаптером;
|
|
85
|
+
- разбирать поток консоли xPOE-Debug, где пакеты идут вперемешку с текстом загрузчика;
|
|
86
|
+
- показывать отладочные логи `DebugLog` и графики `DebugPlot` из прошивки;
|
|
87
|
+
- переводить значения между JSON и CBOR.
|
|
65
88
|
|
|
66
|
-
|
|
89
|
+
Байты совпадают с тем, что собирает прошивка. Это проверяет `npm run TestProtocols`: тесты сверяют результат с эталонными пакетами, собранными кодом прошивки.
|
|
67
90
|
|
|
68
|
-
|
|
91
|
+
Формат пакета, адресация, транспорты и список функций описаны в [PROTOCOL.md](src/lib/protocols/PROTOCOL.md).
|
|
69
92
|
|
|
70
|
-
|
|
93
|
+
## Словарь команд
|
|
71
94
|
|
|
72
|
-
|
|
95
|
+
Все команды (`GET`, `SET`, `ModCfg`, `Restart` и остальные) записаны в одном файле `src/lib/protocols/dictionary.yaml`. Из него генерируется `DEFAULT_ARGUMENT_CODES` для JS (`npm run Dictionary`, перед публикацией запускается сам).
|
|
73
96
|
|
|
74
|
-
|
|
97
|
+
Прошивки ProdFactory-ESP и ProdFactory-STM держат копию словаря в `.framework/Dictionary.yaml`. При сборке прошивки она сверяется с `api_har.h`. Новую команду сначала добавляют сюда, потом копируют в оба фреймворка.
|
|
98
|
+
|
|
99
|
+
## Тема
|
|
100
|
+
|
|
101
|
+
Тема одна для всех приложений. Эталоном служит DevCloud, витрина подключает тот же файл.
|
|
102
|
+
|
|
103
|
+
Поверхности идут в четыре ступени: фон страницы `--bg-body`, панель `--back-color`, блок внутри панели `--container-color`, поле ввода `--field-color`. Для частых случаев есть готовые классы. `ui-panel` для блока прямо на фоне страницы, `ui-inset` для блока внутри панели.
|
|
104
|
+
|
|
105
|
+
Панели не делают полупрозрачными, на фоне они теряются. Выпадающие меню делают через `ui-panel` с тенью `--elevation-3`.
|
|
106
|
+
|
|
107
|
+
Стили тегов в приложении пишите только внутри `@layer base`. Правило вне слоя сильнее утилит Tailwind, и подписи в компонентах станут крупнее, чем задумано.
|
|
75
108
|
|
|
76
109
|
```css
|
|
77
110
|
@layer base {
|
|
@@ -79,74 +112,78 @@ npm install poe-svelte-ui-lib
|
|
|
79
112
|
font-size: 1rem;
|
|
80
113
|
font-weight: 600;
|
|
81
114
|
}
|
|
82
|
-
label {
|
|
83
|
-
font-size: 0.8rem;
|
|
84
|
-
}
|
|
85
115
|
}
|
|
86
116
|
```
|
|
87
117
|
|
|
88
|
-
Классы ролей (`.bg-red`, `.bg-max
|
|
118
|
+
Классы ролей (`.bg-red`, `.bg-max` и другие) и классы темы (`.light`, `.dark`) остаются вне слоя. Они как раз должны перебивать утилиты.
|
|
89
119
|
|
|
90
|
-
|
|
120
|
+
Шапку `Table` можно перекрасить переменной `--table-header-color`. По умолчанию она `--accent-soft`, смарт-виджеты задают её сами от своего цвета.
|
|
91
121
|
|
|
92
|
-
|
|
122
|
+
Посмотреть всю тему разом можно на вкладке «Тема» на главной витрины. Там палитра, все компоненты с демо-данными, типографика и Markdown.
|
|
93
123
|
|
|
94
|
-
##
|
|
124
|
+
## Языки
|
|
95
125
|
|
|
96
|
-
|
|
97
|
-
<script lang="ts">
|
|
98
|
-
import * as UI from "poe-svelte-ui-lib"
|
|
126
|
+
Список языков задан в одном месте, `LANGUAGES` в `src/lib/locales/languages.ts`. Сейчас это RU, EN и ZH. Чтобы добавить язык, достаточно одной записи там. Переключатели языка во всех приложениях подхватят его сами. Пока перевода нет, показывается русский текст.
|
|
99
127
|
|
|
100
|
-
|
|
101
|
-
</script>
|
|
128
|
+
Приложения не держат свой список языков. Они берут его из библиотеки, а свой словарь подключают так:
|
|
102
129
|
|
|
103
|
-
|
|
104
|
-
|
|
130
|
+
```ts
|
|
131
|
+
export const T = createTranslator(translations)
|
|
105
132
|
```
|
|
106
133
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
**Витрина повторяет конструктор DevCloud:** слева компонент и код (прижат к низу), справа панель свойств шириной `24rem` с тем же оформлением, что в облаке, — переполнение подписей видно сразу. Кнопка (i) в шапке панели открывает описание компонента.
|
|
134
|
+
Один вызов `setLanguage` переключает язык и в библиотеке, и в приложении. Выбор сохраняется в браузере. В SSR-приложениях сохранённый язык восстанавливают вызовом `restoreLanguage()` в `onMount` корневого layout.
|
|
110
135
|
|
|
111
|
-
|
|
136
|
+
Серверный код, который запускается под Node без Vite, импортирует языки из `poe-svelte-ui-lib/locales`. Корень пакета тянет Svelte-компоненты, и Node его не загрузит.
|
|
112
137
|
|
|
113
|
-
|
|
114
|
-
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
115
|
-
| `🎯 **Назначение**` | 1–2 фразы: что это и когда применять |
|
|
116
|
-
| `📦 **Пакет данных**` | откуда данные (переменная, группа полей, объект ответа), каким пакетом и как часто их слать, что и когда компонент отправляет сам или «только отображение»; не связан с устройством — так и написать |
|
|
117
|
-
| `🔑 **Ключи**` | по пункту на ключ: `` `Ключ` — тип, единицы, смысл``, обязательность; у простых компонентов — формат значения переменной |
|
|
118
|
-
| `✨ **Особенности**` | поведение, ограничения, советы, связь с другими компонентами |
|
|
119
|
-
| `⚙️ **Настройки**` | что меняется в панели свойств |
|
|
138
|
+
Тексты бывают двух видов:
|
|
120
139
|
|
|
121
|
-
|
|
140
|
+
- **Встроенные тексты компонентов**: подписи, кнопки, подсказки. Они только в словаре `src/lib/locales/translations.ts` и выводятся через `$T("ключ")`. Русских строк прямо в разметке быть не должно.
|
|
141
|
+
- **Тексты из конструктора**: название поля, варианты списка, заголовки колонок. Это строка или объект `{ ru, en, zh }`. Приложение переводит всё описание интерфейса функцией `localizeDeep` перед показом. В конструкторе их правят в окне «Тексты и переводы», которое есть у каждого компонента.
|
|
122
142
|
|
|
123
|
-
|
|
143
|
+
## Как описывать компонент
|
|
124
144
|
|
|
125
|
-
|
|
145
|
+
У компонента два описания.
|
|
126
146
|
|
|
127
|
-
|
|
147
|
+
**Короткое**, по кнопке (i). Лежит в словаре под ключом `component.info.<Тип>`. Его показывают витрина и конструктор DevCloud. Разделы идут в таком порядке, ненужные пропускаются:
|
|
128
148
|
|
|
129
|
-
|
|
130
|
-
|
|
149
|
+
| Раздел | Что писать |
|
|
150
|
+
|---|---|
|
|
151
|
+
| Назначение | Одна-две фразы: что это и когда применять |
|
|
152
|
+
| Пакет данных | Откуда данные, каким пакетом и как часто их слать, что компонент отправляет сам |
|
|
153
|
+
| Ключи | По пункту на ключ: тип, единицы, смысл |
|
|
154
|
+
| Особенности | Поведение, ограничения, советы |
|
|
155
|
+
| Настройки | Что меняется в панели свойств |
|
|
131
156
|
|
|
132
|
-
|
|
157
|
+
**Подробное**, `src/lib/<Компонент>/README.md`. Оно открывается на вкладке «Инфо» витрины. Начало повторяет короткое описание и не должно ему противоречить. Дальше идут пропсы, примеры, панель свойств и внутреннее устройство.
|
|
133
158
|
|
|
134
159
|
## Разработка
|
|
135
160
|
|
|
136
161
|
```bash
|
|
137
|
-
npm run dev
|
|
138
|
-
npm run
|
|
139
|
-
npm run
|
|
162
|
+
npm run dev # витрина на локальном сервере
|
|
163
|
+
npm run check # проверка типов
|
|
164
|
+
npm run TestProtocols # тесты протоколов и битовых полей
|
|
165
|
+
npm run Formatting # prettier
|
|
166
|
+
npm run build # сборка витрины в docs/
|
|
167
|
+
npm pack # сборка пакета в dist/ с проверками
|
|
140
168
|
```
|
|
141
169
|
|
|
142
|
-
|
|
170
|
+
Витрина устроена как конструктор DevCloud: слева компонент и его код, справа панель свойств той же ширины, что в облаке. Если подпись не влезает, это видно сразу.
|
|
171
|
+
|
|
172
|
+
Внутри библиотеки импорты относительные. Витрина импортирует библиотеку через `#lib` (поле `imports` в `package.json`).
|
|
173
|
+
|
|
174
|
+
## Выпуск
|
|
175
|
+
|
|
176
|
+
Выпуск запускается сообщением коммита в `main`:
|
|
177
|
+
|
|
178
|
+
- `[publish]` публикует пакет в npm;
|
|
179
|
+
- `[deploy]` обновляет витрину на GitHub Pages.
|
|
143
180
|
|
|
144
|
-
|
|
181
|
+
Перед выпуском поднимите версию в `package.json`. Версия на витрине берётся оттуда же.
|
|
145
182
|
|
|
146
|
-
Связь
|
|
183
|
+
Публикация идёт через trusted publisher npm, постоянный токен не нужен. Связь настроена на npmjs.com в настройках пакета: GitHub Actions, репозиторий `Oleg-Perevyshin/ElementsUI`, workflow `npm_publish.yaml`.
|
|
147
184
|
|
|
148
|
-
|
|
185
|
+
После публикации облако обновляется само. Workflow ставит новую версию в DevCloud, проверяет типы и, если всё прошло, поднимает вторую цифру версии облака и пушит туда коммит вида `1.6 [deploy] Обновление ElementsUI до 1.84.0`. Вручную версию библиотеки в облаке не поднимают. Если проверка упала, облако остаётся на старой версии, причину ищите в логе job `update-devcloud`.
|
|
149
186
|
|
|
150
187
|
---
|
|
151
188
|
|
|
152
|
-
|
|
189
|
+
Лицензия MIT, см. `LICENSE`.
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
<!-- $lib/Accordion/Accordion.svelte — заголовок не увеличивается при раскрытии, радиус 14.
|
|
2
|
-
Мастер-цвет (componentClass) — как у смарт-виджетов: иконка и текст заголовка цветом, фон заголовка — его мягким оттенком. -->
|
|
1
|
+
<!-- $lib/Accordion/Accordion.svelte — заголовок не увеличивается при раскрытии, радиус 14. Мастер-цвет (componentClass) — как у смарт-виджетов: иконка и текст заголовка цветом, фон заголовка — его мягким оттенком. -->
|
|
3
2
|
<script lang="ts">
|
|
4
3
|
import { slide } from "svelte/transition"
|
|
5
4
|
import type { IAccordionProps } from "../types"
|
|
@@ -27,8 +26,7 @@
|
|
|
27
26
|
transition:slide={{ duration: 200 }}
|
|
28
27
|
>
|
|
29
28
|
<div class="overflow-hidden rounded-[14px] border border-(--hairline-color) bg-(--back-color)">
|
|
30
|
-
<!-- Фон заголовка — мягкий оттенок мастер-цвета (светлый в светлой теме, тёмный в тёмной), текст — мастер-цвет с цветом шрифта 60/40,
|
|
31
|
-
раскрытое содержимое остаётся на чистом фоне (--back-color). -->
|
|
29
|
+
<!-- Фон заголовка — мягкий оттенок мастер-цвета (светлый в светлой теме, тёмный в тёмной), текст — мастер-цвет с цветом шрифта 60/40, раскрытое содержимое остаётся на чистом фоне (--back-color). -->
|
|
32
30
|
<button
|
|
33
31
|
class="flex w-full cursor-pointer items-center justify-between gap-3 bg-(--accent-soft) px-4 py-3 text-left text-[color-mix(in_srgb,var(--accent-color)_60%,var(--font-color))] transition-colors duration-150 hover:bg-[color-mix(in_srgb,var(--accent-color)_12%,var(--accent-soft))]"
|
|
34
32
|
onclick={toggle}
|
package/dist/Accordion/README.md
CHANGED
|
@@ -1,148 +1,54 @@
|
|
|
1
|
-
# Accordion
|
|
1
|
+
# Accordion
|
|
2
|
+
|
|
3
|
+
Сворачиваемый блок. В нём группируют компоненты, которые нужны не всегда: настройки, диагностику, редкие разделы.
|
|
2
4
|
|
|
3
5
|
## Назначение
|
|
4
6
|
|
|
5
|
-
Сворачиваемый блок для группировки
|
|
7
|
+
Сворачиваемый блок для группировки компонентов.
|
|
6
8
|
|
|
7
9
|
## Пакет данных
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
С устройством не связан, ничего не читает и не отправляет.
|
|
10
12
|
|
|
11
13
|
## Особенности
|
|
12
14
|
|
|
13
|
-
-
|
|
14
|
-
- Заголовок с иконкой открывает и закрывает
|
|
15
|
-
- Мастер-цвет
|
|
16
|
-
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
- Сетка содержимого адаптируется под размеры экрана (sm:p-3)
|
|
21
|
-
|
|
22
|
-
### Ограничения
|
|
23
|
-
|
|
24
|
-
- При использовании изображения фона высота строк сетки устанавливается в `minmax(6.5rem, auto)` вместо `auto`
|
|
25
|
-
- Необходимо убедиться, что переданный компонент иконки является валидным Svelte компонентом или SVG строкой
|
|
26
|
-
- Размеры сетки должны быть положительными числами (по умолчанию 1x1)
|
|
27
|
-
|
|
28
|
-
### Производительность
|
|
29
|
-
|
|
30
|
-
- Содержимое аккордеона рендерится только при его открытии (`{#if isOpen}`)
|
|
15
|
+
- В конструкторе компоненты перетаскивают внутрь аккордеона. У него своя сетка, её размер задаётся при создании и меняется растягиванием.
|
|
16
|
+
- Заголовок с иконкой открывает и закрывает содержимое.
|
|
17
|
+
- Мастер-цвет работает как у смарт-виджетов: иконка, текст и стрелка заголовка окрашены цветом из палитры, фон заголовка его мягким оттенком. Без цвета используется акцент темы. Цвет из `label.class` перекрывает цвет текста.
|
|
18
|
+
- Закрытый аккордеон занимает одну строку сетки, открытый растягивается по содержимому.
|
|
19
|
+
- Содержимое рисуется, только когда аккордеон открыт.
|
|
20
|
+
- С картинкой фона (`image`) строки сетки не ниже `6.5rem`.
|
|
31
21
|
|
|
32
22
|
## Пропсы
|
|
33
23
|
|
|
34
|
-
| Название
|
|
35
|
-
|
|
36
|
-
| `id`
|
|
37
|
-
| `isOpen`
|
|
38
|
-
| `wrapperClass`
|
|
39
|
-
| `componentClass` | `string`
|
|
40
|
-
| `size`
|
|
41
|
-
| `
|
|
42
|
-
| `
|
|
43
|
-
| `label`
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
| `label.icon` | `ConstructorOfATypedSvelteComponent \| string \| null` | `null` | Иконка, отображаемая в заголовке (SVG строка или компонент) |
|
|
47
|
-
| `children` | `Snippet` | `undefined` | Слот для содержимого, которое будет отображаться при открытии |
|
|
48
|
-
| `image` | `string` | `""` | URL изображения для фона содержимого аккордеона |
|
|
49
|
-
|
|
50
|
-
### Колбэки
|
|
51
|
-
|
|
52
|
-
Компонент не генерирует специфические события, но использует встроенную функцию `toggle()` для переключения состояния открытия/закрытия при клике на кнопку заголовка.
|
|
24
|
+
| Название | Тип | По умолчанию | Описание |
|
|
25
|
+
|---|---|---|---|
|
|
26
|
+
| `id` | `string` | `crypto.randomUUID()` | Идентификатор |
|
|
27
|
+
| `isOpen` | `boolean` | `false` | Открыт ли. Можно связать через `bind:isOpen` |
|
|
28
|
+
| `wrapperClass` | `string` | `""` | Классы обёртки |
|
|
29
|
+
| `componentClass` | `string` | `""` | Мастер-цвет: `bg-red`, `bg-green` и другие из `COLOR_OPTIONS`. Пусто — акцент темы |
|
|
30
|
+
| `size` | `{ width, height }` | `1 × 1` | Сетка содержимого: колонки и строки |
|
|
31
|
+
| `label.name` | `string` | `""` | Заголовок |
|
|
32
|
+
| `label.class` | `string` | `"text-left"` | Классы текста заголовка |
|
|
33
|
+
| `label.icon` | `Component \| string \| null` | `null` | Иконка заголовка |
|
|
34
|
+
| `image` | `string` | `""` | Картинка фона содержимого |
|
|
35
|
+
| `children` | `Snippet` | | Содержимое |
|
|
53
36
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
### Базовое использование
|
|
57
|
-
|
|
58
|
-
```svelte
|
|
59
|
-
<script>
|
|
60
|
-
import * as UI from "poe-svelte-ui-lib"
|
|
61
|
-
</script>
|
|
62
|
-
|
|
63
|
-
<UI.Accordion label={{ name: "Accordion" }} isOpen={true}>
|
|
64
|
-
<div class="flex flex-col">
|
|
65
|
-
<h1>Содержимое компонента</h1>
|
|
66
|
-
<h1>Содержимое компонента</h1>
|
|
67
|
-
<h1>Содержимое компонента</h1>
|
|
68
|
-
</div>
|
|
69
|
-
</UI.Accordion>
|
|
70
|
-
```
|
|
37
|
+
Колбэков нет. Открытие и закрытие компонент обрабатывает сам.
|
|
71
38
|
|
|
72
|
-
|
|
39
|
+
## Пример
|
|
73
40
|
|
|
74
41
|
```svelte
|
|
75
42
|
<script>
|
|
76
43
|
import * as UI from "poe-svelte-ui-lib"
|
|
44
|
+
let open = $state(false)
|
|
77
45
|
</script>
|
|
78
46
|
|
|
79
|
-
<UI.Accordion label={{ name: "
|
|
80
|
-
<UI.
|
|
81
|
-
<h6>Содержимое вложенного Accordion 1</h6>
|
|
82
|
-
<h5>Содержимое вложенного Accordion 1</h5>
|
|
83
|
-
<h4>Содержимое вложенного Accordion 1</h4>
|
|
84
|
-
<h3>Содержимое вложенного Accordion 1</h3>
|
|
85
|
-
<h2>Содержимое вложенного Accordion 1</h2>
|
|
86
|
-
<h1>Содержимое вложенного Accordion 1</h1>
|
|
87
|
-
</UI.Accordion>
|
|
88
|
-
<UI.Accordion label={{ name: "Nested Accordion 2", class: "" }} isOpen={false} wrapperClass="col-span-3">
|
|
89
|
-
<h1>Содержимое вложенного Accordion 2</h1>
|
|
90
|
-
<h2>Содержимое вложенного Accordion 2</h2>
|
|
91
|
-
<h3>Содержимое вложенного Accordion 2</h3>
|
|
92
|
-
<h4>Содержимое вложенного Accordion 2</h4>
|
|
93
|
-
<h5>Содержимое вложенного Accordion 2</h5>
|
|
94
|
-
</UI.Accordion>
|
|
95
|
-
<UI.Accordion label={{ name: "Nested Accordion 3", class: "" }} isOpen={false} wrapperClass="col-span-3">
|
|
96
|
-
<h4>Содержимое вложенного Accordion 3</h4>
|
|
97
|
-
<h3>Содержимое вложенного Accordion 3</h3>
|
|
98
|
-
<h2>Содержимое вложенного Accordion 3</h2>
|
|
99
|
-
<h1>Содержимое вложенного Accordion 3</h1>
|
|
100
|
-
</UI.Accordion>
|
|
47
|
+
<UI.Accordion label={{ name: "Сеть" }} componentClass="bg-blue" bind:isOpen={open}>
|
|
48
|
+
<UI.Input label={{ name: "SSID" }} />
|
|
101
49
|
</UI.Accordion>
|
|
102
50
|
```
|
|
103
51
|
|
|
104
|
-
##
|
|
105
|
-
|
|
106
|
-
### Описание
|
|
107
|
-
|
|
108
|
-
Компонент `AccordionProps.svelte` предоставляет визуальный интерфейс для редактирования свойств аккордеона. Поддерживает два режима отображения: для конструктора и для редактирования.
|
|
109
|
-
|
|
110
|
-
### Пропсы конструктора
|
|
111
|
-
|
|
112
|
-
| Название | Тип | По умолчанию | Описание |
|
|
113
|
-
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------------------------------------- |
|
|
114
|
-
| `component` | `UIComponent & { properties: Partial<IAccordionProps> }` | `-` | Объект компонента с его свойствами |
|
|
115
|
-
| `onPropertyChange` | `(updates: Partial<{ properties?: string \| object; name?: string; access?: string; eventHandler?: IUIComponentHandler }>) => void` | `-` | Коллбэк для обновления свойств компонента |
|
|
116
|
-
| `forConstructor` | `boolean` | `true` | Режим отображения (для конструктора или редактирования) |
|
|
117
|
-
|
|
118
|
-
### Особенности конструктора
|
|
119
|
-
|
|
120
|
-
- Включает модальное окно для выбора иконок из библиотеки
|
|
121
|
-
- Поддерживает загрузку изображений для фона
|
|
122
|
-
- Поддерживает валидацию числовых значений (min/max) для размеров
|
|
123
|
-
|
|
124
|
-
### Что настраивается
|
|
125
|
-
|
|
126
|
-
- Заголовок, иконка, мастер-цвет заголовка, «Открыт по умолчанию» — состояние при загрузке интерфейса
|
|
127
|
-
- Картинка фона — изображение под содержимым (например схема устройства), поверх неё располагаются компоненты
|
|
128
|
-
|
|
129
|
-
## Внутреннее устройство
|
|
130
|
-
|
|
131
|
-
### Реактивность
|
|
132
|
-
|
|
133
|
-
- Переменная `isOpen` является реактивной и управляет состоянием отображения содержимого
|
|
134
|
-
- Функция `toggle()` изменяет состояние `isOpen`, вызывая повторный рендеринг компонента
|
|
135
|
-
|
|
136
|
-
### Сторы и зависимости
|
|
137
|
-
|
|
138
|
-
- Применяется переход `slide` из `svelte/transition` для анимации открытия/закрытия
|
|
139
|
-
|
|
140
|
-
### Директивы
|
|
141
|
-
|
|
142
|
-
- `transition:slide` для анимации открытия/закрытия содержимого
|
|
143
|
-
- `@render children` для отображения переданного содержимого
|
|
144
|
-
- `bind:isOpen` в конструкторе свойств для двусторонней привязки состояния
|
|
145
|
-
|
|
146
|
-
### Слоты
|
|
52
|
+
## Панель свойств (AccordionProps.svelte)
|
|
147
53
|
|
|
148
|
-
|
|
54
|
+
В конструкторе задают заголовок, иконку, мастер-цвет, картинку фона и размер сетки.
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
<!-- $lib/Button/Button.svelte —
|
|
2
|
-
API не изменён: id, wrapperClass, componentClass, disabled, content, keyBind, onClick.
|
|
3
|
-
Что изменилось внутри:
|
|
4
|
-
• роль определяется значением bg-* (намерение), а не фактом его наличия;
|
|
5
|
-
• убрано автоподчёркивание текста — кнопка больше не выглядит ссылкой;
|
|
6
|
-
• единый радиус 10px (иконка без подписи — круг), высота 32px (стандарт полей h-8), кегль 14/600;
|
|
7
|
-
• кольцо фокуса вместо размытой тени;
|
|
8
|
-
• disabled через токены, а не opacity: 0.5;
|
|
9
|
-
• иконка встала в поток (flex + gap) вместо absolute left-3. -->
|
|
1
|
+
<!-- $lib/Button/Button.svelte — кнопка: роль по значению bg-*, радиус 10px (иконка без подписи — круг), высота 32px, кольцо фокуса, иконка в потоке через flex + gap -->
|
|
10
2
|
<script lang="ts">
|
|
11
3
|
import { onMount } from "svelte"
|
|
12
4
|
import type { IButtonProps } from "../types"
|
|
@@ -29,11 +21,7 @@
|
|
|
29
21
|
|
|
30
22
|
let showInfo = $state(false)
|
|
31
23
|
|
|
32
|
-
/* ─── Роль кнопки по последнему классу bg-* ─────────────────────────
|
|
33
|
-
bg-blue / bg-green / bg-cyan / bg-purple / bg-orange / bg-yellow → primary (заливка + белый текст)
|
|
34
|
-
bg-red / bg-pink → destructive
|
|
35
|
-
bg-max / bg-gray / bg-*-soft → secondary (поверхность + контур)
|
|
36
|
-
bg-transparent / без bg-* → plain (текст акцентом) */
|
|
24
|
+
/* ─── Роль кнопки по последнему классу bg-* ───────────────────────── bg-blue / bg-green / bg-cyan / bg-purple / bg-orange / bg-yellow → primary (заливка + белый текст) bg-red / bg-pink → destructive bg-max / bg-gray / bg-*-soft → secondary (поверхность + контур) bg-transparent / без bg-* → plain (текст акцентом) */
|
|
37
25
|
const SURFACE_BG = ["bg-max", "bg-gray"]
|
|
38
26
|
const DANGER_BG = ["bg-red", "bg-pink"]
|
|
39
27
|
|
|
@@ -51,10 +39,7 @@
|
|
|
51
39
|
|
|
52
40
|
const isIconOnly = $derived(!!content?.icon && !content.name?.trim())
|
|
53
41
|
|
|
54
|
-
/* bg-(--bg-color) намеренно не входит в roleClass: он приклеивается к готовому
|
|
55
|
-
className вне twMerge (см. разметку ниже) — иначе twMerge видит его и явный
|
|
56
|
-
bg-* из componentClass (bg-red, bg-max…) как конфликтующие утилиты одной
|
|
57
|
-
группы и вырезает один из них, из-за чего заливка кнопки пропадает. */
|
|
42
|
+
/* bg-(--bg-color) намеренно не входит в roleClass: он приклеивается к готовому className вне twMerge (см. разметку ниже) — иначе twMerge видит его и явный bg-* из componentClass (bg-red, bg-max…) как конфликтующие утилиты одной группы и вырезает один из них, из-за чего заливка кнопки пропадает. */
|
|
58
43
|
const roleBg = $derived.by(() => {
|
|
59
44
|
if (disabled) return "bg-(--gray-color)"
|
|
60
45
|
if (role === "plain") return "bg-transparent"
|