@ozen-ui/kit 0.16.1 → 0.17.0-canary.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 (130) hide show
  1. package/__inner__/cjs/components/DataList/DataList.css +19 -46
  2. package/__inner__/cjs/components/DataList/DataList.js +101 -40
  3. package/__inner__/cjs/components/DataList/components/DataListCheckIcon/DataListCheckIcon.css +13 -0
  4. package/__inner__/cjs/components/{Select/components/SelectCheckIcon/SelectCheckIcon.d.ts → DataList/components/DataListCheckIcon/DataListCheckIcon.d.ts} +2 -2
  5. package/__inner__/cjs/components/DataList/components/DataListCheckIcon/DataListCheckIcon.js +16 -0
  6. package/__inner__/cjs/components/DataList/components/DataListCheckIcon/index.d.ts +1 -0
  7. package/__inner__/cjs/components/DataList/components/DataListCheckIcon/index.js +4 -0
  8. package/__inner__/cjs/components/DataList/components/DataListOption/DataListOption.css +20 -0
  9. package/__inner__/{esm/components/DataList/components → cjs/components/DataList/components/DataListOption}/DataListOption.d.ts +15 -4
  10. package/__inner__/cjs/components/DataList/components/DataListOption/DataListOption.js +39 -0
  11. package/__inner__/cjs/components/DataList/components/DataListOption/index.d.ts +1 -0
  12. package/__inner__/cjs/components/{Select/components/SelectCheckIcon → DataList/components/DataListOption}/index.js +1 -1
  13. package/__inner__/cjs/components/DataList/constants.d.ts +1 -0
  14. package/__inner__/cjs/components/DataList/constants.js +3 -1
  15. package/__inner__/cjs/components/DataList/helpers/index.d.ts +4 -0
  16. package/__inner__/cjs/components/DataList/helpers/index.js +7 -0
  17. package/__inner__/cjs/components/DataList/helpers/lastSelectedValue.d.ts +1 -0
  18. package/__inner__/cjs/components/DataList/helpers/lastSelectedValue.js +8 -0
  19. package/__inner__/cjs/components/DataList/helpers/types.d.ts +10 -0
  20. package/__inner__/cjs/components/DataList/helpers/types.js +7 -0
  21. package/__inner__/cjs/components/DataList/helpers/useDataListNavigation.d.ts +23 -0
  22. package/__inner__/cjs/components/DataList/helpers/useDataListNavigation.js +85 -0
  23. package/__inner__/cjs/components/DataList/helpers/useScrollContainerToElement.d.ts +3 -0
  24. package/__inner__/cjs/components/DataList/helpers/useScrollContainerToElement.js +15 -0
  25. package/__inner__/cjs/components/DataList/types.d.ts +3 -4
  26. package/__inner__/cjs/components/DataList/types.js +0 -5
  27. package/__inner__/cjs/components/FieldControl/FieldControl.js +1 -0
  28. package/__inner__/cjs/components/Input/Input.js +1 -1
  29. package/__inner__/cjs/components/Input/types.d.ts +3 -2
  30. package/__inner__/cjs/components/Select/Select.css +33 -128
  31. package/__inner__/cjs/components/Select/Select.d.ts +2 -3
  32. package/__inner__/cjs/components/Select/Select.js +92 -80
  33. package/__inner__/cjs/components/Select/components/SelectConsumer/SelectInputConsumer.d.ts +5 -0
  34. package/__inner__/cjs/components/Select/components/SelectConsumer/SelectInputConsumer.js +21 -0
  35. package/__inner__/cjs/components/Select/components/SelectConsumer/index.d.ts +1 -0
  36. package/__inner__/cjs/components/Select/components/SelectConsumer/index.js +4 -0
  37. package/__inner__/cjs/components/Select/components/SelectInput/SelectInput.d.ts +1 -72
  38. package/__inner__/cjs/components/Select/components/SelectInput/SelectInput.js +23 -22
  39. package/__inner__/cjs/components/Select/components/SelectInput/index.d.ts +1 -0
  40. package/__inner__/cjs/components/Select/components/SelectInput/index.js +1 -0
  41. package/__inner__/cjs/components/Select/components/SelectInput/types.d.ts +89 -0
  42. package/__inner__/cjs/components/Select/components/SelectInput/types.js +2 -0
  43. package/__inner__/cjs/components/Select/components/index.d.ts +0 -1
  44. package/__inner__/cjs/components/Select/components/index.js +0 -1
  45. package/__inner__/cjs/components/Select/constants.d.ts +1 -1
  46. package/__inner__/cjs/components/Select/constants.js +2 -2
  47. package/__inner__/cjs/components/Select/helpers/index.d.ts +1 -0
  48. package/__inner__/cjs/components/Select/helpers/index.js +4 -0
  49. package/__inner__/cjs/components/Select/helpers/types.d.ts +8 -0
  50. package/__inner__/cjs/components/Select/helpers/types.js +7 -0
  51. package/__inner__/cjs/components/Select/index.d.ts +2 -1
  52. package/__inner__/cjs/components/Select/index.js +5 -4
  53. package/__inner__/cjs/components/Select/types.d.ts +31 -18
  54. package/__inner__/cjs/components/Textarea/Textarea.js +1 -1
  55. package/__inner__/cjs/components/Textarea/types.d.ts +2 -2
  56. package/__inner__/cjs/utils/scrollContainerToElement.d.ts +3 -4
  57. package/__inner__/esm/components/DataList/DataList.css +19 -46
  58. package/__inner__/esm/components/DataList/DataList.js +101 -40
  59. package/__inner__/esm/components/DataList/components/DataListCheckIcon/DataListCheckIcon.css +13 -0
  60. package/__inner__/esm/components/{Select/components/SelectCheckIcon/SelectCheckIcon.d.ts → DataList/components/DataListCheckIcon/DataListCheckIcon.d.ts} +2 -2
  61. package/__inner__/esm/components/DataList/components/DataListCheckIcon/DataListCheckIcon.js +11 -0
  62. package/__inner__/esm/components/DataList/components/DataListCheckIcon/index.d.ts +1 -0
  63. package/__inner__/esm/components/DataList/components/DataListCheckIcon/index.js +1 -0
  64. package/__inner__/esm/components/DataList/components/DataListOption/DataListOption.css +20 -0
  65. package/__inner__/{cjs/components/DataList/components → esm/components/DataList/components/DataListOption}/DataListOption.d.ts +15 -4
  66. package/__inner__/esm/components/DataList/components/DataListOption/DataListOption.js +36 -0
  67. package/__inner__/esm/components/DataList/components/DataListOption/index.d.ts +1 -0
  68. package/__inner__/esm/components/DataList/components/DataListOption/index.js +1 -0
  69. package/__inner__/esm/components/DataList/constants.d.ts +1 -0
  70. package/__inner__/esm/components/DataList/constants.js +2 -0
  71. package/__inner__/esm/components/DataList/helpers/index.d.ts +4 -0
  72. package/__inner__/esm/components/DataList/helpers/index.js +4 -0
  73. package/__inner__/esm/components/DataList/helpers/lastSelectedValue.d.ts +1 -0
  74. package/__inner__/esm/components/DataList/helpers/lastSelectedValue.js +4 -0
  75. package/__inner__/esm/components/DataList/helpers/types.d.ts +10 -0
  76. package/__inner__/esm/components/DataList/helpers/types.js +2 -0
  77. package/__inner__/esm/components/DataList/helpers/useDataListNavigation.d.ts +23 -0
  78. package/__inner__/esm/components/DataList/helpers/useDataListNavigation.js +81 -0
  79. package/__inner__/esm/components/DataList/helpers/useScrollContainerToElement.d.ts +3 -0
  80. package/__inner__/esm/components/DataList/helpers/useScrollContainerToElement.js +11 -0
  81. package/__inner__/esm/components/DataList/types.d.ts +3 -4
  82. package/__inner__/esm/components/DataList/types.js +1 -2
  83. package/__inner__/esm/components/FieldControl/FieldControl.js +1 -0
  84. package/__inner__/esm/components/Input/Input.js +1 -1
  85. package/__inner__/esm/components/Input/types.d.ts +3 -2
  86. package/__inner__/esm/components/Select/Select.css +33 -128
  87. package/__inner__/esm/components/Select/Select.d.ts +2 -3
  88. package/__inner__/esm/components/Select/Select.js +96 -84
  89. package/__inner__/esm/components/Select/components/SelectConsumer/SelectInputConsumer.d.ts +5 -0
  90. package/__inner__/esm/components/Select/components/SelectConsumer/SelectInputConsumer.js +17 -0
  91. package/__inner__/esm/components/Select/components/SelectConsumer/index.d.ts +1 -0
  92. package/__inner__/esm/components/Select/components/SelectConsumer/index.js +1 -0
  93. package/__inner__/esm/components/Select/components/SelectInput/SelectInput.d.ts +1 -72
  94. package/__inner__/esm/components/Select/components/SelectInput/SelectInput.js +25 -24
  95. package/__inner__/esm/components/Select/components/SelectInput/index.d.ts +1 -0
  96. package/__inner__/esm/components/Select/components/SelectInput/index.js +1 -0
  97. package/__inner__/esm/components/Select/components/SelectInput/types.d.ts +89 -0
  98. package/__inner__/esm/components/Select/components/SelectInput/types.js +1 -0
  99. package/__inner__/esm/components/Select/components/index.d.ts +0 -1
  100. package/__inner__/esm/components/Select/components/index.js +0 -1
  101. package/__inner__/esm/components/Select/constants.d.ts +1 -1
  102. package/__inner__/esm/components/Select/constants.js +1 -1
  103. package/__inner__/esm/components/Select/helpers/index.d.ts +1 -0
  104. package/__inner__/esm/components/Select/helpers/index.js +1 -0
  105. package/__inner__/esm/components/Select/helpers/types.d.ts +8 -0
  106. package/__inner__/esm/components/Select/helpers/types.js +2 -0
  107. package/__inner__/esm/components/Select/index.d.ts +2 -1
  108. package/__inner__/esm/components/Select/index.js +2 -1
  109. package/__inner__/esm/components/Select/types.d.ts +31 -18
  110. package/__inner__/esm/components/Textarea/Textarea.js +1 -1
  111. package/__inner__/esm/components/Textarea/types.d.ts +2 -2
  112. package/__inner__/esm/utils/scrollContainerToElement.d.ts +3 -4
  113. package/package.json +1 -1
  114. package/__inner__/cjs/components/DataList/DataListProvider.d.ts +0 -16
  115. package/__inner__/cjs/components/DataList/DataListProvider.js +0 -11
  116. package/__inner__/cjs/components/DataList/components/DataListOption.js +0 -40
  117. package/__inner__/cjs/components/DataList/useDataListNavigation.d.ts +0 -23
  118. package/__inner__/cjs/components/DataList/useDataListNavigation.js +0 -109
  119. package/__inner__/cjs/components/Select/components/SelectCheckIcon/SelectCheckIcon.css +0 -13
  120. package/__inner__/cjs/components/Select/components/SelectCheckIcon/SelectCheckIcon.js +0 -14
  121. package/__inner__/cjs/components/Select/components/SelectCheckIcon/index.d.ts +0 -1
  122. package/__inner__/esm/components/DataList/DataListProvider.d.ts +0 -16
  123. package/__inner__/esm/components/DataList/DataListProvider.js +0 -7
  124. package/__inner__/esm/components/DataList/components/DataListOption.js +0 -37
  125. package/__inner__/esm/components/DataList/useDataListNavigation.d.ts +0 -23
  126. package/__inner__/esm/components/DataList/useDataListNavigation.js +0 -105
  127. package/__inner__/esm/components/Select/components/SelectCheckIcon/SelectCheckIcon.css +0 -13
  128. package/__inner__/esm/components/Select/components/SelectCheckIcon/SelectCheckIcon.js +0 -9
  129. package/__inner__/esm/components/Select/components/SelectCheckIcon/index.d.ts +0 -1
  130. package/__inner__/esm/components/Select/components/SelectCheckIcon/index.js +0 -1
