@ozen-ui/kit 0.7.0 → 0.9.0

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 (188) hide show
  1. package/FieldControl/package.json +5 -0
  2. package/FieldInput/package.json +5 -0
  3. package/Fieldset/package.json +5 -0
  4. package/__inner__/cjs/components/Backdrop/Backdrop.d.ts +2 -2
  5. package/__inner__/cjs/components/Breadcrumbs/types.d.ts +2 -2
  6. package/__inner__/cjs/components/DataList/DataList.d.ts +1 -1
  7. package/__inner__/cjs/components/DataList/DataListProvider.d.ts +5 -5
  8. package/__inner__/cjs/components/FieldControl/FieldControl.css +135 -0
  9. package/__inner__/cjs/components/FieldControl/FieldControl.d.ts +13 -0
  10. package/__inner__/cjs/components/FieldControl/FieldControl.js +82 -0
  11. package/__inner__/cjs/components/FieldControl/FieldControlContext.d.ts +15 -0
  12. package/__inner__/cjs/components/FieldControl/FieldControlContext.js +6 -0
  13. package/__inner__/cjs/components/FieldControl/index.d.ts +2 -0
  14. package/__inner__/cjs/components/FieldControl/index.js +5 -0
  15. package/__inner__/cjs/components/FieldHint/FieldHint.d.ts +6 -9
  16. package/__inner__/cjs/components/FieldHint/FieldHint.js +24 -4
  17. package/__inner__/cjs/components/FieldIcon/FieldIcon.css +1 -21
  18. package/__inner__/cjs/components/FieldIcon/FieldIcon.d.ts +8 -12
  19. package/__inner__/cjs/components/FieldIcon/FieldIcon.js +15 -4
  20. package/__inner__/cjs/components/FieldInput/FieldInput.d.ts +11 -0
  21. package/__inner__/cjs/components/FieldInput/FieldInput.js +54 -0
  22. package/__inner__/cjs/components/FieldInput/index.d.ts +1 -0
  23. package/__inner__/cjs/components/FieldInput/index.js +4 -0
  24. package/__inner__/cjs/components/FieldLabel/FieldLabel.d.ts +7 -5
  25. package/__inner__/cjs/components/FieldLabel/FieldLabel.js +39 -10
  26. package/__inner__/cjs/components/Fieldset/Fieldset.css +13 -0
  27. package/__inner__/cjs/components/Fieldset/Fieldset.d.ts +10 -0
  28. package/__inner__/cjs/components/Fieldset/Fieldset.js +15 -0
  29. package/__inner__/cjs/components/Fieldset/index.d.ts +1 -0
  30. package/__inner__/cjs/components/Fieldset/index.js +4 -0
  31. package/__inner__/cjs/components/FilePicker/FilePicker.css +48 -59
  32. package/__inner__/cjs/components/FilePicker/FilePicker.js +2 -1
  33. package/__inner__/cjs/components/Input/Input.css +9 -121
  34. package/__inner__/cjs/components/Input/Input.d.ts +1 -62
  35. package/__inner__/cjs/components/Input/Input.js +32 -53
  36. package/__inner__/cjs/components/Input/constants.d.ts +1 -0
  37. package/__inner__/cjs/components/Input/constants.js +4 -0
  38. package/__inner__/cjs/components/Input/index.d.ts +1 -0
  39. package/__inner__/cjs/components/Input/index.js +1 -0
  40. package/__inner__/cjs/components/Input/types.d.ts +71 -0
  41. package/__inner__/cjs/components/Input/types.js +13 -0
  42. package/__inner__/cjs/components/InputNumber/InputNumber.css +60 -74
  43. package/__inner__/cjs/components/InputNumber/InputNumber.js +2 -1
  44. package/__inner__/cjs/components/InputNumber/utils.d.ts +2 -2
  45. package/__inner__/cjs/components/Link/Link.d.ts +1 -1
  46. package/__inner__/cjs/components/List/components/ListItem/ListItem.d.ts +1 -2
  47. package/__inner__/cjs/components/List/components/ListItemButton/ListItemButton.d.ts +1 -2
  48. package/__inner__/cjs/components/List/types.d.ts +3 -3
  49. package/__inner__/cjs/components/Menu/components/MenuItem/MenuItem.d.ts +1 -1
  50. package/__inner__/cjs/components/Menu/components/MenuList/MenuList.d.ts +1 -1
  51. package/__inner__/cjs/components/Modal/Modal.css +4 -8
  52. package/__inner__/cjs/components/Modal/Modal.d.ts +18 -2
  53. package/__inner__/cjs/components/Modal/Modal.js +13 -21
  54. package/__inner__/cjs/components/Modal/components/ModalConsumer.d.ts +5 -0
  55. package/__inner__/cjs/components/Modal/components/ModalConsumer.js +15 -0
  56. package/__inner__/cjs/components/Modal/components/index.d.ts +1 -0
  57. package/__inner__/cjs/components/Modal/components/index.js +4 -0
  58. package/__inner__/cjs/components/Pagination/helpers/createPaginationRange/createPaginationRange.d.ts +1 -1
  59. package/__inner__/cjs/components/Pagination/types.d.ts +5 -5
  60. package/__inner__/cjs/components/Popover/types.d.ts +4 -5
  61. package/__inner__/cjs/components/ProgressBar/ProgressBar.d.ts +2 -2
  62. package/__inner__/cjs/components/Select/Select.css +5 -16
  63. package/__inner__/cjs/components/Select/components/SelectInput/SelectInput.js +2 -1
  64. package/__inner__/cjs/components/Select/types.d.ts +3 -4
  65. package/__inner__/cjs/components/Slider/types.d.ts +1 -1
  66. package/__inner__/cjs/components/Snackbar/types.d.ts +1 -1
  67. package/__inner__/cjs/components/Tag/components/RemoveButton/RemoveButton.d.ts +1 -1
  68. package/__inner__/cjs/components/Textarea/Textarea.css +3 -107
  69. package/__inner__/cjs/components/Textarea/Textarea.d.ts +1 -59
  70. package/__inner__/cjs/components/Textarea/Textarea.js +8 -62
  71. package/__inner__/cjs/components/Textarea/components/TextareaConsumer.d.ts +3 -0
  72. package/__inner__/cjs/components/Textarea/components/TextareaConsumer.js +36 -0
  73. package/__inner__/cjs/components/Textarea/components/TextareaCounter.d.ts +7 -0
  74. package/__inner__/cjs/components/Textarea/components/TextareaCounter.js +25 -0
  75. package/__inner__/cjs/components/Textarea/components/index.d.ts +2 -0
  76. package/__inner__/cjs/components/Textarea/components/index.js +5 -0
  77. package/__inner__/cjs/components/Textarea/constants.d.ts +1 -0
  78. package/__inner__/cjs/components/Textarea/constants.js +4 -0
  79. package/__inner__/cjs/components/Textarea/index.d.ts +1 -0
  80. package/__inner__/cjs/components/Textarea/index.js +1 -0
  81. package/__inner__/cjs/components/Textarea/types.d.ts +69 -0
  82. package/__inner__/cjs/components/Textarea/types.js +4 -0
  83. package/__inner__/cjs/components/ThemeProvider/ThemeProvider.d.ts +2 -1
  84. package/__inner__/cjs/components/ThemeProvider/types.d.ts +2 -0
  85. package/__inner__/cjs/components/Tooltip/types.d.ts +1 -1
  86. package/__inner__/cjs/hooks/useLockBodyScroll/index.d.ts +1 -0
  87. package/__inner__/cjs/hooks/useLockBodyScroll/index.js +4 -0
  88. package/__inner__/cjs/hooks/useLockBodyScroll/useLockBodyScroll.d.ts +1 -0
  89. package/__inner__/cjs/hooks/useLockBodyScroll/useLockBodyScroll.js +18 -0
  90. package/__inner__/cjs/hooks/useMultiRef/useMultiRef.d.ts +2 -3
  91. package/__inner__/cjs/types/ResponsiveValue.d.ts +1 -1
  92. package/__inner__/cjs/utils/isKey.d.ts +2 -2
  93. package/__inner__/cjs/utils/polymorphicComponentWithRef.d.ts +0 -1
  94. package/__inner__/esm/components/Backdrop/Backdrop.d.ts +2 -2
  95. package/__inner__/esm/components/Backdrop/Backdrop.js +1 -1
  96. package/__inner__/esm/components/Breadcrumbs/types.d.ts +2 -2
  97. package/__inner__/esm/components/DataList/DataList.d.ts +1 -1
  98. package/__inner__/esm/components/DataList/DataListProvider.d.ts +5 -5
  99. package/__inner__/esm/components/FieldControl/FieldControl.css +135 -0
  100. package/__inner__/esm/components/FieldControl/FieldControl.d.ts +13 -0
  101. package/__inner__/esm/components/FieldControl/FieldControl.js +79 -0
  102. package/__inner__/esm/components/FieldControl/FieldControlContext.d.ts +15 -0
  103. package/__inner__/esm/components/FieldControl/FieldControlContext.js +2 -0
  104. package/__inner__/esm/components/FieldControl/index.d.ts +2 -0
  105. package/__inner__/esm/components/FieldControl/index.js +2 -0
  106. package/__inner__/esm/components/FieldHint/FieldHint.d.ts +6 -9
  107. package/__inner__/esm/components/FieldHint/FieldHint.js +25 -5
  108. package/__inner__/esm/components/FieldIcon/FieldIcon.css +1 -21
  109. package/__inner__/esm/components/FieldIcon/FieldIcon.d.ts +8 -12
  110. package/__inner__/esm/components/FieldIcon/FieldIcon.js +16 -5
  111. package/__inner__/esm/components/FieldInput/FieldInput.d.ts +11 -0
  112. package/__inner__/esm/components/FieldInput/FieldInput.js +51 -0
  113. package/__inner__/esm/components/FieldInput/index.d.ts +1 -0
  114. package/__inner__/esm/components/FieldInput/index.js +1 -0
  115. package/__inner__/esm/components/FieldLabel/FieldLabel.d.ts +7 -5
  116. package/__inner__/esm/components/FieldLabel/FieldLabel.js +38 -8
  117. package/__inner__/esm/components/Fieldset/Fieldset.css +13 -0
  118. package/__inner__/esm/components/Fieldset/Fieldset.d.ts +10 -0
  119. package/__inner__/esm/components/Fieldset/Fieldset.js +12 -0
  120. package/__inner__/esm/components/Fieldset/index.d.ts +1 -0
  121. package/__inner__/esm/components/Fieldset/index.js +1 -0
  122. package/__inner__/esm/components/FilePicker/FilePicker.css +48 -59
  123. package/__inner__/esm/components/FilePicker/FilePicker.js +2 -1
  124. package/__inner__/esm/components/Input/Input.css +9 -121
  125. package/__inner__/esm/components/Input/Input.d.ts +1 -62
  126. package/__inner__/esm/components/Input/Input.js +33 -54
  127. package/__inner__/esm/components/Input/constants.d.ts +1 -0
  128. package/__inner__/esm/components/Input/constants.js +1 -0
  129. package/__inner__/esm/components/Input/index.d.ts +1 -0
  130. package/__inner__/esm/components/Input/index.js +1 -0
  131. package/__inner__/esm/components/Input/types.d.ts +71 -0
  132. package/__inner__/esm/components/Input/types.js +10 -0
  133. package/__inner__/esm/components/InputNumber/InputNumber.css +60 -74
  134. package/__inner__/esm/components/InputNumber/InputNumber.js +2 -1
  135. package/__inner__/esm/components/InputNumber/utils.d.ts +2 -2
  136. package/__inner__/esm/components/Link/Link.d.ts +1 -1
  137. package/__inner__/esm/components/List/components/ListItem/ListItem.d.ts +1 -2
  138. package/__inner__/esm/components/List/components/ListItemButton/ListItemButton.d.ts +1 -2
  139. package/__inner__/esm/components/List/types.d.ts +3 -3
  140. package/__inner__/esm/components/Menu/components/MenuItem/MenuItem.d.ts +1 -1
  141. package/__inner__/esm/components/Menu/components/MenuList/MenuList.d.ts +1 -1
  142. package/__inner__/esm/components/Modal/Modal.css +4 -8
  143. package/__inner__/esm/components/Modal/Modal.d.ts +18 -2
  144. package/__inner__/esm/components/Modal/Modal.js +13 -21
  145. package/__inner__/esm/components/Modal/components/ModalConsumer.d.ts +5 -0
  146. package/__inner__/esm/components/Modal/components/ModalConsumer.js +12 -0
  147. package/__inner__/esm/components/Modal/components/index.d.ts +1 -0
  148. package/__inner__/esm/components/Modal/components/index.js +1 -0
  149. package/__inner__/esm/components/Pagination/helpers/createPaginationRange/createPaginationRange.d.ts +1 -1
  150. package/__inner__/esm/components/Pagination/types.d.ts +5 -5
  151. package/__inner__/esm/components/Popover/types.d.ts +4 -5
  152. package/__inner__/esm/components/ProgressBar/ProgressBar.d.ts +2 -2
  153. package/__inner__/esm/components/ProgressBar/ProgressBar.js +1 -1
  154. package/__inner__/esm/components/Select/Select.css +5 -16
  155. package/__inner__/esm/components/Select/components/SelectInput/SelectInput.js +2 -1
  156. package/__inner__/esm/components/Select/types.d.ts +3 -4
  157. package/__inner__/esm/components/Slider/types.d.ts +1 -1
  158. package/__inner__/esm/components/Snackbar/types.d.ts +1 -1
  159. package/__inner__/esm/components/Tag/components/RemoveButton/RemoveButton.d.ts +1 -1
  160. package/__inner__/esm/components/Textarea/Textarea.css +3 -107
  161. package/__inner__/esm/components/Textarea/Textarea.d.ts +1 -59
  162. package/__inner__/esm/components/Textarea/Textarea.js +9 -63
  163. package/__inner__/esm/components/Textarea/components/TextareaConsumer.d.ts +3 -0
  164. package/__inner__/esm/components/Textarea/components/TextareaConsumer.js +32 -0
  165. package/__inner__/esm/components/Textarea/components/TextareaCounter.d.ts +7 -0
  166. package/__inner__/esm/components/Textarea/components/TextareaCounter.js +21 -0
  167. package/__inner__/esm/components/Textarea/components/index.d.ts +2 -0
  168. package/__inner__/esm/components/Textarea/components/index.js +2 -0
  169. package/__inner__/esm/components/Textarea/constants.d.ts +1 -0
  170. package/__inner__/esm/components/Textarea/constants.js +1 -0
  171. package/__inner__/esm/components/Textarea/index.d.ts +1 -0
  172. package/__inner__/esm/components/Textarea/index.js +1 -0
  173. package/__inner__/esm/components/Textarea/types.d.ts +69 -0
  174. package/__inner__/esm/components/Textarea/types.js +1 -0
  175. package/__inner__/esm/components/ThemeProvider/ThemeProvider.d.ts +2 -1
  176. package/__inner__/esm/components/ThemeProvider/types.d.ts +2 -0
  177. package/__inner__/esm/components/Tooltip/Tooltip.js +1 -1
  178. package/__inner__/esm/components/Tooltip/types.d.ts +1 -1
  179. package/__inner__/esm/hooks/useLockBodyScroll/index.d.ts +1 -0
  180. package/__inner__/esm/hooks/useLockBodyScroll/index.js +1 -0
  181. package/__inner__/esm/hooks/useLockBodyScroll/useLockBodyScroll.d.ts +1 -0
  182. package/__inner__/esm/hooks/useLockBodyScroll/useLockBodyScroll.js +14 -0
  183. package/__inner__/esm/hooks/useMultiRef/useMultiRef.d.ts +2 -3
  184. package/__inner__/esm/types/ResponsiveValue.d.ts +1 -1
  185. package/__inner__/esm/utils/isKey.d.ts +2 -2
  186. package/__inner__/esm/utils/polymorphicComponentWithRef.d.ts +0 -1
  187. package/package.json +1 -1
  188. package/useLockBodyScroll/package.json +5 -0
