@elcrm/form 0.1.3 → 0.1.4
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/Form.d.ts +21 -3
- package/dist/core/Field.d.ts +12 -0
- package/dist/fields/Card.d.ts +14 -0
- package/dist/fields/Check.d.ts +14 -0
- package/dist/fields/Code.d.ts +14 -1
- package/dist/fields/Color.d.ts +13 -0
- package/dist/fields/ColorPanel.d.ts +4 -0
- package/dist/fields/Date.d.ts +14 -2
- package/dist/fields/DateCalendar.d.ts +11 -1
- package/dist/fields/Display.d.ts +9 -2
- package/dist/fields/DragDrop.d.ts +14 -1
- package/dist/fields/Email.d.ts +14 -2
- package/dist/fields/FieldGroup.d.ts +23 -3
- package/dist/fields/File.d.ts +14 -1
- package/dist/fields/Hidden.d.ts +7 -2
- package/dist/fields/Input.d.ts +10 -5
- package/dist/fields/Mask.d.ts +13 -1
- package/dist/fields/Modal.d.ts +20 -3
- package/dist/fields/Money.d.ts +11 -1
- package/dist/fields/NativeTextField.d.ts +9 -5
- package/dist/fields/Numeric.d.ts +9 -8
- package/dist/fields/Options.d.ts +24 -5
- package/dist/fields/Password.d.ts +11 -0
- package/dist/fields/Percent.d.ts +10 -6
- package/dist/fields/Phone.d.ts +13 -1
- package/dist/fields/Radio.d.ts +14 -0
- package/dist/fields/Range.d.ts +11 -1
- package/dist/fields/Rating.d.ts +13 -1
- package/dist/fields/RichText.d.ts +10 -2
- package/dist/fields/Select.d.ts +21 -0
- package/dist/fields/Tabs.d.ts +15 -0
- package/dist/fields/Tags.d.ts +13 -1
- package/dist/fields/Textarea.d.ts +10 -1
- package/dist/fields/Time.d.ts +13 -4
- package/dist/fields/TimePicker.d.ts +10 -1
- package/dist/fields/Url.d.ts +11 -1
- package/dist/fields/type.d.ts +96 -26
- package/dist/hooks/use.d.ts +20 -6
- package/dist/index.d.ts +2 -0
- package/dist/index.umd.js +1 -1
- package/dist/package.js +1 -1
- package/package.json +1 -1
package/dist/Form.d.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { TModalOpenPayload } from './FormInitContext';
|
|
2
2
|
export type { TModalOpenPayload };
|
|
3
|
+
/**
|
|
4
|
+
* Пропы {@link Form}.Init — регистрация колбэков для всех полей приложения.
|
|
5
|
+
*/
|
|
3
6
|
export type FormInitProps = {
|
|
4
|
-
/**
|
|
7
|
+
/** Тост: копирование телефона и т.п. */
|
|
5
8
|
onNotice?: (message: string) => void;
|
|
6
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* Открыть модалку выбора.
|
|
11
|
+
* Payload: `module` + `modalName` из пропа `modal="module.name"`,
|
|
12
|
+
* `callback(value)` — вернуть выбор в поле.
|
|
13
|
+
*/
|
|
7
14
|
onModal?: (payload: TModalOpenPayload) => void;
|
|
8
15
|
};
|
|
9
16
|
/**
|
|
@@ -14,7 +21,18 @@ declare function Init({ onNotice, onModal }: FormInitProps): null;
|
|
|
14
21
|
declare namespace Init {
|
|
15
22
|
var displayName: string;
|
|
16
23
|
}
|
|
17
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* Пространство имён формы приложения.
|
|
26
|
+
*
|
|
27
|
+
* **`Form.Init`** — зарегистрировать `onNotice` (тосты) и `onModal` (Options/Modal).
|
|
28
|
+
* Ничего не рисует (`null`). Монтировать один раз рядом с формой.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* <>
|
|
32
|
+
* <Form.Init onNotice={toast} onModal={openModal} />
|
|
33
|
+
* <PhoneField name="phone" form={form} />
|
|
34
|
+
* </>
|
|
35
|
+
*/
|
|
18
36
|
export declare const Form: {
|
|
19
37
|
Init: typeof Init;
|
|
20
38
|
};
|
package/dist/core/Field.d.ts
CHANGED
|
@@ -18,6 +18,12 @@ export type FieldControlProps = {
|
|
|
18
18
|
className?: string[];
|
|
19
19
|
props?: Record<string, unknown>;
|
|
20
20
|
};
|
|
21
|
+
/**
|
|
22
|
+
* Пропы внутреннего каркаса. Снаружи не импортируйте — берите `*Field`.
|
|
23
|
+
*
|
|
24
|
+
* `children` — контрол **внутри** капсулы. Слоты `before`/`after` здесь
|
|
25
|
+
* рисуются **снаружи** капсулы (отличие от публичных полей).
|
|
26
|
+
*/
|
|
21
27
|
interface Input {
|
|
22
28
|
/**
|
|
23
29
|
* Классы корневого блока.
|
|
@@ -45,5 +51,11 @@ interface Input {
|
|
|
45
51
|
/** s | m | l — высота как у кнопки/поиска (`sm`/`md` — алиасы) */
|
|
46
52
|
size?: "s" | "m" | "l" | "sm" | "md";
|
|
47
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Каркас поля (внутренний). Снаружи используйте `*Field`.
|
|
56
|
+
*
|
|
57
|
+
* **Элементы:** `[data-field][data-size]` → `label.t` → капсула `.f` (`control` / `element_input`) → ошибка.
|
|
58
|
+
* Слоты `before`/`after` на **этом** компоненте — вне капсулы; у `*Field` слоты внутри капсулы.
|
|
59
|
+
*/
|
|
48
60
|
declare const Field: ({ element_blok, blok, element_input, control, type, label, id: idProp, error, before, after, children, size, }: Input) => import("react/jsx-runtime").JSX.Element;
|
|
49
61
|
export default Field;
|
package/dist/fields/Card.d.ts
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
import { TInput } from './type';
|
|
3
|
+
/**
|
|
4
|
+
* Номер банковской карты.
|
|
5
|
+
*
|
|
6
|
+
* **В форме:** `string` — только цифры (без пробелов).
|
|
7
|
+
*
|
|
8
|
+
* **Элементы:** слева бейдж бренда (`before`, если не задан свой), группы `0000 0000 …`.
|
|
9
|
+
* Иконка: Visa/Мир с 4 цифр; если unknown — ждём до 6 (Mastercard 2xxx). Луна на blur, если `validate`.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* <CardField name="card" form={form} label="Карта" />
|
|
13
|
+
*/
|
|
3
14
|
export type TCard = TInput & {
|
|
4
15
|
/** Встроенная проверка Луна (по умолчанию true) */
|
|
5
16
|
validate?: boolean;
|
|
6
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Поле карты. Бейдж не пересчитывается после freeze BIN, пока не сменятся первые 4 цифры.
|
|
20
|
+
*/
|
|
7
21
|
declare function CardField({ value, form, onValue, onBlur: onBlurField, name, placeholder, label, error, hidden, disabled, className, after, before, maxLength, autoComplete, id, size, validate, }: TCard): import("react/jsx-runtime").JSX.Element | null;
|
|
8
22
|
declare namespace CardField {
|
|
9
23
|
var displayName: string;
|
package/dist/fields/Check.d.ts
CHANGED
|
@@ -3,6 +3,17 @@ export type TCheckSize = "s" | "m" | "l" | "sm" | "md";
|
|
|
3
3
|
export type TCheckVariant = "field" | "plain";
|
|
4
4
|
/** Выравнивание квадрата относительно текста (многострочный label) */
|
|
5
5
|
export type TCheckAlign = "top" | "center" | "bottom";
|
|
6
|
+
/**
|
|
7
|
+
* Чекбокс (кнопка `role="checkbox"` внутри капсулы).
|
|
8
|
+
*
|
|
9
|
+
* **В форме:** `boolean` (`true`/`false`; снаружи также понимает `1`/`"true"`).
|
|
10
|
+
*
|
|
11
|
+
* **Элементы:** квадрат + текст из `placeholder` (не `label`). `label` — подпись над капсулой.
|
|
12
|
+
* `variant="plain"` — без рамки (меню). `align` — квадрат относительно многострочного текста.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* <CheckField name="agree" form={form} label="Согласие" placeholder="Принимаю условия" />
|
|
16
|
+
*/
|
|
6
17
|
export type TCheck = TInput & {
|
|
7
18
|
/**
|
|
8
19
|
* Плотность: `md` — как поле формы (по умолчанию),
|
|
@@ -22,6 +33,9 @@ export type TCheck = TInput & {
|
|
|
22
33
|
/** Квадрат: top | center | bottom относительно текста. По умолчанию center */
|
|
23
34
|
align?: TCheckAlign;
|
|
24
35
|
};
|
|
36
|
+
/**
|
|
37
|
+
* Чекбокс. Клик по строке переключает значение.
|
|
38
|
+
*/
|
|
25
39
|
declare function CheckField({ value, form, onValue, onBlur: onBlurField, name, placeholder, label, error, hidden, disabled, className, after, before, size, variant, showFocusRing, align, }: TCheck): import("react/jsx-runtime").JSX.Element | null;
|
|
26
40
|
declare namespace CheckField {
|
|
27
41
|
var displayName: string;
|
package/dist/fields/Code.d.ts
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import { TInput } from './type';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* OTP / код — ряд квадратных ячеек.
|
|
4
|
+
*
|
|
5
|
+
* **В форме:** `string` длины `length`.
|
|
6
|
+
*
|
|
7
|
+
* **Элементы:** капсула без внутреннего padding → ячейки. `group` — визуальный разделитель.
|
|
8
|
+
* `cellSize` бьёт `--field-code-size`.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* <CodeField name="otp" form={form} label="Код" length={6} group={3} />
|
|
12
|
+
*/
|
|
3
13
|
export type TCode = TInput & {
|
|
4
14
|
length?: number;
|
|
5
15
|
/** Только цифры (по умолчанию) */
|
|
@@ -16,6 +26,9 @@ export type TCode = TInput & {
|
|
|
16
26
|
*/
|
|
17
27
|
cellSize?: number | string;
|
|
18
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* Поле кода. Вставка заполняет ячейки подряд.
|
|
31
|
+
*/
|
|
19
32
|
declare function CodeField({ value, form, onValue, onBlur: onBlurField, name, placeholder, label, error, hidden, disabled, className, after, before, size, length, numeric, group, cellSize, autoComplete, }: TCode): import("react/jsx-runtime").JSX.Element | null;
|
|
20
33
|
declare namespace CodeField {
|
|
21
34
|
var displayName: string;
|
package/dist/fields/Color.d.ts
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { TInput } from './type';
|
|
2
2
|
export { DEFAULT_COLOR_PALETTE, parseHexColor, formatHexColor } from './colorUtils';
|
|
3
3
|
export type { Hsva } from './colorUtils';
|
|
4
|
+
/**
|
|
5
|
+
* Цвет (hex). Попап: SV-плоскость, hue, опционально alpha, hex-инпут.
|
|
6
|
+
*
|
|
7
|
+
* **В форме:** `string` `#RRGGBB` или `#RRGGBBAA`.
|
|
8
|
+
*
|
|
9
|
+
* **Элементы:** капсула → превью-квадрат + текст hex. `inlinePalette` — пресеты **в поле**, не в попапе.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* <ColorField name="accent" form={form} label="Цвет" inlinePalette />
|
|
13
|
+
*/
|
|
4
14
|
export type TColor = TInput & {
|
|
5
15
|
/** Свои пресеты; иначе встроенная палитра */
|
|
6
16
|
colors?: string[];
|
|
@@ -12,6 +22,9 @@ export type TColor = TInput & {
|
|
|
12
22
|
*/
|
|
13
23
|
inlinePalette?: boolean;
|
|
14
24
|
};
|
|
25
|
+
/**
|
|
26
|
+
* Пикер цвета. Триггер — combobox внутри капсулы.
|
|
27
|
+
*/
|
|
15
28
|
declare function ColorField({ value, form, onValue, onBlur: onBlurField, name, placeholder, label, error, hidden, disabled, className, after, before, colors, alpha, inlinePalette, }: TColor): import("react/jsx-runtime").JSX.Element | null;
|
|
16
29
|
declare namespace ColorField {
|
|
17
30
|
var displayName: string;
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
import { Hsva } from './colorUtils';
|
|
3
|
+
/**
|
|
4
|
+
* Попап пикера {@link ColorField}: SV, hue, alpha, hex, опционально палитра.
|
|
5
|
+
* Не публичный API. Позиция — `parent` (rect триггера) + clamp во вьюпорт.
|
|
6
|
+
*/
|
|
3
7
|
export default function ColorPanel({ parent, hsva, setHsva, hexDraft, setHexDraft, alpha, palette, showPalette, onLive, onCommit, onClose, }: {
|
|
4
8
|
parent?: DOMRect;
|
|
5
9
|
hsva: Hsva;
|
package/dist/fields/Date.d.ts
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
import { TInput } from './type';
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Дата с выпадающим календарём (портал).
|
|
5
|
+
*
|
|
6
|
+
* **В форме:** `string` `YYYY-MM-DD` или `""`.
|
|
7
|
+
*
|
|
8
|
+
* **Элементы:** капсула → кнопка-триггер с текстом `дд.мм.гггг`.
|
|
9
|
+
* `icon` — **полная замена** триггера (не слот `before`). `min`/`max` — `Date`.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* <DateField name="due" form={form} label="Срок" min={new Date()} />
|
|
13
|
+
*/
|
|
4
14
|
export type TDate = TInput & {
|
|
5
15
|
max?: Date;
|
|
6
16
|
min?: Date;
|
|
7
17
|
/** Полная замена UI своим триггером (не аффикс) */
|
|
8
18
|
icon?: () => React.JSX.Element;
|
|
9
19
|
};
|
|
10
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* Поле даты. Календарь следует за полем при скролле страницы.
|
|
22
|
+
*/
|
|
11
23
|
declare function DateField({ label, error, hidden, className, placeholder, disabled, onValue, max, min, form, icon, name, value, after, before, }: TDate): import("react/jsx-runtime").JSX.Element;
|
|
12
24
|
declare namespace DateField {
|
|
13
25
|
var displayName: string;
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
import { TDatePosition } from './dateUtils';
|
|
2
|
+
/**
|
|
3
|
+
* Попап календаря {@link DateField} (портал в `document.body`, якорь при скролле).
|
|
4
|
+
* Не публичный API пакета.
|
|
5
|
+
*/
|
|
2
6
|
export type TDateCalendarProps = {
|
|
7
|
+
/** Текущая дата поля (пустое → сегодня в сетке, не в форме). */
|
|
3
8
|
date: Date | string | number;
|
|
9
|
+
/** Коммит `YYYY-MM-DD`. */
|
|
4
10
|
onValue: (value: string) => void;
|
|
11
|
+
/** Прямоугольник триггера для позиционирования. */
|
|
5
12
|
position: TDatePosition;
|
|
6
13
|
max?: Date;
|
|
7
14
|
min?: Date;
|
|
8
15
|
className?: string;
|
|
16
|
+
/** Закрытие попапа. */
|
|
9
17
|
onOpen: (open: boolean) => void;
|
|
10
18
|
};
|
|
11
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
* Календарь: дни / месяцы / годы. z-index из общего стека оверлеев.
|
|
21
|
+
*/
|
|
12
22
|
declare function DateCalendar({ date, onValue, position, max, min, className, onOpen, }: TDateCalendarProps): import("react/jsx-runtime").JSX.Element;
|
|
13
23
|
declare namespace DateCalendar {
|
|
14
24
|
var displayName: string;
|
package/dist/fields/Display.d.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { TInput } from './type';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* Только показ значения (капсула как у String / Textarea, всегда `data-disabled`).
|
|
4
|
+
*
|
|
5
|
+
* **В форме:** любое; на экран идёт `format(value)` или `emptyText`.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* <DisplayField name="id" form={form} label="ID" format={(v) => `#${v}`} />
|
|
5
9
|
*/
|
|
6
10
|
export type TDisplay = TInput & {
|
|
7
11
|
/** Форматтер отображаемого текста */
|
|
@@ -13,6 +17,9 @@ export type TDisplay = TInput & {
|
|
|
13
17
|
*/
|
|
14
18
|
multiline?: boolean;
|
|
15
19
|
};
|
|
20
|
+
/**
|
|
21
|
+
* Readonly-поле. Не пишет в форму при клике.
|
|
22
|
+
*/
|
|
16
23
|
declare function DisplayField({ value, form, name, placeholder, label, error, hidden, disabled, className, after, before, format, emptyText, size, multiline, }: TDisplay): import("react/jsx-runtime").JSX.Element | null;
|
|
17
24
|
declare namespace DisplayField {
|
|
18
25
|
var displayName: string;
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import { TInput } from './type';
|
|
2
2
|
/** Раскладка зоны: default · fill (100% родителя) · overlay (прозрачная поверх превью) */
|
|
3
3
|
export type TDragDropLayout = "default" | "fill" | "overlay";
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Зона drag-and-drop (+ клик = тот же выбор файла).
|
|
6
|
+
*
|
|
7
|
+
* **В форме:** как {@link FileField} (`keepFile` / мета).
|
|
8
|
+
*
|
|
9
|
+
* **Элементы:** пунктирная зона `.z` внутри прозрачной капсулы; список файлов под ней.
|
|
10
|
+
* `layout`: `default` | `fill` | `overlay`.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* <DragDropField name="files" form={form} multiple maxFiles={5} hint="Перетащите сюда" />
|
|
14
|
+
*/
|
|
5
15
|
export type TDragDrop = TInput & {
|
|
6
16
|
accept?: string;
|
|
7
17
|
multiple?: boolean;
|
|
@@ -29,6 +39,9 @@ export type TDragDrop = TInput & {
|
|
|
29
39
|
/** Скрыть список файлов и «Очистить всё» (часто с overlay) */
|
|
30
40
|
hideList?: boolean;
|
|
31
41
|
};
|
|
42
|
+
/**
|
|
43
|
+
* Drop-зона. Капсула без рамки (`padding: 0`), рамка у внутренней зоны.
|
|
44
|
+
*/
|
|
32
45
|
declare function DragDropField({ value, form, onValue, onBlur: onBlurField, name, placeholder, label, error, hidden, disabled, className, after, before, accept, multiple, maxSize, maxFiles, keepFile, hint, append, layout, aspectRatio, hideList, }: TDragDrop): import("react/jsx-runtime").JSX.Element | null;
|
|
33
46
|
declare namespace DragDropField {
|
|
34
47
|
var displayName: string;
|
package/dist/fields/Email.d.ts
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
import { TInput } from './type';
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Email. Нативный `<input type="email">`.
|
|
5
|
+
*
|
|
6
|
+
* **В форме:** `string`.
|
|
7
|
+
*
|
|
8
|
+
* @property validate — проверка формата на blur (по умолчанию `true`); ошибка «Некорректный email».
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* <EmailField name="email" form={form} label="Почта" autoComplete="email" />
|
|
12
|
+
*/
|
|
4
13
|
export type TEmail = TInput & {
|
|
5
|
-
/** Проверка формата при blur (по умолчанию true) */
|
|
14
|
+
/** Проверка формата при blur (по умолчанию `true`) */
|
|
6
15
|
validate?: boolean;
|
|
7
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* Поле email. Справа при ошибке валидации — бейдж, если не задан `after`.
|
|
19
|
+
*/
|
|
8
20
|
declare function EmailField({ validate, error, onBlur, onValue, after, ...rest }: TEmail): import("react/jsx-runtime").JSX.Element;
|
|
9
21
|
declare namespace EmailField {
|
|
10
22
|
var displayName: string;
|
|
@@ -13,14 +13,21 @@ type GroupOwned = "form" | "onValue" | "onBlur";
|
|
|
13
13
|
* Редкие пропы можно передать через assertion или расширить тип.
|
|
14
14
|
*/
|
|
15
15
|
type FieldGroupItemExtras = {
|
|
16
|
+
/** Select / Radio / Tabs / Options */
|
|
16
17
|
options?: unknown;
|
|
18
|
+
/** Select: порядок id */
|
|
17
19
|
order?: number[];
|
|
20
|
+
/** Mask: шаблон `_` */
|
|
18
21
|
format?: string;
|
|
22
|
+
/** Code: число ячеек */
|
|
19
23
|
length?: number;
|
|
24
|
+
/** Code: визуальные группы */
|
|
20
25
|
group?: number;
|
|
21
26
|
cellSize?: number | string;
|
|
22
27
|
numeric?: boolean;
|
|
28
|
+
/** Card / Email: проверка на blur */
|
|
23
29
|
validate?: boolean;
|
|
30
|
+
/** Money: множитель записи в форму */
|
|
24
31
|
course?: number;
|
|
25
32
|
isClear?: boolean;
|
|
26
33
|
decimals?: number;
|
|
@@ -47,6 +54,7 @@ type FieldGroupItemExtras = {
|
|
|
47
54
|
colors?: string[];
|
|
48
55
|
alpha?: boolean;
|
|
49
56
|
emptyText?: string;
|
|
57
|
+
/** Options / Modal: `"module.name"` */
|
|
50
58
|
modal?: string;
|
|
51
59
|
inlinePalette?: boolean;
|
|
52
60
|
outFormat?: "array" | "string" | "object";
|
|
@@ -70,6 +78,20 @@ export type FieldGroupItem = {
|
|
|
70
78
|
/** Имя в form / onValue */
|
|
71
79
|
name: string;
|
|
72
80
|
} & Partial<Omit<TInput, GroupOwned | "name">> & FieldGroupItemExtras;
|
|
81
|
+
/**
|
|
82
|
+
* Несколько полей одним списком `items`.
|
|
83
|
+
*
|
|
84
|
+
* **Элементы:** `div[role=group]` → внутри обычные `*Field`.
|
|
85
|
+
* Общие `form` / `disabled` / `size` / `errors` на группе; у item — `field` + `name` + свои пропы.
|
|
86
|
+
*
|
|
87
|
+
* `field`: `string` → StringField, `select` → SelectField, `card` → CardField, …
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* <FieldGroup form={form} items={[
|
|
91
|
+
* { field: "string", name: "login", label: "Логин", native: true },
|
|
92
|
+
* { field: "email", name: "email", label: "Почта" },
|
|
93
|
+
* ]} />
|
|
94
|
+
*/
|
|
73
95
|
export type FieldGroupProps = Omit<HTMLAttributes<HTMLDivElement>, "onChange"> & {
|
|
74
96
|
items: FieldGroupItem[];
|
|
75
97
|
/** Общая форма для всех items */
|
|
@@ -96,9 +118,7 @@ export type FieldGroupProps = Omit<HTMLAttributes<HTMLDivElement>, "onChange"> &
|
|
|
96
118
|
gap?: number | string;
|
|
97
119
|
};
|
|
98
120
|
/**
|
|
99
|
-
* Группа
|
|
100
|
-
* Родитель задаёт общие `form` / `onValue` / `onBlur` / `disabled` / `size`,
|
|
101
|
-
* у каждого item — `field` + конкретные пропы (`name`, `label`, `options`, …).
|
|
121
|
+
* Группа полей. Не капсула — только раскладка и прокидывание `form`.
|
|
102
122
|
*/
|
|
103
123
|
declare function FieldGroup({ items, form, onValue, onBlur, disabled, size, errors, values, gap, className, style, ...rest }: FieldGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
104
124
|
declare namespace FieldGroup {
|
package/dist/fields/File.d.ts
CHANGED
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
import { TInput } from './type';
|
|
2
|
-
/** Метаданные
|
|
2
|
+
/** Метаданные файла в форме, если не храните сам `File` (`keepFile={false}`). */
|
|
3
3
|
export type TFileMeta = {
|
|
4
4
|
name: string;
|
|
5
5
|
size: number;
|
|
6
6
|
type: string;
|
|
7
7
|
lastModified: number;
|
|
8
8
|
};
|
|
9
|
+
/**
|
|
10
|
+
* Выбор файла(ов) кнопкой в капсуле.
|
|
11
|
+
*
|
|
12
|
+
* **В форме:** `File` / `File[]` при `keepFile`, иначе {@link TFileMeta} / массив меты.
|
|
13
|
+
*
|
|
14
|
+
* **Элементы:** кнопка «Выбрать» + имя/размер + крестик очистки.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* <FileField name="doc" form={form} label="Файл" accept=".pdf" maxSize={5_000_000} />
|
|
18
|
+
*/
|
|
9
19
|
export type TFile = TInput & {
|
|
10
20
|
accept?: string;
|
|
11
21
|
multiple?: boolean;
|
|
@@ -17,6 +27,9 @@ export type TFile = TInput & {
|
|
|
17
27
|
*/
|
|
18
28
|
keepFile?: boolean;
|
|
19
29
|
};
|
|
30
|
+
/**
|
|
31
|
+
* Поле файла. Для drag-and-drop зоны смотрите {@link DragDropField}.
|
|
32
|
+
*/
|
|
20
33
|
declare function FileField({ value, form, onValue, onBlur: onBlurField, name, placeholder, label, error, hidden, disabled, className, after, before, accept, multiple, maxSize, keepFile, }: TFile): import("react/jsx-runtime").JSX.Element | null;
|
|
21
34
|
declare namespace FileField {
|
|
22
35
|
var displayName: string;
|
package/dist/fields/Hidden.d.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { TInput } from './type';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* Значение в форме без видимого UI.
|
|
4
|
+
*
|
|
5
|
+
* **Элементы:** только `<input type="hidden">` (для нативного submit).
|
|
6
|
+
* Пропы: `value`, `form`, `onValue`, `name`, `id`, `hidden`.
|
|
5
7
|
*/
|
|
6
8
|
export type THidden = Pick<TInput, "value" | "form" | "onValue" | "name" | "id" | "hidden">;
|
|
9
|
+
/**
|
|
10
|
+
* Скрытое поле. `hidden` на этом компоненте полностью убирает input.
|
|
11
|
+
*/
|
|
7
12
|
declare function HiddenField({ value, form, onValue, name, id, hidden, }: THidden): import("react/jsx-runtime").JSX.Element | null;
|
|
8
13
|
declare namespace HiddenField {
|
|
9
14
|
var displayName: string;
|
package/dist/fields/Input.d.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
import { TInput } from './type';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Однострочный текст.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* У `contentEditable` автозаполнение **не работает** как у поля логина.
|
|
8
|
-
* Включите **`native`** и задайте **`autoComplete="username"`** (и оберните поля в `<form>`, при необходимости).
|
|
6
|
+
* **В форме:** `string`.
|
|
9
7
|
*
|
|
10
|
-
*
|
|
8
|
+
* **Элементы:** подпись `label` → капсула → слоты `before` / `after`.
|
|
9
|
+
* Ввод по умолчанию — `contentEditable`; `native` — настоящий `<input>`
|
|
10
|
+
* (нужен для автозаполнения: `autoComplete="username"` + обёртка `<form>`).
|
|
11
|
+
*
|
|
12
|
+
* Общие пропы — {@link TInput}.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* <StringField name="login" form={form} label="Логин" native autoComplete="username" />
|
|
11
16
|
*/
|
|
12
17
|
declare function StringField({ value, form, onValue, name, placeholder, label, hidden, disabled, onBlur: onBlurField, className, after, before, error, inputmode, maxLength, spellCheck, native, autoComplete, inputType, id, size, }: TInput): import("react/jsx-runtime").JSX.Element | "";
|
|
13
18
|
declare const _default: React.MemoExoticComponent<typeof StringField>;
|
package/dist/fields/Mask.d.ts
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
import { TInput } from './type';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Маска ввода. **В форме — только цифры**; на экране шаблон `format`, `_` = слот цифры.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* <MaskField name="inn" form={form} label="ИНН" format="____________" />
|
|
7
|
+
*/
|
|
3
8
|
export type TMask = TInput & {
|
|
9
|
+
/**
|
|
10
|
+
* Шаблон, например `+_(___) ___-__-__` или `99.99.9999`.
|
|
11
|
+
* Цифры в шаблоне — фиксированные, `_` — ввод.
|
|
12
|
+
*/
|
|
4
13
|
format?: string;
|
|
5
14
|
};
|
|
15
|
+
/**
|
|
16
|
+
* Поле с маской. Не путать с PhoneField (маски стран).
|
|
17
|
+
*/
|
|
6
18
|
declare function MaskField({ value, form, onValue, onBlur: onBlurField, name, format, placeholder, label, error, hidden, disabled, className, after, before, inputmode, view, }: TMask): import("react/jsx-runtime").JSX.Element;
|
|
7
19
|
declare namespace MaskField {
|
|
8
20
|
var displayName: string;
|
package/dist/fields/Modal.d.ts
CHANGED
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
import { UseFormApi } from '../hooks/use';
|
|
3
3
|
import { TValue } from './type';
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Одно значение из модалки приложения (`Form.Init.onModal`).
|
|
6
|
+
*
|
|
7
|
+
* **В форме:** `string` или кортеж `[id, подпись]`.
|
|
8
|
+
*
|
|
9
|
+
* **Элементы:** капсула с текстом выбранного; клик → `modal` (`"module.name"`, обязателен).
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* <ModalField name="city" form={form} label="Город" modal="geo.city" />
|
|
13
|
+
*/
|
|
14
|
+
export type TModal = {
|
|
15
|
+
/** Строка или `[id, подпись]` — в капсуле показывается подпись. */
|
|
5
16
|
value?: string | [string | number, string];
|
|
6
17
|
form?: UseFormApi;
|
|
7
18
|
onValue?: (data: TValue) => void | Promise<void>;
|
|
8
19
|
name: string;
|
|
9
20
|
placeholder?: string;
|
|
21
|
+
/** Подпись над капсулой */
|
|
10
22
|
label?: string;
|
|
11
23
|
error?: string;
|
|
12
24
|
hidden?: boolean;
|
|
@@ -15,10 +27,15 @@ interface Input {
|
|
|
15
27
|
before?: ReactNode;
|
|
16
28
|
view?: string;
|
|
17
29
|
className?: string;
|
|
30
|
+
/** Обязательно: `"module.modalName"` → {@link Form.Init} `onModal`. */
|
|
18
31
|
modal: string;
|
|
32
|
+
/** Доп. данные в payload модалки */
|
|
19
33
|
options?: Record<string | number, unknown>;
|
|
20
|
-
}
|
|
21
|
-
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Поле-триггер модалки. Без `Form.Init` колбэк — no-op.
|
|
37
|
+
*/
|
|
38
|
+
declare function ModalField({ value, form, onValue, name, placeholder, label, error, hidden, disabled, after, before, view, modal, options, className, }: TModal): import("react/jsx-runtime").JSX.Element;
|
|
22
39
|
declare namespace ModalField {
|
|
23
40
|
var displayName: string;
|
|
24
41
|
}
|
package/dist/fields/Money.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { TInput } from './type';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Деньги. В UI — сумма с разделителями; **в форме — целое × `course`** (копейки при `course={100}`).
|
|
4
|
+
*
|
|
5
|
+
* **Элементы:** contentEditable + опционально кнопка очистки (`isClear`) в капсуле.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* <MoneyField name="sum" form={form} label="Сумма" course={100} />
|
|
9
|
+
*/
|
|
3
10
|
export type TMoney = TInput & {
|
|
4
11
|
/** Курс для отображения (множитель при записи в форму) */
|
|
5
12
|
course?: number;
|
|
@@ -8,6 +15,9 @@ export type TMoney = TInput & {
|
|
|
8
15
|
/** Режим фильтра символов при вводе */
|
|
9
16
|
type?: string;
|
|
10
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Поле суммы. Клавиатура `decimal`.
|
|
20
|
+
*/
|
|
11
21
|
declare function MoneyField({ value, form, onValue, name, placeholder, label, error, hidden, disabled, onBlur: onBlurField, className, after, before, inputmode, course, view, type, isClear, }: TMoney): import("react/jsx-runtime").JSX.Element | "";
|
|
12
22
|
declare namespace MoneyField {
|
|
13
23
|
var displayName: string;
|
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { TInput } from './type';
|
|
2
|
+
/**
|
|
3
|
+
* Внутренний каркас для {@link EmailField} / {@link UrlField}.
|
|
4
|
+
* Не экспортируется из пакета — снаружи используйте готовые поля.
|
|
5
|
+
*/
|
|
2
6
|
export type TNativeTextField = TInput & {
|
|
3
|
-
/** data-field
|
|
7
|
+
/** `data-field` на корне (email / url). */
|
|
4
8
|
fieldType: string;
|
|
5
|
-
/** type у input */
|
|
9
|
+
/** HTML `type` у `<input>`. */
|
|
6
10
|
inputType: "email" | "url" | "text" | "search" | "tel";
|
|
7
|
-
/**
|
|
11
|
+
/** aria-label, если нет `label` и `placeholder`. */
|
|
8
12
|
defaultAriaLabel: string;
|
|
9
13
|
};
|
|
10
14
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
15
|
+
* Нативный `<input>` внутри той же капсулы, что у остальных полей.
|
|
16
|
+
* **Элементы:** `label` → капсула (`before` | input | `after`) → `error`.
|
|
13
17
|
*/
|
|
14
18
|
declare function NativeTextField({ value, form, onValue, onBlur: onBlurField, name, placeholder, label, error, hidden, disabled, className, after, before, maxLength, autoComplete, inputmode, id, size, fieldType, inputType, defaultAriaLabel, }: TNativeTextField): import("react/jsx-runtime").JSX.Element | null;
|
|
15
19
|
export default NativeTextField;
|
package/dist/fields/Numeric.d.ts
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { TInput } from './type';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Целые цифры как **строка** в форме (`"123"`), не `number`.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* - проп **`max`** (и `maxLength`) — лимит **символов**, не верхняя граница числа;
|
|
8
|
-
* - дробных нет (только `\d`).
|
|
5
|
+
* `max` / `maxLength` — лимит **символов**, не максимум числа.
|
|
6
|
+
* Для 0–100 / `number` используйте {@link PercentField}.
|
|
9
7
|
*
|
|
10
|
-
*
|
|
8
|
+
* @example
|
|
9
|
+
* <NumberField name="qty" form={form} label="Кол-во" max={6} />
|
|
11
10
|
*/
|
|
12
|
-
/** NumberField — строка цифр в form. `max` = лимит символов. */
|
|
13
11
|
export type TNumeric = TInput & {
|
|
14
|
-
/** Макс. число символов (если нет `maxLength`). Не
|
|
12
|
+
/** Макс. число символов (если нет `maxLength`). Не верхняя граница значения. */
|
|
15
13
|
max?: number;
|
|
16
14
|
};
|
|
15
|
+
/**
|
|
16
|
+
* Поле целых цифр (строка в form).
|
|
17
|
+
*/
|
|
17
18
|
declare function NumberField({ value, form, onValue, name, placeholder, label, hidden, disabled, onBlur: onBlurField, className, after, before, error, size, inputmode, maxLength, max, view, }: TNumeric): import("react/jsx-runtime").JSX.Element | null;
|
|
18
19
|
declare namespace NumberField {
|
|
19
20
|
var displayName: string;
|