@@ -0,0 +1,3 @@
1
+ import type { RefObject } from 'react';
2
+ import type { ScrollContainerToElement } from '../../../utils/scrollContainerToElement';
3
+ export declare function useScrollContainerToElement(container: RefObject<HTMLElement>, element: RefObject<HTMLElement>, behavior?: ScrollContainerToElement['behavior']): void;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useScrollContainerToElement = void 0;
4
+ var react_1 = require("react");
5
+ var scrollContainerToElement_1 = require("../../../utils/scrollContainerToElement");
6
+ function useScrollContainerToElement(container, element, behavior) {
7
+ (0, react_1.useEffect)(function () {
8
+ (0, scrollContainerToElement_1.scrollContainerToElement)({
9
+ container: container.current,
10
+ element: element.current,
11
+ behavior: behavior,
12
+ });
13
+ }, [container, element]);
14
+ }
15
+ exports.useScrollContainerToElement = useScrollContainerToElement;
@@ -5,11 +5,12 @@ import type { PolymorphicComponentPropsWithRef, PolymorphicComponentRef } from '
5
5
  import type { ListProps } from '../List';
6
6
  import type { PopoverBaseProps } from '../Popover';
7
7
  import type { DATA_LIST_DEFAULT_TAG } from './constants';
8
+ export type DataListValue = string | number;
9
+ export type DataListSelected<MULTIPLE extends boolean> = (MULTIPLE extends true ? DataListValue[] : DataListValue) | undefined;
8
10
  export type DataListPayload<MULTIPLE extends boolean> = {
9
11
  name?: string;
10
- value: MULTIPLE extends true ? string[] : string;
12
+ value: DataListSelected<MULTIPLE>;
11
13
  };
