poe-svelte-ui-lib 1.9.8 → 1.9.9
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/Accordion/README.md +1 -1
- package/dist/Button/README.md +184 -0
- package/dist/Carousel/README.md +147 -0
- package/dist/ColorPicker/README.md +141 -0
- package/dist/ComponentExample.svelte +11 -7
- package/dist/ComponentExample.svelte.d.ts +1 -0
- package/dist/FileAttach/README.md +172 -0
- package/dist/Graph/README.md +151 -0
- package/dist/Input/InputProps.svelte +2 -2
- package/dist/Input/README.md +0 -0
- package/dist/Joystick/README.md +147 -0
- package/dist/Map/README.md +152 -0
- package/dist/ProgressBar/README.md +157 -0
- package/dist/Select/README.md +176 -0
- package/dist/Slider/README.md +177 -0
- package/dist/Switch/README.md +186 -0
- package/dist/Table/README.md +223 -0
- package/dist/Tabs/README.md +181 -0
- package/dist/TextField/README.md +121 -0
- package/dist/Widget/README.md +196 -0
- package/dist/Widget/WidgetProps.svelte +0 -37
- package/dist/locales/translations.js +8 -0
- package/package.json +4 -2
package/dist/Accordion/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Описание
|
|
4
4
|
|
|
5
|
-
Аккордеон - это
|
|
5
|
+
Аккордеон - это UI-компонент, который позволяет скрывать и отображать содержимое в виде раскрывающегося блока. Компонент предоставляет возможность настройки внешнего вида, размеров, иконок, изображений фона и других параметров через систему пропсов.
|
|
6
6
|
|
|
7
7
|
## Пропсы
|
|
8
8
|
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Button Component
|
|
2
|
+
|
|
3
|
+
## Описание
|
|
4
|
+
|
|
5
|
+
Кнопка - это интерактивный UI-компонент, который предоставляет возможность выполнения действий при клике. Компонент поддерживает настройку внешнего вида, иконок, информационных подсказок, горячих клавиш и другие параметры через систему пропсов.
|
|
6
|
+
|
|
7
|
+
## Пропсы
|
|
8
|
+
|
|
9
|
+
| Название | Тип | По умолчанию | Описание |
|
|
10
|
+
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | ------------------------------------------------ |
|
|
11
|
+
| id | string | crypto.randomUUID() | Уникальный идентификатор компонента |
|
|
12
|
+
| wrapperClass | string | "" | Дополнительные CSS-классы для обертки компонента |
|
|
13
|
+
| componentClass | string | "" | CSS-классы для стилизации самой кнопки |
|
|
14
|
+
| disabled | boolean | false | Состояние отключения кнопки |
|
|
15
|
+
| content | { name?: string; info?: { text: string; side: "top" \| "bottom" \| "left" \| "right" }; icon?: ConstructorOfATypedSvelteComponent \| string \| null } | { name: "", info: { text: "", side: "top" }, icon: null } | Настройки содержимого кнопки |
|
|
16
|
+
| keyBind | { key?: string; ctrlKey?: boolean; shiftKey?: boolean; altKey?: boolean; metaKey?: boolean; showHint?: boolean } | { showHint: true } | Настройки горячих клавиш для активации кнопки |
|
|
17
|
+
| onClick | () => void | undefined | Обработчик клика по кнопке |
|
|
18
|
+
|
|
19
|
+
### Вложенные типы
|
|
20
|
+
|
|
21
|
+
#### Content
|
|
22
|
+
|
|
23
|
+
| Название | Тип | По умолчанию | Описание |
|
|
24
|
+
| -------- | -------------------------------------------------------------- | ------------------------- | -------------------------------------------------------- |
|
|
25
|
+
| name | string | "" | Текст кнопки |
|
|
26
|
+
| info | { text: string; side: "top" \| "bottom" \| "left" \| "right" } | { text: "", side: "top" } | Информационная подсказка |
|
|
27
|
+
| icon | ConstructorOfATypedSvelteComponent \| string \| null | null | Иконка, отображаемая в кнопке (SVG строка или компонент) |
|
|
28
|
+
|
|
29
|
+
#### Info
|
|
30
|
+
|
|
31
|
+
| Название | Тип | По умолчанию | Описание |
|
|
32
|
+
| -------- | -------------------------------------- | ------------ | ------------------------------ |
|
|
33
|
+
| text | string | "" | Текст информационной подсказки |
|
|
34
|
+
| side | "top" \| "bottom" \| "left" \| "right" | "top" | Сторона отображения подсказки |
|
|
35
|
+
|
|
36
|
+
#### KeyBind
|
|
37
|
+
|
|
38
|
+
| Название | Тип | По умолчанию | Описание |
|
|
39
|
+
| -------- | ------- | ------------ | ------------------------------------------ |
|
|
40
|
+
| key | string | undefined | Клавиша для активации |
|
|
41
|
+
| ctrlKey | boolean | undefined | Требование нажатия Ctrl |
|
|
42
|
+
| shiftKey | boolean | undefined | Требование нажатия Shift |
|
|
43
|
+
| altKey | boolean | undefined | Требование нажатия Alt |
|
|
44
|
+
| metaKey | boolean | undefined | Требование нажатия Meta (Cmd на Mac) |
|
|
45
|
+
| showHint | boolean | true | Показывать ли подсказку о горячих клавишах |
|
|
46
|
+
|
|
47
|
+
## События
|
|
48
|
+
|
|
49
|
+
| Название | Тип | Описание |
|
|
50
|
+
| -------- | ---------- | ----------------------------------------------------------------------- |
|
|
51
|
+
| onClick | () => void | Срабатывает при клике по кнопке или при активации через горячую клавишу |
|
|
52
|
+
|
|
53
|
+
## Примеры
|
|
54
|
+
|
|
55
|
+
### Базовое использование
|
|
56
|
+
|
|
57
|
+
```svelte
|
|
58
|
+
<script>
|
|
59
|
+
import * as UI from "poe-svelte-ui-lib"
|
|
60
|
+
|
|
61
|
+
const handleClick = () => {
|
|
62
|
+
console.log("Кнопка нажата!")
|
|
63
|
+
}
|
|
64
|
+
</script>
|
|
65
|
+
|
|
66
|
+
<UI.Button content={{ name: "Button 1" }} componentClass="bg-red" onClick={handleClick} />
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Кнопка с информацией и иконкой
|
|
70
|
+
|
|
71
|
+
```svelte
|
|
72
|
+
<script>
|
|
73
|
+
import * as UI from "poe-svelte-ui-lib"
|
|
74
|
+
import IconGripVerticalDual from "./appIcons/IconGripVerticalDual.svelte"
|
|
75
|
+
|
|
76
|
+
const handleClick = () => {
|
|
77
|
+
console.log("Кнопка с иконкой нажата!")
|
|
78
|
+
}
|
|
79
|
+
</script>
|
|
80
|
+
|
|
81
|
+
<UI.Button
|
|
82
|
+
content={{
|
|
83
|
+
name: "Button 2",
|
|
84
|
+
icon: IconGripVerticalDual,
|
|
85
|
+
info: { text: "Info for Icon Button", side: "right" },
|
|
86
|
+
}}
|
|
87
|
+
componentClass="bg-green h-12 rounded-3xl"
|
|
88
|
+
onClick={handleClick}
|
|
89
|
+
/>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Отключенная кнопка
|
|
93
|
+
|
|
94
|
+
```svelte
|
|
95
|
+
<script>
|
|
96
|
+
import * as UI from "poe-svelte-ui-lib"
|
|
97
|
+
</script>
|
|
98
|
+
|
|
99
|
+
<UI.Button content={{ name: "Button 3" }} componentClass="bg-blue" disabled={true} />
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Кнопка только с иконкой
|
|
103
|
+
|
|
104
|
+
```svelte
|
|
105
|
+
<script>
|
|
106
|
+
import * as UI from "poe-svelte-ui-lib"
|
|
107
|
+
import IconGripHorizontalUp from "./appIcons/IconGripHorizontalUp.svelte"
|
|
108
|
+
|
|
109
|
+
const handleClick = () => {
|
|
110
|
+
console.log("Кнопка с иконкой нажата!")
|
|
111
|
+
}
|
|
112
|
+
</script>
|
|
113
|
+
|
|
114
|
+
<div class="flex h-10 items-center justify-around">
|
|
115
|
+
<UI.Button content={{ icon: IconGripHorizontalUp }} wrapperClass="w-20 h-10" componentClass="bg-purple rounded-full" onClick={handleClick} />
|
|
116
|
+
</div>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Внутренняя архитектура
|
|
120
|
+
|
|
121
|
+
### Реактивность
|
|
122
|
+
|
|
123
|
+
- Переменная `showInfo` управляет видимостью информационной подсказки
|
|
124
|
+
- Переменная `svgSize` вычисляет размеры SVG иконки на основе классов
|
|
125
|
+
- Объект `tooltipConfig` содержит конфигурацию позиционирования подсказок
|
|
126
|
+
|
|
127
|
+
### Сторы и зависимости
|
|
128
|
+
|
|
129
|
+
- Используется стор `twMerge` для объединения Tailwind CSS классов
|
|
130
|
+
- Применяется переход `fly` из `svelte/transition` для анимации подсказки
|
|
131
|
+
- Используется `onMount` для подписки и отписки от глобальных событий клавиатуры
|
|
132
|
+
|
|
133
|
+
### Директивы
|
|
134
|
+
|
|
135
|
+
- `transition:fly` для анимации появления/скрытия информационной подсказки
|
|
136
|
+
- Обработчики `onmouseenter` и `onmouseleave` для показа/скрытия подсказки
|
|
137
|
+
- Обработчик `onclick` для активации кнопки
|
|
138
|
+
|
|
139
|
+
### Слоты
|
|
140
|
+
|
|
141
|
+
- Компонент не использует внешних слотов
|
|
142
|
+
|
|
143
|
+
## Конструктор свойств (ButtonProps.svelte)
|
|
144
|
+
|
|
145
|
+
### Описание
|
|
146
|
+
|
|
147
|
+
Компонент `ButtonProps.svelte` предоставляет визуальный интерфейс для редактирования свойств кнопки. Поддерживает два режима отображения: для конструктора и для редактирования.
|
|
148
|
+
|
|
149
|
+
### Пропсы конструктора
|
|
150
|
+
|
|
151
|
+
| Название | Тип | По умолчанию | Описание |
|
|
152
|
+
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------------------------------------- |
|
|
153
|
+
| component | UIComponent & { properties: Partial<IButtonProps> } | - | Объект компонента с его свойствами |
|
|
154
|
+
| onPropertyChange | (updates: Partial<{ properties?: string \| object; name?: string; access?: string; eventHandler?: IUIComponentHandler }>) => void | - | Коллбэк для обновления свойств компонента |
|
|
155
|
+
| forConstructor | boolean | true | Режим отображения (для конструктора или редактирования) |
|
|
156
|
+
|
|
157
|
+
### Особенности конструктора
|
|
158
|
+
|
|
159
|
+
- Предоставляет визуальные элементы управления для всех доступных свойств
|
|
160
|
+
- Включает модальное окно для выбора иконок из библиотеки
|
|
161
|
+
- Поддерживает настройку обработчика событий и аргументов
|
|
162
|
+
- Имеет различные наборы полей в зависимости от режима (`forConstructor`)
|
|
163
|
+
- Использует систему локализации через `$t('constructor.props.*')`
|
|
164
|
+
- Поддерживает валидацию вводимых данных через регулярные выражения
|
|
165
|
+
|
|
166
|
+
## Заметки
|
|
167
|
+
|
|
168
|
+
### Адаптивность
|
|
169
|
+
|
|
170
|
+
- Компонент использует Tailwind CSS для адаптивного дизайна
|
|
171
|
+
- Используются относительные единицы измерения для обеспечения масштабируемости
|
|
172
|
+
- Подсказки автоматически позиционируются в зависимости от стороны отображения
|
|
173
|
+
|
|
174
|
+
### Ограничения
|
|
175
|
+
|
|
176
|
+
- При использовании только иконки (без текста) кнопка становится прозрачной без фона
|
|
177
|
+
- Горячие клавиши регистрируются глобально и могут конфликтовать с другими компонентами
|
|
178
|
+
- Подсказки не поддерживают HTML-разметку, отображают только текст
|
|
179
|
+
|
|
180
|
+
### Производительность
|
|
181
|
+
|
|
182
|
+
- Компонент использует оптимизации Svelte для минимизации перерисовок
|
|
183
|
+
- Обработчики клавиатуры удаляются при размонтировании компонента
|
|
184
|
+
- Используется эффективное объединение классов через `twMerge`
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Carousel Component
|
|
2
|
+
|
|
3
|
+
## Описание
|
|
4
|
+
|
|
5
|
+
Карусель - это интерактивный UI-компонент, который позволяет просматривать контент в виде прокручиваемой ленты с возможностью навигации по стрелкам.
|
|
6
|
+
|
|
7
|
+
## Пропсы
|
|
8
|
+
|
|
9
|
+
| Название | Тип | По умолчанию | Описание |
|
|
10
|
+
| ------------ | --------------------------------- | -------------------------------- | ----------------------------------------------------------- |
|
|
11
|
+
| id | string | crypto.randomUUID() | Уникальный идентификатор компонента |
|
|
12
|
+
| wrapperClass | string | "" | Дополнительные CSS-классы для обертки компонента |
|
|
13
|
+
| label | { name?: string; class?: string } | { name: "", class: "text-left" } | Настройки заголовка карусели |
|
|
14
|
+
| scrollValue | number | 200 | Значение прокрутки при нажатии на стрелки (в пикселях) |
|
|
15
|
+
| children | Snippet | undefined | Слот для содержимого, которое будет отображаться в карусели |
|
|
16
|
+
|
|
17
|
+
### Вложенные типы
|
|
18
|
+
|
|
19
|
+
#### Label
|
|
20
|
+
|
|
21
|
+
| Название | Тип | По умолчанию | Описание |
|
|
22
|
+
| -------- | ------ | ------------ | ------------------------------------------ |
|
|
23
|
+
| name | string | "" | Текст заголовка карусели |
|
|
24
|
+
| class | string | "text-left" | CSS-классы для стилизации текста заголовка |
|
|
25
|
+
|
|
26
|
+
## События
|
|
27
|
+
|
|
28
|
+
Компонент не генерирует специфические события.
|
|
29
|
+
|
|
30
|
+
## Примеры
|
|
31
|
+
|
|
32
|
+
### Базовое использование
|
|
33
|
+
|
|
34
|
+
```svelte
|
|
35
|
+
<script>
|
|
36
|
+
import * as UI from "poe-svelte-ui-lib"
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<UI.Carousel scrollValue={200}>
|
|
40
|
+
<div class="w-90 min-w-90 h-20 bg-white p-2">
|
|
41
|
+
<div class="mr-2 flex flex-col items-end">
|
|
42
|
+
<h5 class="flex items-center whitespace-nowrap">COIV-REQE-J1U9-VCS7 |</h5>
|
|
43
|
+
<p class="flex w-fit text-sm whitespace-nowrap gap-0.5">10.00.000-00_00007C9E0000BDE300000718:B2</p>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
<div class="w-90 min-w-90 h-20 bg-white p-2">
|
|
47
|
+
<div class="mr-2 flex flex-col items-end">
|
|
48
|
+
<h5 class="flex items-center whitespace-nowrap">COIV-REQE-J1U9-VCS7 |</h5>
|
|
49
|
+
<p class="flex w-fit text-sm whitespace-nowrap gap-0.5">10.00.000-00_00007C9E0000BDE300000718:B2</p>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="w-90 min-w-90 h-20 bg-white p-2">
|
|
53
|
+
<div class="mr-2 flex flex-col items-end">
|
|
54
|
+
<h5 class="flex items-center whitespace-nowrap">COIV-REQE-J1U9-VCS7 |</h5>
|
|
55
|
+
<p class="flex w-fit text-sm whitespace-nowrap gap-0.5">10.00.000-00_00007C9E0000BDE300000718:B2</p>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
</UI.Carousel>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### С заголовком
|
|
62
|
+
|
|
63
|
+
```svelte
|
|
64
|
+
<script>
|
|
65
|
+
import * as UI from "poe-svelte-ui-lib"
|
|
66
|
+
</script>
|
|
67
|
+
|
|
68
|
+
<UI.Carousel label={{ name: "Карусель с заголовком" }} scrollValue={300}>
|
|
69
|
+
<div class="w-80 min-w-80 h-24 bg-blue-100 p-3 rounded-lg">
|
|
70
|
+
<p>Элемент 1</p>
|
|
71
|
+
</div>
|
|
72
|
+
<div class="w-80 min-w-80 h-24 bg-green-100 p-3 rounded-lg">
|
|
73
|
+
<p>Элемент 2</p>
|
|
74
|
+
</div>
|
|
75
|
+
<div class="w-80 min-w-80 h-24 bg-yellow-100 p-3 rounded-lg">
|
|
76
|
+
<p>Элемент 3</p>
|
|
77
|
+
</div>
|
|
78
|
+
<div class="w-80 min-w-80 h-24 bg-red-100 p-3 rounded-lg">
|
|
79
|
+
<p>Элемент 4</p>
|
|
80
|
+
</div>
|
|
81
|
+
</UI.Carousel>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### С настраиваемым классом обертки
|
|
85
|
+
|
|
86
|
+
```svelte
|
|
87
|
+
<script>
|
|
88
|
+
import * as UI from "poe-svelte-ui-lib"
|
|
89
|
+
</script>
|
|
90
|
+
|
|
91
|
+
<UI.Carousel wrapperClass="my-4 mx-auto max-w-4xl" scrollValue={150}>
|
|
92
|
+
<div class="w-72 min-w-72 h-16 bg-purple-100 p-2 rounded-md">
|
|
93
|
+
<p>Контент 1</p>
|
|
94
|
+
</div>
|
|
95
|
+
<div class="w-72 min-w-72 h-16 bg-pink-100 p-2 rounded-md">
|
|
96
|
+
<p>Контент 2</p>
|
|
97
|
+
</div>
|
|
98
|
+
<div class="w-72 min-w-72 h-16 bg-indigo-100 p-2 rounded-md">
|
|
99
|
+
<p>Контент 3</p>
|
|
100
|
+
</div>
|
|
101
|
+
</UI.Carousel>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Внутренняя архитектура
|
|
105
|
+
|
|
106
|
+
### Реактивность
|
|
107
|
+
|
|
108
|
+
- Переменная `carouselRef` хранит ссылку на DOM-элемент карусели
|
|
109
|
+
- Переменная `isAtStart` отслеживает, находится ли карусель в начале прокрутки
|
|
110
|
+
- Переменная `isAtEnd` отслеживает, находится ли карусель в конце прокрутки
|
|
111
|
+
- Функция `updateScrollState` обновляет состояния `isAtStart` и `isAtEnd` при прокрутке
|
|
112
|
+
|
|
113
|
+
### Сторы и зависимости
|
|
114
|
+
|
|
115
|
+
- Используется стор `twMerge` для объединения Tailwind CSS классов
|
|
116
|
+
- Применяется переход `slide` из `svelte/transition` для анимации стрелок навигации
|
|
117
|
+
- Используется `ResizeObserver` для отслеживания изменений размера
|
|
118
|
+
|
|
119
|
+
### Директивы
|
|
120
|
+
|
|
121
|
+
- `bind:this={carouselRef}` для получения ссылки на элемент карусели
|
|
122
|
+
- `transition:slide` для анимации стрелок навигации
|
|
123
|
+
- `$effect` для установки и очистки обработчиков событий
|
|
124
|
+
|
|
125
|
+
### Слоты
|
|
126
|
+
|
|
127
|
+
- `children` - слот для содержимого, которое отображается внутри карусели
|
|
128
|
+
|
|
129
|
+
## Заметки
|
|
130
|
+
|
|
131
|
+
### Адаптивность
|
|
132
|
+
|
|
133
|
+
- Компонент использует Tailwind CSS для адаптивного дизайна
|
|
134
|
+
- Стрелки навигации автоматически скрываются при достижении начала или конца карусели
|
|
135
|
+
- Используются относительные единицы измерения для обеспечения масштабируемости
|
|
136
|
+
|
|
137
|
+
### Ограничения
|
|
138
|
+
|
|
139
|
+
- Для корректного отображения элементы внутри карусели должны иметь фиксированную ширину
|
|
140
|
+
- Компонент не поддерживает вертикальную прокрутку
|
|
141
|
+
- Значение `scrollValue` влияет на величину прокрутки при нажатии стрелок
|
|
142
|
+
|
|
143
|
+
### Производительность
|
|
144
|
+
|
|
145
|
+
- Компонент использует оптимизации Svelte для минимизации перерисовок
|
|
146
|
+
- Обработчики событий и `ResizeObserver` корректно удаляются при размонтировании
|
|
147
|
+
- Используется эффективное объединение классов через `twMerge`
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# ColorPicker Component
|
|
2
|
+
|
|
3
|
+
## Описание
|
|
4
|
+
|
|
5
|
+
Палитра - это интерактивный UI-компонент, который позволяет выбирать цвета с помощью HSV-палитры и настройки яркости. Компонент поддерживает два режима работы: цветовой (HSV) и белый (градации серого), а также предоставляет превью цвета, его RGB и HEX значения.
|
|
6
|
+
|
|
7
|
+
## Пропсы
|
|
8
|
+
|
|
9
|
+
| Название | Тип | По умолчанию | Описание |
|
|
10
|
+
| ------------ | --------------------------------- | ----------------------- | ---------------------------------------------------------------- |
|
|
11
|
+
| id | string | crypto.randomUUID() | Уникальный идентификатор компонента |
|
|
12
|
+
| readonly | boolean | false | Режим только для чтения (без возможности изменения цвета) |
|
|
13
|
+
| wrapperClass | string | "" | Дополнительные CSS-классы для обертки компонента |
|
|
14
|
+
| label | { name?: string; class?: string } | { name: "", class: "" } | Настройки заголовка компонента |
|
|
15
|
+
| value | [number, number, number] | [0, 0, 0] | Начальное значение цвета в формате RGB (массив из 3 чисел 0-255) |
|
|
16
|
+
| onChange | () => void | () => {} | Обработчик изменения цвета |
|
|
17
|
+
|
|
18
|
+
### Вложенные типы
|
|
19
|
+
|
|
20
|
+
#### Label
|
|
21
|
+
|
|
22
|
+
| Название | Тип | По умолчанию | Описание |
|
|
23
|
+
| -------- | ------ | ------------ | ------------------------------------------ |
|
|
24
|
+
| name | string | "" | Текст заголовка компонента |
|
|
25
|
+
| class | string | "" | CSS-классы для стилизации текста заголовка |
|
|
26
|
+
|
|
27
|
+
## События
|
|
28
|
+
|
|
29
|
+
| Название | Тип | Описание |
|
|
30
|
+
| -------- | ---------------------------------- | ------------------------------------------------------------- |
|
|
31
|
+
| onChange | ([number, number, number]) => void | Срабатывает при изменении цвета, передает массив RGB значений |
|
|
32
|
+
|
|
33
|
+
## Примеры
|
|
34
|
+
|
|
35
|
+
### Базовое использование
|
|
36
|
+
|
|
37
|
+
```svelte
|
|
38
|
+
<script>
|
|
39
|
+
import * as UI from "poe-svelte-ui-lib"
|
|
40
|
+
|
|
41
|
+
let selectedColor = [186, 25, 255]
|
|
42
|
+
|
|
43
|
+
const handleColorChange = (newColor) => {
|
|
44
|
+
selectedColor = newColor
|
|
45
|
+
console.log("Новый цвет:", newColor)
|
|
46
|
+
}
|
|
47
|
+
</script>
|
|
48
|
+
|
|
49
|
+
<UI.ColorPicker label={{ name: "Выбор цвета из палитры" }} bind:value={selectedColor} onChange={handleColorChange} />
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### С начальным значением
|
|
53
|
+
|
|
54
|
+
```svelte
|
|
55
|
+
<script>
|
|
56
|
+
import * as UI from "poe-svelte-ui-lib"
|
|
57
|
+
|
|
58
|
+
const handleColorChange = (newColor) => {
|
|
59
|
+
console.log("Цвет изменен:", newColor)
|
|
60
|
+
}
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<UI.ColorPicker value={[255, 100, 50]} onChange={handleColorChange} />
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Только для чтения
|
|
67
|
+
|
|
68
|
+
```svelte
|
|
69
|
+
<script>
|
|
70
|
+
import * as UI from "poe-svelte-ui-lib"
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
<UI.ColorPicker value={[0, 255, 128]} readonly={true} label={{ name: "Просмотр цвета" }} />
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Внутренняя архитектура
|
|
77
|
+
|
|
78
|
+
### Реактивность
|
|
79
|
+
|
|
80
|
+
- Переменная `hsv` хранит текущее значение цвета в формате HSV
|
|
81
|
+
- Переменные `huePointer`, `brightnessPointer` и `whiteValue` отслеживают положение слайдеров
|
|
82
|
+
- Переменная `mode` определяет текущий режим (hsv или white)
|
|
83
|
+
- Функция `hsvToRgb` конвертирует HSV в RGB формат
|
|
84
|
+
- `$effect` синхронизирует входное значение RGB с внутренним состоянием HSV
|
|
85
|
+
|
|
86
|
+
### Сторы и зависимости
|
|
87
|
+
|
|
88
|
+
- Используется стор `twMerge` для объединения Tailwind CSS классов
|
|
89
|
+
- Используются математические функции для конвертации цветовых пространств
|
|
90
|
+
|
|
91
|
+
### Директивы
|
|
92
|
+
|
|
93
|
+
- `bind:this` для получения ссылок на DOM-элементы
|
|
94
|
+
- Обработчики `onmousedown` для перетаскивания слайдеров
|
|
95
|
+
- `$derived` для вычисления цвета превью и HEX значения
|
|
96
|
+
|
|
97
|
+
### Слоты
|
|
98
|
+
|
|
99
|
+
- Компонент не использует внешних слотов
|
|
100
|
+
|
|
101
|
+
## Конструктор свойств (ColorPickerProps.svelte)
|
|
102
|
+
|
|
103
|
+
### Описание
|
|
104
|
+
|
|
105
|
+
Компонент `ColorPickerProps.svelte` предоставляет визуальный интерфейс для редактирования свойств компонента выбора цвета. Поддерживает два режима отображения: для конструктора и для редактирования.
|
|
106
|
+
|
|
107
|
+
### Пропсы конструктора
|
|
108
|
+
|
|
109
|
+
| Название | Тип | По умолчанию | Описание |
|
|
110
|
+
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------------------------------------- |
|
|
111
|
+
| component | UIComponent & { properties: Partial<IColorPickerProps> } | - | Объект компонента с его свойствами |
|
|
112
|
+
| onPropertyChange | (updates: Partial<{ properties?: string \| object; name?: string; access?: string; eventHandler?: IUIComponentHandler }>) => void | - | Коллбэк для обновления свойств компонента |
|
|
113
|
+
| forConstructor | boolean | true | Режим отображения (для конструктора или редактирования) |
|
|
114
|
+
|
|
115
|
+
### Особенности конструктора
|
|
116
|
+
|
|
117
|
+
- Предоставляет визуальные элементы управления для всех доступных свойств
|
|
118
|
+
- Поддерживает настройку начального цвета через три числовых поля (RGB)
|
|
119
|
+
- Использует общие сниппеты для настройки различных параметров
|
|
120
|
+
- Имеет различные наборы полей в зависимости от режима (`forConstructor`)
|
|
121
|
+
- Использует систему локализации через `$t('constructor.props.*')`
|
|
122
|
+
|
|
123
|
+
## Заметки
|
|
124
|
+
|
|
125
|
+
### Адаптивность
|
|
126
|
+
|
|
127
|
+
- Компонент использует Tailwind CSS для адаптивного дизайна
|
|
128
|
+
- Превью цвета автоматически изменяет цвет текста для лучшей читаемости
|
|
129
|
+
- Используются относительные единицы измерения для обеспечения масштабируемости
|
|
130
|
+
|
|
131
|
+
### Ограничения
|
|
132
|
+
|
|
133
|
+
- Входное значение `value` должно быть массивом из 3 чисел в диапазоне 0-255
|
|
134
|
+
- Компонент автоматически определяет режим (HSV/белый) на основе входного значения
|
|
135
|
+
- При работе в режиме белого цвета все три компонента RGB имеют одинаковое значение
|
|
136
|
+
|
|
137
|
+
### Производительность
|
|
138
|
+
|
|
139
|
+
- Компонент использует оптимизации Svelte для минимизации перерисовок
|
|
140
|
+
- Вычисления цветовых преобразований происходят только при необходимости
|
|
141
|
+
- Используется эффективное объединение классов через `twMerge`
|
|
@@ -7,25 +7,28 @@
|
|
|
7
7
|
component,
|
|
8
8
|
componentProps,
|
|
9
9
|
examples,
|
|
10
|
+
props,
|
|
10
11
|
codeText,
|
|
11
12
|
forConstructor = $bindable(),
|
|
12
|
-
}: { component: Snippet; componentProps: Snippet; examples?: Snippet; codeText: string; forConstructor: boolean } = $props()
|
|
13
|
+
}: { component: Snippet; componentProps: Snippet; examples?: Snippet; props?: Snippet; codeText: string; forConstructor: boolean } = $props()
|
|
13
14
|
|
|
14
15
|
let isCopied = $state(false)
|
|
15
16
|
let snippetOptions = [
|
|
16
17
|
{ id: crypto.randomUUID(), value: "overview", name: $t("library.overview") },
|
|
17
18
|
{ id: crypto.randomUUID(), value: "examples", name: $t("library.examples") },
|
|
19
|
+
{ id: crypto.randomUUID(), value: "props", name: $t("library.props") },
|
|
18
20
|
]
|
|
19
21
|
|
|
20
22
|
let mainSnippet: string | undefined = $state("overview")
|
|
21
23
|
|
|
22
24
|
const renderCurrentSnippet = () => {
|
|
23
25
|
if (mainSnippet === "examples" && examples) return examples
|
|
26
|
+
if (mainSnippet === "props" && props) return props
|
|
24
27
|
else return overview
|
|
25
28
|
}
|
|
26
29
|
</script>
|
|
27
30
|
|
|
28
|
-
|
|
31
|
+
<div class="flex flex-col">
|
|
29
32
|
<Select
|
|
30
33
|
wrapperClass="w-1/2 mx-auto mb-3"
|
|
31
34
|
type="buttons"
|
|
@@ -33,8 +36,10 @@
|
|
|
33
36
|
value={snippetOptions.find((o) => o.value == mainSnippet)}
|
|
34
37
|
onUpdate={(value) => (mainSnippet = (value as IOption<string>).value)}
|
|
35
38
|
/>
|
|
36
|
-
|
|
37
|
-
{@render renderCurrentSnippet()()}
|
|
39
|
+
<div class="flex-1 whitespace-pre">
|
|
40
|
+
{@render renderCurrentSnippet()()}
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
38
43
|
|
|
39
44
|
{#snippet overview()}
|
|
40
45
|
<div class="flex w-full h-[calc(100vh-9rem)] flex-col">
|
|
@@ -53,7 +58,7 @@
|
|
|
53
58
|
{@render componentProps()}
|
|
54
59
|
<div class="relative mt-3">
|
|
55
60
|
<button
|
|
56
|
-
class="absolute top-
|
|
61
|
+
class="absolute top-9 right-3 flex cursor-pointer border-none bg-transparent"
|
|
57
62
|
onclick={(e) => {
|
|
58
63
|
e.preventDefault()
|
|
59
64
|
navigator.clipboard.writeText(codeText)
|
|
@@ -82,8 +87,7 @@
|
|
|
82
87
|
{/if}
|
|
83
88
|
</div>
|
|
84
89
|
</button>
|
|
85
|
-
<pre class="overflow-x-auto">{codeText}
|
|
86
|
-
</pre>
|
|
90
|
+
<pre class="overflow-x-auto">{codeText}</pre>
|
|
87
91
|
</div>
|
|
88
92
|
</div>
|
|
89
93
|
</div>
|