@ozen-ui/kit 0.8.0 → 0.9.1

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 (171) 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 +55 -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 +40 -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 +61 -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.d.ts +1 -1
  52. package/__inner__/cjs/components/Modal/Modal.js +1 -1
  53. package/__inner__/cjs/components/Modal/components/ModalConsumer.d.ts +2 -2
  54. package/__inner__/cjs/components/Pagination/helpers/createPaginationRange/createPaginationRange.d.ts +1 -1
  55. package/__inner__/cjs/components/Pagination/types.d.ts +5 -5
  56. package/__inner__/cjs/components/Popover/types.d.ts +4 -5
  57. package/__inner__/cjs/components/ProgressBar/ProgressBar.d.ts +2 -2
  58. package/__inner__/cjs/components/Select/Select.css +5 -16
  59. package/__inner__/cjs/components/Select/components/SelectInput/SelectInput.js +2 -1
  60. package/__inner__/cjs/components/Select/types.d.ts +3 -4
  61. package/__inner__/cjs/components/Slider/types.d.ts +1 -1
  62. package/__inner__/cjs/components/Snackbar/types.d.ts +1 -1
  63. package/__inner__/cjs/components/Tag/components/RemoveButton/RemoveButton.d.ts +1 -1
  64. package/__inner__/cjs/components/Textarea/Textarea.css +3 -107
  65. package/__inner__/cjs/components/Textarea/Textarea.d.ts +1 -59
  66. package/__inner__/cjs/components/Textarea/Textarea.js +8 -62
  67. package/__inner__/cjs/components/Textarea/components/TextareaConsumer.d.ts +3 -0
  68. package/__inner__/cjs/components/Textarea/components/TextareaConsumer.js +36 -0
  69. package/__inner__/cjs/components/Textarea/components/TextareaCounter.d.ts +7 -0
  70. package/__inner__/cjs/components/Textarea/components/TextareaCounter.js +25 -0
  71. package/__inner__/cjs/components/Textarea/components/index.d.ts +2 -0
  72. package/__inner__/cjs/components/Textarea/components/index.js +5 -0
  73. package/__inner__/cjs/components/Textarea/constants.d.ts +1 -0
  74. package/__inner__/cjs/components/Textarea/constants.js +4 -0
  75. package/__inner__/cjs/components/Textarea/index.d.ts +1 -0
  76. package/__inner__/cjs/components/Textarea/index.js +1 -0
  77. package/__inner__/cjs/components/Textarea/types.d.ts +69 -0
  78. package/__inner__/cjs/components/Textarea/types.js +4 -0
  79. package/__inner__/cjs/components/ThemeProvider/ThemeProvider.d.ts +2 -1
  80. package/__inner__/cjs/components/ThemeProvider/types.d.ts +2 -0
  81. package/__inner__/cjs/components/Tooltip/types.d.ts +1 -1
  82. package/__inner__/cjs/hooks/useMultiRef/useMultiRef.d.ts +2 -3
  83. package/__inner__/cjs/types/ResponsiveValue.d.ts +1 -1
  84. package/__inner__/cjs/utils/isKey.d.ts +2 -2
  85. package/__inner__/cjs/utils/polymorphicComponentWithRef.d.ts +0 -1
  86. package/__inner__/esm/components/Backdrop/Backdrop.d.ts +2 -2
  87. package/__inner__/esm/components/Backdrop/Backdrop.js +1 -1
  88. package/__inner__/esm/components/Breadcrumbs/types.d.ts +2 -2
  89. package/__inner__/esm/components/DataList/DataList.d.ts +1 -1
  90. package/__inner__/esm/components/DataList/DataListProvider.d.ts +5 -5
  91. package/__inner__/esm/components/FieldControl/FieldControl.css +135 -0
  92. package/__inner__/esm/components/FieldControl/FieldControl.d.ts +13 -0
  93. package/__inner__/esm/components/FieldControl/FieldControl.js +79 -0
  94. package/__inner__/esm/components/FieldControl/FieldControlContext.d.ts +15 -0
  95. package/__inner__/esm/components/FieldControl/FieldControlContext.js +2 -0
  96. package/__inner__/esm/components/FieldControl/index.d.ts +2 -0
  97. package/__inner__/esm/components/FieldControl/index.js +2 -0
  98. package/__inner__/esm/components/FieldHint/FieldHint.d.ts +6 -9
  99. package/__inner__/esm/components/FieldHint/FieldHint.js +25 -5
  100. package/__inner__/esm/components/FieldIcon/FieldIcon.css +1 -21
  101. package/__inner__/esm/components/FieldIcon/FieldIcon.d.ts +8 -12
  102. package/__inner__/esm/components/FieldIcon/FieldIcon.js +16 -5
  103. package/__inner__/esm/components/FieldInput/FieldInput.d.ts +11 -0
  104. package/__inner__/esm/components/FieldInput/FieldInput.js +52 -0
  105. package/__inner__/esm/components/FieldInput/index.d.ts +1 -0
  106. package/__inner__/esm/components/FieldInput/index.js +1 -0
  107. package/__inner__/esm/components/FieldLabel/FieldLabel.d.ts +7 -5
  108. package/__inner__/esm/components/FieldLabel/FieldLabel.js +39 -8
  109. package/__inner__/esm/components/Fieldset/Fieldset.css +13 -0
  110. package/__inner__/esm/components/Fieldset/Fieldset.d.ts +10 -0
  111. package/__inner__/esm/components/Fieldset/Fieldset.js +12 -0
  112. package/__inner__/esm/components/Fieldset/index.d.ts +1 -0
  113. package/__inner__/esm/components/Fieldset/index.js +1 -0
  114. package/__inner__/esm/components/FilePicker/FilePicker.css +48 -59
  115. package/__inner__/esm/components/FilePicker/FilePicker.js +2 -1
  116. package/__inner__/esm/components/Input/Input.css +9 -121
  117. package/__inner__/esm/components/Input/Input.d.ts +1 -62
  118. package/__inner__/esm/components/Input/Input.js +33 -54
  119. package/__inner__/esm/components/Input/constants.d.ts +1 -0
  120. package/__inner__/esm/components/Input/constants.js +1 -0
  121. package/__inner__/esm/components/Input/index.d.ts +1 -0
  122. package/__inner__/esm/components/Input/index.js +1 -0
  123. package/__inner__/esm/components/Input/types.d.ts +71 -0
  124. package/__inner__/esm/components/Input/types.js +10 -0
  125. package/__inner__/esm/components/InputNumber/InputNumber.css +61 -74
  126. package/__inner__/esm/components/InputNumber/InputNumber.js +2 -1
  127. package/__inner__/esm/components/InputNumber/utils.d.ts +2 -2
  128. package/__inner__/esm/components/Link/Link.d.ts +1 -1
  129. package/__inner__/esm/components/List/components/ListItem/ListItem.d.ts +1 -2
  130. package/__inner__/esm/components/List/components/ListItemButton/ListItemButton.d.ts +1 -2
  131. package/__inner__/esm/components/List/types.d.ts +3 -3
  132. package/__inner__/esm/components/Menu/components/MenuItem/MenuItem.d.ts +1 -1
  133. package/__inner__/esm/components/Menu/components/MenuList/MenuList.d.ts +1 -1
  134. package/__inner__/esm/components/Modal/Modal.d.ts +1 -1
  135. package/__inner__/esm/components/Modal/Modal.js +1 -1
  136. package/__inner__/esm/components/Modal/components/ModalConsumer.d.ts +2 -2
  137. package/__inner__/esm/components/Pagination/helpers/createPaginationRange/createPaginationRange.d.ts +1 -1
  138. package/__inner__/esm/components/Pagination/types.d.ts +5 -5
  139. package/__inner__/esm/components/Popover/types.d.ts +4 -5
  140. package/__inner__/esm/components/ProgressBar/ProgressBar.d.ts +2 -2
  141. package/__inner__/esm/components/ProgressBar/ProgressBar.js +1 -1
  142. package/__inner__/esm/components/Select/Select.css +5 -16
  143. package/__inner__/esm/components/Select/components/SelectInput/SelectInput.js +2 -1
  144. package/__inner__/esm/components/Select/types.d.ts +3 -4
  145. package/__inner__/esm/components/Slider/types.d.ts +1 -1
  146. package/__inner__/esm/components/Snackbar/types.d.ts +1 -1
  147. package/__inner__/esm/components/Tag/components/RemoveButton/RemoveButton.d.ts +1 -1
  148. package/__inner__/esm/components/Textarea/Textarea.css +3 -107
  149. package/__inner__/esm/components/Textarea/Textarea.d.ts +1 -59
  150. package/__inner__/esm/components/Textarea/Textarea.js +9 -63
  151. package/__inner__/esm/components/Textarea/components/TextareaConsumer.d.ts +3 -0
  152. package/__inner__/esm/components/Textarea/components/TextareaConsumer.js +32 -0
  153. package/__inner__/esm/components/Textarea/components/TextareaCounter.d.ts +7 -0
  154. package/__inner__/esm/components/Textarea/components/TextareaCounter.js +21 -0
  155. package/__inner__/esm/components/Textarea/components/index.d.ts +2 -0
  156. package/__inner__/esm/components/Textarea/components/index.js +2 -0
  157. package/__inner__/esm/components/Textarea/constants.d.ts +1 -0
  158. package/__inner__/esm/components/Textarea/constants.js +1 -0
  159. package/__inner__/esm/components/Textarea/index.d.ts +1 -0
  160. package/__inner__/esm/components/Textarea/index.js +1 -0
  161. package/__inner__/esm/components/Textarea/types.d.ts +69 -0
  162. package/__inner__/esm/components/Textarea/types.js +1 -0
  163. package/__inner__/esm/components/ThemeProvider/ThemeProvider.d.ts +2 -1
  164. package/__inner__/esm/components/ThemeProvider/types.d.ts +2 -0
  165. package/__inner__/esm/components/Tooltip/Tooltip.js +1 -1
  166. package/__inner__/esm/components/Tooltip/types.d.ts +1 -1
  167. package/__inner__/esm/hooks/useMultiRef/useMultiRef.d.ts +2 -3
  168. package/__inner__/esm/types/ResponsiveValue.d.ts +1 -1
  169. package/__inner__/esm/utils/isKey.d.ts +2 -2
  170. package/__inner__/esm/utils/polymorphicComponentWithRef.d.ts +0 -1
  171. package/package.json +1 -1
