@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
@@ -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;
@@ -1,49 +1,71 @@
1
- import { __assign, __read, __rest } from "tslib";
1
+ import { __assign, __read, __rest, __spreadArray } from "tslib";
2
2
  import './Select.css';
3
- import React, { useRef, useEffect, forwardRef, Children, isValidElement, } from 'react';
3
+ import React, { useRef, useEffect, forwardRef, isValidElement, Children, } from 'react';
4
4
  import { isFragment } from 'react-is';
5
- import { useBoolean } from '../../hooks/useBoolean';
6
- import { useClickOutside } from '../../hooks/useClickOutside';
7
5
  import { useControlled } from '../../hooks/useControlled';
8
6
  import { useMultiRef } from '../../hooks/useMultiRef';
9
7
  import { useThemeProps } from '../../hooks/useThemeProps';
10
8
  import { cn } from '../../utils/classname';
11
- import { getIconSizeToFormElement } from '../../utils/getIconSizeToFormElement';
12
9
  import { isKey } from '../../utils/isKey';
13
- import { Menu } from '../Menu';
14
- import { SelectCheckIcon, SelectInput } from './components';
15
- import { SELECT_DEFAULT_AUTO_FOCUS, SELECT_DEFAULT_DEFAULT_OPEN, SELECT_DEFAULT_DISABLED, SELECT_DEFAULT_FULL_WIDTH, SELECT_DEFAULT_MULTILINE, SELECT_DEFAULT_REQUIRED, SELECT_DEFAULT_AUTO_SIZE, } from './constants';
16
- import { Option, OptionItemText } from './index';
10
+ import { DataList, DataListOption } from '../DataList';
11
+ import { SelectInput } from './components';
12
+ import { SELECT_DEFAULT_AUTO_FOCUS, SELECT_DEFAULT_DEFAULT_OPEN, SELECT_DEFAULT_DISABLED, SELECT_DEFAULT_FULL_WIDTH, SELECT_DEFAULT_MULTILINE, SELECT_DEFAULT_REQUIRED, SELECT_DEFAULT_SIZE, } from './constants';
13
+ import { isMultipleParams, isNotMultipleParams } from './helpers';
17
14
  export var cnSelect = cn('Select');
