@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.
Files changed (42) hide show
  1. package/dist/Form.d.ts +21 -3
  2. package/dist/core/Field.d.ts +12 -0
  3. package/dist/fields/Card.d.ts +14 -0
  4. package/dist/fields/Check.d.ts +14 -0
  5. package/dist/fields/Code.d.ts +14 -1
  6. package/dist/fields/Color.d.ts +13 -0
  7. package/dist/fields/ColorPanel.d.ts +4 -0
  8. package/dist/fields/Date.d.ts +14 -2
  9. package/dist/fields/DateCalendar.d.ts +11 -1
  10. package/dist/fields/Display.d.ts +9 -2
  11. package/dist/fields/DragDrop.d.ts +14 -1
  12. package/dist/fields/Email.d.ts +14 -2
  13. package/dist/fields/FieldGroup.d.ts +23 -3
  14. package/dist/fields/File.d.ts +14 -1
  15. package/dist/fields/Hidden.d.ts +7 -2
  16. package/dist/fields/Input.d.ts +10 -5
  17. package/dist/fields/Mask.d.ts +13 -1
  18. package/dist/fields/Modal.d.ts +20 -3
  19. package/dist/fields/Money.d.ts +11 -1
  20. package/dist/fields/NativeTextField.d.ts +9 -5
  21. package/dist/fields/Numeric.d.ts +9 -8
  22. package/dist/fields/Options.d.ts +24 -5
  23. package/dist/fields/Password.d.ts +11 -0
  24. package/dist/fields/Percent.d.ts +10 -6
  25. package/dist/fields/Phone.d.ts +13 -1
  26. package/dist/fields/Radio.d.ts +14 -0
  27. package/dist/fields/Range.d.ts +11 -1
  28. package/dist/fields/Rating.d.ts +13 -1
  29. package/dist/fields/RichText.d.ts +10 -2
  30. package/dist/fields/Select.d.ts +21 -0
  31. package/dist/fields/Tabs.d.ts +15 -0
  32. package/dist/fields/Tags.d.ts +13 -1
  33. package/dist/fields/Textarea.d.ts +10 -1
  34. package/dist/fields/Time.d.ts +13 -4
  35. package/dist/fields/TimePicker.d.ts +10 -1
  36. package/dist/fields/Url.d.ts +11 -1
  37. package/dist/fields/type.d.ts +96 -26
  38. package/dist/hooks/use.d.ts +20 -6
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.umd.js +1 -1
  41. package/dist/package.js +1 -1
  42. 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
- /** Модальные окна выбора для полей ModalField / OptionsField (`modal="module.name"`) */
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
- /** Пространство имён: `Form.Init` */
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
  };
@@ -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;
@@ -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;
@@ -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;
@@ -1,5 +1,15 @@
1
1
  import { TInput } from './type';
2
- /** CodeField / OTP — ряд отдельных ячеек. Значение: строка. */
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;
@@ -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;
@@ -1,13 +1,25 @@
1
1
  import { default as React } from 'react';
2
2
  import { TInput } from './type';
3
- /** DateField — дата с календарём. Значение в form: `YYYY-MM-DD` | `""`. */
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
- /** DateField — дата с выпадающим календарём. */
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;
@@ -1,7 +1,11 @@
1
1
  import { TInput } from './type';
2
2
  /**
3
- * DisplayField (Readonly) только показ значения.
4
- * Вид как у StringField / TextareaField (капсула + disabled).
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
- /** DragDropField — зона перетаскивания файлов (+ клик для выбора). */
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;
@@ -1,10 +1,22 @@
1
1
  import { default as React } from 'react';
2
2
  import { TInput } from './type';
3
- /** EmailField — нативный input type=email + опциональная проверка формата. */
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
- * Группа полей (items-API, как RadioGroup в @elcrm/components).
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 {
@@ -1,11 +1,21 @@
1
1
  import { TInput } from './type';
2
- /** Метаданные выбранного файла (File в форме сериализовать нельзя надёжно). */
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;
@@ -1,9 +1,14 @@
1
1
  import { TInput } from './type';
2
2
  /**
3
- * HiddenField — значение в форме без UI.
4
- * Рендерит нативный `<input type="hidden">` для submit обычных форм.
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;
@@ -1,13 +1,18 @@
1
1
  import { default as React } from 'react';
2
2
  import { TInput } from './type';
3
3
  /**
4
- * StringField — текстовое поле (по умолчанию contentEditable).
4
+ * Однострочный текст.
5
5
  *
6
- * **Автозаполнение (логин + пароль):** менеджеры паролей опираются на нативные `<input>`.
7
- * У `contentEditable` автозаполнение **не работает** как у поля логина.
8
- * Включите **`native`** и задайте **`autoComplete="username"`** (и оберните поля в `<form>`, при необходимости).
6
+ * **В форме:** `string`.
9
7
  *
10
- * @param hidden при true скрывает поле, только если значение пустое
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>;
@@ -1,8 +1,20 @@
1
1
  import { TInput } from './type';
2
- /** MaskField — в form только цифры; UI по `format` (`_` = слот). */
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;
@@ -1,12 +1,24 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { UseFormApi } from '../hooks/use';
3
3
  import { TValue } from './type';
4
- interface Input {
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
- declare function ModalField({ value, form, onValue, name, placeholder, label, error, hidden, disabled, after, before, view, modal, options, className, }: Input): import("react/jsx-runtime").JSX.Element;
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
  }
@@ -1,5 +1,12 @@
1
1
  import { TInput } from './type';
2
- /** MoneyField — в form число × `course` (по умолчанию 100). */
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
- /** fallback для aria-label, если нет label/placeholder */
11
+ /** aria-label, если нет `label` и `placeholder`. */
8
12
  defaultAriaLabel: string;
9
13
  };
10
14
  /**
11
- * Общее нативное текстовое поле (Email / Url и т.п.).
12
- * Подпись и ошибка связываются через Field a11y (htmlFor / aria-describedby).
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;
@@ -1,19 +1,20 @@
1
1
  import { TInput } from './type';
2
2
  /**
3
- * NumberField — целые цифры как **строка** в форме (`"123"`).
3
+ * Целые цифры как **строка** в форме (`"123"`), не `number`.
4
4
  *
5
- * **Не путать с PercentField:**
6
- * - сюда в форму пишется **строка цифр**, не `number`;
7
- * - проп **`max`** (и `maxLength`) — лимит **символов**, не верхняя граница числа;
8
- * - дробных нет (только `\d`).
5
+ * `max` / `maxLength` — лимит **символов**, не максимум числа.
6
+ * Для 0–100 / `number` используйте {@link PercentField}.
9
7
  *
10
- * Для процентов / clamp 0–100 / `number` используйте **`PercentField`**.
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;