@@ -1,39 +1,13 @@
1
1
  .Textarea {
2
- --textfield-color: var(--color-content-primary);
3
- --textfield-background-color: var(--color-background-primary);
4
- --textfield-border-width: var(--border-width-s);
5
- --textfield-border-color: var(--color-border-main);
6
2
  --textfield-scroll-size: 12px;
7
- min-block-size: var(--textfield-input-block-size);
8
- display: inline-flex;
9
- vertical-align: top;
10
- flex-direction: column;
3
+ min-block-size: var(--textfield-input-height);
11
4
  position: relative;
12
- cursor: text;
13
5
  }
14
6
 
15
- .Textarea > * {
16
- cursor: text;
17
- }
18
-
19
7
  .Textarea-Label {
20
8
  padding: 0 var(--textfield-gutter-x);
21
9
  }
22
10
 
23
- .Textarea-Fieldset {
24
- position: absolute;
25
- inset-block-end: 0;
26
- inset-inline-end: 0;
27
- inset-block-start: 0;
28
- inset-inline-start: 0;
29
- margin: 0;
30
- padding: 0;
31
- pointer-events: none;
32
- border-radius: var(--border-radius-xs);
33
- border: var(--textfield-border-width) solid var(--textfield-border-color);
34
- transition: border var(--transition-default);
35
- }
36
-
37
11
  .Textarea-Body,