12
- export type DataListSelected<MULTIPLE extends boolean> = (MULTIPLE extends true ? string[] : string) | undefined;
13
14
  export type DataListOnSelect<MULTIPLE extends boolean> = (event: React.SyntheticEvent | KeyboardEvent, payload: DataListPayload<MULTIPLE>) => void;
14
15
  export type DataListBaseProps<MULTIPLE extends boolean = false> = {
15
16
  /** Имя списка */
@@ -33,8 +34,6 @@ export type DataListBaseProps<MULTIPLE extends boolean = false> = {
33
34
  /** Свойства компонента List */
34
35
  listProps?: ListProps;
35
36
  } & Omit<PopoverBaseProps, 'onSelect'>;
36
- export declare const isMultipleParams: (params: DataListBaseProps<boolean>) => params is DataListBaseProps<true>;
37
- export declare const isNotMultipleParams: (params: DataListBaseProps<boolean>) => params is DataListBaseProps<false>;
38
37
  export type DataListRef = PolymorphicComponentRef<typeof DATA_LIST_DEFAULT_TAG>;
39
38
  export type DataListProps<As extends ElementType = typeof DATA_LIST_DEFAULT_TAG, MULTIPLE extends boolean = false> = PolymorphicComponentPropsWithRef<DataListBaseProps<MULTIPLE>, As>;
40
39
  export type DataListComponent = <As extends ElementType = typeof DATA_LIST_DEFAULT_TAG, MULTIPLE extends boolean = false>(props: PolymorphicComponentPropsWithRef<DataListBaseProps<MULTIPLE>, As>) => React.ReactElement | null;
@@ -1,7 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isNotMultipleParams = exports.isMultipleParams = void 0;
4
- var isMultipleParams = function (params) { return !!params.multiple; };
5
- exports.isMultipleParams = isMultipleParams;
6
- var isNotMultipleParams = function (params) { return !params.multiple; };
7
- exports.isNotMultipleParams = isNotMultipleParams;
@@ -71,6 +71,7 @@ exports.FieldControl = (0, polymorphicComponentWithRef_1.polymorphicComponentWit
71
71
  fullWidth: fullWidth,
72
72
  disabled: disabled,
73
73
  required: required,
74
+ label: label,
74
75
  size: size,
75
76
  filled: filled,
76
77
  focused: focused,
@@ -21,7 +21,7 @@ exports.Input = (0, react_1.forwardRef)(function (inProps, ref) {
21
21
  props: inProps,
22
22
  name: 'Input',
23
23
  });
24
- var _a = props.size, size = _a === void 0 ? constants_1.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, bodyProps = props.bodyProps, other = tslib_1.__rest(props, ["size", "label", "error", "autoFocus", "placeholder", "id", "name", "type", "renderLeft", "renderRight", "inputRef", "fullWidth", "disabled", "hint", "required", "className", "inputProps", "value", "defaultValue", "onChange", "labelProps", "labelRef", "bodyProps"]);
24
+ var _a = props.size, size = _a === void 0 ? constants_1.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, fullWidth = props.fullWidth, disabled = props.disabled, hint = props.hint, required = props.required, className = props.className, value = props.value, defaultValue = props.defaultValue, onChange = props.onChange, inputProps = props.inputProps, bodyProps = props.bodyProps, labelProps = props.labelProps, inputRef = props.inputRef, labelRef = props.labelRef, other = tslib_1.__rest(props, ["size", "label", "error", "autoFocus", "placeholder", "id", "name", "type", "renderLeft", "renderRight", "fullWidth", "disabled", "hint", "required", "className", "value", "defaultValue", "onChange", "inputProps", "bodyProps", "labelProps", "inputRef", "labelRef"]);
25
25
  var bodyInnerRef = (0, react_1.useRef)(null);
26
26
  var fieldInnerRef = (0, react_1.useRef)(null);
27
27
  /* Хук useEventListener необходим для того, чтобы при нажатии на кнопку мыши
@@ -8,12 +8,13 @@ export type InputTypeVariant = (typeof inputTypeVariant)[number];
8
8
  export type InputSizeVariant = FormElementSizeVariant;
9
9
  type InputPropsDeprecated = {
10
10
  /**
11
- * deprecated
12
11
  * Ссылка на FieldLabel
12
+ * @deprecated Используйте labelProps.ref
13
13
  * */
14
14
  labelRef?: FieldLabelProps['ref'];
15
- /** deprecated
15
+ /**
16
16
  * Ссылка на элемент input
17
+ * @deprecated Используйте inputProps.ref
17
18
  * */
18
19
  inputRef?: Ref<HTMLInputElement>;
19
20
  };
@@ -1,19 +1,8 @@
1
- /* stylelint-disable */
2
1
  .Select {
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);
8
- display: inline-flex;
9
- vertical-align: top;
10
- flex-direction: column;
11
2
  min-inline-size: 120px;
12
3
  }