18
- export var Select = forwardRef(function (inProps, ref) {
15
+ var SelectRender = function (inProps, ref) {
19
16
  var props = useThemeProps({
20
17
  props: inProps,
21
18
  name: 'Select',
22
19
  });
23
- var id = props.id, name = props.name, _a = props.size, size = _a === void 0 ? SELECT_DEFAULT_AUTO_SIZE : _a, _b = props.autoFocus, autoFocus = _b === void 0 ? SELECT_DEFAULT_AUTO_FOCUS : _b, _c = props.fullWidth, fullWidth = _c === void 0 ? SELECT_DEFAULT_FULL_WIDTH : _c, _d = props.disabled, disabled = _d === void 0 ? SELECT_DEFAULT_DISABLED : _d, _e = props.required, required = _e === void 0 ? SELECT_DEFAULT_REQUIRED : _e, _f = props.multiline, multiline = _f === void 0 ? SELECT_DEFAULT_MULTILINE : _f, _g = props.defaultOpen, defaultOpen = _g === void 0 ? 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 = __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"]);
24
- var _h = menuProps || {}, menuListProps = _h.menuListProps, menuPropsOther = __rest(_h, ["menuListProps"]);
25
- var menuRef = useRef(null);
26
- var selectRef = useRef(null);
27
- var bodyRef = useRef(null);
28
- var _j = __read(useBoolean(false), 2), focused = _j[0], _k = _j[1], onFocus = _k.on, offFocus = _k.off;
29
- var iconSize = getIconSizeToFormElement(size);
30
- var currentOption = {};
31
- var _l = __read(useControlled({
20
+ var _a = props.size, size = _a === void 0 ? SELECT_DEFAULT_SIZE : _a, _b = props.autoFocus, autoFocus = _b === void 0 ? SELECT_DEFAULT_AUTO_FOCUS : _b, _c = props.fullWidth, fullWidth = _c === void 0 ? SELECT_DEFAULT_FULL_WIDTH : _c, _d = props.disabled, disabled = _d === void 0 ? SELECT_DEFAULT_DISABLED : _d, _e = props.required, required = _e === void 0 ? SELECT_DEFAULT_REQUIRED : _e, _f = props.multiline, multiline = _f === void 0 ? SELECT_DEFAULT_MULTILINE : _f, _g = props.defaultOpen, defaultOpen = _g === void 0 ? 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 = __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"]);
21
+ var bodyInnerRef = useRef(null);
22
+ /** @deprecated props */
23
+ var bodyRef = (bodyProps === null || bodyProps === void 0 ? void 0 : bodyProps.ref) || bodeRefProp;
24
+ var dataListProps = dataListPropsProp || menuProps;
25
+ var _h = __read(useControlled({
32
26
  value: valueProp,
33
27
  defaultValue: defaultValue,
34
28
  name: 'Select',
35
29
  state: 'value',
36
- }), 3), valueState = _l[0], setValueState = _l[1], isValueControlled = _l[2];
37
- var _m = __read(useControlled({
30
+ }), 3), valueState = _h[0], setValueState = _h[1], isValueControlled = _h[2];
31
+ var _j = __read(useControlled({
38
32
  value: openProp,
39
33
  defaultValue: defaultOpen,
40
34
  name: 'Select',
41
35
  state: 'open',
42
- }), 3), open = _m[0], setOpen = _m[1], isOpenControlled = _m[2];
43
- var isNotSelectOption = function (child) { return !isValidElement(child) || child.type !== Option; };
36
+ }), 3), open = _j[0], setOpen = _j[1], isOpenControlled = _j[2];
37
+ var currentLabel;
38
+ var isNotSelectOption = function (child) { return !isValidElement(child) || child.type !== DataListOption; };
44
39
  var resolvedChildren = isFragment(children)
45
40
  ? children.props.children
46
41
  : children;
42
+ Children.forEach(resolvedChildren, function (child) {
43
+ var _a, _b;
44
+ if (!isNotSelectOption(child)) {
45
+ var label_1 = typeof child.props.children === 'string'
46
+ ? (_a = child.props.label) !== null && _a !== void 0 ? _a : child.props.children
47
+ : child.props.label;
48
+ var params = {
49
+ multiple: multiple,
50
+ label: currentLabel,
51
+ value: valueState,
52
+ };
53
+ if (isMultipleParams(params)) {
54
+ var selected = (_b = params.value) === null || _b === void 0 ? void 0 : _b.includes(child.props.value);
55
+ if (selected) {
56
+ currentLabel = __spreadArray(__spreadArray([], __read((params.label || [])), false), [
57
+ label_1,
58
+ ], false);
59
+ }
60
+ }
61
+ if (isNotMultipleParams(params)) {
62
+ var selected = params.value === child.props.value;
63
+ if (selected) {
64
+ currentLabel = label_1;
65
+ }
66
+ }
67
+ }
68
+ });
47
69
  var handleClose = function () {
48
70
  setOpen(false);
49
71
  onCloseProp === null || onCloseProp === void 0 ? void 0 : onCloseProp();
@@ -62,75 +84,64 @@ export var Select = forwardRef(function (inProps, ref) {
62
84
  handleOpen();
63
85
  }
64
86
  };
65
- /** Сбрасывает визуальное состояние фокуса по клику за пределами
66
- * элемента контроля и раскрывающегося списка */
67
- useClickOutside({
68
- refs: [selectRef, menuRef],
69
- handler: function () {
70
- offFocus();
71
- },
72
- active: focused,
73
- });
74
- /** Управление фокусом элемента контроля */
75
- var handleFocus = function () {
76
- onFocus();
77
- };
78
- /** Управление потерей фокуса с элемента контроля */
79
- var handleBlur = function () {
80
- if (!open) {
81
- offFocus();
82
- }
87
+ var handleClick = function (event) {
88
+ onClick === null || onClick === void 0 ? void 0 : onClick(event);
89
+ handleToggle();
83
90
  };
84
91
  /** Управление элементом контроля через клавиатуру */
85
92
  var handleKeyDown = function (event) {
86
- if (isKey(event, 'Enter') ||
87
- isKey(event, 'Space') ||
93
+ if ((isKey(event, 'Space') ||
88
94
  isKey(event, 'ArrowDown') ||
89
- isKey(event, 'ArrowUp')) {
95
+ isKey(event, 'ArrowUp')) &&
96
+ !open) {
90
97
  event.preventDefault();
91
98
  handleToggle();
92
99
  }
100
+ onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
93
101
  };
94
102
  /** Событие выбора значения из раскрывающегося списка */
95
- var handleChange = function (e, value) {
103
+ var handleChange = function (event, _a) {
104
+ var value = _a.value;
96
105
  if (!isValueControlled || onChange) {
97
106
  setValueState(value);
98
107
  }
99
- onChange === null || onChange === void 0 ? void 0 : onChange(value, e);
100
- handleClose();
108
+ onChange === null || onChange === void 0 ? void 0 : onChange(value, event);
109
+ if (!multiple)
110
+ handleClose();
101
111
  };
102
- /** Представление раскрывающегося списка */
103
- var renderChildren = Children.map(resolvedChildren, function (child) {
104
- if (isNotSelectOption(child)) {
105
- return child;
106
- }
107
- var elementChild = child;
108
- var label = typeof child.props.children === 'string'
109
- ? child.props.children || child.props.label
110
- : child.props.label;
111
- var selected = valueState === child.props.value;
112
- var props = __assign(__assign({}, child.props), { onClick: function (event) {
113
- var _a, _b;
114
- handleChange(event, child.props.value || '');
115
- (_b = (_a = child.props).onClick) === null || _b === void 0 ? void 0 : _b.call(_a, event);
116
- } });
117
- if (selected) {
118
- currentOption = {
119
- label: label,
120
- value: child.props.value,
121
- };
122
- }
123
- if (typeof child.props.children === 'string') {
124
- return (React.createElement(Option, __assign({}, props, { ref: ref, selected: selected }),
125
- React.createElement(OptionItemText, { primary: label || '' }),
126
- React.createElement(SelectCheckIcon, { size: iconSize, selected: selected })));
127
- }
128
- return React.cloneElement(elementChild, __assign({}, props));
129
- });
130
112
  /** Представление значение элемента контроля по умолчанию */
131
113
  var renderDefaultValue = function (option) {
132
114
  var _a = option.label, label = _a === void 0 ? '' : _a, _b = option.value, value = _b === void 0 ? '' : _b;
133
- return React.createElement("span", null, label || value);
115
+ if (!value && value !== 0) {
116
+ return null;
117
+ }
118
+ var params = {
119
+ multiple: multiple,
120
+ label: label,
121
+ value: value,
122
+ };
123
+ if (isMultipleParams(params)) {
124
+ return React.createElement("span", null, __spreadArray([], __read(params.label), false).join(', '));
125
+ }
126
+ if (isNotMultipleParams(params)) {
127
+ return React.createElement("span", null, params.label);
128
+ }
129
+ return null;
130
+ };
131
+ /** Значение для текстового поля компонента */
132
+ var inputValue = function () {
133
+ var _a;
134
+ var params = {
135
+ multiple: multiple,
136
+ value: valueState,
137
+ };
138
+ if (isMultipleParams(params)) {
139
+ return (_a = params.value) === null || _a === void 0 ? void 0 : _a.join(',');
140
+ }
141
+ if (isNotMultipleParams(params)) {
142
+ return params.value;
143
+ }
144
+ return '';
134
145
  };
135
146
  /** Представление значение элемента контроля */
136
147
  var renderValue = renderValueProp || renderDefaultValue;
@@ -140,20 +151,21 @@ export var Select = forwardRef(function (inProps, ref) {
140
151
  * если компонент по умолчанию открыт – defaultOpen={true}
141
152
  * и является неконтролируемым */
142
153
  if (defaultOpen && !isOpenControlled) {
143
- (_a = bodyRef.current) === null || _a === void 0 ? void 0 : _a.focus();
154
+ (_a = bodyInnerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
144
155
  }
145
156
  }, [open]);
146
157
  useEffect(function () {
147
158
  var _a;
148
159
  /** Автофокус на элементе контроля */
149
160
  if (autoFocus) {
150
- (_a = bodyRef.current) === null || _a === void 0 ? void 0 : _a.focus();
161
+ (_a = bodyInnerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
151
162
  }
152
163
  }, [autoFocus]);
153
164
  return (React.createElement(React.Fragment, null,
154
- React.createElement(SelectInput, __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: useMultiRef([selectRef, ref]) })),
155
- React.createElement(Menu, __assign({ placement: "bottom-start", transitionProps: {
156
- classNames: cnSelect({ animation: true }),
157
- }, menuListProps: __assign({ size: size, role: 'listbox' }, menuListProps), equalAnchorWidth: true }, menuPropsOther, { open: open, anchorRef: bodyRef, onClose: handleClose, ref: menuRef }), renderChildren)));
158
- });
159
- Select.displayName = 'Select';
165
+ React.createElement(SelectInput, __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: __assign(__assign({}, bodyProps), { ref: useMultiRef([bodyRef, bodyInnerRef]) }), ref: ref, renderedValue: renderValue({
166
+ label: currentLabel,
167
+ value: valueState,
168
+ }) })),
169
+ React.createElement(DataList, __assign({ equalAnchorWidth: true }, dataListProps, { listProps: __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)));
170
+ };
171
+ export var Select = 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,17 @@
1
+ import { __assign, __read } from "tslib";
2
+ import React, { useContext } from 'react';
3
+ import { FieldControlContext } from '../../../FieldControl';
4
+ import { cnSelect } from '../../index';
5
+ export var SelectInputConsumer = function (_a) {
6
+ 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;
7
+ var context = useContext(FieldControlContext);
8
+ var _c = __read(context, 1), fieldControl = _c[0];
9
+ var disabled = fieldControl.disabled, required = fieldControl.required, filled = fieldControl.filled, focused = fieldControl.focused, label = fieldControl.label;
10
+ var hasLabel = !!label;
11
+ var placeholder = (focused || !hasLabel) && !valueProp && placeholderProp;
12
+ return (React.createElement(React.Fragment, null,
13
+ React.createElement("div", __assign({}, fieldProps, { className: cnSelect('Field', { filled: filled, asPlaceholder: !!placeholder }, [
14
+ fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.className,
15
+ ]), ref: fieldRef }), placeholder || renderedValue),
16
+ React.createElement("input", __assign({ id: id, name: name, defaultValue: defaultValue, value: valueProp, disabled: disabled, required: required, tabIndex: -1, "aria-hidden": true, readOnly: true }, inputProps, { className: cnSelect('Input', [inputProps === null || inputProps === void 0 ? void 0 : inputProps.className]), ref: inputRef }))));
17
+ };
@@ -0,0 +1 @@
1
+ export * from './SelectInputConsumer';
@@ -0,0 +1 @@
1
+ export * from './SelectInputConsumer';
@@ -1,75 +1,4 @@
1
1
  import '../../Select.css';
2
2
  import React from 'react';
3
- import type { HTMLAttributes, InputHTMLAttributes, Ref } from 'react';
4
- import type { FormElementSizeVariant } from '../../../../types/FormElementSizeVariant';
5
- import { type FieldIconProps } from '../../../FieldIcon';
6
- import { type FieldLabelProps } from '../../../FieldLabel';
7
- export type SelectInputSizeVariant = FormElementSizeVariant;
8
- type DivElement = HTMLAttributes<HTMLDivElement>;
9
- type InputElement = InputHTMLAttributes<HTMLInputElement>;
10
- export type SelectInputProps = {
11
- /** Атрибут id для элемента input */
12
- id?: string;
13
- /** Атрибут name для элемента input */
14
- name?: string;
15
- /** Лейбл */
16
- label?: string;
17
- /** Размер компонента */
18
- size?: SelectInputSizeVariant;
19
- /** Подсказка. Отображается, когда вариант не выбран */
20
- placeholder?: string;
21
- /** Если {true} устанавливает автофокус */
22
- autoFocus?: boolean;
23
- /** Если {true} переводит поле в состояние ошибки */
24
- error?: boolean;
25
- /** Если {true} растягивает поле на всю ширину */
26
- fullWidth?: boolean;
27
- /** Дополнительное описание к полю */
28
- hint?: string | null | undefined;
29
- /** Если {true} делает элемент неактивным */
30
- disabled?: boolean;
31
- /** Если {true} делает элемент обязательным к заполнению */
32
- required?: boolean;
33
- /** Признак визуального состояния компонента с фокусом */
34
- focused?: boolean;
35
- /** Если {true} предотвращает сокращение текста в значении и
36
- * задает гибкую высоту контейнера компонента */
37
- multiline?: boolean;
38
- /** Текст или иконка слева */
39
- renderLeft?: FieldIconProps['icon'];
40
- /** Текст или иконка справа */
41
- renderRight?: FieldIconProps['icon'];
42
- /** Значение для отображения */
43
- renderedValue?: React.ReactNode;
44
- /** Выбранное значение */
45
- value?: InputElement['value'];
46
- /** Значение умолчанию (неконтролируемый компонент) */
47
- defaultValue?: InputElement['defaultValue'];
48
- /** Ссылка на Field */
49
- fieldRef?: Ref<HTMLDivElement>;
50
- /** Свойства Field */
51
- fieldProps?: DivElement & {
52
- 'data-testid'?: string;
53
- };
54
- /** Ссылка на элемент input */
55
- inputRef?: Ref<HTMLInputElement>;
56
- /** Свойства элемента input */
57
- inputProps?: InputElement & {
58
- 'data-testid'?: string;
59
- };
60
- /** Ссылка на FieldLabel */
61
- labelRef?: FieldLabelProps['ref'];
62
- /** Свойства FieldLabel */
63
- labelProps?: FieldLabelProps;
64
- /** Ссылка на Body */
65
- bodyRef?: Ref<HTMLDivElement>;
66
- /** Свойства Body */
67
- bodyProps?: DivElement;
68
- /** Ссылка на корневой DOM-элемент компонента */
69
- ref?: Ref<HTMLDivElement>;
70
- open?: boolean;
71
- 'data-testid'?: string;
72
- children?: never;
73
- } & Omit<HTMLAttributes<HTMLDivElement>, 'value' | 'defaultValue' | 'onChange'>;
3
+ import type { SelectInputProps } from './types';
74
4
  export declare const SelectInput: React.ForwardRefExoticComponent<Omit<SelectInputProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
75
- export {};