38
12
  .Textarea-Field {
39
13
  transition: background-color var(--transition-slow);
@@ -50,10 +24,9 @@
50
24
  transition: background-color var(--transition-slow);
51
25
  color: var(--textfield-color);
52
26
  border-radius: var(--border-radius-xs);
53
- padding-block-start: 16px;
54
- padding-block-end: 16px;
55
27
  min-block-size: inherit;
56
28
  block-size: inherit;
29
+ padding: var(--textfield-input-padding);
57
30
  }
58
31
 
59
32
  .Textarea-Field {
@@ -95,7 +68,7 @@
95
68
  border: none;
96
69
  display: flex;
97
70
  outline: none;
98
- font: var(--textfield-input-font);
71
+ font: inherit;
99
72
  background-color: var(--textfield-background-color);
100
73
  color: var(--textfield-color);
101
74
  padding: 0 var(--textfield-gutter-x);
@@ -126,80 +99,3 @@
126
99
  resize: vertical;
127
100
  overflow: hidden;
128
101
  }
129
-
130
- .Textarea_hasLabel .Textarea-Field::placeholder {
131
- opacity: 0;
132
- }
133
-
134
- .Textarea_hasLabel .Textarea-Field:focus::placeholder {
135
- opacity: 1;
136
- }
137
-
138
- .Textarea_hasLabel .Textarea-Body {
139
- padding: var(--textfield-input-padding);
140
- }
141
-
142
- .Textarea_fullWidth {
143
- inline-size: 100%;
144
- }
145
-
146
- .Textarea_size_2xs {
147
- --textfield-gutter-x: 12px;
148
- --textfield-input-block-size: 32px;
149
- --textfield-input-font: var(--typography-text-2xs-font);
150
- --textfield-input-padding: 8px 0 8px;
151
- }
152
-
153
- .Textarea_size_xs {
154
- --textfield-gutter-x: 12px;
155
- --textfield-input-block-size: 40px;
156
- --textfield-input-font: var(--typography-text-xs-font);
157
- --textfield-input-padding: 19px 0 4px;
158
- }
159
-
160
- .Textarea_size_s {
161
- --textfield-gutter-x: 16px;
162
- --textfield-input-block-size: 48px;
163
- --textfield-input-font: var(--typography-text-s-font);
164
- --textfield-input-padding: 21px 0 6px;
165
- }
166
-
167
- .Textarea_size_m {
168
- --textfield-gutter-x: 20px;
169
- --textfield-input-block-size: 56px;
170
- --textfield-input-font: var(--typography-text-m-font);
171
- --textfield-input-padding: 24px 0 6px;
172
- }
173
-
174
- .Textarea_size_l {
175
- --textfield-gutter-x: 24px;
176
- --textfield-input-block-size: 64px;
177
- --textfield-input-font: var(--typography-text-l-font);
178
- --textfield-input-padding: 26px 0 6px;
179
- }
180
-
181
- .Textarea:hover {
182
- --textfield-border-color: var(--color-border-main-hover);
183
- }
184
-
185
- .Textarea_focused,
186
- .Textarea_focused:hover {
187
- --textfield-border-width: var(--border-width-m);
188
- --textfield-background-color: var(--color-background-main);
189
- --textfield-border-color: var(--color-border-action);
190
- }
191
-
192
- .Textarea_error,
193
- .Textarea_error.Textarea:hover,
194
- .Textarea_error.Textarea_focused,
195
- .Textarea_error.Textarea_focused:hover {
196
- --textfield-border-color: var(--color-border-error);
197
- }
198
-
199
- .Textarea_disabled {
200
- --textfield-border-color: var(--color-border-disabled);
201
- --textfield-background-color: var(--color-background-disabled);
202
- --textfield-color: var(--color-content-secondary);
203
- pointer-events: none;
204
- cursor: default;
205
- }
@@ -1,63 +1,5 @@
1
1
  import './Textarea.css';
