poe-svelte-ui-lib 1.9.7 → 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.
@@ -95,10 +95,10 @@
95
95
  <div class="flex items-start justify-center gap-8">
96
96
  <div class="flex w-1/3 flex-col px-2">
97
97
  <CommonSnippets snippet="Access" {component} {onPropertyChange} />
98
- <CommonSnippets snippet="Label" {component} {onPropertyChange} />
99
- <CommonSnippets snippet="LabelAlign" initialValue={initialAlign} {component} {onPropertyChange} />
100
98
  </div>
101
99
  <div class="flex w-1/3 flex-col px-2">
100
+ <CommonSnippets snippet="Label" {component} {onPropertyChange} />
101
+ <CommonSnippets snippet="LabelAlign" initialValue={initialAlign} {component} {onPropertyChange} />
102
102
  <CommonSnippets
103
103
  snippet="IconsLib"
104
104
  initialValue={{
@@ -120,12 +120,12 @@
120
120
  <div class="flex w-1/3 flex-col px-2">
121
121
  <CommonSnippets snippet="Identificator" {component} {onPropertyChange} />
122
122
  <CommonSnippets snippet="Access" {component} {onPropertyChange} />
123
-
123
+ <CommonSnippets snippet="WrapperClass" {component} {onPropertyChange} />
124
124
  {@render AccordionSize()}
125
- {@render AccordionIsOpen()}
126
125
  </div>
127
126
  <div class="flex w-1/3 flex-col px-2">
128
- <CommonSnippets snippet="WrapperClass" {component} {onPropertyChange} />
127
+ <CommonSnippets snippet="Label" {component} {onPropertyChange} />
128
+ <CommonSnippets snippet="LabelClass" initialValue={initialAlign} {component} {onPropertyChange} />
129
129
  <CommonSnippets
130
130
  snippet="IconsLib"
131
131
  initialValue={{
@@ -137,8 +137,7 @@
137
137
  {component}
138
138
  {onPropertyChange}
139
139
  />
140
- <CommonSnippets snippet="Label" {component} {onPropertyChange} />
141
- <CommonSnippets snippet="LabelClass" initialValue={initialAlign} {component} {onPropertyChange} />
140
+ {@render AccordionIsOpen()}
142
141
  </div>
143
142
  <div class="flex w-1/3 flex-col items-center gap-2 px-2">
144
143
  {@render AccordionBackgroundImage()}
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Описание
4
4
 
5
- Аккордеон - это интерактивный UI-компонент, который позволяет скрывать и отображать содержимое в виде раскрывающегося блока. Компонент предоставляет возможность настройки внешнего вида, размеров, иконок, изображений фона и других параметров через систему пропсов.
5
+ Аккордеон - это UI-компонент, который позволяет скрывать и отображать содержимое в виде раскрывающегося блока. Компонент предоставляет возможность настройки внешнего вида, размеров, иконок, изображений фона и других параметров через систему пропсов.
6
6
 
7
7
  ## Пропсы
8
8
 
@@ -152,27 +152,6 @@
152
152
  </div>
153
153
  <div class="flex w-1/3 flex-col px-2">
154
154
  {@render ButtonVariables()}
155
- <CommonSnippets
156
- snippet="IconsLib"
157
- initialValue={{
158
- name: $t("constructor.props.buttonIcon"),
159
- icon: component.properties.content.icon,
160
- updateProperty: (icon: string) => {
161
- updateProperty("content.icon", icon as string, component, onPropertyChange)
162
- if (component.properties.content.icon && !component.properties.content.name?.trim())
163
- updateProperty("componentClass", twMerge((component.properties as UI.IButtonProps).componentClass, "w-fit"), component, onPropertyChange)
164
- else if (!component.properties.content.icon && !component.properties.content.name?.trim())
165
- updateProperty("componentClass", twMerge((component.properties as UI.IButtonProps).componentClass, "w-full"), component, onPropertyChange)
166
- },
167
- icons: { array: ICONS },
168
- }}
169
- {component}
170
- {onPropertyChange}
171
- />
172
- </div>
173
- <div class="flex w-1/3 flex-col px-2">
174
- {@render ButtonName()}
175
- {@render ButtonHeight()}
176
155
  <CommonSnippets
177
156
  snippet="Colors"
178
157
  initialValue={{
@@ -201,6 +180,27 @@
201
180
  {onPropertyChange}
202
181
  />
203
182
  </div>
183
+ <div class="flex w-1/3 flex-col px-2">
184
+ {@render ButtonName()}
185
+ <CommonSnippets
186
+ snippet="IconsLib"
187
+ initialValue={{
188
+ name: $t("constructor.props.buttonIcon"),
189
+ icon: component.properties.content.icon,
190
+ updateProperty: (icon: string) => {
191
+ updateProperty("content.icon", icon as string, component, onPropertyChange)
192
+ if (component.properties.content.icon && !component.properties.content.name?.trim())
193
+ updateProperty("componentClass", twMerge((component.properties as UI.IButtonProps).componentClass, "w-fit"), component, onPropertyChange)
194
+ else if (!component.properties.content.icon && !component.properties.content.name?.trim())
195
+ updateProperty("componentClass", twMerge((component.properties as UI.IButtonProps).componentClass, "w-full"), component, onPropertyChange)
196
+ },
197
+ icons: { array: ICONS },
198
+ }}
199
+ {component}
200
+ {onPropertyChange}
201
+ />
202
+ {@render ButtonHeight()}
203
+ </div>
204
204
  </div>
205
205
  {:else}
206
206
  <div class="relative flex flex-row items-start justify-center">
@@ -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`
@@ -212,14 +212,14 @@
212
212
  <div class="flex">
213
213
  <UI.Input
214
214
  label={{ name: $t("constructor.props.min") }}
215
- value={initialValue.number.minNum}
215
+ value={initialValue.number?.minNum}
216
216
  type="number"
217
217
  readonly={initialValue.bitMode}
218
218
  onUpdate={(value) => initialValue.updateProperty(value as number, "number.minNum")}
219
219
  />
220
220
  <UI.Input
221
221
  label={{ name: $t("constructor.props.max") }}
222
- value={initialValue.number.maxNum}
222
+ value={initialValue.number?.maxNum}
223
223
  type="number"
224
224
  readonly={initialValue.bitMode}
225
225
  onUpdate={(value) => initialValue.updateProperty(value as number, "number.maxNum")}
@@ -227,7 +227,7 @@
227
227
  {#if component.type !== "ProgressBar"}
228
228
  <UI.Input
229
229
  label={{ name: $t("constructor.props.step") }}
230
- value={initialValue.number.step}
230
+ value={initialValue.number?.step}
231
231
  type="number"
232
232
  readonly={initialValue.bitMode}
233
233
  onUpdate={(value) => initialValue.updateProperty(value as number, "number.step")}