fui-material 2.5.6 → 2.5.7

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.
@@ -1,31 +1,73 @@
1
1
  import React, { type ChangeEvent, type ReactNode, type CSSProperties } from "react";
2
2
  /**
3
3
  * Интерфейс пропсов для компонента `FSearchableSelect`.
4
+ *
5
+ * @interface IFSearchableSelect
6
+ * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'>}
4
7
  */
5
8
  export interface IFSearchableSelect extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {
6
- /** Метка (label) над полем */
9
+ /**
10
+ * Метка (label), отображаемая над полем ввода.
11
+ * @type {string | undefined}
12
+ */
7
13
  label?: string;
8
- /** Инлайновые стили контейнера */
14
+ /**
15
+ * Инлайновые стили для внешнего контейнера компонента.
16
+ * @type {CSSProperties | undefined}
17
+ */
9
18
  st?: CSSProperties;
10
- /** Опции выбора (обычно теги <option>) */
19
+ /**
20
+ * Дочерние элементы (обычно `<option>`), из которых формируется список выбора.
21
+ * Значения извлекаются из пропсов `value` и `children` переданных элементов.
22
+ * @type {ReactNode | undefined}
23
+ */
11
24
  children?: ReactNode;
12
- /** Растянуть на 100% ширины */
25
+ /**
26
+ * Флаг, указывающий, должен ли компонент занимать 100% ширины родителя.
27
+ * @type {boolean | undefined}
28
+ */
13
29
  fullWidth?: boolean;
14
- /** Состояние загрузки (блокирует ввод и показывает спиннер) */
30
+ /**
31
+ * Флаг состояния загрузки. Если true, отображается спиннер, а взаимодействие блокируется.
32
+ * @type {boolean | undefined}
33
+ */
15
34
  load?: boolean;
16
- /** Текст ошибок (подсвечивает поле красным) */
35
+ /**
36
+ * Массив строк с текстом ошибок. Если массив не пуст, поле подсвечивается красным.
37
+ * @type {string[] | undefined}
38
+ */
17
39
  errText?: string[];
18
- /** Вспомогательный текст под полем */
40
+ /**
41
+ * Вспомогательный текст, отображаемый под полем ввода.
42
+ * @type {string | undefined}
43
+ */
19
44
  helpText?: string;
20
- /** Ширина поля */
45
+ /**
46
+ * Явное указание ширины компонента.
47
+ * @type {string | number | undefined}
48
+ */
21
49
  width?: string | number;
22
- /** Высота поля */
50
+ /**
51
+ * Явное указание высоты компонента.
52
+ * @type {string | number | undefined}
53
+ */
23
54
  height?: string | number;
24
- /** Разрешить создание новых значений (режим Combobox) */
55
+ /**
56
+ * Разрешить создание новых элементов, отсутствующих в списке.
57
+ * При вводе уникального текста появится опция "Создать".
58
+ * @type {boolean | undefined}
59
+ */
25
60
  allowCreate?: boolean;
26
- /** Текущее значение */
61
+ /**
62
+ * Текущее значение поля (контролируемый компонент).
63
+ * @type {string | number | readonly string[] | undefined}
64
+ */
27
65
  value?: string | number | readonly string[];
28
- /** Обработчик изменения значения */
66
+ /**
67
+ * Callback, вызываемый при изменении значения.
68
+ * Возвращает синтетическое событие с объектом target, содержащим name и value.
69
+ * @type {((event: { target: { name: string; value: string } } | ChangeEvent<HTMLInputElement>) => void) | undefined}
70
+ */
29
71
  onChange?: (event: {
30
72
  target: {
31
73
  name: string;
@@ -34,14 +76,52 @@ export interface IFSearchableSelect extends Omit<React.InputHTMLAttributes<HTMLI
34
76
  } | ChangeEvent<HTMLInputElement>) => void;
35
77
  }
36
78
  /**
37
- * Компонент `FSearchableSelect` — выпадающий список с поиском.
79
+ * Компонент `FSearchableSelect` — выпадающий список с возможностью поиска и фильтрации опций.
80
+ *
81
+ * Особенности:
82
+ * - Поддерживает фильтрацию списка при вводе текста.
83
+ * - Может работать как обычный Select или как Combobox (с `allowCreate`).
84
+ * - Парсит опции из переданных `children` (например, `<option value="1">One</option>`).
85
+ * - Поддерживает навигацию с клавиатуры (стрелки, Enter, Escape).
86
+ * - Имеет состояния: ошибка, загрузка, disabled.
38
87
  *
39
88
  * @component
40
89
  * @example
41
- * <FSearchableSelect label="Страна" value={val} onChange={handleChange}>
42
- * <option value="ru">Россия</option>
43
- * <option value="en">США</option>
90
+ * // Простой пример использования с опциями
91
+ * <FSearchableSelect
92
+ * label="Выберите город"
93
+ * value={city}
94
+ * onChange={(e) => setCity(e.target.value)}
95
+ * fullWidth
96
+ * >
97
+ * <option value="moscow">Москва</option>
98
+ * <option value="spb">Санкт-Петербург</option>
44
99
  * </FSearchableSelect>
100
+ *
101
+ * @example
102
+ * // Пример с созданием новых значений (allowCreate) и ошибкой
103
+ * <FSearchableSelect
104
+ * label="Теги"
105
+ * allowCreate
106
+ * value={tag}
107
+ * onChange={(e) => setTag(e.target.value)}
108
+ * errText={hasError ? ['Некорректный тег'] : undefined}
109
+ * >
110
+ * {tagsList.map(t => <option key={t.id} value={t.name}>{t.name}</option>)}
111
+ * </FSearchableSelect>
112
+ *
113
+ * @param {string} [label] - Метка поля.
114
+ * @param {CSSProperties} [st] - Стили контейнера.
115
+ * @param {ReactNode} [children] - Опции списка.
116
+ * @param {boolean} [fullWidth=false] - Растянуть на 100%.
117
+ * @param {boolean} [load=false] - Показать лоадер.
118
+ * @param {string[]} [errText] - Текст ошибки.
119
+ * @param {string} [helpText] - Подсказка.
120
+ * @param {boolean} [allowCreate=false] - Разрешить ввод своих значений.
121
+ * @param {string|number} [value] - Значение.
122
+ * @param {Function} [onChange] - Обработчик изменений.
123
+ *
124
+ * @returns {JSX.Element} Рендерит кастомный Select с поиском.
45
125
  */
46
126
  declare const FSearchableSelect: React.ForwardRefExoticComponent<IFSearchableSelect & React.RefAttributes<HTMLInputElement>>;
47
127
  export default FSearchableSelect;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fui-material",
3
- "version": "2.5.6",
3
+ "version": "2.5.7",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public",