@@ -1,71 +1,50 @@
1
- import { __assign, __read, __rest } from "tslib";
1
+ import { __assign, __rest } from "tslib";
2
2
  import './Input.css';
3
- import React, { useState, useCallback, useRef, forwardRef } from 'react';
3
+ import React, { forwardRef, useRef } from 'react';
4
+ import { useEventListener } from '../../hooks/useEventListener';
4
5
  import { useMultiRef } from '../../hooks/useMultiRef';
5
6
  import { useThemeProps } from '../../hooks/useThemeProps';
6
7
  import { cn } from '../../utils/classname';
8
+ import { FieldControl } from '../FieldControl';
7
9
  import { FieldHint } from '../FieldHint';
8
10
  import { FieldIcon } from '../FieldIcon';
11
+ import { FieldInput } from '../FieldInput';
9
12
  import { FieldLabel } from '../FieldLabel';
10
- export var inputTypeVariant = [
11
- 'number',
12
- 'date',
13
- 'datetime-local',
14
- 'time',
15
- 'text',
16
- 'tel',
17
- 'password',
18
- 'email',
19
- ];
13
+ import { Fieldset } from '../Fieldset';
14
+ import { INPUT_DEFAULT_SIZE } from './constants';
20
15
  export var cnInput = cn('Input');