13
- .Select-Option {
14
- padding-inline-end: 24px;
15
- }
16
- .Select-Input {
4
+
5
+ .Select-Input {
17
6
  inset-block-end: 0;
18
7
  inset-inline-start: 0;
19
8
  position: absolute;
@@ -22,7 +11,8 @@
22
11
  inline-size: 100%;
23
12
  box-sizing: border-box;
24
13
  }
25
- .Select-Body {
14
+
15
+ .Select-Body {
26
16
  position: relative;
27
17
  display: flex;
28
18
  -moz-column-gap: var(--textfield-input-gap);
@@ -37,12 +27,14 @@
37
27
  cursor: pointer;
38
28
  outline: none;
39
29
  }
40
- .Select-FieldContainer {
30
+
31
+ .Select-FieldContainer {
41
32
  inline-size: 100%;
42
33
  position: relative;
43
34
  overflow: hidden;
44
35
  }
45
- .Select-Field {
36
+
37
+ .Select-Field {
46
38
  border: none;
47
39
  position: relative;
48
40
  display: flex;
@@ -51,143 +43,56 @@
51
43
  background: none;
52
44
  color: var(--textfield-color);
53
45
  box-sizing: border-box;
54
- block-size: var(--textfield-input-block-size);
46
+ block-size: var(--textfield-input-height);
55
47
  align-items: center;
56
48
  }
57
- .Select-Field span {
49
+
50
+ .Select-Field span {
58
51
  overflow: hidden;
59
52
  text-overflow: ellipsis;
60
53
  white-space: nowrap;
61
54
  }
62
- .Select-Field_asPlaceholder {
55
+
56
+ .Select-Field_asPlaceholder {
63
57
  color: var(--color-content-tertiary);
64
58
  }
65
- .Select_multiline .Select-FieldContainer {
59
+
60
+ .Select_multiline .Select-FieldContainer {
66
61
  overflow: auto;
67
62
  }
68
- .Select_multiline .Select-Field {
63
+
64
+ .Select_multiline .Select-Field {
69
65
  block-size: initial;
70
- min-block-size: var(--textfield-input-block-size);
66
+ min-block-size: var(--textfield-input-height);
71
67
  }
72
- .Select_multiline .Select-Field span {
68
+
69
+ .Select_multiline .Select-Field > span {
73
70
  overflow: auto;
74
71
  text-overflow: initial;
75
72
  white-space: initial;
76
73
  }
77
- .Select_size_2xs {
78
- --textfield-gutter-x: 12px;
79
- --textfield-input-block-size: 32px;
80
- --textfield-input-font: var(--typography-text-2xs-font);
81
- --textfield-input-padding: 8px 0 8px;
82
- --textfield-input-gap: var(--space-s);
83
- }
84
- .Select_size_xs {
85
- --textfield-gutter-x: 12px;
86
- --textfield-input-block-size: 40px;
87
- --textfield-input-font: var(--typography-text-xs-font);
88
- --textfield-input-padding: 19px 0 4px;
89
- --textfield-input-gap: var(--space-s);
90
- }
91
- .Select_size_s {
92
- --textfield-gutter-x: 16px;
93
- --textfield-input-block-size: 48px;
94
- --textfield-input-font: var(--typography-text-s-font);
95
- --textfield-input-padding: 21px 0 6px;
96
- --textfield-input-gap: var(--space-m);
97
- }
98
- .Select_size_m {
99
- --textfield-gutter-x: 20px;
100
- --textfield-input-block-size: 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
- }
105
- .Select_size_l {
106
- --textfield-gutter-x: 24px;
107
- --textfield-input-block-size: 64px;
108
- --textfield-input-font: var(--typography-text-l-font);
109
- --textfield-input-padding: 26px 0 6px;
110
- --textfield-input-gap: var(--space-l);
111
- }
112
- .Select_fullWidth {
113
- inline-size: 100%;
114
- }
115
- .Select_hasLabel .Select-Field {
116
- padding: var(--textfield-input-padding);
117
- font: var(--textfield-input-font);
118
- }
119
- .Select:hover {
120
- --textfield-border-color: var(--color-border-main-hover);
121
- }
122
- .Select_focused,
123
- .Select_focused:hover {
124
- --textfield-border-width: var(--border-width-m);
125
- --textfield-background-color: var(--color-background-main);
126
- --textfield-border-color: var(--color-border-action);
127
- }
128
- .Select_error,
129
- .Select_error.Select:hover,
130
- .Select_error.Select_focused,
131
- .Select_error.Select_focused:hover {
132
- --textfield-border-color: var(--color-border-error);
133
- }
134
- .Select_disabled {
135
- --textfield-border-color: var(--color-border-disabled);
136
- --textfield-background-color: var(--color-background-disabled);
137
- --textfield-color: var(--color-content-secondary);
138
- pointer-events: none;
139
- cursor: default;
140
- }
141
- .Select-RenderLeft {
142
- pointer-events: none;
143
- }
144
- .Select-RenderRight {
74
+
75
+ .Select-RenderLeft,
76
+ .Select-RenderRight {
145
77
  pointer-events: none;
146
78
  }
147
- .Select-DropDownIcon {
79
+
80
+ .Select-DropDownIcon {
148
81
  display: flex;
149
82
  align-items: center;
150
83
  transition: transform var(--transition-default);
151
84
  will-change: transform;
152
85
  }
153
- .Select-DropDownIcon_open {
86
+
87
+ .Select-DropDownIcon_open {
154
88
  transform: rotate(180deg);
155
89
  }
90
+
91
+ .FieldControl_hasLabel .Select-Field {
92
+ padding: var(--textfield-input-padding);
93
+ font: var(--textfield-input-font);
94
+ }
95
+
156
96
  .Select .ListItemButton::after {
157
97
  content: none;
158
98
  }
159
- .Select_animation-enter {
160
- opacity: 0;
161
- transform: translate(0, calc(var(--space-s) * -1));
162
- pointer-events: none;
163
- }
164
- .Select_animation-enter-active {
165
- opacity: 1;
166
- transition:
167
- opacity var(--transition-default),
168
- transform var(--transition-default);
169
- transform: translate(0);
170
- pointer-events: none;
171
- }
172
- .Select_animation-enter-done {
173
- opacity: 1;
174
- transform: translate(0);
175
- }
176
- .Select_animation-exit {
177
- opacity: 1;
178
- transform: translate(0);
179
- pointer-events: none;
180
- }
181
- .Select_animation-exit-active {
182
- opacity: 0;
183
- transition:
184
- opacity var(--transition-default),
185
- transform var(--transition-default);
186
- transform: translate(0, calc(var(--space-s) * -1));
187
- pointer-events: none;
188
- }
189
- .Select_animation-exit-done {
190
- opacity: 0;
191
- transform: translate(0, calc(var(--space-s) * -1));
192
- pointer-events: none;
193
- }
@@ -1,5 +1,4 @@
1
1
  import './Select.css';
2
- import React from 'react';
3
- import type { SelectProps } from './types';
2
+ import type { SelectComponent } from './types';
4
3
  export declare const cnSelect: import("@bem-react/classname").ClassNameFormatter;
5
- export declare const Select: React.ForwardRefExoticComponent<SelectProps & React.RefAttributes<HTMLDivElement>>;
4
+ export declare const Select: SelectComponent;
@@ -5,48 +5,70 @@ var tslib_1 = require("tslib");
5
5
  require("./Select.css");
6
6
  var react_1 = tslib_1.__importStar(require("react"));
7
7
  var react_is_1 = require("react-is");
8
- var useBoolean_1 = require("../../hooks/useBoolean");
9
- var useClickOutside_1 = require("../../hooks/useClickOutside");
10
8
  var useControlled_1 = require("../../hooks/useControlled");
11
9
  var useMultiRef_1 = require("../../hooks/useMultiRef");
12
10
  var useThemeProps_1 = require("../../hooks/useThemeProps");
13
11
  var classname_1 = require("../../utils/classname");
14
- var getIconSizeToFormElement_1 = require("../../utils/getIconSizeToFormElement");
15
12
  var isKey_1 = require("../../utils/isKey");
16
- var Menu_1 = require("../Menu");
13
+ var DataList_1 = require("../DataList");
17
14
  var components_1 = require("./components");
18
15
  var constants_1 = require("./constants");
19
- var index_1 = require("./index");
16
+ var helpers_1 = require("./helpers");
20
17
  exports.cnSelect = (0, classname_1.cn)('Select');
21
- exports.Select = (0, react_1.forwardRef)(function (inProps, ref) {
18
+ var SelectRender = function (inProps, ref) {
22
19
  var props = (0, useThemeProps_1.useThemeProps)({
23
20
  props: inProps,
24
21
  name: 'Select',
25
22
  });
26
- var id = props.id, name = props.name, _a = props.size, size = _a === void 0 ? constants_1.SELECT_DEFAULT_AUTO_SIZE : _a, _b = props.autoFocus, autoFocus = _b === void 0 ? constants_1.SELECT_DEFAULT_AUTO_FOCUS : _b, _c = props.fullWidth, fullWidth = _c === void 0 ? constants_1.SELECT_DEFAULT_FULL_WIDTH : _c, _d = props.disabled, disabled = _d === void 0 ? constants_1.SELECT_DEFAULT_DISABLED : _d, _e = props.required, required = _e === void 0 ? constants_1.SELECT_DEFAULT_REQUIRED : _e, _f = props.multiline, multiline = _f === void 0 ? constants_1.SELECT_DEFAULT_MULTILINE : _f, _g = props.defaultOpen, defaultOpen = _g === void 0 ? constants_1.SELECT_DEFAULT_DEFAULT_OPEN : _g, valueProp = props.value, defaultValue = props.defaultValue, error = props.error, onChange = props.onChange, label = props.label, placeholder = props.placeholder, renderValueProp = props.renderValue, renderLeft = props.renderLeft, renderRight = props.renderRight, hint = props.hint, children = props.children, menuProps = props.menuProps, inputProps = props.inputProps, inputRef = props.inputRef, onCloseProp = props.onClose, onOpenProp = props.onOpen, openProp = props.open, other = tslib_1.__rest(props, ["id", "name", "size", "autoFocus", "fullWidth", "disabled", "required", "multiline", "defaultOpen", "value", "defaultValue", "error", "onChange", "label", "placeholder", "renderValue", "renderLeft", "renderRight", "hint", "children", "menuProps", "inputProps", "inputRef", "onClose", "onOpen", "open"]);
27
- var _h = menuProps || {}, menuListProps = _h.menuListProps, menuPropsOther = tslib_1.__rest(_h, ["menuListProps"]);
28
- var menuRef = (0, react_1.useRef)(null);
29
- var selectRef = (0, react_1.useRef)(null);
30
- var bodyRef = (0, react_1.useRef)(null);
31
- var _j = tslib_1.__read((0, useBoolean_1.useBoolean)(false), 2), focused = _j[0], _k = _j[1], onFocus = _k.on, offFocus = _k.off;
32
- var iconSize = (0, getIconSizeToFormElement_1.getIconSizeToFormElement)(size);
33
- var currentOption = {};
34
- var _l = tslib_1.__read((0, useControlled_1.useControlled)({
23
+ var _a = props.size, size = _a === void 0 ? constants_1.SELECT_DEFAULT_SIZE : _a, _b = props.autoFocus, autoFocus = _b === void 0 ? constants_1.SELECT_DEFAULT_AUTO_FOCUS : _b, _c = props.fullWidth, fullWidth = _c === void 0 ? constants_1.SELECT_DEFAULT_FULL_WIDTH : _c, _d = props.disabled, disabled = _d === void 0 ? constants_1.SELECT_DEFAULT_DISABLED : _d, _e = props.required, required = _e === void 0 ? constants_1.SELECT_DEFAULT_REQUIRED : _e, _f = props.multiline, multiline = _f === void 0 ? constants_1.SELECT_DEFAULT_MULTILINE : _f, _g = props.defaultOpen, defaultOpen = _g === void 0 ? constants_1.SELECT_DEFAULT_DEFAULT_OPEN : _g, id = props.id, name = props.name, valueProp = props.value, defaultValue = props.defaultValue, error = props.error, onChange = props.onChange, label = props.label, placeholder = props.placeholder, renderValueProp = props.renderValue, renderLeft = props.renderLeft, renderRight = props.renderRight, hint = props.hint, children = props.children, onClick = props.onClick, onKeyDown = props.onKeyDown, menuProps = props.menuProps, dataListPropsProp = props.dataListProps, bodyProps = props.bodyProps, bodeRefProp = props.bodyRef, onCloseProp = props.onClose, onOpenProp = props.onOpen, openProp = props.open, multiple = props.multiple, other = tslib_1.__rest(props, ["size", "autoFocus", "fullWidth", "disabled", "required", "multiline", "defaultOpen", "id", "name", "value", "defaultValue", "error", "onChange", "label", "placeholder", "renderValue", "renderLeft", "renderRight", "hint", "children", "onClick", "onKeyDown", "menuProps", "dataListProps", "bodyProps", "bodyRef", "onClose", "onOpen", "open", "multiple"]);
24
+ var bodyInnerRef = (0, react_1.useRef)(null);
25
+ /** @deprecated props */
26
+ var bodyRef = (bodyProps === null || bodyProps === void 0 ? void 0 : bodyProps.ref) || bodeRefProp;
27
+ var dataListProps = dataListPropsProp || menuProps;
28
+ var _h = tslib_1.__read((0, useControlled_1.useControlled)({
35
29
  value: valueProp,
36
30
  defaultValue: defaultValue,
37
31
  name: 'Select',
38
32
  state: 'value',
39
- }), 3), valueState = _l[0], setValueState = _l[1], isValueControlled = _l[2];
40
- var _m = tslib_1.__read((0, useControlled_1.useControlled)({
33
+ }), 3), valueState = _h[0], setValueState = _h[1], isValueControlled = _h[2];
34
+ var _j = tslib_1.__read((0, useControlled_1.useControlled)({
41
35
  value: openProp,
42
36
  defaultValue: defaultOpen,
43
37
  name: 'Select',
44
38
  state: 'open',
45
- }), 3), open = _m[0], setOpen = _m[1], isOpenControlled = _m[2];
46
- var isNotSelectOption = function (child) { return !(0, react_1.isValidElement)(child) || child.type !== index_1.Option; };
39
+ }), 3), open = _j[0], setOpen = _j[1], isOpenControlled = _j[2];
40
+ var currentLabel;
41
+ var isNotSelectOption = function (child) { return !(0, react_1.isValidElement)(child) || child.type !== DataList_1.DataListOption; };
47
42
  var resolvedChildren = (0, react_is_1.isFragment)(children)
48
43
  ? children.props.children
49
44
  : children;
45
+ react_1.Children.forEach(resolvedChildren, function (child) {
46
+ var _a, _b;
47
+ if (!isNotSelectOption(child)) {
48
+ var label_1 = typeof child.props.children === 'string'
49
+ ? (_a = child.props.label) !== null && _a !== void 0 ? _a : child.props.children
50
+ : child.props.label;
51
+ var params = {
52
+ multiple: multiple,
53
+ label: currentLabel,
54
+ value: valueState,
55
+ };
56
+ if ((0, helpers_1.isMultipleParams)(params)) {
57
+ var selected = (_b = params.value) === null || _b === void 0 ? void 0 : _b.includes(child.props.value);
58
+ if (selected) {
59
+ currentLabel = tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read((params.label || [])), false), [
60
+ label_1,
61
+ ], false);
62
+ }
63
+ }
64
+ if ((0, helpers_1.isNotMultipleParams)(params)) {
65
+ var selected = params.value === child.props.value;
66
+ if (selected) {
67
+ currentLabel = label_1;
68
+ }
69
+ }
70
+ }
71
+ });
50
72
  var handleClose = function () {
51
73
  setOpen(false);
52
74
  onCloseProp === null || onCloseProp === void 0 ? void 0 : onCloseProp();
@@ -65,75 +87,64 @@ exports.Select = (0, react_1.forwardRef)(function (inProps, ref) {
65
87
  handleOpen();
66
88
  }
67
89
  };
68
- /** Сбрасывает визуальное состояние фокуса по клику за пределами
69
- * элемента контроля и раскрывающегося списка */
70
- (0, useClickOutside_1.useClickOutside)({
71
- refs: [selectRef, menuRef],
72
- handler: function () {
73
- offFocus();
74
- },
75
- active: focused,
76
- });
77
- /** Управление фокусом элемента контроля */
78
- var handleFocus = function () {
79
- onFocus();
80
- };
81
- /** Управление потерей фокуса с элемента контроля */
82
- var handleBlur = function () {
83
- if (!open) {
84
- offFocus();
85
- }
90
+ var handleClick = function (event) {
91
+ onClick === null || onClick === void 0 ? void 0 : onClick(event);
92
+ handleToggle();
86
93
  };
87
94
  /** Управление элементом контроля через клавиатуру */
88
95
  var handleKeyDown = function (event) {
89
- if ((0, isKey_1.isKey)(event, 'Enter') ||
90
- (0, isKey_1.isKey)(event, 'Space') ||
96
+ if (((0, isKey_1.isKey)(event, 'Space') ||
91
97
  (0, isKey_1.isKey)(event, 'ArrowDown') ||
92
- (0, isKey_1.isKey)(event, 'ArrowUp')) {
98
+ (0, isKey_1.isKey)(event, 'ArrowUp')) &&
99
+ !open) {
93
100
  event.preventDefault();
94
101
  handleToggle();
95
102
  }
103
+ onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
96
104
  };
97
105
  /** Событие выбора значения из раскрывающегося списка */
98
- var handleChange = function (e, value) {
106
+ var handleChange = function (event, _a) {
107
+ var value = _a.value;
99
108
  if (!isValueControlled || onChange) {
100
109
  setValueState(value);
101
110
  }
102
- onChange === null || onChange === void 0 ? void 0 : onChange(value, e);
103
- handleClose();
111
+ onChange === null || onChange === void 0 ? void 0 : onChange(value, event);
112
+ if (!multiple)
113
+ handleClose();
104
114
  };
105
- /** Представление раскрывающегося списка */
106
- var renderChildren = react_1.Children.map(resolvedChildren, function (child) {
107
- if (isNotSelectOption(child)) {
108
- return child;
109
- }
110
- var elementChild = child;
111
- var label = typeof child.props.children === 'string'
112
- ? child.props.children || child.props.label
113
- : child.props.label;
114
- var selected = valueState === child.props.value;
115
- var props = tslib_1.__assign(tslib_1.__assign({}, child.props), { onClick: function (event) {
116
- var _a, _b;
117
- handleChange(event, child.props.value || '');
118
- (_b = (_a = child.props).onClick) === null || _b === void 0 ? void 0 : _b.call(_a, event);
119
- } });
120
- if (selected) {
121
- currentOption = {
122
- label: label,
123
- value: child.props.value,
124
- };
125
- }
126
- if (typeof child.props.children === 'string') {
127
- return (react_1.default.createElement(index_1.Option, tslib_1.__assign({}, props, { ref: ref, selected: selected }),
128
- react_1.default.createElement(index_1.OptionItemText, { primary: label || '' }),
129
- react_1.default.createElement(components_1.SelectCheckIcon, { size: iconSize, selected: selected })));
130
- }
131
- return react_1.default.cloneElement(elementChild, tslib_1.__assign({}, props));
132
- });
133
115
  /** Представление значение элемента контроля по умолчанию */
134
116
  var renderDefaultValue = function (option) {
135
117
  var _a = option.label, label = _a === void 0 ? '' : _a, _b = option.value, value = _b === void 0 ? '' : _b;
136
- return react_1.default.createElement("span", null, label || value);
118
+ if (!value && value !== 0) {
119
+ return null;
120
+ }
121
+ var params = {
122
+ multiple: multiple,
123
+ label: label,
124
+ value: value,
125
+ };
126
+ if ((0, helpers_1.isMultipleParams)(params)) {
127
+ return react_1.default.createElement("span", null, tslib_1.__spreadArray([], tslib_1.__read(params.label), false).join(', '));
128
+ }
129
+ if ((0, helpers_1.isNotMultipleParams)(params)) {
130
+ return react_1.default.createElement("span", null, params.label);
131
+ }
132
+ return null;
133
+ };
134
+ /** Значение для текстового поля компонента */
135
+ var inputValue = function () {
136
+ var _a;
137
+ var params = {
138
+ multiple: multiple,
139
+ value: valueState,
140
+ };
141
+ if ((0, helpers_1.isMultipleParams)(params)) {
142
+ return (_a = params.value) === null || _a === void 0 ? void 0 : _a.join(',');
143
+ }
144
+ if ((0, helpers_1.isNotMultipleParams)(params)) {
145
+ return params.value;
146
+ }
147
+ return '';
137
148
  };
138
149
  /** Представление значение элемента контроля */
139
150
  var renderValue = renderValueProp || renderDefaultValue;
@@ -143,20 +154,21 @@ exports.Select = (0, react_1.forwardRef)(function (inProps, ref) {
143
154
  * если компонент по умолчанию открыт – defaultOpen={true}
144
155
  * и является неконтролируемым */
145
156
  if (defaultOpen && !isOpenControlled) {
146
- (_a = bodyRef.current) === null || _a === void 0 ? void 0 : _a.focus();
157
+ (_a = bodyInnerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
147
158
  }
148
159
  }, [open]);
149
160
  (0, react_1.useEffect)(function () {
150
161
  var _a;
151
162
  /** Автофокус на элементе контроля */
152
163
  if (autoFocus) {
153
- (_a = bodyRef.current) === null || _a === void 0 ? void 0 : _a.focus();
164
+ (_a = bodyInnerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
154
165
  }
155
166
  }, [autoFocus]);
156
167
  return (react_1.default.createElement(react_1.default.Fragment, null,
157
- react_1.default.createElement(components_1.SelectInput, tslib_1.__assign({ id: id, name: name, inputProps: inputProps, inputRef: inputRef, label: label, placeholder: placeholder, size: size, disabled: disabled, required: required, multiline: multiline, error: error, hint: hint, fullWidth: fullWidth, renderLeft: renderLeft, open: open, renderRight: renderRight, renderedValue: currentOption.value && renderValue(currentOption) }, other, { focused: focused, value: valueState || '', bodyRef: bodyRef, onClick: handleToggle, onKeyDown: handleKeyDown, onFocus: handleFocus, onBlur: handleBlur, ref: (0, useMultiRef_1.useMultiRef)([selectRef, ref]) })),
158
- react_1.default.createElement(Menu_1.Menu, tslib_1.__assign({ placement: "bottom-start", transitionProps: {
159
- classNames: (0, exports.cnSelect)({ animation: true }),
160
- }, menuListProps: tslib_1.__assign({ size: size, role: 'listbox' }, menuListProps), equalAnchorWidth: true }, menuPropsOther, { open: open, anchorRef: bodyRef, onClose: handleClose, ref: menuRef }), renderChildren)));
161
- });
162
- exports.Select.displayName = 'Select';
168
+ react_1.default.createElement(components_1.SelectInput, tslib_1.__assign({ id: id, name: name, label: label, placeholder: placeholder, size: size, disabled: disabled, required: required, multiline: multiline, error: error, hint: hint, fullWidth: fullWidth, renderLeft: renderLeft, renderRight: renderRight }, other, { open: open, value: inputValue() || '', onKeyDown: handleKeyDown, onClick: handleClick, bodyProps: tslib_1.__assign(tslib_1.__assign({}, bodyProps), { ref: (0, useMultiRef_1.useMultiRef)([bodyRef, bodyInnerRef]) }), ref: ref, renderedValue: renderValue({
169
+ label: currentLabel,
170
+ value: valueState,
171
+ }) })),
172
+ react_1.default.createElement(DataList_1.DataList, tslib_1.__assign({ equalAnchorWidth: true }, dataListProps, { listProps: tslib_1.__assign({ size: size, role: 'listbox' }, dataListProps === null || dataListProps === void 0 ? void 0 : dataListProps.listProps), open: open, multiple: multiple, selected: (valueState || ''), onSelect: handleChange, anchorRef: bodyInnerRef, onClose: handleClose }), children)));
173
+ };
174
+ exports.Select = (0, react_1.forwardRef)(SelectRender);
@@ -0,0 +1,5 @@
1
+ import type { FC } from 'react';
2
+ import type { SelectInputProps } from '../SelectInput';
3
+ type SelectInputConsumerProps = Pick<SelectInputProps, 'value' | 'placeholder' | 'defaultValue' | 'id' | 'name' | 'fieldProps' | 'fieldRef' | 'inputProps' | 'inputRef' | 'renderedValue'>;
4
+ export declare const SelectInputConsumer: FC<SelectInputConsumerProps>;
5
+ export {};
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SelectInputConsumer = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = tslib_1.__importStar(require("react"));
6
+ var FieldControl_1 = require("../../../FieldControl");
7
+ var index_1 = require("../../index");
8
+ var SelectInputConsumer = function (_a) {
9
+ var id = _a.id, name = _a.name, _b = _a.value, valueProp = _b === void 0 ? '' : _b, placeholderProp = _a.placeholder, defaultValue = _a.defaultValue, inputProps = _a.inputProps, inputRef = _a.inputRef, fieldRef = _a.fieldRef, fieldProps = _a.fieldProps, renderedValue = _a.renderedValue;
10
+ var context = (0, react_1.useContext)(FieldControl_1.FieldControlContext);
11
+ var _c = tslib_1.__read(context, 1), fieldControl = _c[0];
12
+ var disabled = fieldControl.disabled, required = fieldControl.required, filled = fieldControl.filled, focused = fieldControl.focused, label = fieldControl.label;
13
+ var hasLabel = !!label;
14
+ var placeholder = (focused || !hasLabel) && !valueProp && placeholderProp;
15
+ return (react_1.default.createElement(react_1.default.Fragment, null,
16
+ react_1.default.createElement("div", tslib_1.__assign({}, fieldProps, { className: (0, index_1.cnSelect)('Field', { filled: filled, asPlaceholder: !!placeholder }, [
17
+ fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.className,
18
+ ]), ref: fieldRef }), placeholder || renderedValue),
19
+ react_1.default.createElement("input", tslib_1.__assign({ id: id, name: name, defaultValue: defaultValue, value: valueProp, disabled: disabled, required: required, tabIndex: -1, "aria-hidden": true, readOnly: true }, inputProps, { className: (0, index_1.cnSelect)('Input', [inputProps === null || inputProps === void 0 ? void 0 : inputProps.className]), ref: inputRef }))));
20
+ };
21
+ exports.SelectInputConsumer = SelectInputConsumer;
@@ -0,0 +1 @@
1
+ export * from './SelectInputConsumer';
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./SelectInputConsumer"), exports);