2
2
  import React from 'react';
3
- import type { HTMLAttributes, TextareaHTMLAttributes, Ref } from 'react';
4
- import type { FormElementSizeVariant } from '../../types/FormElementSizeVariant';
5
- import { type FieldLabelProps } from '../FieldLabel';
3
+ import type { TextareaProps } from './index';
6
4
  export declare const cnTextarea: import("@bem-react/classname").ClassNameFormatter;
7
- export type TextareaSizeVariant = FormElementSizeVariant;
8
- export declare const textareaExpandVariant: readonly ["autoSize", "verticalResize"];
9
- export type TextareaExpandVariant = (typeof textareaExpandVariant)[number];
10
- type TextareaElement = TextareaHTMLAttributes<HTMLTextAreaElement>;
11
- export type TextareaProps = {
12
- /** Атрибут id для элемента input */
13
- id?: string;
14
- /** Атрибут name для элемента input */
15
- name?: string;
16
- /** Лейбл */
17
- label?: string;
18
- /** Размер компонента */
19
- size?: TextareaSizeVariant;
20
- /** Подсказка. Отображается, когда вариант не выбран */
21
- placeholder?: string;
22
- /** Если {true} устанавливает автофокус */
23
- autoFocus?: boolean;
24
- /** Если {true} переводит поле в состояние ошибки */
25
- error?: boolean;
26
- /** Если {true} растягивает поле на всю ширину */
27
- fullWidth?: boolean;
28
- /** Дополнительное описание к полю */
29
- hint?: string | null | undefined;
30
- /** Если {true} делает элемент неактивным */
31
- disabled?: boolean;
32
- /** Если {true} делает элемент обязательным к заполнению */
33
- required?: boolean;
34
- /** Устанавливает максимальное число символов, которое может быть введено пользователем в текстовом поле. */
35
- maxLength?: number;
36
- /** Количество колонок */
37
- cols?: number;
38
- /** Количество строк */
39
- rows?: number;
40
- /** Расширяемость поля */
41
- expand?: TextareaExpandVariant;
42
- /** Выбранное значение */
43
- value?: string;
44
- /** Значение по умолчанию (неконтролируемый компонент) */
45
- defaultValue?: string;
46
- /** Обработчик события на изменение значения поля */
47
- onChange?: TextareaElement['onChange'];
48
- /** Ссылка на элемент textarea */
49
- textareaRef?: Ref<HTMLTextAreaElement>;
50
- /** Свойства элемента textarea */
51
- textareaProps?: TextareaElement & {
52
- 'data-testid'?: string;
53
- };
54
- /** Ссылка на FieldLabel */
55
- labelRef?: FieldLabelProps['ref'];
56
- /** Свойства FieldLabel */
57
- labelProps?: FieldLabelProps;
58
- /** Ссылка на корневой DOM-элемент компонента */
59
- ref?: Ref<HTMLDivElement>;
60
- 'data-testid'?: string;
61
- } & Omit<HTMLAttributes<HTMLDivElement>, 'value' | 'defaultValue' | 'onChange'>;
62
5
  export declare const Textarea: React.ForwardRefExoticComponent<Omit<TextareaProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
63
- export {};
@@ -1,75 +1,21 @@
1
- import { __assign, __read, __rest } from "tslib";
1
+ import { __assign, __rest } from "tslib";
2
2
  import './Textarea.css';
3
- import React, { useMemo, useCallback, useState, useEffect, useRef, forwardRef, } from 'react';
4
- import { useMultiRef } from '../../hooks/useMultiRef';
3
+ import React, { forwardRef } from 'react';
5
4
  import { useThemeProps } from '../../hooks/useThemeProps';
6
5
  import { cn } from '../../utils/classname';