21
16
  export var Input = forwardRef(function (inProps, ref) {
22
17
  var props = useThemeProps({
23
18
  props: inProps,
24
19
  name: 'Input'
25
20
  });
26
- var _a = props.size, size = _a === void 0 ? 'm' : _a, label = props.label, error = props.error, autoFocus = props.autoFocus, placeholder = props.placeholder, id = props.id, name = props.name, type = props.type, renderLeft = props.renderLeft, renderRight = props.renderRight, inputRef = props.inputRef, fullWidth = props.fullWidth, disabled = props.disabled, hint = props.hint, required = props.required, className = props.className, inputProps = props.inputProps, valueProp = props.value, defaultValue = props.defaultValue, onChange = props.onChange, labelRef = props.labelRef, labelProps = props.labelProps, other = __rest(props, ["size", "label", "error", "autoFocus", "placeholder", "id", "name", "type", "renderLeft", "renderRight", "inputRef", "fullWidth", "disabled", "hint", "required", "className", "inputProps", "value", "defaultValue", "onChange", "labelRef", "labelProps"]);
27
- var isControlled = typeof valueProp !== 'undefined';
28
- var _b = __read(useState(), 2), focused = _b[0], setFocused = _b[1];
29
- var fieldRef = useRef(null);
30
- var _c = __read(useState(defaultValue), 2), valueState = _c[0], setValueState = _c[1];
31
- var filled = isControlled
32
- ? !!valueProp || valueProp === 0
33
- : !!valueState || valueState === 0;
34
- var handleChange = useCallback(function (e) {
35
- if (disabled)
36
- return;
37
- var value = e.target.value;
38
- if (!isControlled) {
39
- setValueState(value);
21
+ var _a = props.size, size = _a === void 0 ? INPUT_DEFAULT_SIZE : _a, label = props.label, error = props.error, autoFocus = props.autoFocus, placeholder = props.placeholder, id = props.id, name = props.name, type = props.type, renderLeft = props.renderLeft, renderRight = props.renderRight, inputRef = props.inputRef, fullWidth = props.fullWidth, disabled = props.disabled, hint = props.hint, required = props.required, className = props.className, inputProps = props.inputProps, value = props.value, defaultValue = props.defaultValue, onChange = props.onChange, labelProps = props.labelProps, labelRef = props.labelRef, other = __rest(props, ["size", "label", "error", "autoFocus", "placeholder", "id", "name", "type", "renderLeft", "renderRight", "inputRef", "fullWidth", "disabled", "hint", "required", "className", "inputProps", "value", "defaultValue", "onChange", "labelProps", "labelRef"]);
22
+ var labelInnerRef = useRef(null);
23
+ var fieldInnerRef = useRef(null);
24
+ /* Хук useEventListener необходим для того, чтобы при нажатии на кнопку мыши
25
+ * внутри HTML-элемента label - фокус не переходил на body или на цель нажатия кнопки мыши.
26
+ * Если же нажатие кнопки происходит на самом HTML-элементе input, то мы ничего не делаем,
27
+ * так как в противном случае мы сломаем возможность выделять текст для копирования.
28
+ */
29
+ useEventListener({
30
+ element: labelInnerRef,
31
+ eventName: 'mousedown',
32
+ handler: function (e) {
33
+ var _a;
34
+ if (e.target !== fieldInnerRef.current) {
35
+ e.preventDefault();
36
+ (_a = fieldInnerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
37
+ }
40
38
  }
41
- onChange === null || onChange === void 0 ? void 0 : onChange(e);
42
- }, [onChange, isControlled, disabled]);
43
- var handleFocus = useCallback(function (e) {
44
- var _a;
45
- setFocused(true);
46
- (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.onFocus) === null || _a === void 0 ? void 0 : _a.call(inputProps, e);
47
- }, [inputProps === null || inputProps === void 0 ? void 0 : inputProps.onFocus]);
48
- var handleBlur = useCallback(function (e) {
49
- var _a;
50
- setFocused(false);
51
- (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.onBlur) === null || _a === void 0 ? void 0 : _a.call(inputProps, e);
52
- }, [inputProps === null || inputProps === void 0 ? void 0 : inputProps.onBlur]);
53
- return (React.createElement("div", __assign({}, other, { ref: ref, className: cnInput({
54
- fullWidth: fullWidth,
55
- size: size,
56
- error: error,
57
- disabled: disabled,
58
- required: required,
59
- hasLabel: !!label,
60
- focused: focused
61
- }, [className]) }),
62
- React.createElement("label", { className: cnInput('Body') },
63
- React.createElement(FieldIcon, { className: cnInput('RenderLeft'), icon: renderLeft, size: size }),
39
+ });
40
+ return (React.createElement(FieldControl, __assign({ size: size, error: error, disabled: disabled, required: required, fullWidth: fullWidth }, other, { ref: ref, className: cnInput({}, [className]) }),
41
+ React.createElement("label", { className: cnInput('Body'), ref: labelInnerRef },
42
+ React.createElement(FieldIcon, { icon: renderLeft }),
64
43
  React.createElement("div", { className: cnInput('FieldContainer') },
65
- label && (React.createElement(FieldLabel, __assign({ filled: filled, focused: focused, required: required, disabled: disabled, size: size }, labelProps, { className: cnInput('Label', [labelProps === null || labelProps === void 0 ? void 0 : labelProps.className]), ref: labelRef }), label)),
66
- React.createElement("input", __assign({ id: id, name: name, autoFocus: autoFocus, disabled: disabled, value: valueProp, type: type, defaultValue: defaultValue, required: required, placeholder: placeholder }, inputProps, { className: cnInput('Field', { filled: filled }, [inputProps === null || inputProps === void 0 ? void 0 : inputProps.className]), onFocus: handleFocus, onBlur: handleBlur, onChange: handleChange, ref: useMultiRef([inputRef, fieldRef]) }))),
67
- React.createElement(FieldIcon, { className: cnInput('RenderRight'), icon: renderRight, size: size }),
68
- React.createElement("fieldset", { className: cnInput('Fieldset') })),
69
- React.createElement(FieldHint, { size: size, error: error, disabled: disabled }, hint)));
44
+ React.createElement(FieldLabel, __assign({}, labelProps, { ref: labelRef || (labelProps === null || labelProps === void 0 ? void 0 : labelProps.ref), className: labelProps === null || labelProps === void 0 ? void 0 : labelProps.className }), label),
45
+ React.createElement(FieldInput, __assign({ id: id, name: name, autoFocus: autoFocus, value: value, type: type, defaultValue: defaultValue, placeholder: placeholder, onChange: onChange }, inputProps, { className: cnInput('Field', [inputProps === null || inputProps === void 0 ? void 0 : inputProps.className]), ref: useMultiRef([inputRef || (inputProps === null || inputProps === void 0 ? void 0 : inputProps.ref), fieldInnerRef]) }))),
46
+ React.createElement(FieldIcon, { icon: renderRight }),
47
+ React.createElement(Fieldset, null)),
48
+ React.createElement(FieldHint, null, hint)));
70
49
  });
71
50
  Input.displayName = 'Input';
@@ -0,0 +1 @@
1
+ export declare const INPUT_DEFAULT_SIZE = "m";
@@ -0,0 +1 @@
1
+ export var INPUT_DEFAULT_SIZE = 'm';
@@ -1 +1,2 @@
1
1
  export * from './Input';
2
+ export * from './types';
@@ -1 +1,2 @@
1
1
  export * from './Input';
2
+ export * from './types';
@@ -0,0 +1,71 @@
1
+ import type { ComponentPropsWithRef, ComponentRef, Ref } from 'react';
2
+ import type { FormElementSizeVariant } from '../../types/FormElementSizeVariant';
3
+ import type { FIELD_CONTROL_DEFAULT_TAG } from '../FieldControl';
4
+ import type { FieldIconProps } from '../FieldIcon';
5
+ import type { FieldLabelProps } from '../FieldLabel';
6
+ export declare const inputTypeVariant: readonly ["number", "date", "datetime-local", "time", "text", "tel", "password", "email"];
7
+ export type InputTypeVariant = (typeof inputTypeVariant)[number];
8
+ export type InputSizeVariant = FormElementSizeVariant;
9
+ type InputPropsDeprecated = {
10
+ /**
11
+ * deprecated
12
+ * Ссылка на FieldLabel
13
+ * */
14
+ labelRef?: FieldLabelProps['ref'];
15
+ /** deprecated
16
+ * Ссылка на элемент input
17
+ * */
18
+ inputRef?: Ref<HTMLInputElement>;
19
+ };
20
+ type InputElement = ComponentPropsWithRef<'input'>;
21
+ export type InputProps = Omit<ComponentPropsWithRef<typeof FIELD_CONTROL_DEFAULT_TAG>, 'size' | 'onChange'> & {
22
+ /** Атрибут id для элемента input */
23
+ id?: string;
24
+ /** Атрибут name для элемента input */
25
+ name?: string;
26
+ /** Лейбл */
27
+ label?: string;
28
+ /** Размер компонента */
29
+ size?: InputSizeVariant;
30
+ /** Подсказка. Отображается, когда вариант не выбран */
31
+ placeholder?: string;
32
+ /** Если {true} устанавливает автофокус */
33
+ autoFocus?: boolean;
34
+ /** Если {true} переводит поле в состояние ошибки */
35
+ error?: boolean;
36
+ /** Если {true} растягивает поле на всю ширину */
37
+ fullWidth?: boolean;
38
+ /** Дополнительное описание к полю */
39
+ hint?: string | null | undefined;
40
+ /** Атрибут type для элемента input */
41
+ type?: InputTypeVariant;
42
+ /** Если {true} делает элемент неактивным */
43
+ disabled?: boolean;
44
+ /** Если {true} делает элемент обязательным к заполнению */
45
+ required?: boolean;
46
+ /** Минимальное количество символов разрешенных для ввода */
47
+ minLength?: InputElement['minLength'];
48
+ /** Максимальное количество символов разрешенных для ввода */
49
+ maxLength?: InputElement['maxLength'];
50
+ /** Текст или иконка слева */
51
+ renderLeft?: FieldIconProps['icon'];
52
+ /** Текст или иконка справа */
53
+ renderRight?: FieldIconProps['icon'];
54
+ /** Выбранное значение */
55
+ value?: InputElement['value'];
56
+ /** Значение по умолчанию (неконтролируемый компонент) */
57
+ defaultValue?: InputElement['defaultValue'];
58
+ /** Обработчик события на изменение значения поля */
59
+ onChange?: InputElement['onChange'];
60
+ /** Свойства элемента input */
61
+ inputProps?: InputElement & {
62
+ 'data-testid'?: string;
63
+ };
64
+ /** Свойства FieldLabel */
65
+ labelProps?: FieldLabelProps;
66
+ /** Ссылка на корневой DOM-элемент компонента */
67
+ ref?: ComponentRef<typeof FIELD_CONTROL_DEFAULT_TAG>;
68
+ /** data-атрибут для тестирования */
69
+ 'data-testid'?: string;
70
+ } & InputPropsDeprecated;
71
+ export {};
@@ -0,0 +1,10 @@
1
+ export var inputTypeVariant = [
2
+ 'number',
3
+ 'date',
4
+ 'datetime-local',
5
+ 'time',
6
+ 'text',
7
+ 'tel',
8
+ 'password',
9
+ 'email',
10
+ ];
@@ -1,9 +1,10 @@
1
1
  /* stylelint-disable */
2
2
  .InputNumber {
3
- --number-input-color: var(--color-content-primary);
4
- --number-input-background-color: var(--color-background-primary);
5
- --number-input-border-width: var(--border-width-s);
6
- --number-input-border-color: var(--color-border-main);
3
+ --textfield-color: var(--color-content-primary);
4
+ --textfield-background-color: var(--color-background-primary);
5
+ --textfield-border-width: var(--border-width-s);
6
+ --textfield-border-color: var(--color-border-main);
7
+ font: var(--textfield-input-font);
7
8
  cursor: text;
8
9
  display: inline-flex;
9
10
  vertical-align: top;
@@ -12,31 +13,17 @@
12
13
  .InputNumber > * {
13
14
  cursor: text;
14
15
  }
15
- .InputNumber-Fieldset {
16
- position: absolute;
17
- inset-block-end: 0;
18
- inset-inline-end: 0;
19
- inset-block-start: 0;
20
- inset-inline-start: 0;
21
- margin: 0;
22
- padding: 0;
23
- pointer-events: none;
24
- border-radius: var(--border-radius-xs);
25
- border: var(--number-input-border-width) solid
26
- var(--number-input-border-color);
27
- transition: border var(--transition-default);
28
- }
29
16
  .InputNumber-Body {
30
17
  position: relative;
31
18
  display: flex;
32
- -moz-column-gap: var(--number-input-input-gap);
33
- column-gap: var(--number-input-input-gap);
19
+ -moz-column-gap: var(--textfield-input-gap);
20
+ column-gap: var(--textfield-input-gap);
34
21
  align-items: center;
35
22
  box-sizing: border-box;
36
- padding: 0 4px 0 var(--number-input-gutter-x);
37
- background-color: var(--number-input-background-color);
23
+ padding: 0 4px 0 var(--textfield-gutter-x);
24
+ background-color: var(--textfield-background-color);
38
25
  transition: background-color var(--transition-slow);
39
- color: var(--number-input-color);
26
+ color: var(--textfield-color);
40
27
  border-radius: var(--border-radius-xs);
41
28
  }
42
29
  .InputNumber-FieldContainer {
@@ -53,10 +40,9 @@
53
40
  inline-size: 100%;
54
41
  padding: 0;
55
42
  background: none;
56
- color: var(--number-input-color);
43
+ color: var(--textfield-color);
57
44
  box-sizing: border-box;
58
- block-size: var(--number-input-input-height);
59
- font: var(--number-input-input-font);
45
+ block-size: var(--textfield-input-height);
60
46
  }
61
47
  .InputNumber-Field::placeholder {
62
48
  opacity: 1;
@@ -65,7 +51,7 @@
65
51
  .InputNumber-Field:-webkit-autofill,
66
52
  .InputNumber-Field:-webkit-autofill:hover,
67
53
  .InputNumber-Field:-webkit-autofill:focus {
68
- box-shadow: 0 0 0 1000px var(--number-input-background-color) inset !important;
54
+ box-shadow: 0 0 0 1000px var(--textfield-background-color) inset !important;
69
55
  background-color: transparent !important;
70
56
  -webkit-text-fill-color: var(--color-content-info-dark);
71
57
  }
@@ -80,59 +66,59 @@
80
66
  flex-direction: column;
81
67
  }
82
68
  .InputNumber_size_2xs {
83
- --number-input-gutter-x: 12px;
84
- --number-input-input-height: 40px;
85
- --number-input-input-padding: 4px 0 4px;
86
- --number-input-input-font: var(--typography-text-2xs-font);
87
- --number-input-input-gap: var(--space-s);
88
- --number-input-button-width: 24px;
89
- --number-input-button-height: 16px;
69
+ --textfield-gutter-x: 12px;
70
+ --textfield-input-height: 40px;
71
+ --textfield-input-padding: 4px 0 4px;
72
+ --textfield-input-font: var(--typography-text-2xs-font);
73
+ --textfield-input-gap: var(--space-s);
74
+ --textfield-button-width: 24px;
75
+ --textfield-button-height: 16px;
90
76
  }
91
77
  .InputNumber_size_2xs .FieldLabel_size_2xs {
92
78
  --field-label-top: 12px;
93
79
  }
94
80
  .InputNumber_size_xs {
95
- --number-input-gutter-x: 12px;
96
- --number-input-input-height: 40px;
97
- --number-input-input-font: var(--typography-text-xs-font);
98
- --number-input-input-padding: 19px 0 4px;
99
- --number-input-input-gap: var(--space-s);
100
- --number-input-button-width: 28px;
101
- --number-input-button-height: 16px;
81
+ --textfield-gutter-x: 12px;
82
+ --textfield-input-height: 40px;
83
+ --textfield-input-font: var(--typography-text-xs-font);
84
+ --textfield-input-padding: 19px 0 4px;
85
+ --textfield-input-gap: var(--space-s);
86
+ --textfield-button-width: 28px;
87
+ --textfield-button-height: 16px;
102
88
  }
103
89
  .InputNumber_size_s {
104
- --number-input-gutter-x: 16px;
105
- --number-input-input-height: 48px;
106
- --number-input-input-font: var(--typography-text-s-font);
107
- --number-input-input-padding: 21px 0 6px;
108
- --number-input-input-gap: var(--space-m);
109
- --number-input-button-width: 32px;
110
- --number-input-button-height: 20px;
90
+ --textfield-gutter-x: 16px;
91
+ --textfield-input-height: 48px;
92
+ --textfield-input-font: var(--typography-text-s-font);
93
+ --textfield-input-padding: 21px 0 6px;
94
+ --textfield-input-gap: var(--space-m);
95
+ --textfield-button-width: 32px;
96
+ --textfield-button-height: 20px;
111
97
  }
112
98
  .InputNumber_size_m {
113
- --number-input-gutter-x: 20px;
114
- --number-input-input-height: 56px;
115
- --number-input-input-font: var(--typography-text-m-font);
116
- --number-input-input-padding: 24px 0 6px;
117
- --number-input-input-gap: var(--space-m);
118
- --number-input-button-width: 40px;
119
- --number-input-button-height: 24px;
99
+ --textfield-gutter-x: 20px;
100
+ --textfield-input-height: 56px;
101
+ --textfield-input-font: var(--typography-text-m-font);
102
+ --textfield-input-padding: 24px 0 6px;
103
+ --textfield-input-gap: var(--space-m);
104
+ --textfield-button-width: 40px;
105
+ --textfield-button-height: 24px;
120
106
  }
121
107
  .InputNumber_size_l {
122
- --number-input-gutter-x: 24px;
123
- --number-input-input-height: 64px;
124
- --number-input-input-font: var(--typography-text-l-font);
125
- --number-input-input-padding: 26px 0 6px;
126
- --number-input-input-gap: var(--space-l);
127
- --number-input-button-width: 48px;
128
- --number-input-button-height: 28px;
108
+ --textfield-gutter-x: 24px;
109
+ --textfield-input-height: 64px;
110
+ --textfield-input-font: var(--typography-text-l-font);
111
+ --textfield-input-padding: 26px 0 6px;
112
+ --textfield-input-gap: var(--space-l);
113
+ --textfield-button-width: 48px;
114
+ --textfield-button-height: 28px;
129
115
  }
130
116
  .InputNumber_fullWidth {
131
117
  inline-size: 100%;
132
118
  }
133
119
  .InputNumber_hasLabel .InputNumber-Field {
134
- padding: var(--number-input-input-padding);
135
- font: var(--number-input-input-font);
120
+ padding: var(--textfield-input-padding);
121
+ font: var(--textfield-input-font);
136
122
  }
137
123
  .InputNumber_hasLabel .InputNumber-Field::placeholder {
138
124
  opacity: 0;
@@ -141,31 +127,31 @@
141
127
  opacity: 1;
142
128
  }
143
129
  .InputNumber:hover {
144
- --number-input-border-color: var(--color-border-main-hover);
130
+ --textfield-border-color: var(--color-border-main-hover);
145
131
  }
146
132
  .InputNumber_focused,
147
133
  .InputNumber_focused:hover {
148
- --number-input-border-width: var(--border-width-m);
149
- --number-input-background-color: var(--color-background-main);
150
- --number-input-border-color: var(--color-border-action);
134
+ --textfield-border-width: var(--border-width-m);
135
+ --textfield-background-color: var(--color-background-main);
136
+ --textfield-border-color: var(--color-border-action);
151
137
  }
152
138
  .InputNumber_error,
153
139
  .InputNumber_error.InputNumber:hover,
154
140
  .InputNumber_error.InputNumber_focused,
155
141
  .InputNumber_error.InputNumber_focused:hover {
156
- --number-input-border-color: var(--color-border-error);
142
+ --textfield-border-color: var(--color-border-error);
157
143
  }
158
144
  .InputNumber_disabled {
159
- --number-input-border-color: var(--color-border-disabled);
160
- --number-input-background-color: var(--color-background-disabled);
161
- --number-input-color: var(--color-content-secondary);
145
+ --textfield-border-color: var(--color-border-disabled);
146
+ --textfield-background-color: var(--color-background-disabled);
147
+ --textfield-color: var(--color-content-secondary);
162
148
  pointer-events: none;
163
149
  cursor: default;
164
150
  }
165
151
  .IconButton.InputNumber-Increment,
166
152
  .IconButton.InputNumber-Decrement {
167
- inline-size: var(--number-input-button-width);
168
- block-size: var(--number-input-button-height);
153
+ inline-size: var(--textfield-button-width);
154
+ block-size: var(--textfield-button-height);
169
155
  }
170
156
  .IconButton.InputNumber-Increment *, .IconButton.InputNumber-Decrement * {
171
157
  pointer-events: none;
@@ -11,6 +11,7 @@ import { cn } from '../../utils/classname';
11
11
  import { FieldHint } from '../FieldHint';
12
12
  import { FieldIcon } from '../FieldIcon';
13
13
  import { FieldLabel } from '../FieldLabel';
14
+ import { Fieldset } from '../Fieldset';
14
15
  import { IconButton } from '../IconButton';
15
16
  import { INPUT_NUMBER_DEFAULT_STEP, INPUT_NUMBER_DEFAULT_SIZE, INPUT_NUMBER_DEFAULT_AUTO_FOCUS, INPUT_NUMBER_DEFAULT_ERROR, INPUT_NUMBER_DEFAULT_REQUIRED, INPUT_NUMBER_DEFAULT_DISABLED, INPUT_NUMBER_DEFAULT_FULL_WIDTH, INPUT_NUMBER_DEFAULT_VALUE, INPUT_NUMBER_DEFAULT_MIN, INPUT_NUMBER_DEFAULT_MAX, } from './constants';
16
17
  import { getValue, isInputInvalid, isValidValue } from './utils';
@@ -142,7 +143,7 @@ export var InputNumber = forwardRef(function (inProps, ref) {
142
143
  React.createElement("span", { className: cnInputNumber('Controls') },
143
144
  React.createElement(IconButton, { tabIndex: -1, size: size, className: cnInputNumber('Increment'), icon: SortUpIcon, onMouseDown: handleMouseDown('increment'), disabled: disabled, "aria-label": "increment", variant: "ghost" }),
144
145
  React.createElement(IconButton, { tabIndex: -1, size: size, icon: SortDownIcon, className: cnInputNumber('Decrement'), onMouseDown: handleMouseDown('decrement'), disabled: disabled, "aria-label": "decrement", variant: "ghost" })),
145
- React.createElement("fieldset", { className: cnInputNumber('Fieldset') })),
146
+ React.createElement(Fieldset, { className: cnInputNumber('Fieldset') })),
146
147
  React.createElement(FieldHint, { size: size, error: error, disabled: disabled }, hint)));
147
148
  });