7
- import { FieldHint } from '../FieldHint';
8
- import { FieldLabel } from '../FieldLabel';
6
+ import { FieldControl } from '../FieldControl';
7
+ import { TextareaConsumer } from './components';
8
+ import { TEXTAREA_DEFAULT_SIZE } from './constants';
9
9
  export var cnTextarea = cn('Textarea');
10
- export var textareaExpandVariant = ['autoSize', 'verticalResize'];
11
10
  export var Textarea = forwardRef(function (inProps, ref) {
12
11
  var props = useThemeProps({
13
12
  props: inProps,
14
13
  name: 'Textarea'
15
14
  });
16
- var _a = props.size, size = _a === void 0 ? 'm' : _a, autoFocus = props.autoFocus, maxLength = props.maxLength, expand = props.expand, placeholder = props.placeholder, id = props.id, name = props.name, error = props.error, fullWidth = props.fullWidth, cols = props.cols, rows = props.rows, className = props.className, label = props.label, hint = props.hint, valueProp = props.value, defaultValue = props.defaultValue, onChange = props.onChange, required = props.required, textareaRef = props.textareaRef, disabled = props.disabled, textareaProps = props.textareaProps, labelRef = props.labelRef, labelProps = props.labelProps, other = __rest(props, ["size", "autoFocus", "maxLength", "expand", "placeholder", "id", "name", "error", "fullWidth", "cols", "rows", "className", "label", "hint", "value", "defaultValue", "onChange", "required", "textareaRef", "disabled", "textareaProps", "labelRef", "labelProps"]);
17
- var fieldRef = useRef(null);
18
- var isControlled = typeof valueProp !== 'undefined';
19
- var _b = __read(useState(), 2), focused = _b[0], setFocused = _b[1];
20
- var _c = __read(useState(defaultValue), 2), valueState = _c[0], setValueState = _c[1];
21
- var filled = isControlled ? !!valueProp : !!valueState;
22
- // autoSize
23
- useEffect(function () {
24
- if (fieldRef.current && expand === 'autoSize') {
25
- fieldRef.current.style.blockSize = '0px';
26
- var scrollHeight = fieldRef.current.scrollHeight;
27
- fieldRef.current.style.blockSize = "".concat(scrollHeight, "px");
28
- }
29
- }, [valueProp, valueState]);
30
- // maxLength
31
- var counter = useMemo(function () {
32
- var _a;
33
- var value = valueProp || valueState;
34
- return maxLength ? "".concat((_a = value === null || value === void 0 ? void 0 : value.length) !== null && _a !== void 0 ? _a : 0, " / ").concat(maxLength) : undefined;
35
- }, [maxLength, valueProp, valueState]);
36
- var handleFocus = useCallback(function (e) {
37
- var _a;
38
- setFocused(true);
39
- (_a = textareaProps === null || textareaProps === void 0 ? void 0 : textareaProps.onFocus) === null || _a === void 0 ? void 0 : _a.call(textareaProps, e);
40
- }, [textareaProps === null || textareaProps === void 0 ? void 0 : textareaProps.onFocus]);
41
- var handleBlur = useCallback(function (e) {
42
- var _a;
43
- setFocused(false);
44
- (_a = textareaProps === null || textareaProps === void 0 ? void 0 : textareaProps.onBlur) === null || _a === void 0 ? void 0 : _a.call(textareaProps, e);
45
- }, [textareaProps === null || textareaProps === void 0 ? void 0 : textareaProps.onBlur]);
46
- var handleChange = useCallback(function (e) {
47
- if (disabled)
48
- return;
49
- var value = e.target.value;
50
- if (!isControlled || maxLength || expand === 'autoSize') {
51
- setValueState(value);
52
- }
53
- onChange === null || onChange === void 0 ? void 0 : onChange(e);
54
- }, [onChange, isControlled, disabled, maxLength, expand]);
55
- return (React.createElement("div", __assign({}, other, { className: cnTextarea({
56
- size: size,
57
- required: required,
58
- fullWidth: fullWidth,
59
- error: error,
60
- disabled: disabled,
61
- hasLabel: !!label,
62
- expand: expand,
63
- focused: focused
15
+ var _a = props.size, size = _a === void 0 ? TEXTAREA_DEFAULT_SIZE : _a, autoFocus = props.autoFocus, maxLength = props.maxLength, expand = props.expand, placeholder = props.placeholder, id = props.id, name = props.name, error = props.error, fullWidth = props.fullWidth, cols = props.cols, rows = props.rows, className = props.className, label = props.label, hint = props.hint, value = props.value, defaultValue = props.defaultValue, onChange = props.onChange, required = props.required, textareaRef = props.textareaRef, disabled = props.disabled, textareaProps = props.textareaProps, labelRef = props.labelRef, labelProps = props.labelProps, other = __rest(props, ["size", "autoFocus", "maxLength", "expand", "placeholder", "id", "name", "error", "fullWidth", "cols", "rows", "className", "label", "hint", "value", "defaultValue", "onChange", "required", "textareaRef", "disabled", "textareaProps", "labelRef", "labelProps"]);
16
+ return (React.createElement(FieldControl, __assign({ size: size, error: error, disabled: disabled, required: required, fullWidth: fullWidth }, other, { className: cnTextarea({
17
+ expand: expand
64
18
  }, [className]), ref: ref }),
65
- React.createElement("label", { className: cnTextarea('Body') },
66
- label && (React.createElement(FieldLabel, __assign({ filled: filled, focused: focused, required: required, disabled: disabled, size: size }, labelProps, { className: cnTextarea('Label', [labelProps === null || labelProps === void 0 ? void 0 : labelProps.className]), ref: labelRef }), label)),
67
- React.createElement("textarea", __assign({ id: id, name: name, cols: cols, rows: rows, disabled: disabled, value: valueProp, required: required, defaultValue: defaultValue, maxLength: maxLength, placeholder: placeholder, autoFocus: autoFocus }, textareaProps, { className: cnTextarea('Field', { filled: filled }, [
68
- textareaProps === null || textareaProps === void 0 ? void 0 : textareaProps.className,
69
- ]), onFocus: handleFocus, onBlur: handleBlur, onChange: handleChange, ref: useMultiRef([textareaRef, fieldRef]) })),
70
- React.createElement("fieldset", { className: cnTextarea('Fieldset') })),
71
- (hint || maxLength) && (React.createElement(FieldHint, { size: size, error: error, disabled: disabled },
72
- hint,
73
- maxLength && (React.createElement("span", { className: cnTextarea('Counter', { disabled: disabled }) }, counter))))));
19
+ React.createElement(TextareaConsumer, { autoFocus: autoFocus, maxLength: maxLength, placeholder: placeholder, id: id, name: name, cols: cols, expand: expand, rows: rows, label: label, hint: hint, value: value, defaultValue: defaultValue, onChange: onChange, textareaRef: textareaRef, textareaProps: textareaProps, labelRef: labelRef, labelProps: labelProps })));
74
20
  });
75
21
  Textarea.displayName = 'Textarea';
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import type { TextareaProps } from '../../Textarea';
3
+ export declare const TextareaConsumer: React.FC<TextareaProps>;
@@ -0,0 +1,32 @@
1
+ import { __assign, __read } from "tslib";
2
+ import React, { useContext, useEffect, useRef } from 'react';
3
+ import { useMultiRef } from '../../../hooks/useMultiRef';
4
+ import { FieldControlContext } from '../../FieldControl';
5
+ import { FieldHint } from '../../FieldHint';
6
+ import { FieldInput } from '../../FieldInput';
7
+ import { FieldLabel } from '../../FieldLabel';
8
+ import { Fieldset } from '../../Fieldset';
9
+ import { cnTextarea } from '../../Textarea';
10
+ import { TextareaCounter } from './index';
11
+ export var TextareaConsumer = function (_a) {
12
+ var labelProps = _a.labelProps, labelRef = _a.labelRef, maxLength = _a.maxLength, label = _a.label, id = _a.id, name = _a.name, cols = _a.cols, rows = _a.rows, disabled = _a.disabled, valueProp = _a.value, required = _a.required, defaultValue = _a.defaultValue, placeholder = _a.placeholder, autoFocus = _a.autoFocus, textareaProps = _a.textareaProps, onChange = _a.onChange, textareaRef = _a.textareaRef, expand = _a.expand, hint = _a.hint;
13
+ var fieldRef = useRef(null);
14
+ var context = useContext(FieldControlContext);
15
+ var _b = __read(context, 1), value = _b[0].value;
16
+ // autoSize
17
+ useEffect(function () {
18
+ if (fieldRef.current && expand === 'autoSize') {
19
+ fieldRef.current.style.blockSize = '0px';
20
+ var scrollHeight = fieldRef.current.scrollHeight;
21
+ fieldRef.current.style.blockSize = "".concat(scrollHeight, "px");
22
+ }
23
+ }, [value]);
24
+ return (React.createElement(React.Fragment, null,
25
+ React.createElement("label", { className: cnTextarea('Body') },
26
+ React.createElement(FieldLabel, __assign({}, labelProps, { className: cnTextarea('Label', [labelProps === null || labelProps === void 0 ? void 0 : labelProps.className]), ref: labelRef || (labelProps === null || labelProps === void 0 ? void 0 : labelProps.ref) }), label),
27
+ React.createElement(FieldInput, __assign({ as: "textarea", id: id, name: name, cols: cols, rows: rows, disabled: disabled, value: valueProp, required: required, defaultValue: defaultValue, maxLength: maxLength, placeholder: placeholder, autoFocus: autoFocus, onChange: onChange }, textareaProps, { className: cnTextarea('Field', {}, [textareaProps === null || textareaProps === void 0 ? void 0 : textareaProps.className]), ref: useMultiRef([textareaRef || (textareaProps === null || textareaProps === void 0 ? void 0 : textareaProps.ref), fieldRef]) })),
28
+ React.createElement(Fieldset, null)),
29
+ React.createElement(FieldHint, null,
30
+ hint,
31
+ maxLength && React.createElement(TextareaCounter, { maxLength: maxLength }))));
32
+ };
@@ -0,0 +1,7 @@
1
+ import type { ComponentPropsWithRef, FC } from 'react';
2
+ import type { TextareaProps } from '../index';
3
+ export type TextareaCounter = ComponentPropsWithRef<'span'> & {
4
+ maxLength: TextareaProps['maxLength'];
5
+ disabled?: TextareaProps['disabled'];
6
+ };
7
+ export declare const TextareaCounter: FC<TextareaCounter>;
@@ -0,0 +1,21 @@
1
+ import { __read } from "tslib";
2
+ import React, { useContext } from 'react';
3
+ import { FieldControlContext } from '../../FieldControl';
4
+ import { cnTextarea } from '../index';
5
+ export var TextareaCounter = function (_a) {
6
+ var _b, _c, _d;
7
+ var maxLength = _a.maxLength, disabledProp = _a.disabled;
8
+ var context = useContext(FieldControlContext);
9
+ var _e = __read(context, 1), fieldControl = _e[0];
10
+ var disabled = disabledProp;
11
+ // maxLength
12
+ var counter = maxLength
13
+ ? "".concat((_d = (_c = (_b = fieldControl.value) === null || _b === void 0 ? void 0 : _b.toString()) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0, " / ").concat(maxLength)
14
+ : undefined;
15
+ if (fieldControl) {
16
+ if (disabled === undefined && fieldControl.disabled) {
17
+ disabled = fieldControl.disabled;
18
+ }
19
+ }
20
+ return React.createElement("span", { className: cnTextarea('Counter', { disabled: disabled }) }, counter);
21
+ };
@@ -0,0 +1,2 @@
1
+ export * from './TextareaCounter';
2
+ export * from './TextareaConsumer';
@@ -0,0 +1,2 @@
1
+ export * from './TextareaCounter';
2
+ export * from './TextareaConsumer';
@@ -0,0 +1 @@
1
+ export declare const TEXTAREA_DEFAULT_SIZE = "m";
@@ -0,0 +1 @@
1
+ export var TEXTAREA_DEFAULT_SIZE = 'm';
@@ -1 +1,2 @@
1
1
  export * from './Textarea';
2
+ export * from './types';
@@ -1 +1,2 @@
1
1
  export * from './Textarea';
2
+ export * from './types';
@@ -0,0 +1,69 @@
1
+ import type { Ref, ComponentPropsWithRef, ComponentRef } from 'react';
2
+ import type { FormElementSizeVariant } from '../../types/FormElementSizeVariant';
3
+ import type { FIELD_CONTROL_DEFAULT_TAG } from '../FieldControl';
4
+ import type { FieldLabelProps } from '../FieldLabel';
5
+ export type TextareaSizeVariant = FormElementSizeVariant;
6
+ export declare const textareaExpandVariant: readonly ["autoSize", "verticalResize"];
7
+ export type TextareaExpandVariant = (typeof textareaExpandVariant)[number];
8
+ type TextareaPropsDeprecated = {
9
+ /**
10
+ * deprecated
11
+ * Ссылка на FieldLabel
12
+ * */
13
+ labelRef?: FieldLabelProps['ref'];
14
+ /**
15
+ * deprecated
16
+ * Ссылка на элемент textarea
17
+ * */
18
+ textareaRef?: Ref<HTMLTextAreaElement>;
19
+ };
20
+ type TextareaElement = ComponentPropsWithRef<'textarea'>;
21
+ export type TextareaProps = 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?: TextareaSizeVariant;
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
+ /** Если {true} делает элемент неактивным */
41
+ disabled?: boolean;
42
+ /** Если {true} делает элемент обязательным к заполнению */
43
+ required?: boolean;
44
+ /** Устанавливает максимальное число символов, которое может быть введено пользователем в текстовом поле. */
45
+ maxLength?: number;
46
+ /** Количество колонок */
47
+ cols?: number;
48
+ /** Количество строк */
49
+ rows?: number;
50
+ /** Расширяемость поля */
51
+ expand?: TextareaExpandVariant;
52
+ /** Выбранное значение */
53
+ value?: string;
54
+ /** Значение по умолчанию (неконтролируемый компонент) */
55
+ defaultValue?: string;
56
+ /** Обработчик события на изменение значения поля */
57
+ onChange?: TextareaElement['onChange'];
58
+ /** Свойства элемента textarea */
59
+ textareaProps?: TextareaElement & {
60
+ 'data-testid'?: string;
61
+ };
62
+ /** Свойства FieldLabel */
63
+ labelProps?: FieldLabelProps;
64
+ /** Ссылка на корневой DOM-элемент компонента */
65
+ ref?: ComponentRef<typeof FIELD_CONTROL_DEFAULT_TAG>;
66
+ /** data-атрибут для тестирования */
67
+ 'data-testid'?: string;
68
+ } & TextareaPropsDeprecated;
69
+ export {};
@@ -0,0 +1 @@
1
+ export var textareaExpandVariant = ['autoSize', 'verticalResize'];
@@ -1,5 +1,6 @@
1
1
  import './ThemeProvider.css';
2
- import React, { ComponentRef, ElementType } from 'react';
2
+ import type { ComponentRef, ElementType } from 'react';
3
+ import React from 'react';
3
4
  import { type PolymorphicComponentPropsWithoutRef } from '../../utils/polymorphicComponentWithRef';
4
5
  import type { Theme } from './types';
5
6
  export declare const THEME_DEFAULT_TAG = "div";
@@ -12,6 +12,7 @@ import type { CollapseProps } from '../Collapse';
12
12
  import type { ContainerProps } from '../Container';
13
13
  import type { DataListProps } from '../DataList';
14
14
  import type { DividerProps } from '../Divider';
15
+ import type { FieldControlProps } from '../FieldControl';
15
16
  import type { FileProps } from '../File';
16
17
  import type { FilePickerProps } from '../FilePicker';
17
18
  import type { FormGroupProps } from '../FormGroup';
@@ -72,6 +73,7 @@ export type Theme = {
72
73
  Container?: Partial<ContainerProps>;
73
74
  DataList?: Partial<DataListProps>;
74
75
  Divider?: Partial<DividerProps>;
76
+ FieldControl?: Partial<FieldControlProps>;
75
77
  File?: Partial<FileProps>;
76
78
  FilePicker?: Partial<FilePickerProps>;
77
79
  FormGroup?: Partial<FormGroupProps>;
@@ -1,6 +1,6 @@
1
1
  import { __assign, __read, __rest } from "tslib";
2
2
  import './Tooltip.css';
3
- import React, { forwardRef, useRef, useMemo, useState, useEffect, } from 'react';
3
+ import React, { forwardRef, useRef, useMemo, useState, useEffect } from 'react';
4
4
  import { useControlled } from '../../hooks/useControlled';
5
5
  import { useDebounceCallback } from '../../hooks/useDebounceCallback';
6
6
  import { useMultiRef } from '../../hooks/useMultiRef';
@@ -1,6 +1,6 @@
1
1
  import type { Ref, ReactNode, ReactElement, ComponentPropsWithRef } from 'react';
2
2
  import type { PopoverBaseProps } from '../Popover';
3
- import { TOOLTIP_DEFAULT_TAG } from './constants';
3
+ import type { TOOLTIP_DEFAULT_TAG } from './constants';
4
4
  export declare const tooltipSizeVariant: readonly ["xs", "s"];
5
5
  export type TooltipSizeVariant = (typeof tooltipSizeVariant)[number];
6
6
  export declare const tooltipVariant: readonly ["light", "dark"];
@@ -1,6 +1,5 @@
1
- import * as React from 'react';
2
- import type { Dispatch, SetStateAction, RefCallback } from 'react';
3
- type Ref<T> = React.Ref<T> | Dispatch<SetStateAction<T | undefined>> | null;
1
+ import type { Dispatch, SetStateAction, RefCallback, Ref as ReactRef } from 'react';
2
+ type Ref<T> = ReactRef<T> | Dispatch<SetStateAction<T | undefined>> | null;
4
3
  /** Создает несколько ссылок (ref) на один DOM-элемент. */
5
4
  export declare function useMultiRef<T>(refs: Array<Ref<T> | undefined>): RefCallback<T> | null;
6
5
  export {};
@@ -1,4 +1,4 @@
1
- import { BreakpointVariant } from './Breakpoints';
1
+ import type { BreakpointVariant } from './Breakpoints';
2
2
  export type ResponsiveValue<T> = T | {
3
3
  [key in BreakpointVariant]?: T;
4
4
  };
@@ -1,3 +1,3 @@
1
- import React from 'react';
1
+ import type { KeyboardEvent as ReactKeyboardEvent } from 'react';
2
2
  import type { KeyCode } from '../types/KeyCode';
3
- export declare const isKey: (event: KeyboardEvent | React.KeyboardEvent, key: KeyCode) => boolean;
3
+ export declare const isKey: (event: KeyboardEvent | ReactKeyboardEvent, key: KeyCode) => boolean;
@@ -1,4 +1,3 @@
1
- import React from 'react';
2
1
  import type { ComponentPropsWithRef, ElementType, ComponentPropsWithoutRef } from 'react';
3
2
  declare const defaultElement = "div";
4
3
  export type PolymorphicComponentPropsWithRef<Props, As extends ElementType> = Props & {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ozen-ui/kit",
3
- "version": "0.8.0",
3
+ "version": "0.9.1",
4
4
  "description": "React component library",
5
5
  "files": [
6
6
  "*"