148
149
  InputNumber.displayName = 'InputNumber';
@@ -1,5 +1,5 @@
1
- import { KeyboardEvent } from 'react';
2
- import { InputNumberValue, InputNumberCountDirection } from './types';
1
+ import type { KeyboardEvent } from 'react';
2
+ import type { InputNumberValue, InputNumberCountDirection } from './types';
3
3
  export declare const isValidValue: (value?: InputNumberValue) => boolean;
4
4
  export declare const isInputInvalid: (event: KeyboardEvent<HTMLInputElement>) => boolean;
5
5
  export declare const getValue: ({ value, step, min, max, countDirection, }: {
@@ -1,5 +1,5 @@
1
1
  import './Link.css';
2
- import { ElementType } from 'react';
2
+ import type { ElementType } from 'react';
3
3
  import { type PolymorphicComponentPropsWithoutRef } from '../../utils/polymorphicComponentWithRef';
4
4
  import { type TypographyBaseProps } from '../Typography';
5
5
  export type LinkBaseProps = Pick<TypographyBaseProps, 'variant' | 'display' | 'defaultMargin' | 'children' | 'noWrap' | 'align'>;
@@ -1,6 +1,5 @@
1
1
  import './ListItem.css';
2
- import { ElementType } from 'react';
3
- import type { ReactNode } from 'react';
2
+ import type { ReactNode, ElementType } from 'react';
4
3
  import { type PolymorphicComponentPropsWithoutRef } from '../../../../utils/polymorphicComponentWithRef';
5
4
  import { LIST_ITEM_DEFAULT_TAG } from '../../constants';
6
5
  export declare const cnListItem: import("@bem-react/classname").ClassNameFormatter;
@@ -1,6 +1,5 @@
1
1
  import './ListItemButton.css';
2
- import { ElementType } from 'react';
3
- import type { ReactNode } from 'react';
2
+ import type { ReactNode, ElementType } from 'react';
4
3
  import { type PolymorphicComponentPropsWithoutRef } from '../../../../utils/polymorphicComponentWithRef';
5
4
  import { LIST_ITEM_BUTTON_DEFAULT_TAG } from '../../constants';
6
5
  export declare const cnListItemButton: import("@bem-react/classname").ClassNameFormatter;
@@ -1,7 +1,7 @@
1
1
  import type { ElementType, ReactNode } from 'react';
2
- import { FormElementSizeVariant } from '../../types/FormElementSizeVariant';
3
- import { PolymorphicComponentPropsWithRef } from '../../utils/polymorphicComponentWithRef';
4
- import { LIST_DEFAULT_TAG } from './constants';
2
+ import type { FormElementSizeVariant } from '../../types/FormElementSizeVariant';
3
+ import type { PolymorphicComponentPropsWithRef } from '../../utils/polymorphicComponentWithRef';
4
+ import type { LIST_DEFAULT_TAG } from './constants';
5
5
  export type ListSizeVariant = FormElementSizeVariant;
6
6
  export type ListContextValue = {
7
7
  size: ListSizeVariant;
@@ -1,4 +1,4 @@
1
- import { ElementType } from 'react';
1
+ import type { ElementType } from 'react';
2
2
  import { type PolymorphicComponentPropsWithoutRef } from '../../../../utils/polymorphicComponentWithRef';
3
3
  import { type ListItemButtonBaseProps } from '../../../List';
4
4
  import { LIST_ITEM_BUTTON_DEFAULT_TAG } from '../../../List/constants';
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { ListProps } from '../../../List';
2
+ import type { ListProps } from '../../../List';
3
3
  export type MenuListProps = {
4
4
  /** Если {true} устанавливает автофокус на первый или выбранный элемент в списке */
5
5
  autoFocus?: boolean;
@@ -1,22 +1,18 @@
1
- .no-scroll {
2
- overflow: hidden;
3
- }
4
-
5
1
  .Modal {
6
2
  position: fixed;
7
3
  z-index: var(--z-index-modal);
8
4
  inset: 0;
9
5
  }
10
6
 
11
- .Modal:not(.Modal_hasBackdrop) {
7
+ .Modal:not(.Modal_hasBackdrop) {
12
8
  pointer-events: none;
13
9
  }
14
10
 
15
- .Modal:not(.Modal_hasBackdrop) .Modal-Window {
11
+ .Modal:not(.Modal_hasBackdrop) .Modal-Window {
16
12
  pointer-events: auto;
17
13
  }
18
14
 
19
- .Modal-Window {
15
+ .Modal-Window {
20
16
  position: absolute;
21
17
  inset-block-start: 50%;
22
18
  inset-inline-start: 50%;
@@ -27,7 +23,7 @@
27
23
  padding: var(--space-2xl);
28
24
  }
29
25
 
30
- .Modal_hidden {
26
+ .Modal_hidden {
31
27
  visibility: hidden;
32
28
  }
33
29
 
@@ -1,7 +1,7 @@
1
1
  import './Modal.css';
2
2
  import React from 'react';
3
- import type { ReactNode } from 'react';
4
- import { CSSTransitionProps } from 'react-transition-group/CSSTransition';
3
+ import type { ReactNode, RefObject } from 'react';
4
+ import type { CSSTransitionProps } from 'react-transition-group/CSSTransition';
5
5
  import { type BackdropProps } from '../Backdrop';
6
6
  import { type PaperProps } from '../Paper';
7
7
  import { type PortalProps, type PortalRef } from '../Portal';
@@ -30,6 +30,12 @@ export type ModalProps = {
30
30
  hideBackdrop?: boolean;
31
31
  /** Если {true} предотвращает размонтирование компонента при событии закрыть */
32
32
  keepMounted?: boolean;
33
+ /** Если {true} отключает блокировку прокрутки основного экрана приложения */
34
+ disableScrollLock?: boolean;
35
+ /** Если {true} отключает закрытие окна при клике за его пределами */
36
+ disableClickOutside?: boolean;
37
+ /** Если {true} отключает закрытие окна при нажатии на клавишу ESC */
38
+ disableEscapeKeyDown?: boolean;
33
39
  /** Свойства компонента Backdrop (подложка) */
34
40
  backdropProps?: BackdropProps & {
35
41
  'data-testid'?: string;
@@ -48,6 +54,8 @@ export type ModalProps = {
48
54
  'data-testid'?: string;
49
55
  /** Контейнер для монтирования всплывающего окна */
50
56
  container?: PortalProps['container'];
57
+ /** Список ссылок на элементы при клике на которые Modal не будет закрываться (см. хук useClickOutside) */
58
+ ignoreClickOutsideRefs?: Array<RefObject<HTMLElement>>;
51
59
  } & PortalProps;
52
60
  export type ModalRef = PortalRef;
53
61
  export declare const Modal: React.ForwardRefExoticComponent<{
@@ -74,6 +82,12 @@ export declare const Modal: React.ForwardRefExoticComponent<{
74
82
  hideBackdrop?: boolean | undefined;
75
83
  /** Если {true} предотвращает размонтирование компонента при событии закрыть */
76
84
  keepMounted?: boolean | undefined;
85
+ /** Если {true} отключает блокировку прокрутки основного экрана приложения */
86
+ disableScrollLock?: boolean | undefined;
87
+ /** Если {true} отключает закрытие окна при клике за его пределами */
88
+ disableClickOutside?: boolean | undefined;
89
+ /** Если {true} отключает закрытие окна при нажатии на клавишу ESC */
90
+ disableEscapeKeyDown?: boolean | undefined;
77
91
  /** Свойства компонента Backdrop (подложка) */
78
92
  backdropProps?: (import("../Backdrop").BackdropBaseProps & {
79
93
  as?: "div" | undefined;
@@ -100,6 +114,8 @@ export declare const Modal: React.ForwardRefExoticComponent<{
100
114
  'data-testid'?: string | undefined;
101
115
  /** Контейнер для монтирования всплывающего окна */
102
116
  container?: PortalProps['container'];
117
+ /** Список ссылок на элементы при клике на которые Modal не будет закрываться (см. хук useClickOutside) */
118
+ ignoreClickOutsideRefs?: React.RefObject<HTMLElement>[] | undefined;
103
119
  } & import("../Portal").PortalBaseProps & {
104
120
  as?: "div" | undefined;
105
121
  } & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "container"> & React.RefAttributes<HTMLDivElement>>;